Index: firmware/lib/vboot_kernel.c |
diff --git a/firmware/lib/vboot_kernel.c b/firmware/lib/vboot_kernel.c |
index d26ef6ff0d2de7c912ff40d9934ebfa56e41b680..a0a76566748930022be6c6cfafd14bce3ce35f99 100644 |
--- a/firmware/lib/vboot_kernel.c |
+++ b/firmware/lib/vboot_kernel.c |
@@ -134,22 +134,20 @@ int LoadKernel(LoadKernelParams* params) { |
params->bootloader_address = 0; |
params->bootloader_size = 0; |
- /* Set up TPM; required in all modes */ |
- if (0 != SetupTPM( |
- ((BOOT_FLAG_RECOVERY & params->boot_flags) ? |
- RO_RECOVERY_MODE : RW_NORMAL_MODE), |
- ((BOOT_FLAG_DEVELOPER & params->boot_flags) ? 1 : 0))) { |
- debug("Error setting up TPM\n"); |
- return LOAD_KERNEL_RECOVERY; |
+ /* Let the TPM know if we're in recovery mode */ |
+ if (BOOT_FLAG_RECOVERY & params->boot_flags) { |
+ if (0 != RollbackKernelRecovery(BOOT_FLAG_DEVELOPER & params->boot_flags |
+ ? 1 : 0)) { |
+ debug("Error setting up TPM for recovery kernel\n"); |
+ return LOAD_KERNEL_RECOVERY; |
+ } |
} |
if (is_normal) { |
/* Read current kernel key index from TPM. Assumes TPM is already |
* initialized. */ |
- if (0 != GetStoredVersions(KERNEL_VERSIONS, |
- &tpm_key_version, |
- &tpm_kernel_version)) { |
- debug("Unable to get stored version from TPM\n"); |
+ if (0 != RollbackKernelRead(&tpm_key_version, &tpm_kernel_version)) { |
+ debug("Unable to get kernel versions from TPM\n"); |
return LOAD_KERNEL_RECOVERY; |
} |
} else if (is_dev) { |
@@ -368,25 +366,18 @@ int LoadKernel(LoadKernelParams* params) { |
if ((lowest_key_version > tpm_key_version) || |
(lowest_key_version == tpm_key_version && |
lowest_kernel_version > tpm_kernel_version)) { |
- if (0 != WriteStoredVersions(KERNEL_VERSIONS, |
- (uint16_t)lowest_key_version, |
- (uint16_t)lowest_kernel_version)) |
+ if (0 != RollbackKernelWrite((uint16_t)lowest_key_version, |
+ (uint16_t)lowest_kernel_version)) { |
+ debug("Error writing kernel versions to TPM.\n"); |
return LOAD_KERNEL_RECOVERY; |
+ } |
} |
} |
- if (!(BOOT_FLAG_RECOVERY & params->boot_flags)) { |
- /* We can lock the TPM now, since we've decided which kernel we |
- * like. If we don't find a good kernel, we leave the TPM |
- * unlocked so we can try again on the next boot device. If no |
- * kernels are good, we'll reboot to recovery mode, so it's ok to |
- * leave the TPM unlocked in that case too. |
- * |
- * If we're already in recovery mode, we need to leave PP unlocked, |
- * so don't lock the kernel versions. */ |
- debug("Lock kernel versions\n"); |
- if (0 != LockKernelVersionsByLockingPP()) |
- return LOAD_KERNEL_RECOVERY; |
+ /* Lock the kernel versions, since we're about to boot the kernel */ |
+ if (0 != RollbackKernelLock()) { |
+ debug("Error locking kernel versions.\n"); |
+ return LOAD_KERNEL_RECOVERY; |
} |
/* Success! */ |