summaryrefslogtreecommitdiff
path: root/firmware/include/gpt_misc.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/include/gpt_misc.h')
-rw-r--r--firmware/include/gpt_misc.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/firmware/include/gpt_misc.h b/firmware/include/gpt_misc.h
new file mode 100644
index 00000000..4d91bd8c
--- /dev/null
+++ b/firmware/include/gpt_misc.h
@@ -0,0 +1,129 @@
+/* Copyright (c) 2013 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_CGPT_MISC_H_
+#define VBOOT_REFERENCE_CGPT_MISC_H_
+
+#include "vboot_api.h"
+
+enum {
+ GPT_SUCCESS = 0,
+ GPT_ERROR_NO_VALID_KERNEL,
+ GPT_ERROR_INVALID_HEADERS,
+ GPT_ERROR_INVALID_ENTRIES,
+ GPT_ERROR_INVALID_SECTOR_SIZE,
+ GPT_ERROR_INVALID_SECTOR_NUMBER,
+ GPT_ERROR_INVALID_UPDATE_TYPE,
+ GPT_ERROR_CRC_CORRUPTED,
+ GPT_ERROR_OUT_OF_REGION,
+ GPT_ERROR_START_LBA_OVERLAP,
+ GPT_ERROR_END_LBA_OVERLAP,
+ GPT_ERROR_DUP_GUID,
+ GPT_ERROR_INVALID_FLASH_GEOMETRY,
+ GPT_ERROR_NO_SUCH_ENTRY,
+ /* Number of errors */
+ GPT_ERROR_COUNT
+};
+
+/* Bit masks for GptData.modified field. */
+#define GPT_MODIFIED_HEADER1 0x01
+#define GPT_MODIFIED_HEADER2 0x02
+#define GPT_MODIFIED_ENTRIES1 0x04
+#define GPT_MODIFIED_ENTRIES2 0x08
+
+/*
+ * Size of GptData.primary_entries and secondary_entries: 128 bytes/entry * 128
+ * entries.
+ */
+#define TOTAL_ENTRIES_SIZE 16384
+
+/*
+ * The 'update_type' of GptUpdateKernelEntry(). We expose TRY and BAD only
+ * because those are what verified boot needs. For more precise control on GPT
+ * attribute bits, please refer to gpt_internal.h.
+ */
+enum {
+ /*
+ * System will be trying to boot the currently selected kernel
+ * partition. Update its try count if necessary.
+ */
+ GPT_UPDATE_ENTRY_TRY = 1,
+ /*
+ * The currently selected kernel partition failed validation. Mark
+ * entry as invalid.
+ */
+ GPT_UPDATE_ENTRY_BAD = 2,
+};
+
+typedef struct {
+ /* Fill in the following fields before calling GptInit() */
+ /* GPT primary header, from sector 1 of disk (size: 512 bytes) */
+ uint8_t *primary_header;
+ /* GPT secondary header, from last sector of disk (size: 512 bytes) */
+ uint8_t *secondary_header;
+ /* Primary GPT table, follows primary header (size: 16 KB) */
+ uint8_t *primary_entries;
+ /* Secondary GPT table, precedes secondary header (size: 16 KB) */
+ uint8_t *secondary_entries;
+ /* Size of a LBA sector, in bytes */
+ uint32_t sector_bytes;
+ /* Size of drive in LBA sectors, in sectors */
+ uint64_t drive_sectors;
+
+ /* Outputs */
+ /* Which inputs have been modified? GPT_MODIFIED_* */
+ uint8_t modified;
+ /*
+ * The current chromeos kernel index in partition table. -1 means not
+ * found on drive. Note that GPT partition numbers are traditionally
+ * 1-based, but we're using a zero-based index here.
+ */
+ int current_kernel;
+
+ /* Internal variables */
+ uint32_t valid_headers, valid_entries;
+ int current_priority;
+} GptData;
+
+/**
+ * Initializes the GPT data structure's internal state.
+ *
+ * The following fields must be filled before calling this function:
+ *
+ * primary_header
+ * secondary_header
+ * primary_entries
+ * secondary_entries
+ * sector_bytes
+ * drive_sectors
+ *
+ * On return the modified field may be set, if the GPT data has been modified
+ * and should be written to disk.
+ *
+ * Returns GPT_SUCCESS if successful, non-zero if error:
+ * GPT_ERROR_INVALID_HEADERS, both partition table headers are invalid, enters
+ * recovery mode,
+ * GPT_ERROR_INVALID_ENTRIES, both partition table entries are invalid, enters
+ * recovery mode,
+ * GPT_ERROR_INVALID_SECTOR_SIZE, size of a sector is not supported,
+ * GPT_ERROR_INVALID_SECTOR_NUMBER, number of sectors in drive is invalid (too
+ * small) */
+int GptInit(GptData *gpt);
+
+/**
+ * Allocate and read GPT data from the drive. The sector_bytes and
+ * drive_sectors fields should be filled on input. The primary and secondary
+ * header and entries are filled on output.
+ *
+ * Returns 0 if successful, 1 if error.
+ */
+int AllocAndReadGptData(VbExDiskHandle_t disk_handle, GptData *gptdata);
+
+/**
+ * Write any changes for the GPT data back to the drive, then free the buffers.
+ */
+int WriteAndFreeGptData(VbExDiskHandle_t disk_handle, GptData *gptdata);
+
+#endif /* VBOOT_REFERENCE_CGPT_MISC_H_ */