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 * High-level firmware API for loading and verifying rewritable firmware. | 5 * High-level firmware API for loading and verifying rewritable firmware. |
6 * (Firmware portion) | 6 * (Firmware portion) |
7 */ | 7 */ |
8 | 8 |
9 #include "gbb_header.h" | 9 #include "gbb_header.h" |
10 #include "load_firmware_fw.h" | 10 #include "load_firmware_fw.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 VbLoadFirmwareInternal* lfi = | 29 VbLoadFirmwareInternal* lfi = |
30 (VbLoadFirmwareInternal*)params->load_firmware_internal; | 30 (VbLoadFirmwareInternal*)params->load_firmware_internal; |
31 | 31 |
32 DigestUpdate(&lfi->body_digest_context, data, size); | 32 DigestUpdate(&lfi->body_digest_context, data, size); |
33 lfi->body_size_accum += size; | 33 lfi->body_size_accum += size; |
34 } | 34 } |
35 | 35 |
36 | 36 |
37 int LoadFirmwareSetup(void) { | 37 int LoadFirmwareSetup(void) { |
38 /* TODO: handle test errors (requires passing in VbNvContext) */ | 38 /* TODO: handle test errors (requires passing in VbNvContext) */ |
| 39 /* TODO: record timer values (requires passing in VbSharedData) */ |
39 /* TODO: start initializing the TPM */ | 40 /* TODO: start initializing the TPM */ |
40 return LOAD_FIRMWARE_SUCCESS; | 41 return LOAD_FIRMWARE_SUCCESS; |
41 } | 42 } |
42 | 43 |
43 | 44 |
44 int LoadFirmware(LoadFirmwareParams* params) { | 45 int LoadFirmware(LoadFirmwareParams* params) { |
45 VbSharedDataHeader* shared = (VbSharedDataHeader*)params->shared_data_blob; | 46 VbSharedDataHeader* shared = (VbSharedDataHeader*)params->shared_data_blob; |
46 GoogleBinaryBlockHeader* gbb = (GoogleBinaryBlockHeader*)params->gbb_data; | 47 GoogleBinaryBlockHeader* gbb = (GoogleBinaryBlockHeader*)params->gbb_data; |
47 VbPublicKey* root_key; | 48 VbPublicKey* root_key; |
48 VbLoadFirmwareInternal* lfi; | 49 VbLoadFirmwareInternal* lfi; |
(...skipping 20 matching lines...) Expand all Loading... |
69 | 70 |
70 /* Setup NV storage */ | 71 /* Setup NV storage */ |
71 VbNvSetup(vnc); | 72 VbNvSetup(vnc); |
72 | 73 |
73 /* Initialize shared data structure. */ | 74 /* Initialize shared data structure. */ |
74 if (0 != VbSharedDataInit(shared, params->shared_data_size)) { | 75 if (0 != VbSharedDataInit(shared, params->shared_data_size)) { |
75 VBDEBUG(("Shared data init error\n")); | 76 VBDEBUG(("Shared data init error\n")); |
76 recovery = VBNV_RECOVERY_RO_SHARED_DATA; | 77 recovery = VBNV_RECOVERY_RO_SHARED_DATA; |
77 goto LoadFirmwareExit; | 78 goto LoadFirmwareExit; |
78 } | 79 } |
| 80 shared->timer_load_firmware_enter = VbGetTimer(); |
79 | 81 |
80 /* Handle test errors */ | 82 /* Handle test errors */ |
81 VbNvGet(vnc, VBNV_TEST_ERROR_FUNC, &test_err); | 83 VbNvGet(vnc, VBNV_TEST_ERROR_FUNC, &test_err); |
82 if (VBNV_TEST_ERROR_LOAD_FIRMWARE == test_err) { | 84 if (VBNV_TEST_ERROR_LOAD_FIRMWARE == test_err) { |
83 /* Get error code */ | 85 /* Get error code */ |
84 VbNvGet(vnc, VBNV_TEST_ERROR_NUM, &test_err); | 86 VbNvGet(vnc, VBNV_TEST_ERROR_NUM, &test_err); |
85 /* Clear test params so we don't repeat the error */ | 87 /* Clear test params so we don't repeat the error */ |
86 VbNvSet(vnc, VBNV_TEST_ERROR_FUNC, 0); | 88 VbNvSet(vnc, VBNV_TEST_ERROR_FUNC, 0); |
87 VbNvSet(vnc, VBNV_TEST_ERROR_NUM, 0); | 89 VbNvSet(vnc, VBNV_TEST_ERROR_NUM, 0); |
88 /* Handle error codes */ | 90 /* Handle error codes */ |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 VBDEBUG(("Alas, no good firmware.\n")); | 347 VBDEBUG(("Alas, no good firmware.\n")); |
346 recovery = VBNV_RECOVERY_RO_INVALID_RW; | 348 recovery = VBNV_RECOVERY_RO_INVALID_RW; |
347 } | 349 } |
348 | 350 |
349 LoadFirmwareExit: | 351 LoadFirmwareExit: |
350 /* Store recovery request, if any, then tear down non-volatile storage */ | 352 /* Store recovery request, if any, then tear down non-volatile storage */ |
351 VbNvSet(vnc, VBNV_RECOVERY_REQUEST, LOAD_FIRMWARE_RECOVERY == retval ? | 353 VbNvSet(vnc, VBNV_RECOVERY_REQUEST, LOAD_FIRMWARE_RECOVERY == retval ? |
352 recovery : VBNV_RECOVERY_NOT_REQUESTED); | 354 recovery : VBNV_RECOVERY_NOT_REQUESTED); |
353 VbNvTeardown(vnc); | 355 VbNvTeardown(vnc); |
354 | 356 |
| 357 shared->timer_load_firmware_exit = VbGetTimer(); |
| 358 |
355 /* Note that we don't reduce params->shared_data_size to shared->data_used, | 359 /* Note that we don't reduce params->shared_data_size to shared->data_used, |
356 * since we want to leave space for LoadKernel() to add to the shared data | 360 * since we want to leave space for LoadKernel() to add to the shared data |
357 * buffer. */ | 361 * buffer. */ |
358 | 362 |
359 return retval; | 363 return retval; |
360 } | 364 } |
361 | 365 |
362 | 366 |
363 int S3Resume(void) { | 367 int S3Resume(void) { |
364 | 368 |
365 /* TODO: handle test errors (requires passing in VbNvContext) */ | 369 /* TODO: handle test errors (requires passing in VbNvContext) */ |
366 | 370 |
367 /* Resume the TPM */ | 371 /* Resume the TPM */ |
368 uint32_t status = RollbackS3Resume(); | 372 uint32_t status = RollbackS3Resume(); |
369 | 373 |
370 /* If we can't resume, just do a full reboot. No need to go to recovery | 374 /* If we can't resume, just do a full reboot. No need to go to recovery |
371 * mode here, since if the TPM is really broken we'll catch it on the | 375 * mode here, since if the TPM is really broken we'll catch it on the |
372 * next boot. */ | 376 * next boot. */ |
373 if (status == TPM_SUCCESS) | 377 if (status == TPM_SUCCESS) |
374 return LOAD_FIRMWARE_SUCCESS; | 378 return LOAD_FIRMWARE_SUCCESS; |
375 else | 379 else |
376 return LOAD_FIRMWARE_REBOOT; | 380 return LOAD_FIRMWARE_REBOOT; |
377 } | 381 } |
OLD | NEW |