summaryrefslogtreecommitdiff
path: root/firmware/lib/cgptlib/include/cgptlib_internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/lib/cgptlib/include/cgptlib_internal.h')
-rw-r--r--firmware/lib/cgptlib/include/cgptlib_internal.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/firmware/lib/cgptlib/include/cgptlib_internal.h b/firmware/lib/cgptlib/include/cgptlib_internal.h
new file mode 100644
index 00000000..f4a4d199
--- /dev/null
+++ b/firmware/lib/cgptlib/include/cgptlib_internal.h
@@ -0,0 +1,115 @@
+/* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_
+#define VBOOT_REFERENCE_CGPTLIB_INTERNAL_H_
+
+#include "sysincludes.h"
+#include "cgptlib.h"
+#include "gpt.h"
+
+/* If gpt->current_kernel is this value, means either:
+ * 1. an initial value before scanning GPT entries,
+ * 2. after scanning, no any valid kernel is found.
+ */
+#define CGPT_KERNEL_ENTRY_NOT_FOUND (-1)
+
+/* Bit definitions and masks for GPT attributes.
+ *
+ * 63-61 -- (reserved)
+ * 60 -- read-only
+ * 59-57 -- (reserved)
+ * 56 -- success
+ * 55-52 -- tries
+ * 51-48 -- priority
+ * 47-2 -- UEFI: reserved for future use
+ * 1 -- UEFI: partition is not mapped
+ * 0 -- UEFI: partition is required
+ */
+#define CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET 56
+#define CGPT_ATTRIBUTE_MAX_SUCCESSFUL (1ULL)
+#define CGPT_ATTRIBUTE_SUCCESSFUL_MASK (CGPT_ATTRIBUTE_MAX_SUCCESSFUL << \
+ CGPT_ATTRIBUTE_SUCCESSFUL_OFFSET)
+
+#define CGPT_ATTRIBUTE_TRIES_OFFSET 52
+#define CGPT_ATTRIBUTE_MAX_TRIES (15ULL)
+#define CGPT_ATTRIBUTE_TRIES_MASK (CGPT_ATTRIBUTE_MAX_TRIES << \
+ CGPT_ATTRIBUTE_TRIES_OFFSET)
+
+#define CGPT_ATTRIBUTE_PRIORITY_OFFSET 48
+#define CGPT_ATTRIBUTE_MAX_PRIORITY (15ULL)
+#define CGPT_ATTRIBUTE_PRIORITY_MASK (CGPT_ATTRIBUTE_MAX_PRIORITY << \
+ CGPT_ATTRIBUTE_PRIORITY_OFFSET)
+
+/* Defines ChromeOS-specific limitation on GPT */
+#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
+
+/* 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_ */