| Index: src/platform/vboot_reference/vboot_firmware/lib/load_kernel_fw.c
|
| diff --git a/src/platform/vboot_reference/vboot_firmware/lib/load_kernel_fw.c b/src/platform/vboot_reference/vboot_firmware/lib/load_kernel_fw.c
|
| index dec92d199a4c69d2c2acffff434e3ee536df186c..ba515a275a90fcea82f4c0da6e52efc2b04f689d 100644
|
| --- a/src/platform/vboot_reference/vboot_firmware/lib/load_kernel_fw.c
|
| +++ b/src/platform/vboot_reference/vboot_firmware/lib/load_kernel_fw.c
|
| @@ -18,6 +18,7 @@
|
|
|
| // TODO: for testing
|
| #include <stdio.h>
|
| +#include <inttypes.h> /* For PRIu64 macro */
|
| #include "cgptlib_internal.h"
|
|
|
| /* TODO: Remove this terrible hack which fakes partition attributes
|
| @@ -28,11 +29,10 @@ void FakePartitionAttributes(GptData* gpt) {
|
| GptEntry* e;
|
| int i;
|
| printf("Hacking partition attributes...\n");
|
| - printf("Note that GUIDs below have first 3 fields endian-swapped\n");
|
|
|
| for (i = 0, e = entries; i < 12; i++, e++) {
|
|
|
| - printf("%2d %08x %04x %04x %02x %02x %02x %02x %02x %02x %02x %02x\n",
|
| + 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,
|
| @@ -46,6 +46,8 @@ void FakePartitionAttributes(GptData* gpt) {
|
| 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);
|
| if (!IsKernelEntry(e))
|
| continue;
|
| printf("Hacking attributes for kernel partition %d\n", i);
|
| @@ -144,6 +146,11 @@ int LoadKernel(LoadKernelParams* params) {
|
| uint16_t lowest_kernel_version = 0xFFFF;
|
| KernelImage *kim = NULL;
|
|
|
| + /* Clear output params in case we fail */
|
| + params->partition_number = 0;
|
| + params->bootloader_address = 0;
|
| + params->bootloader_size = 0;
|
| +
|
| /* Read current kernel key index from TPM. Assumes TPM is already
|
| * initialized. */
|
| /* TODO: Is that a safe assumption? Normally, SetupTPM() would be called
|
| @@ -161,8 +168,6 @@ int LoadKernel(LoadKernelParams* params) {
|
| if (0 != AllocAndReadGptData(&gpt))
|
| break;
|
|
|
| - fprintf(stderr, "RRS1\n");
|
| -
|
| /* Initialize GPT library */
|
| if (GPT_SUCCESS != GptInit(&gpt))
|
| break;
|
| @@ -180,15 +185,11 @@ int LoadKernel(LoadKernelParams* params) {
|
| if (!kim)
|
| break;
|
|
|
| - fprintf(stderr, "RRS2\n");
|
| -
|
| /* Loop over candidate kernel partitions */
|
| while (GPT_SUCCESS == GptNextKernelEntry(&gpt, &part_start, &part_size)) {
|
| RSAPublicKey *kernel_sign_key = NULL;
|
| int kernel_start, kernel_sectors;
|
|
|
| - fprintf(stderr, "RRS3\n");
|
| -
|
| /* Found at least one kernel partition. */
|
| found_partition = 1;
|
|
|
| @@ -198,8 +199,6 @@ int LoadKernel(LoadKernelParams* params) {
|
| if (0 != BootDeviceReadLBA(part_start, kbuf_sectors, kbuf))
|
| continue;
|
|
|
| - fprintf(stderr, "RRS4\n");
|
| -
|
| /* Verify the kernel header and preamble */
|
| if (VERIFY_KERNEL_SUCCESS != VerifyKernelHeader(
|
| params->header_sign_key_blob,
|
| @@ -211,7 +210,17 @@ int LoadKernel(LoadKernelParams* params) {
|
| continue;
|
| }
|
|
|
| - fprintf(stderr, "RRS5\n");
|
| + printf("Kernel header:\n");
|
| + printf("header version: %d\n", kim->header_version);
|
| + printf("header len: %d\n", kim->header_len);
|
| + printf("firmware sign alg: %d\n", kim->firmware_sign_algorithm);
|
| + printf("kernel sign alg: %d\n", kim->kernel_sign_algorithm);
|
| + printf("kernel key version: %d\n", kim->kernel_key_version);
|
| + printf("kernel version: %d\n", kim->kernel_version);
|
| + printf("kernel len: %" PRIu64 "\n", kim->kernel_len);
|
| + printf("bootloader addr: %" PRIu64 "\n", kim->bootloader_offset);
|
| + printf("bootloader size: %" PRIu64 "\n", kim->bootloader_size);
|
| + printf("padded header size: %" PRIu64 "\n", kim->padded_header_size);
|
|
|
| /* Check for rollback of key version */
|
| if (kim->kernel_key_version < tpm_kernel_key_version) {
|
| @@ -270,8 +279,7 @@ int LoadKernel(LoadKernelParams* params) {
|
| if (-1 == good_partition) {
|
| good_partition = gpt.current_kernel;
|
| params->partition_number = gpt.current_kernel;
|
| - params->bootloader_start = (uint8_t*)params->kernel_buffer +
|
| - kim->bootloader_offset;
|
| + params->bootloader_address = kim->bootloader_offset;
|
| params->bootloader_size = kim->bootloader_size;
|
|
|
| /* If the good partition's key version is the same as the tpm, then
|
|
|