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