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