Chromium Code Reviews| 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! */ |