| 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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 if (0 != status) { | 118 if (0 != status) { |
| 119 VBDEBUG(("Unable to setup TPM and read stored versions.\n")); | 119 VBDEBUG(("Unable to setup TPM and read stored versions.\n")); |
| 120 VBPERFEND("VB_TPMI"); | 120 VBPERFEND("VB_TPMI"); |
| 121 if (status == TPM_E_MUST_REBOOT) | 121 if (status == TPM_E_MUST_REBOOT) |
| 122 retval = LOAD_FIRMWARE_REBOOT; | 122 retval = LOAD_FIRMWARE_REBOOT; |
| 123 else | 123 else |
| 124 recovery = VBNV_RECOVERY_RO_TPM_ERROR; | 124 recovery = VBNV_RECOVERY_RO_TPM_ERROR; |
| 125 goto LoadFirmwareExit; | 125 goto LoadFirmwareExit; |
| 126 } | 126 } |
| 127 shared->fw_version_tpm_start = tpm_version; | 127 shared->fw_version_tpm_start = tpm_version; |
| 128 shared->fw_version_tpm = tpm_version; |
| 128 VBPERFEND("VB_TPMI"); | 129 VBPERFEND("VB_TPMI"); |
| 129 | 130 |
| 130 /* Read try-b count and decrement if necessary */ | 131 /* Read try-b count and decrement if necessary */ |
| 131 VbNvGet(vnc, VBNV_TRY_B_COUNT, &try_b_count); | 132 VbNvGet(vnc, VBNV_TRY_B_COUNT, &try_b_count); |
| 132 if (0 != try_b_count) { | 133 if (0 != try_b_count) { |
| 133 VbNvSet(vnc, VBNV_TRY_B_COUNT, try_b_count - 1); | 134 VbNvSet(vnc, VBNV_TRY_B_COUNT, try_b_count - 1); |
| 134 shared->flags |= VBSD_FWB_TRIED; | 135 shared->flags |= VBSD_FWB_TRIED; |
| 135 } | 136 } |
| 136 VbNvSet(vnc, VBNV_TRIED_FIRMWARE_B, try_b_count ? 1 : 0); | 137 VbNvSet(vnc, VBNV_TRIED_FIRMWARE_B, try_b_count ? 1 : 0); |
| 137 | 138 |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 status = RollbackFirmwareWrite((uint32_t)lowest_version); | 341 status = RollbackFirmwareWrite((uint32_t)lowest_version); |
| 341 VBPERFEND("VB_TPMU"); | 342 VBPERFEND("VB_TPMU"); |
| 342 if (0 != status) { | 343 if (0 != status) { |
| 343 VBDEBUG(("Unable to write stored versions.\n")); | 344 VBDEBUG(("Unable to write stored versions.\n")); |
| 344 if (status == TPM_E_MUST_REBOOT) | 345 if (status == TPM_E_MUST_REBOOT) |
| 345 retval = LOAD_FIRMWARE_REBOOT; | 346 retval = LOAD_FIRMWARE_REBOOT; |
| 346 else | 347 else |
| 347 recovery = VBNV_RECOVERY_RO_TPM_ERROR; | 348 recovery = VBNV_RECOVERY_RO_TPM_ERROR; |
| 348 goto LoadFirmwareExit; | 349 goto LoadFirmwareExit; |
| 349 } | 350 } |
| 351 shared->fw_version_tpm = (uint32_t)lowest_version; |
| 350 } | 352 } |
| 351 | 353 |
| 352 /* Lock firmware versions in TPM */ | 354 /* Lock firmware versions in TPM */ |
| 353 VBPERFSTART("VB_TPML"); | 355 VBPERFSTART("VB_TPML"); |
| 354 status = RollbackFirmwareLock(); | 356 status = RollbackFirmwareLock(); |
| 355 VBPERFEND("VB_TPML"); | 357 VBPERFEND("VB_TPML"); |
| 356 if (0 != status) { | 358 if (0 != status) { |
| 357 VBDEBUG(("Unable to lock firmware versions.\n")); | 359 VBDEBUG(("Unable to lock firmware versions.\n")); |
| 358 if (status == TPM_E_MUST_REBOOT) | 360 if (status == TPM_E_MUST_REBOOT) |
| 359 retval = LOAD_FIRMWARE_REBOOT; | 361 retval = LOAD_FIRMWARE_REBOOT; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 uint32_t status = RollbackS3Resume(); | 398 uint32_t status = RollbackS3Resume(); |
| 397 | 399 |
| 398 /* If we can't resume, just do a full reboot. No need to go to recovery | 400 /* If we can't resume, just do a full reboot. No need to go to recovery |
| 399 * mode here, since if the TPM is really broken we'll catch it on the | 401 * mode here, since if the TPM is really broken we'll catch it on the |
| 400 * next boot. */ | 402 * next boot. */ |
| 401 if (status == TPM_SUCCESS) | 403 if (status == TPM_SUCCESS) |
| 402 return LOAD_FIRMWARE_SUCCESS; | 404 return LOAD_FIRMWARE_SUCCESS; |
| 403 else | 405 else |
| 404 return LOAD_FIRMWARE_REBOOT; | 406 return LOAD_FIRMWARE_REBOOT; |
| 405 } | 407 } |
| OLD | NEW |