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 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 int retval = LOAD_KERNEL_RECOVERY; | 142 int retval = LOAD_KERNEL_RECOVERY; |
143 int recovery = VBNV_RECOVERY_RO_UNSPECIFIED; | 143 int recovery = VBNV_RECOVERY_RO_UNSPECIFIED; |
| 144 uint64_t timer_enter = VbGetTimer(); |
144 | 145 |
145 /* Setup NV storage */ | 146 /* Setup NV storage */ |
146 VbNvSetup(vnc); | 147 VbNvSetup(vnc); |
147 | 148 |
148 /* Sanity Checks */ | 149 /* Sanity Checks */ |
149 if (!params || | 150 if (!params || |
150 !params->bytes_per_lba || | 151 !params->bytes_per_lba || |
151 !params->ending_lba || | 152 !params->ending_lba || |
152 !params->kernel_buffer || | 153 !params->kernel_buffer || |
153 !params->kernel_buffer_size) { | 154 !params->kernel_buffer_size) { |
154 VBDEBUG(("LoadKernel() called with invalid params\n")); | 155 VBDEBUG(("LoadKernel() called with invalid params\n")); |
155 goto LoadKernelExit; | 156 goto LoadKernelExit; |
156 } | 157 } |
157 | 158 |
| 159 /* Clear output params in case we fail */ |
| 160 params->partition_number = 0; |
| 161 params->bootloader_address = 0; |
| 162 params->bootloader_size = 0; |
| 163 |
158 /* Handle test errors */ | 164 /* Handle test errors */ |
159 VbNvGet(vnc, VBNV_TEST_ERROR_FUNC, &test_err); | 165 VbNvGet(vnc, VBNV_TEST_ERROR_FUNC, &test_err); |
160 if (VBNV_TEST_ERROR_LOAD_KERNEL == test_err) { | 166 if (VBNV_TEST_ERROR_LOAD_KERNEL == test_err) { |
161 /* Get error code */ | 167 /* Get error code */ |
162 VbNvGet(vnc, VBNV_TEST_ERROR_NUM, &test_err); | 168 VbNvGet(vnc, VBNV_TEST_ERROR_NUM, &test_err); |
163 /* Clear test params so we don't repeat the error */ | 169 /* Clear test params so we don't repeat the error */ |
164 VbNvSet(vnc, VBNV_TEST_ERROR_FUNC, 0); | 170 VbNvSet(vnc, VBNV_TEST_ERROR_FUNC, 0); |
165 VbNvSet(vnc, VBNV_TEST_ERROR_NUM, 0); | 171 VbNvSet(vnc, VBNV_TEST_ERROR_NUM, 0); |
166 /* Handle error codes */ | 172 /* Handle error codes */ |
167 switch (test_err) { | 173 switch (test_err) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 recovery = VBNV_RECOVERY_RW_DEV_MISMATCH; | 205 recovery = VBNV_RECOVERY_RW_DEV_MISMATCH; |
200 goto LoadKernelExit; | 206 goto LoadKernelExit; |
201 } | 207 } |
202 boot_mode = kBootDev; | 208 boot_mode = kBootDev; |
203 } else { | 209 } else { |
204 /* Normal firmware */ | 210 /* Normal firmware */ |
205 boot_mode = kBootNormal; | 211 boot_mode = kBootNormal; |
206 dev_switch = 0; /* Always do a fully verified boot */ | 212 dev_switch = 0; /* Always do a fully verified boot */ |
207 } | 213 } |
208 | 214 |
209 /* Clear output params in case we fail */ | |
210 params->partition_number = 0; | |
211 params->bootloader_address = 0; | |
212 params->bootloader_size = 0; | |
213 | |
214 if (kBootRecovery == boot_mode) { | 215 if (kBootRecovery == boot_mode) { |
215 /* Initialize the shared data structure, since LoadFirmware() didn't do it | 216 /* Initialize the shared data structure, since LoadFirmware() didn't do it |
216 * for us. */ | 217 * for us. */ |
217 if (0 != VbSharedDataInit(shared, params->shared_data_size)) { | 218 if (0 != VbSharedDataInit(shared, params->shared_data_size)) { |
218 /* Error initializing the shared data, but we can keep going. We just | 219 /* Error initializing the shared data, but we can keep going. We just |
219 * can't use the shared data. */ | 220 * can't use the shared data. */ |
220 VBDEBUG(("Shared data init error\n")); | 221 VBDEBUG(("Shared data init error\n")); |
221 params->shared_data_size = 0; | 222 params->shared_data_size = 0; |
222 shared = NULL; | 223 shared = NULL; |
223 } | 224 } |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 LoadKernelExit: | 550 LoadKernelExit: |
550 | 551 |
551 /* Save whether the good partition's key block was fully verified */ | 552 /* Save whether the good partition's key block was fully verified */ |
552 VbNvSet(vnc, VBNV_FW_VERIFIED_KERNEL_KEY, good_partition_key_block_valid); | 553 VbNvSet(vnc, VBNV_FW_VERIFIED_KERNEL_KEY, good_partition_key_block_valid); |
553 | 554 |
554 /* Store recovery request, if any, then tear down non-volatile storage */ | 555 /* Store recovery request, if any, then tear down non-volatile storage */ |
555 VbNvSet(vnc, VBNV_RECOVERY_REQUEST, LOAD_KERNEL_RECOVERY == retval ? | 556 VbNvSet(vnc, VBNV_RECOVERY_REQUEST, LOAD_KERNEL_RECOVERY == retval ? |
556 recovery : VBNV_RECOVERY_NOT_REQUESTED); | 557 recovery : VBNV_RECOVERY_NOT_REQUESTED); |
557 VbNvTeardown(vnc); | 558 VbNvTeardown(vnc); |
558 | 559 |
559 /* Store how much shared data we used, if any */ | 560 if (shared) { |
560 if (shared) | 561 /* Save timer values */ |
| 562 shared->timer_load_kernel_enter = timer_enter; |
| 563 shared->timer_load_kernel_exit = VbGetTimer(); |
| 564 /* Store how much shared data we used, if any */ |
561 params->shared_data_size = shared->data_used; | 565 params->shared_data_size = shared->data_used; |
| 566 } |
562 | 567 |
563 return retval; | 568 return retval; |
564 } | 569 } |
OLD | NEW |