Index: vboot_firmware/lib/load_kernel_fw.c |
diff --git a/vboot_firmware/lib/load_kernel_fw.c b/vboot_firmware/lib/load_kernel_fw.c |
index 2a17c6cda4adfed0d5a79c779d21165fa5fd060d..88870679c0f621aa76c3143ac259736aceec21b7 100644 |
--- a/vboot_firmware/lib/load_kernel_fw.c |
+++ b/vboot_firmware/lib/load_kernel_fw.c |
@@ -13,6 +13,7 @@ |
#include "kernel_image_fw.h" |
#include "rollback_index.h" |
#include "utility.h" |
+#include "vboot_kernel.h" |
#define GPT_ENTRIES_SIZE 16384 /* Bytes to read for GPT entries */ |
@@ -20,134 +21,9 @@ |
// TODO: for testing |
#include <stdio.h> |
#include <inttypes.h> /* For PRIu64 macro */ |
-#endif |
- |
-/* TODO: Remove this terrible hack which fakes partition attributes |
- * for the kernel partitions so that GptNextKernelEntry() won't |
- * choke. */ |
#include "cgptlib_internal.h" |
-void FakePartitionAttributes(GptData* gpt) { |
- GptHeader* h = (GptHeader*)gpt->primary_header; |
- GptEntry* entries = (GptEntry*)gpt->primary_entries; |
- GptEntry* e; |
- int i; |
- |
- for (i = 0, e = entries; i < h->number_of_entries; i++, e++) { |
- if (!IsKernelEntry(e)) |
- continue; |
- |
-#ifdef PRINT_DEBUG_INFO |
- |
- printf("%2d %08x %04x %04x %02x %02x %02x %02x %02x %02x %02x %02x", |
- i, |
- e->type.u.Uuid.time_low, |
- e->type.u.Uuid.time_mid, |
- e->type.u.Uuid.time_high_and_version, |
- e->type.u.Uuid.clock_seq_high_and_reserved, |
- e->type.u.Uuid.clock_seq_low, |
- e->type.u.Uuid.node[0], |
- e->type.u.Uuid.node[1], |
- e->type.u.Uuid.node[2], |
- e->type.u.Uuid.node[3], |
- e->type.u.Uuid.node[4], |
- e->type.u.Uuid.node[5] |
- ); |
- printf(" %8" PRIu64 " %8" PRIu64"\n", e->starting_lba, |
- e->ending_lba - e->starting_lba + 1); |
- printf("Hacking attributes for kernel partition %d\n", i); |
#endif |
- SetEntryPriority(e, 2); |
- SetEntrySuccessful(e, 1); |
- } |
-} |
- |
- |
-/* Allocates and reads 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(GptData* gptdata) { |
- |
- uint64_t entries_sectors = GPT_ENTRIES_SIZE / gptdata->sector_bytes; |
- |
- /* No data to be written yet */ |
- gptdata->modified = 0; |
- |
- /* Allocate all buffers */ |
- gptdata->primary_header = (uint8_t*)Malloc(gptdata->sector_bytes); |
- gptdata->secondary_header = (uint8_t*)Malloc(gptdata->sector_bytes); |
- gptdata->primary_entries = (uint8_t*)Malloc(GPT_ENTRIES_SIZE); |
- gptdata->secondary_entries = (uint8_t*)Malloc(GPT_ENTRIES_SIZE); |
- |
- if (gptdata->primary_header == NULL || gptdata->secondary_header == NULL || |
- gptdata->primary_entries == NULL || gptdata->secondary_entries == NULL) |
- return 1; |
- |
- /* Read data from the drive, skipping the protective MBR */ |
- if (0 != BootDeviceReadLBA(1, 1, gptdata->primary_header)) |
- return 1; |
- if (0 != BootDeviceReadLBA(2, entries_sectors, gptdata->primary_entries)) |
- return 1; |
- if (0 != BootDeviceReadLBA(gptdata->drive_sectors - entries_sectors - 1, |
- entries_sectors, gptdata->secondary_entries)) |
- return 1; |
- if (0 != BootDeviceReadLBA(gptdata->drive_sectors - 1, |
- 1, gptdata->secondary_header)) |
- return 1; |
- |
- return 0; |
-} |
- |
- |
-/* Writes any changes for the GPT data back to the drive, then frees |
- * the buffers. |
- * |
- * Returns 0 if successful, 1 if error. */ |
-int WriteAndFreeGptData(GptData* gptdata) { |
- |
- uint64_t entries_sectors = GPT_ENTRIES_SIZE / gptdata->sector_bytes; |
- |
- if (gptdata->primary_header) { |
- if (gptdata->modified & GPT_MODIFIED_HEADER1) { |
- if (0 != BootDeviceWriteLBA(1, 1, gptdata->primary_header)) |
- return 1; |
- } |
- Free(gptdata->primary_header); |
- } |
- |
- if (gptdata->primary_entries) { |
- if (gptdata->modified & GPT_MODIFIED_ENTRIES1) { |
- if (0 != BootDeviceWriteLBA(2, entries_sectors, |
- gptdata->primary_entries)) |
- return 1; |
- } |
- Free(gptdata->primary_entries); |
- } |
- |
- if (gptdata->secondary_entries) { |
- if (gptdata->modified & GPT_MODIFIED_ENTRIES2) { |
- if (0 != BootDeviceWriteLBA(gptdata->drive_sectors - entries_sectors - 1, |
- entries_sectors, gptdata->secondary_entries)) |
- return 1; |
- } |
- Free(gptdata->secondary_entries); |
- } |
- |
- if (gptdata->secondary_header) { |
- if (gptdata->modified & GPT_MODIFIED_HEADER2) { |
- if (0 != BootDeviceWriteLBA(gptdata->drive_sectors - 1, 1, |
- gptdata->secondary_header)) |
- return 1; |
- } |
- Free(gptdata->secondary_header); |
- } |
- |
- /* Success */ |
- return 0; |
-} |
- |
#define KBUF_SIZE 65536 /* Bytes to read at start of kernel partition */ |
@@ -194,9 +70,6 @@ int LoadKernel(LoadKernelParams* params) { |
if (GPT_SUCCESS != GptInit(&gpt)) |
break; |
- /* TODO: TERRIBLE KLUDGE - fake partition attributes */ |
- FakePartitionAttributes(&gpt); |
- |
/* Allocate kernel header and image work buffers */ |
kbuf = (uint8_t*)Malloc(KBUF_SIZE); |
if (!kbuf) |