1aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen/* 2aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * Copyright (C) 2015 The Android Open Source Project 3aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * 4aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * Licensed under the Apache License, Version 2.0 (the "License"); 5aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * you may not use this file except in compliance with the License. 6aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * You may obtain a copy of the License at 7aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * 8aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * http://www.apache.org/licenses/LICENSE-2.0 9aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * 10aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * Unless required by applicable law or agreed to in writing, software 11aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * distributed under the License is distributed on an "AS IS" BASIS, 12aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * See the License for the specific language governing permissions and 14aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen * limitations under the License. 15aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen */ 16aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 17aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen#ifndef BOOTINFO_H_ 18aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen#define BOOTINFO_H_ 19aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 20aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen#include <stdint.h> 21aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen#include <stdbool.h> 22aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 23aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthentypedef struct BrilloSlotInfo { 24aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen uint8_t bootable : 1; 25aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen uint8_t reserved[3]; 26aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen} BrilloSlotInfo; 27aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 28aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthentypedef struct BrilloBootInfo { 29aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen // Used by fs_mgr. Must be NUL terminated. 30aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen char bootctrl_suffix[4]; 31aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 32aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen // Magic for identification - must be 'B', 'C', 'c' (short for 33aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen // "boot_control copy" implementation). 34aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen uint8_t magic[3]; 35aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 36aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen // Version of BrilloBootInfo struct, must be 0 or larger. 37aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen uint8_t version; 38aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 39aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen // Currently active slot. 40aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen uint8_t active_slot; 41aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 42aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen // Information about each slot. 43aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen BrilloSlotInfo slot_info[2]; 44aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 45aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen uint8_t reserved[15]; 46aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen} BrilloBootInfo; 47aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 48aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen// Loading and saving BrillBootInfo instances. 49aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthenbool boot_info_load(BrilloBootInfo *out_info); 50aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthenbool boot_info_save(BrilloBootInfo *info); 51aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 52aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen// Returns non-zero if valid. 53aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthenbool boot_info_validate(BrilloBootInfo* info); 54aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthenvoid boot_info_reset(BrilloBootInfo* info); 55aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 56aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen// Opens partition by |name|, e.g. "misc" or "boot_a" with |flags| 57aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen// (e.g. O_RDONLY or O_RDWR) passed directly to open(2). Returns fd on 58aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen// success and -1 on error. 59aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthenint boot_info_open_partition(const char *name, uint64_t *out_size, int flags); 60aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 61aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6 62aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen_Static_assert(sizeof(BrilloBootInfo) == 32, "BrilloBootInfo has wrong size"); 63aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen#endif 64aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen 65aaa6282361272d3f5d10867245e1e489bd9d19f6David Zeuthen#endif // BOOTINFO_H 66