added reboot return codes to load kernel and firmware

Review URL: http://codereview.chromium.org/2844044
This commit is contained in:
Randall Spangler
2010-07-08 13:29:42 -07:00
parent 416f681882
commit 7a786b73e7
7 changed files with 41 additions and 17 deletions

View File

@@ -19,6 +19,7 @@
/* Return codes for LoadFirmware() */
#define LOAD_FIRMWARE_SUCCESS 0 /* Success */
#define LOAD_FIRMWARE_RECOVERY 1 /* Reboot to recovery mode */
#define LOAD_FIRMWARE_REBOOT 2 /* Reboot to same mode as current boot */
/* Boot flags for LoadFirmware().boot_flags */
#define BOOT_FLAG_DEVELOPER UINT64_C(0x01) /* Developer switch is on */

View File

@@ -18,6 +18,8 @@
#define LOAD_KERNEL_NOT_FOUND 1 /* No kernel found on device */
#define LOAD_KERNEL_INVALID 2 /* Only invalid kernels found on device */
#define LOAD_KERNEL_RECOVERY 3 /* Internal error; reboot to recovery mode */
#define LOAD_KERNEL_REBOOT 4 /* Internal error; reboot to current mode */
/* Boot flags for LoadKernel().boot_flags */
#define BOOT_FLAG_DEVELOPER UINT64_C(0x01) /* Developer switch is on */

View File

@@ -10,6 +10,7 @@
#define VBOOT_REFERENCE_ROLLBACK_INDEX_H_
#include "sysincludes.h"
#include "tss_constants.h"
/* Rollback version types. */
#define FIRMWARE_VERSIONS 0

View File

@@ -20,6 +20,7 @@ __pragma(warning (disable: 4127))
#define RETURN_ON_FAILURE(tpm_command) do { \
uint32_t result; \
if ((result = (tpm_command)) != TPM_SUCCESS) { \
VBDEBUG(("Rollback: %08x returned by " #tpm_command "\n", (int)result)); \
return result; \
} \
} while (0)

View File

@@ -40,6 +40,7 @@ int LoadFirmware(LoadFirmwareParams* params) {
uint16_t tpm_fw_version = 0;
uint64_t lowest_key_version = 0xFFFF;
uint64_t lowest_fw_version = 0xFFFF;
uint32_t status;
int good_index = -1;
int index;
@@ -60,13 +61,17 @@ int LoadFirmware(LoadFirmwareParams* params) {
}
/* Initialize the TPM and read rollback indices. */
if (0 != RollbackFirmwareSetup(params->boot_flags & BOOT_FLAG_DEVELOPER)) {
status = RollbackFirmwareSetup(params->boot_flags & BOOT_FLAG_DEVELOPER);
if (0 != status) {
VBDEBUG(("Unable to setup TPM.\n"));
return LOAD_FIRMWARE_RECOVERY;
return (status == TPM_E_MUST_REBOOT ?
LOAD_FIRMWARE_REBOOT : LOAD_FIRMWARE_RECOVERY);
}
if (0 != RollbackFirmwareRead(&tpm_key_version, &tpm_fw_version)) {
status = RollbackFirmwareRead(&tpm_key_version, &tpm_fw_version);
if (0 != status) {
VBDEBUG(("Unable to read stored versions.\n"));
return LOAD_FIRMWARE_RECOVERY;
return (status == TPM_E_MUST_REBOOT ?
LOAD_FIRMWARE_REBOOT : LOAD_FIRMWARE_RECOVERY);
}
/* Allocate our internal data */
@@ -219,17 +224,23 @@ int LoadFirmware(LoadFirmwareParams* params) {
if ((lowest_key_version > tpm_key_version) ||
(lowest_key_version == tpm_key_version &&
lowest_fw_version > tpm_fw_version)) {
if (0 != RollbackFirmwareWrite((uint16_t)lowest_key_version,
(uint16_t)lowest_fw_version)) {
status = RollbackFirmwareWrite((uint16_t)lowest_key_version,
(uint16_t)lowest_fw_version);
if (0 != status) {
VBDEBUG(("Unable to write stored versions.\n"));
return LOAD_FIRMWARE_RECOVERY;
return (status == TPM_E_MUST_REBOOT ?
LOAD_FIRMWARE_REBOOT : LOAD_FIRMWARE_RECOVERY);
}
}
/* Lock firmware versions in TPM */
if (0 != RollbackFirmwareLock()) {
status = RollbackFirmwareLock();
if (0 != status) {
VBDEBUG(("Unable to lock firmware versions.\n"));
return LOAD_FIRMWARE_RECOVERY;
return (status == TPM_E_MUST_REBOOT ?
LOAD_FIRMWARE_REBOOT : LOAD_FIRMWARE_RECOVERY);
}
/* Success */

View File

@@ -129,6 +129,7 @@ int LoadKernel(LoadKernelParams* params) {
int is_dev = (BOOT_FLAG_DEVELOPER & params->boot_flags ? 1 : 0);
int is_rec = (BOOT_FLAG_RECOVERY & params->boot_flags ? 1 : 0);
int is_normal = (!is_dev && !is_rec);
uint32_t status;
/* Clear output params in case we fail */
params->partition_number = 0;
@@ -147,9 +148,11 @@ int LoadKernel(LoadKernelParams* params) {
if (is_normal) {
/* Read current kernel key index from TPM. Assumes TPM is already
* initialized. */
if (0 != RollbackKernelRead(&tpm_key_version, &tpm_kernel_version)) {
status = RollbackKernelRead(&tpm_key_version, &tpm_kernel_version);
if (0 != status) {
VBDEBUG(("Unable to get kernel versions from TPM\n"));
return LOAD_KERNEL_RECOVERY;
return (status == TPM_E_MUST_REBOOT ?
LOAD_KERNEL_REBOOT : LOAD_KERNEL_RECOVERY);
}
} else if (is_dev && !is_rec) {
/* In developer mode, we ignore the kernel subkey, and just use
@@ -367,20 +370,25 @@ int LoadKernel(LoadKernelParams* params) {
if ((lowest_key_version > tpm_key_version) ||
(lowest_key_version == tpm_key_version &&
lowest_kernel_version > tpm_kernel_version)) {
if (0 != RollbackKernelWrite((uint16_t)lowest_key_version,
(uint16_t)lowest_kernel_version)) {
status = RollbackKernelWrite((uint16_t)lowest_key_version,
(uint16_t)lowest_kernel_version);
if (0 != status) {
VBDEBUG(("Error writing kernel versions to TPM.\n"));
return LOAD_KERNEL_RECOVERY;
return (status == TPM_E_MUST_REBOOT ?
LOAD_KERNEL_REBOOT : LOAD_KERNEL_RECOVERY);
}
}
}
/* Lock the kernel versions */
if (0 != RollbackKernelLock()) {
status = RollbackKernelLock();
if (0 != status) {
VBDEBUG(("Error locking kernel versions.\n"));
/* Don't reboot to recovery mode if we're already there */
if (!is_rec)
return LOAD_KERNEL_RECOVERY;
return (status == TPM_E_MUST_REBOOT ?
LOAD_KERNEL_REBOOT : LOAD_KERNEL_RECOVERY);
}
/* Success! */

View File

@@ -1 +1 @@
char* VbootVersion = "VBOOv=983af25b";
char* VbootVersion = "VBOOv=ba8bd4f8";