10bda13f5154afc8068e7d2d4563ff20b152f1c87Randall Spangler/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
249fa8e51ad4dff55b74d852d270ce5d0b9590034Louis Yung-Chieh Lo * Use of this source code is governed by a BSD-style license that can be
349fa8e51ad4dff55b74d852d270ce5d0b9590034Louis Yung-Chieh Lo * found in the LICENSE file.
449fa8e51ad4dff55b74d852d270ce5d0b9590034Louis Yung-Chieh Lo */
549fa8e51ad4dff55b74d852d270ce5d0b9590034Louis Yung-Chieh Lo
60dce41c2ece9020d5ac9bb68c9772432fac85e64Louis Yung-Chieh Lo#ifndef VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_
70dce41c2ece9020d5ac9bb68c9772432fac85e64Louis Yung-Chieh Lo#define VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_
849fa8e51ad4dff55b74d852d270ce5d0b9590034Louis Yung-Chieh Lo
9f302905224a346718910e56f5f1593d4b19253f1Randall Spangler#include "sysincludes.h"
100dce41c2ece9020d5ac9bb68c9772432fac85e64Louis Yung-Chieh Lo#include "cgptlib.h"
113dcf9dce04301d6d735f265652625fffb6758430Randall Spangler#include "gpt.h"
12b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo
13cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/*
14cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * If gpt->current_kernel is this value, means either:
15b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo *   1. an initial value before scanning GPT entries,
16b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo *   2. after scanning, no any valid kernel is found.
17b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo */
18b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo#define CGPT_KERNEL_ENTRY_NOT_FOUND (-1)
19b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo
20cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/*
21cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Bit definitions and masks for GPT attributes.
22b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo *
2377d26e51909b4f8bc4d3641577b42ee537ccdf18Bill Richardson *  63-61  -- (reserved)
24b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo *     60  -- read-only
2577d26e51909b4f8bc4d3641577b42ee537ccdf18Bill Richardson *  59-57  -- (reserved)
26b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo *     56  -- success
2777d26e51909b4f8bc4d3641577b42ee537ccdf18Bill Richardson *  55-52  -- tries
2877d26e51909b4f8bc4d3641577b42ee537ccdf18Bill Richardson *  51-48  -- priority
2977d26e51909b4f8bc4d3641577b42ee537ccdf18Bill Richardson *   47-2  -- UEFI: reserved for future use
3077d26e51909b4f8bc4d3641577b42ee537ccdf18Bill Richardson *      1  -- UEFI: partition is not mapped
3177d26e51909b4f8bc4d3641577b42ee537ccdf18Bill Richardson *      0  -- UEFI: partition is required
32b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo */
33f7a45cc01d7e4056482b2cdc23080bfabbbffc76vbendeb#define CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET (56 - 48)
34b31ddcec6a826986cd215725bf4defbc6021fe6bLouis Yung-Chieh Lo#define CGPT_ATTRIBUTE_MAX_SUCCESSFUL (1ULL)
35b31ddcec6a826986cd215725bf4defbc6021fe6bLouis Yung-Chieh Lo#define CGPT_ATTRIBUTE_SUCCESSFUL_MASK (CGPT_ATTRIBUTE_MAX_SUCCESSFUL << \
36b31ddcec6a826986cd215725bf4defbc6021fe6bLouis Yung-Chieh Lo                                     CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET)
37b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo
38f7a45cc01d7e4056482b2cdc23080bfabbbffc76vbendeb#define CGPT_ATTRIBUTE_TRIES_OFFSET (52 - 48)
39b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo#define CGPT_ATTRIBUTE_MAX_TRIES (15ULL)
40b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo#define CGPT_ATTRIBUTE_TRIES_MASK (CGPT_ATTRIBUTE_MAX_TRIES << \
41b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo                                   CGPT_ATTRIBUTE_TRIES_OFFSET)
42b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo
43f7a45cc01d7e4056482b2cdc23080bfabbbffc76vbendeb#define CGPT_ATTRIBUTE_PRIORITY_OFFSET (48 - 48)
44b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo#define CGPT_ATTRIBUTE_MAX_PRIORITY (15ULL)
45b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo#define CGPT_ATTRIBUTE_PRIORITY_MASK (CGPT_ATTRIBUTE_MAX_PRIORITY << \
46b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo                                      CGPT_ATTRIBUTE_PRIORITY_OFFSET)
47b17db3c4b9e7051e51af72bfd404d3d243b44f5cLouis Yung-Chieh Lo
483dcf9dce04301d6d735f265652625fffb6758430Randall Spangler/* Defines ChromeOS-specific limitation on GPT */
493dcf9dce04301d6d735f265652625fffb6758430Randall Spangler#define MIN_SIZE_OF_HEADER 92
503dcf9dce04301d6d735f265652625fffb6758430Randall Spangler#define MAX_SIZE_OF_HEADER 512
513dcf9dce04301d6d735f265652625fffb6758430Randall Spangler#define MIN_SIZE_OF_ENTRY 128
523dcf9dce04301d6d735f265652625fffb6758430Randall Spangler#define MAX_SIZE_OF_ENTRY 512
533dcf9dce04301d6d735f265652625fffb6758430Randall Spangler#define SIZE_OF_ENTRY_MULTIPLE 8
543200401242aec1521e7c4a8b1906366fcabfb1a2Nam T. Nguyen#define MIN_NUMBER_OF_ENTRIES 16
55f3f7fca07fbcb6bb9655a71257f09c71b0a1458dDan Ehrenberg#define MAX_NUMBER_OF_ENTRIES 128
563dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
573dcf9dce04301d6d735f265652625fffb6758430Randall Spangler/* Defines GPT sizes */
5888458d9b5281aca162821a369707781ac9abb44eNam T. Nguyen#define GPT_PMBR_SECTORS 1  /* size (in sectors) of PMBR */
5988458d9b5281aca162821a369707781ac9abb44eNam T. Nguyen#define GPT_HEADER_SECTORS 1
603dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
61cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/*
62cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Alias name of index in internal array for primary and secondary header and
63cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * entries.
64cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
653dcf9dce04301d6d735f265652625fffb6758430Randall Spanglerenum {
66cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler	/* constants for index */
67cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler	PRIMARY = 0,
68cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler	SECONDARY = 1,
69cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler	ANY_VALID = 9999,  /* accept any between primary and secondary */
70cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler
71cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler	/* constants for bit mask */
72cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler	MASK_NONE = 0,
73cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler	MASK_PRIMARY = 1,
74cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler	MASK_SECONDARY = 2,
75cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler	MASK_BOTH = 3,
763dcf9dce04301d6d735f265652625fffb6758430Randall Spangler};
773dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
78cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
79cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Verify GptData parameters are sane.
80cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
813dcf9dce04301d6d735f265652625fffb6758430Randall Spanglerint CheckParameters(GptData* gpt);
823dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
83cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
84cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Check header fields.
853dcf9dce04301d6d735f265652625fffb6758430Randall Spangler *
86cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Returns 0 if header is valid, 1 if invalid.
87cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
88b3d38f5c620da89662deb1a08971c5025d6c1132Dan Ehrenbergint CheckHeader(GptHeader *h, int is_secondary,
89b3d38f5c620da89662deb1a08971c5025d6c1132Dan Ehrenberg                uint64_t streaming_drive_sectors,
90b3d38f5c620da89662deb1a08971c5025d6c1132Dan Ehrenberg                uint64_t gpt_drive_sectors, uint32_t flags);
913dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
92cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
93cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Calculate and return the header CRC.
94cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
95cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangleruint32_t HeaderCrc(GptHeader *h);
963dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
97cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
98cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Check entries.
993dcf9dce04301d6d735f265652625fffb6758430Randall Spangler *
100cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Returns 0 if entries are valid, 1 if invalid.
101cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
102cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglerint CheckEntries(GptEntry *entries, GptHeader *h);
1033dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
104cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
105cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Return 0 if the GptHeaders are the same for all fields which don't differ
106cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * between the primary and secondary headers - that is, all fields other than:
1070bda13f5154afc8068e7d2d4563ff20b152f1c87Randall Spangler *
1080bda13f5154afc8068e7d2d4563ff20b152f1c87Randall Spangler * my_lba
1090bda13f5154afc8068e7d2d4563ff20b152f1c87Randall Spangler * alternate_lba
110cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * entries_lba
111cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
1120bda13f5154afc8068e7d2d4563ff20b152f1c87Randall Spanglerint HeaderFieldsSame(GptHeader *h1, GptHeader *h2);
1130bda13f5154afc8068e7d2d4563ff20b152f1c87Randall Spangler
114cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
115cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Check GptData, headers, entries.
1163dcf9dce04301d6d735f265652625fffb6758430Randall Spangler *
1173dcf9dce04301d6d735f265652625fffb6758430Randall Spangler * If successful, sets gpt->valid_headers and gpt->valid_entries and returns
1183dcf9dce04301d6d735f265652625fffb6758430Randall Spangler * GPT_SUCCESS.
1193dcf9dce04301d6d735f265652625fffb6758430Randall Spangler *
120cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * On error, returns a GPT_ERROR_* return code.
121cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
122cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglerint GptSanityCheck(GptData *gpt);
1233dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
124cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
125cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Repair GPT data by copying from one set of valid headers/entries to the
1263dcf9dce04301d6d735f265652625fffb6758430Randall Spangler * other.  Assumes GptSanityCheck() has been run to determine which headers
127cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * and/or entries are already valid.
128cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
129cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglervoid GptRepair(GptData *gpt);
1303dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
1315c9e4532b9bc45cff22f37d3556da679809a60a7Albert Chaulk/**
1325c9e4532b9bc45cff22f37d3556da679809a60a7Albert Chaulk * Called when the primary entries are modified and the CRCs need to be
1335c9e4532b9bc45cff22f37d3556da679809a60a7Albert Chaulk * recalculated and propagated to the secondary entries
1345c9e4532b9bc45cff22f37d3556da679809a60a7Albert Chaulk */
1355c9e4532b9bc45cff22f37d3556da679809a60a7Albert Chaulkvoid GptModified(GptData *gpt);
1365c9e4532b9bc45cff22f37d3556da679809a60a7Albert Chaulk
1373dcf9dce04301d6d735f265652625fffb6758430Randall Spangler/* Getters and setters for partition attribute fields. */
1383dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
139cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglerint GetEntrySuccessful(const GptEntry *e);
140cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglerint GetEntryPriority(const GptEntry *e);
141cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglerint GetEntryTries(const GptEntry *e);
142cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglervoid SetEntrySuccessful(GptEntry *e, int successful);
143cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglervoid SetEntryPriority(GptEntry *e, int priority);
144cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglervoid SetEntryTries(GptEntry *e, int tries);
1453dcf9dce04301d6d735f265652625fffb6758430Randall Spangler
146cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
147cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Return 1 if the entry is a Chrome OS kernel partition, else 0.
148cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
149cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglerint IsKernelEntry(const GptEntry *e);
150cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler
151cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
152cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Copy the current kernel partition's UniquePartitionGuid to the dest.
153cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
1545deb67f22507481cf5cb8f991976a9969fa90a22Bill Richardsonvoid GetCurrentKernelUniqueGuid(GptData *gpt, void *dest);
1555deb67f22507481cf5cb8f991976a9969fa90a22Bill Richardson
156cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler/**
157cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler * Return a pointer to text describing the passed in error.
158cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spangler */
159cefe12c105a91e6ee9f44bca218bd6e4f89bcb71Randall Spanglerconst char *GptErrorText(int error_code);
16065d3c277a2098d6149fb79f7881da5d78133ae57Vadim Bendebury
1613200401242aec1521e7c4a8b1906366fcabfb1a2Nam T. Nguyen/**
1623200401242aec1521e7c4a8b1906366fcabfb1a2Nam T. Nguyen * Return number of 512-byte sectors required to store the entries table.
1633200401242aec1521e7c4a8b1906366fcabfb1a2Nam T. Nguyen */
1643200401242aec1521e7c4a8b1906366fcabfb1a2Nam T. Nguyensize_t CalculateEntriesSectors(GptHeader* h);
1653200401242aec1521e7c4a8b1906366fcabfb1a2Nam T. Nguyen
1660dce41c2ece9020d5ac9bb68c9772432fac85e64Louis Yung-Chieh Lo#endif /* VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_ */
167