Index: firmware/lib/vboot_kernel.c |
diff --git a/firmware/lib/vboot_kernel.c b/firmware/lib/vboot_kernel.c |
index 5533f11c8d2e06bb6ff4eb92a1af12e5ff320b39..e6658d7518a69546c8a3fc743f748d97d16c1a46 100644 |
--- a/firmware/lib/vboot_kernel.c |
+++ b/firmware/lib/vboot_kernel.c |
@@ -124,10 +124,9 @@ int LoadKernel(LoadKernelParams* params) { |
uint16_t tpm_kernel_version = 0; |
uint64_t lowest_key_version = 0xFFFF; |
uint64_t lowest_kernel_version = 0xFFFF; |
- int is_dev = ((BOOT_FLAG_DEVELOPER & params->boot_flags) && |
- !(BOOT_FLAG_RECOVERY & params->boot_flags)); |
- int is_normal = (!(BOOT_FLAG_DEVELOPER & params->boot_flags) && |
- !(BOOT_FLAG_RECOVERY & params->boot_flags)); |
+ int is_dev = (BOOT_FLAG_DEVELOPER & params->boot_flags); |
+ int is_rec = (BOOT_FLAG_RECOVERY & params->boot_flags); |
+ int is_normal = (!is_dev && !is_rec); |
/* Clear output params in case we fail */ |
params->partition_number = 0; |
@@ -135,11 +134,11 @@ int LoadKernel(LoadKernelParams* params) { |
params->bootloader_size = 0; |
/* 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)) { |
+ if (is_rec) { |
+ if (0 != RollbackKernelRecovery(is_dev ? 1 : 0)) { |
Luigi Semenzato
2010/06/24 20:18:43
If our convention for booleans is 0 for false, and
|
VBDEBUG(("Error setting up TPM for recovery kernel\n")); |
- return LOAD_KERNEL_RECOVERY; |
+ /* Ignore return code, since we need to boot recovery mode to |
+ * fix the TPM. */ |
} |
} |
@@ -150,7 +149,7 @@ int LoadKernel(LoadKernelParams* params) { |
VBDEBUG(("Unable to get kernel versions from TPM\n")); |
return LOAD_KERNEL_RECOVERY; |
} |
- } else if (is_dev) { |
+ } else if (is_dev && !is_rec) { |
/* In developer mode, we ignore the kernel subkey, and just use |
* the SHA-512 hash to verify the key block. */ |
kernel_subkey = NULL; |
@@ -205,14 +204,14 @@ int LoadKernel(LoadKernelParams* params) { |
/* Check the key block flags against the current boot mode */ |
if (!(key_block->key_block_flags && |
- ((BOOT_FLAG_DEVELOPER & params->boot_flags) ? |
- KEY_BLOCK_FLAG_DEVELOPER_1 : KEY_BLOCK_FLAG_DEVELOPER_0))) { |
+ (is_dev ? KEY_BLOCK_FLAG_DEVELOPER_1 : |
+ KEY_BLOCK_FLAG_DEVELOPER_0))) { |
VBDEBUG(("Developer flag mismatch.\n")); |
continue; |
} |
if (!(key_block->key_block_flags && |
- ((BOOT_FLAG_RECOVERY & params->boot_flags) ? |
- KEY_BLOCK_FLAG_RECOVERY_1 : KEY_BLOCK_FLAG_RECOVERY_0))) { |
+ (is_rec ? KEY_BLOCK_FLAG_RECOVERY_1 : |
+ KEY_BLOCK_FLAG_RECOVERY_0))) { |
VBDEBUG(("Recovery flag mismatch.\n")); |
continue; |
} |
@@ -374,10 +373,12 @@ int LoadKernel(LoadKernelParams* params) { |
} |
} |
- /* Lock the kernel versions, since we're about to boot the kernel */ |
+ /* Lock the kernel versions */ |
Luigi Semenzato
2010/06/24 20:18:43
I think that here we may want to invert the condit
|
if (0 != RollbackKernelLock()) { |
VBDEBUG(("Error locking kernel versions.\n")); |
- return LOAD_KERNEL_RECOVERY; |
+ /* Don't reboot to recovery mode if we're already there */ |
+ if (!is_rec) |
+ return LOAD_KERNEL_RECOVERY; |
} |
/* Success! */ |