Index: src/platform/vboot_reference/vboot_firmware/lib/cgptlib/include/cgptlib_internal.h |
diff --git a/src/platform/vboot_reference/vboot_firmware/lib/cgptlib/include/cgptlib_internal.h b/src/platform/vboot_reference/vboot_firmware/lib/cgptlib/include/cgptlib_internal.h |
index b4b63c535de930e29618f803e7ecdb4a5d072af3..195f4d6c33891a6b31541996687d0c11159c593a 100644 |
--- a/src/platform/vboot_reference/vboot_firmware/lib/cgptlib/include/cgptlib_internal.h |
+++ b/src/platform/vboot_reference/vboot_firmware/lib/cgptlib/include/cgptlib_internal.h |
@@ -8,46 +8,7 @@ |
#include <stdint.h> |
#include "cgptlib.h" |
- |
-int CheckParameters(GptData *gpt); |
-uint32_t CheckHeaderSignature(GptData *gpt); |
-uint32_t CheckRevision(GptData *gpt); |
-uint32_t CheckSize(GptData *gpt); |
-uint32_t CheckReservedFields(GptData *gpt); |
-uint32_t CheckMyLba(GptData *gpt); |
-uint32_t CheckSizeOfPartitionEntry(GptData *gpt); |
-uint32_t CheckNumberOfEntries(GptData *gpt); |
-uint32_t CheckEntriesLba(GptData *gpt); |
-uint32_t CheckValidUsableLbas(GptData *gpt); |
-uint32_t CheckHeaderCrc(GptData *gpt); |
-uint32_t CheckEntriesCrc(GptData *gpt); |
-int NonZeroGuid(const Guid *guid); |
-uint32_t CheckValidEntries(GptData *gpt); |
-typedef struct { |
- uint64_t starting; |
- uint64_t ending; |
-} pair_t; |
-int OverlappedEntries(GptEntry *entries, uint32_t number_of_entries); |
-uint32_t CheckOverlappedPartition(GptData *gpt); |
-int IsSynonymous(const GptHeader* a, const GptHeader* b); |
-uint8_t RepairEntries(GptData *gpt, const uint32_t valid_entries); |
-uint8_t RepairHeader(GptData *gpt, const uint32_t valid_headers); |
-void UpdateCrc(GptData *gpt); |
-int GptSanityCheck(GptData *gpt); |
-void GptRepair(GptData *gpt); |
- |
-GptEntry *GetEntry(GptData *gpt, int secondary, int entry_index); |
-void SetPriority(GptData *gpt, int secondary, int entry_index, int priority); |
-int GetPriority(GptData *gpt, int secondary, int entry_index); |
-void SetBad(GptData *gpt, int secondary, int entry_index, int bad); |
-int GetBad(GptData *gpt, int secondary, int entry_index); |
-void SetTries(GptData *gpt, int secondary, int entry_index, int tries); |
-int GetTries(GptData *gpt, int secondary, int entry_index); |
-void SetSuccessful(GptData *gpt, int secondary, int entry_index, int success); |
-int GetSuccessful(GptData *gpt, int secondary, int entry_index); |
- |
-/* Get number of entries value in primary header */ |
-uint32_t GetNumberOfEntries(const GptData *gpt); |
+#include "gpt.h" |
/* If gpt->current_kernel is this value, means either: |
* 1. an initial value before scanning GPT entries, |
@@ -61,17 +22,11 @@ uint32_t GetNumberOfEntries(const GptData *gpt); |
* 62 -- hidden |
* 60 -- read-only |
* : |
- * 57 -- bad kernel entry |
* 56 -- success |
* 55,52 -- tries |
* 51,48 -- priority |
* 0 -- system partition |
*/ |
-#define CGPT_ATTRIBUTE_BAD_OFFSET 57 |
-#define CGPT_ATTRIBUTE_MAX_BAD (1ULL) |
-#define CGPT_ATTRIBUTE_BAD_MASK (CGPT_ATTRIBUTE_MAX_BAD << \ |
- CGPT_ATTRIBUTE_BAD_OFFSET) |
- |
#define CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET 56 |
#define CGPT_ATTRIBUTE_MAX_SUCCESSFUL (1ULL) |
#define CGPT_ATTRIBUTE_SUCCESSFUL_MASK (CGPT_ATTRIBUTE_MAX_SUCCESSFUL << \ |
@@ -87,4 +42,75 @@ uint32_t GetNumberOfEntries(const GptData *gpt); |
#define CGPT_ATTRIBUTE_PRIORITY_MASK (CGPT_ATTRIBUTE_MAX_PRIORITY << \ |
CGPT_ATTRIBUTE_PRIORITY_OFFSET) |
+/* Defines ChromeOS-specific limitation on GPT */ |
+/* TODO: Move these to cgptlib_internal.h */ |
+#define MIN_SIZE_OF_HEADER 92 |
+#define MAX_SIZE_OF_HEADER 512 |
+#define MIN_SIZE_OF_ENTRY 128 |
+#define MAX_SIZE_OF_ENTRY 512 |
+#define SIZE_OF_ENTRY_MULTIPLE 8 |
+#define MIN_NUMBER_OF_ENTRIES 32 |
+#define MAX_NUMBER_OF_ENTRIES 512 |
+#define TOTAL_ENTRIES_SIZE 16384 /* usual case is 128 bytes * 128 entries */ |
+ |
+/* Defines GPT sizes */ |
+#define GPT_PMBR_SECTOR 1 /* size (in sectors) of PMBR */ |
+#define GPT_HEADER_SECTOR 1 |
+#define GPT_ENTRIES_SECTORS 32 /* assume sector size if 512 bytes, then |
+ * (TOTAL_ENTRIES_SIZE / 512) = 32 */ |
+ |
+/* alias name of index in internal array for primary and secondary header and |
+ * entries. */ |
+enum { |
+ PRIMARY = 0, |
+ SECONDARY = 1, |
+ MASK_NONE = 0, |
+ MASK_PRIMARY = 1, |
+ MASK_SECONDARY = 2, |
+ MASK_BOTH = 3, |
+}; |
+ |
+/* Verify GptData parameters are sane. */ |
+int CheckParameters(GptData* gpt); |
+ |
+/* Check header fields. |
+ * |
+ * Returns 0 if header is valid, 1 if invalid. */ |
+int CheckHeader(GptHeader* h, int is_secondary, uint64_t drive_sectors); |
+ |
+/* Calculate and return the header CRC. */ |
+uint32_t HeaderCrc(GptHeader* h); |
+ |
+/* Check entries. |
+ * |
+ * Returns 0 if entries are valid, 1 if invalid. */ |
+int CheckEntries(GptEntry* entries, GptHeader* h, uint64_t drive_sectors); |
+ |
+/* Check GptData, headers, entries. |
+ * |
+ * If successful, sets gpt->valid_headers and gpt->valid_entries and returns |
+ * GPT_SUCCESS. |
+ * |
+ * On error, returns a GPT_ERROR_* return code. */ |
+int GptSanityCheck(GptData* gpt); |
+ |
+/* Repairs GPT data by copying from one set of valid headers/entries to the |
+ * other. Assumes GptSanityCheck() has been run to determine which headers |
+ * and/or entries are already valid. */ |
+void GptRepair(GptData* gpt); |
+ |
+/* Getters and setters for partition attribute fields. */ |
+int GetEntrySuccessful(const GptEntry* e); |
+int GetEntryPriority(const GptEntry* e); |
+int GetEntryTries(const GptEntry* e); |
+void SetEntrySuccessful(GptEntry* e, int successful); |
+void SetEntryPriority(GptEntry* e, int priority); |
+void SetEntryTries(GptEntry* e, int tries); |
+ |
+/* Return 1 if the entry is unused, 0 if it is used. */ |
+int IsUnusedEntry(const GptEntry* e); |
+ |
+/* Returns 1 if the entry is a Chrome OS kernel partition, else 0. */ |
+int IsKernelEntry(const GptEntry* e); |
+ |
#endif /* VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_ */ |