summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2011-03-15 09:50:38 -0700
committerRandall Spangler <rspangler@chromium.org>2011-03-15 09:50:38 -0700
commitb17e8d353c50d46f0e5f29578f6294003692ea1d (patch)
tree0de607d6d721868399339fcc1e123f3ceeb6b52e
parent2008423d5fb291eb7628389dcb04fe6d5ebb75fc (diff)
downloadvboot-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.h13
-rw-r--r--firmware/lib/vboot_nvstorage.c23
-rw-r--r--host/lib/crossystem.c8
-rw-r--r--tests/vboot_nvstorage_test.c2
-rw-r--r--utility/crossystem_main.c12
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}
};