mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-25 10:45:02 +00:00
added reboot return codes to load kernel and firmware
Review URL: http://codereview.chromium.org/2844044
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
/* Return codes for LoadFirmware() */
|
/* Return codes for LoadFirmware() */
|
||||||
#define LOAD_FIRMWARE_SUCCESS 0 /* Success */
|
#define LOAD_FIRMWARE_SUCCESS 0 /* Success */
|
||||||
#define LOAD_FIRMWARE_RECOVERY 1 /* Reboot to recovery mode */
|
#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 */
|
/* Boot flags for LoadFirmware().boot_flags */
|
||||||
#define BOOT_FLAG_DEVELOPER UINT64_C(0x01) /* Developer switch is on */
|
#define BOOT_FLAG_DEVELOPER UINT64_C(0x01) /* Developer switch is on */
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
#define LOAD_KERNEL_NOT_FOUND 1 /* No kernel found on device */
|
#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_INVALID 2 /* Only invalid kernels found on device */
|
||||||
#define LOAD_KERNEL_RECOVERY 3 /* Internal error; reboot to recovery mode */
|
#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 */
|
/* Boot flags for LoadKernel().boot_flags */
|
||||||
#define BOOT_FLAG_DEVELOPER UINT64_C(0x01) /* Developer switch is on */
|
#define BOOT_FLAG_DEVELOPER UINT64_C(0x01) /* Developer switch is on */
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#define VBOOT_REFERENCE_ROLLBACK_INDEX_H_
|
#define VBOOT_REFERENCE_ROLLBACK_INDEX_H_
|
||||||
|
|
||||||
#include "sysincludes.h"
|
#include "sysincludes.h"
|
||||||
|
#include "tss_constants.h"
|
||||||
|
|
||||||
/* Rollback version types. */
|
/* Rollback version types. */
|
||||||
#define FIRMWARE_VERSIONS 0
|
#define FIRMWARE_VERSIONS 0
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ __pragma(warning (disable: 4127))
|
|||||||
#define RETURN_ON_FAILURE(tpm_command) do { \
|
#define RETURN_ON_FAILURE(tpm_command) do { \
|
||||||
uint32_t result; \
|
uint32_t result; \
|
||||||
if ((result = (tpm_command)) != TPM_SUCCESS) { \
|
if ((result = (tpm_command)) != TPM_SUCCESS) { \
|
||||||
|
VBDEBUG(("Rollback: %08x returned by " #tpm_command "\n", (int)result)); \
|
||||||
return result; \
|
return result; \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ int LoadFirmware(LoadFirmwareParams* params) {
|
|||||||
uint16_t tpm_fw_version = 0;
|
uint16_t tpm_fw_version = 0;
|
||||||
uint64_t lowest_key_version = 0xFFFF;
|
uint64_t lowest_key_version = 0xFFFF;
|
||||||
uint64_t lowest_fw_version = 0xFFFF;
|
uint64_t lowest_fw_version = 0xFFFF;
|
||||||
|
uint32_t status;
|
||||||
int good_index = -1;
|
int good_index = -1;
|
||||||
int index;
|
int index;
|
||||||
|
|
||||||
@@ -60,13 +61,17 @@ int LoadFirmware(LoadFirmwareParams* params) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the TPM and read rollback indices. */
|
/* 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"));
|
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"));
|
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 */
|
/* Allocate our internal data */
|
||||||
@@ -219,17 +224,23 @@ int LoadFirmware(LoadFirmwareParams* params) {
|
|||||||
if ((lowest_key_version > tpm_key_version) ||
|
if ((lowest_key_version > tpm_key_version) ||
|
||||||
(lowest_key_version == tpm_key_version &&
|
(lowest_key_version == tpm_key_version &&
|
||||||
lowest_fw_version > tpm_fw_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"));
|
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 */
|
/* Lock firmware versions in TPM */
|
||||||
if (0 != RollbackFirmwareLock()) {
|
status = RollbackFirmwareLock();
|
||||||
|
if (0 != status) {
|
||||||
VBDEBUG(("Unable to lock firmware versions.\n"));
|
VBDEBUG(("Unable to lock firmware versions.\n"));
|
||||||
return LOAD_FIRMWARE_RECOVERY;
|
return (status == TPM_E_MUST_REBOOT ?
|
||||||
|
LOAD_FIRMWARE_REBOOT : LOAD_FIRMWARE_RECOVERY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Success */
|
/* Success */
|
||||||
|
|||||||
@@ -129,6 +129,7 @@ int LoadKernel(LoadKernelParams* params) {
|
|||||||
int is_dev = (BOOT_FLAG_DEVELOPER & params->boot_flags ? 1 : 0);
|
int is_dev = (BOOT_FLAG_DEVELOPER & params->boot_flags ? 1 : 0);
|
||||||
int is_rec = (BOOT_FLAG_RECOVERY & params->boot_flags ? 1 : 0);
|
int is_rec = (BOOT_FLAG_RECOVERY & params->boot_flags ? 1 : 0);
|
||||||
int is_normal = (!is_dev && !is_rec);
|
int is_normal = (!is_dev && !is_rec);
|
||||||
|
uint32_t status;
|
||||||
|
|
||||||
/* Clear output params in case we fail */
|
/* Clear output params in case we fail */
|
||||||
params->partition_number = 0;
|
params->partition_number = 0;
|
||||||
@@ -147,9 +148,11 @@ int LoadKernel(LoadKernelParams* params) {
|
|||||||
if (is_normal) {
|
if (is_normal) {
|
||||||
/* Read current kernel key index from TPM. Assumes TPM is already
|
/* Read current kernel key index from TPM. Assumes TPM is already
|
||||||
* initialized. */
|
* 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"));
|
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) {
|
} else if (is_dev && !is_rec) {
|
||||||
/* In developer mode, we ignore the kernel subkey, and just use
|
/* 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) ||
|
if ((lowest_key_version > tpm_key_version) ||
|
||||||
(lowest_key_version == tpm_key_version &&
|
(lowest_key_version == tpm_key_version &&
|
||||||
lowest_kernel_version > tpm_kernel_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"));
|
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 */
|
/* Lock the kernel versions */
|
||||||
if (0 != RollbackKernelLock()) {
|
status = RollbackKernelLock();
|
||||||
|
if (0 != status) {
|
||||||
VBDEBUG(("Error locking kernel versions.\n"));
|
VBDEBUG(("Error locking kernel versions.\n"));
|
||||||
/* Don't reboot to recovery mode if we're already there */
|
/* Don't reboot to recovery mode if we're already there */
|
||||||
if (!is_rec)
|
if (!is_rec)
|
||||||
return LOAD_KERNEL_RECOVERY;
|
return (status == TPM_E_MUST_REBOOT ?
|
||||||
|
LOAD_KERNEL_REBOOT : LOAD_KERNEL_RECOVERY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Success! */
|
/* Success! */
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
char* VbootVersion = "VBOOv=983af25b";
|
char* VbootVersion = "VBOOv=ba8bd4f8";
|
||||||
|
|||||||
Reference in New Issue
Block a user