Index: firmware/lib/vboot_kernel.c |
diff --git a/firmware/lib/vboot_kernel.c b/firmware/lib/vboot_kernel.c |
index ea39f7b1bf6f0ebd7228aa20fc353d13b563d880..ee2890cfcd38ecc70a1dee670c5b031fb0bdfe1e 100644 |
--- a/firmware/lib/vboot_kernel.c |
+++ b/firmware/lib/vboot_kernel.c |
@@ -1,4 +1,4 @@ |
-/* Copyright (c) 2010-2011 The Chromium OS Authors. All rights reserved. |
+/* Copyright (c) 2011 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. |
* |
@@ -11,6 +11,7 @@ |
#include "boot_device.h" |
#include "cgptlib.h" |
#include "cgptlib_internal.h" |
+#include "gbb_header.h" |
#include "load_kernel_fw.h" |
#include "rollback_index.h" |
#include "utility.h" |
@@ -118,7 +119,9 @@ int WriteAndFreeGptData(GptData* gptdata) { |
__pragma(warning(disable: 4127)) |
int LoadKernel(LoadKernelParams* params) { |
+ VbSharedDataHeader* shared = (VbSharedDataHeader*)params->shared_data_blob; |
VbNvContext* vnc = params->nv_context; |
+ GoogleBinaryBlockHeader* gbb = (GoogleBinaryBlockHeader*)params->gbb_data; |
VbPublicKey* kernel_subkey; |
GptData gpt; |
uint64_t part_start, part_size; |
@@ -154,7 +157,6 @@ int LoadKernel(LoadKernelParams* params) { |
} |
/* Initialization */ |
- kernel_subkey = (VbPublicKey*)params->header_sign_key_blob; |
blba = params->bytes_per_lba; |
kbuf_sectors = KBUF_SIZE / blba; |
if (0 == kbuf_sectors) { |
@@ -187,14 +189,30 @@ int LoadKernel(LoadKernelParams* params) { |
params->bootloader_address = 0; |
params->bootloader_size = 0; |
- /* Let the TPM know if we're in recovery mode */ |
if (kBootRecovery == boot_mode) { |
+ /* Initialize the shared data structure, since LoadFirmware() didn't do it |
+ * for us. */ |
+ if (0 != VbSharedDataInit(shared, params->shared_data_size)) { |
+ /* Error initializing the shared data, but we can keep going. We just |
+ * can't use the shared data. */ |
+ VBDEBUG(("Shared data init error\n")); |
+ params->shared_data_size = 0; |
+ shared = NULL; |
+ } |
+ |
+ /* Use the recovery key to verify the kernel */ |
+ kernel_subkey = (VbPublicKey*)((uint8_t*)gbb + gbb->recovery_key_offset); |
+ |
+ /* Let the TPM know if we're in recovery mode */ |
if (0 != RollbackKernelRecovery(dev_switch)) { |
VBDEBUG(("Error setting up TPM for recovery kernel\n")); |
/* Ignore return code, since we need to boot recovery mode to |
* fix the TPM. */ |
} |
} else { |
+ /* Use the kernel subkey passed from LoadFirmware(). */ |
+ kernel_subkey = &shared->kernel_subkey; |
+ |
/* Read current kernel key index from TPM. Assumes TPM is already |
* initialized. */ |
status = RollbackKernelRead(&tpm_version); |
@@ -505,5 +523,9 @@ LoadKernelExit: |
recovery : VBNV_RECOVERY_NOT_REQUESTED); |
VbNvTeardown(vnc); |
+ /* Store how much shared data we used, if any */ |
+ if (shared) |
+ params->shared_data_size = shared->data_used; |
+ |
return retval; |
} |