diff options
author | Randall Spangler <rspangler@chromium.org> | 2011-03-15 09:50:38 -0700 |
---|---|---|
committer | Randall Spangler <rspangler@chromium.org> | 2011-03-15 09:50:38 -0700 |
commit | b17e8d353c50d46f0e5f29578f6294003692ea1d (patch) | |
tree | 0de607d6d721868399339fcc1e123f3ceeb6b52e | |
parent | 2008423d5fb291eb7628389dcb04fe6d5ebb75fc (diff) | |
download | vboot-b17e8d353c50d46f0e5f29578f6294003692ea1d.tar.gz |
Add VB test error func/num
Change-Id: Ibe253963f0424935554fe91f166ef5040a723c6f
BUG=13107
TEST=make && make runtests
Review URL: http://codereview.chromium.org/6698032
-rw-r--r-- | firmware/include/vboot_nvstorage.h | 13 | ||||
-rw-r--r-- | firmware/lib/vboot_nvstorage.c | 23 | ||||
-rw-r--r-- | host/lib/crossystem.c | 8 | ||||
-rw-r--r-- | tests/vboot_nvstorage_test.c | 2 | ||||
-rw-r--r-- | utility/crossystem_main.c | 12 |
5 files changed, 52 insertions, 6 deletions
diff --git a/firmware/include/vboot_nvstorage.h b/firmware/include/vboot_nvstorage.h index 824dfac5..98377056 100644 --- a/firmware/include/vboot_nvstorage.h +++ b/firmware/include/vboot_nvstorage.h @@ -54,6 +54,11 @@ typedef enum VbNvParam { * in the firmware. 0=no, just used the key block hash; 1=yes, used the * key block signature. */ VBNV_FW_VERIFIED_KERNEL_KEY, + /* Verified boot API function which should generate a test error, if + * error number (below) is non-zero. */ + VBNV_TEST_ERROR_FUNC, + /* Verified boot API error to generate for the function, if non-zero. */ + VBNV_TEST_ERROR_NUM, } VbNvParam; @@ -76,6 +81,12 @@ typedef enum VbNvParam { #define VBNV_RECOVERY_RO_TPM_ERROR 0x05 /* Shared data error in read-only firmware */ #define VBNV_RECOVERY_RO_SHARED_DATA 0x06 +/* Test error from S3Resume() */ +#define VBNV_RECOVERY_RO_TEST_S3 0x07 +/* Test error from LoadFirmwareSetup() */ +#define VBNV_RECOVERY_RO_TEST_LFS 0x08 +/* Test error from LoadFirmware() */ +#define VBNV_RECOVERY_RO_TEST_LF 0x09 /* Unspecified/unknown error in read-only firmware */ #define VBNV_RECOVERY_RO_UNSPECIFIED 0x3F /* User manually requested recovery by pressing a key at developer @@ -91,6 +102,8 @@ typedef enum VbNvParam { #define VBNV_RECOVERY_RW_DEV_MISMATCH 0x45 /* Shared data error in rewritable firmware */ #define VBNV_RECOVERY_RW_SHARED_DATA 0x46 +/* Test error from LoadKernel() */ +#define VBNV_RECOVERY_RW_TEST_LK 0x47 /* Unspecified/unknown error in rewritable firmware */ #define VBNV_RECOVERY_RW_UNSPECIFIED 0x7F /* DM-verity error */ diff --git a/firmware/lib/vboot_nvstorage.c b/firmware/lib/vboot_nvstorage.c index 419a9fbc..83f6ef5c 100644 --- a/firmware/lib/vboot_nvstorage.c +++ b/firmware/lib/vboot_nvstorage.c @@ -29,6 +29,9 @@ #define FIRMWARE_FLAGS_OFFSET 5 #define FIRMWARE_TRIED_FIRMWARE_B 0x80 #define FIRMWARE_FW_VERIFIED_KERNEL_KEY 0x40 +#define FIRMWARE_TEST_ERR_FUNC_MASK 0x38 +#define FIRMWARE_TEST_ERR_FUNC_SHIFT 3 +#define FIRMWARE_TEST_ERR_NUM_MASK 0x07 #define KERNEL_FIELD_OFFSET 11 #define CRC_OFFSET 15 @@ -134,6 +137,15 @@ int VbNvGet(VbNvContext* context, VbNvParam param, uint32_t* dest) { 1 : 0); return 0; + case VBNV_TEST_ERROR_FUNC: + *dest = (raw[FIRMWARE_FLAGS_OFFSET] & FIRMWARE_TEST_ERR_FUNC_MASK) + >> FIRMWARE_TEST_ERR_FUNC_SHIFT; + return 0; + + case VBNV_TEST_ERROR_NUM: + *dest = raw[FIRMWARE_FLAGS_OFFSET] & FIRMWARE_TEST_ERR_NUM_MASK; + return 0; + default: return 1; } @@ -215,6 +227,17 @@ int VbNvSet(VbNvContext* context, VbNvParam param, uint32_t value) { raw[FIRMWARE_FLAGS_OFFSET] &= ~FIRMWARE_FW_VERIFIED_KERNEL_KEY; break; + case VBNV_TEST_ERROR_FUNC: + raw[FIRMWARE_FLAGS_OFFSET] &= ~FIRMWARE_TEST_ERR_FUNC_MASK; + raw[FIRMWARE_FLAGS_OFFSET] |= (value << FIRMWARE_TEST_ERR_FUNC_SHIFT) + & FIRMWARE_TEST_ERR_FUNC_MASK; + break; + + case VBNV_TEST_ERROR_NUM: + raw[FIRMWARE_FLAGS_OFFSET] &= ~FIRMWARE_TEST_ERR_NUM_MASK; + raw[FIRMWARE_FLAGS_OFFSET] |= (value & FIRMWARE_TEST_ERR_NUM_MASK); + break; + default: return 1; } diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c index 9bea492a..b43c502d 100644 --- a/host/lib/crossystem.c +++ b/host/lib/crossystem.c @@ -644,6 +644,10 @@ int VbGetSystemPropertyInt(const char* name) { value = VbGetNvStorage(VBNV_KERNEL_FIELD); } else if (!strcasecmp(name,"nvram_cleared")) { value = VbGetNvStorage(VBNV_KERNEL_SETTINGS_RESET); + } else if (!strcasecmp(name,"vbtest_errfunc")) { + value = VbGetNvStorage(VBNV_TEST_ERROR_FUNC); + } else if (!strcasecmp(name,"vbtest_errno")) { + value = VbGetNvStorage(VBNV_TEST_ERROR_NUM); } /* NV storage values. If unable to get from NV storage, fall back to the * CMOS reboot field used by older BIOS. */ @@ -759,6 +763,10 @@ int VbSetSystemPropertyInt(const char* name, int value) { return VbSetNvStorage(VBNV_KERNEL_SETTINGS_RESET, 0); } else if (!strcasecmp(name,"kern_nv")) { return VbSetNvStorage(VBNV_KERNEL_FIELD, value); + } else if (!strcasecmp(name,"vbtest_errfunc")) { + return VbSetNvStorage(VBNV_TEST_ERROR_FUNC, value); + } else if (!strcasecmp(name,"vbtest_errno")) { + return VbSetNvStorage(VBNV_TEST_ERROR_NUM, value); } /* NV storage values. If unable to get from NV storage, fall back to the * CMOS reboot field used by older BIOS. */ diff --git a/tests/vboot_nvstorage_test.c b/tests/vboot_nvstorage_test.c index 40fa6890..3d16b9fe 100644 --- a/tests/vboot_nvstorage_test.c +++ b/tests/vboot_nvstorage_test.c @@ -31,6 +31,8 @@ static VbNvField nvfields[] = { {VBNV_KERNEL_FIELD, 0, 0x12345678, 0xFEDCBA98, "kernel field"}, {VBNV_TRIED_FIRMWARE_B, 0, 1, 0, "tried firmware B"}, {VBNV_FW_VERIFIED_KERNEL_KEY, 0, 1, 0, "firmware verified kernel key"}, + {VBNV_TEST_ERROR_FUNC, 0, 1, 7, "verified boot test error func"}, + {VBNV_TEST_ERROR_NUM, 0, 3, 6, "verified boot test error number"}, {0, 0, 0, 0, NULL} }; diff --git a/utility/crossystem_main.c b/utility/crossystem_main.c index 4d6cd48a..abd41865 100644 --- a/utility/crossystem_main.c +++ b/utility/crossystem_main.c @@ -27,8 +27,10 @@ const Param sys_param_list[] = { {"recoverysw_cur", 0, 0, "Recovery switch current position"}, {"recoverysw_boot", 0, 0, "Recovery switch position at boot"}, {"recoverysw_ec_boot", 0, 0, "Recovery switch position at EC boot"}, - {"wpsw_cur", 0, 0, "Firmware write protect switch current position"}, - {"wpsw_boot", 0, 0, "Firmware write protect switch position at boot"}, + {"wpsw_cur", 0, 0, + "Firmware write protect hardware switch current position"}, + {"wpsw_boot", 0, 0, + "Firmware write protect hardware switch position at boot"}, {"recovery_reason", 0, 0, "Recovery mode reason for current boot"}, {"savedmem_base", 0, 0, "RAM debug data area physical address", "0x%08x"}, {"savedmem_size", 0, 0, "RAM debug data area size in bytes"}, @@ -49,12 +51,10 @@ const Param sys_param_list[] = { {"recovery_request", 0, 1, "Recovery mode request (writable)"}, {"dbg_reset", 0, 1, "Debug reset mode request (writable)"}, {"fwb_tries", 0, 1, "Try firmware B count (writable)"}, + {"vbtest_errfunc", 0, 1, "Verified boot test error function (writable)"}, + {"vbtest_errno", 0, 1, "Verified boot test error number (writable)"}, {"vdat", 1, 0, "Raw VDAT contents."}, - /* TODO: implement the following: - * nvram_cleared - */ - /* Terminate with null name */ {NULL, 0, 0, NULL} }; |