OLD | NEW |
1 /* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. | 1 /* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
2 * Use of this source code is governed by a BSD-style license that can be | 2 * Use of this source code is governed by a BSD-style license that can be |
3 * found in the LICENSE file. | 3 * found in the LICENSE file. |
4 * | 4 * |
5 * Functions for loading a kernel from disk. | 5 * Functions for loading a kernel from disk. |
6 * (Firmware portion) | 6 * (Firmware portion) |
7 */ | 7 */ |
8 | 8 |
9 #include "vboot_kernel.h" | 9 #include "vboot_kernel.h" |
10 | 10 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 int found_partitions = 0; | 132 int found_partitions = 0; |
133 int good_partition = -1; | 133 int good_partition = -1; |
134 int good_partition_key_block_valid = 0; | 134 int good_partition_key_block_valid = 0; |
135 uint32_t tpm_version = 0; | 135 uint32_t tpm_version = 0; |
136 uint64_t lowest_version = LOWEST_TPM_VERSION; | 136 uint64_t lowest_version = LOWEST_TPM_VERSION; |
137 int rec_switch, dev_switch; | 137 int rec_switch, dev_switch; |
138 BootMode boot_mode; | 138 BootMode boot_mode; |
139 uint32_t test_err = 0; | 139 uint32_t test_err = 0; |
140 uint32_t status; | 140 uint32_t status; |
141 | 141 |
142 /* TODO: differentiate between finding an invalid kernel (found_partitions>0) | 142 int retval = LOAD_KERNEL_RECOVERY; |
143 * and not finding one at all. Right now we treat them the same, and return | |
144 * LOAD_KERNEL_INVALID for both. */ | |
145 int retval = LOAD_KERNEL_INVALID; | |
146 int recovery = VBNV_RECOVERY_RO_UNSPECIFIED; | 143 int recovery = VBNV_RECOVERY_RO_UNSPECIFIED; |
147 | 144 |
148 /* Setup NV storage */ | 145 /* Setup NV storage */ |
149 VbNvSetup(vnc); | 146 VbNvSetup(vnc); |
150 | 147 |
151 /* Sanity Checks */ | 148 /* Sanity Checks */ |
152 if (!params || | 149 if (!params || |
153 !params->bytes_per_lba || | 150 !params->bytes_per_lba || |
154 !params->ending_lba || | 151 !params->ending_lba || |
155 !params->kernel_buffer || | 152 !params->kernel_buffer || |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 if (status == TPM_E_MUST_REBOOT) | 532 if (status == TPM_E_MUST_REBOOT) |
536 retval = LOAD_KERNEL_REBOOT; | 533 retval = LOAD_KERNEL_REBOOT; |
537 else | 534 else |
538 recovery = VBNV_RECOVERY_RW_TPM_ERROR; | 535 recovery = VBNV_RECOVERY_RW_TPM_ERROR; |
539 goto LoadKernelExit; | 536 goto LoadKernelExit; |
540 } | 537 } |
541 } | 538 } |
542 | 539 |
543 /* Success! */ | 540 /* Success! */ |
544 retval = LOAD_KERNEL_SUCCESS; | 541 retval = LOAD_KERNEL_SUCCESS; |
| 542 } else { |
| 543 /* TODO: differentiate between finding an invalid kernel |
| 544 * (found_partitions>0) and not finding one at all. Right now we |
| 545 * treat them the same, and return LOAD_KERNEL_INVALID for both. */ |
| 546 retval = LOAD_KERNEL_INVALID; |
545 } | 547 } |
546 | 548 |
547 LoadKernelExit: | 549 LoadKernelExit: |
548 | 550 |
549 /* Save whether the good partition's key block was fully verified */ | 551 /* Save whether the good partition's key block was fully verified */ |
550 VbNvSet(vnc, VBNV_FW_VERIFIED_KERNEL_KEY, good_partition_key_block_valid); | 552 VbNvSet(vnc, VBNV_FW_VERIFIED_KERNEL_KEY, good_partition_key_block_valid); |
551 | 553 |
552 /* Store recovery request, if any, then tear down non-volatile storage */ | 554 /* Store recovery request, if any, then tear down non-volatile storage */ |
553 VbNvSet(vnc, VBNV_RECOVERY_REQUEST, LOAD_KERNEL_RECOVERY == retval ? | 555 VbNvSet(vnc, VBNV_RECOVERY_REQUEST, LOAD_KERNEL_RECOVERY == retval ? |
554 recovery : VBNV_RECOVERY_NOT_REQUESTED); | 556 recovery : VBNV_RECOVERY_NOT_REQUESTED); |
555 VbNvTeardown(vnc); | 557 VbNvTeardown(vnc); |
556 | 558 |
557 /* Store how much shared data we used, if any */ | 559 /* Store how much shared data we used, if any */ |
558 if (shared) | 560 if (shared) |
559 params->shared_data_size = shared->data_used; | 561 params->shared_data_size = shared->data_used; |
560 | 562 |
561 return retval; | 563 return retval; |
562 } | 564 } |
OLD | NEW |