diff options
author | Randall Spangler <rspangler@chromium.org> | 2014-06-24 15:31:04 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-06-28 00:56:17 +0000 |
commit | 9e1da784487fb8cfbe4e76693e07205b66675bda (patch) | |
tree | 9beada3e8c3667c27765702708b537aaa76d5062 /host/lib/crossystem.c | |
parent | d11086caf05c692815ae6f90aa83a4fc30d50ed7 (diff) | |
download | vboot-9e1da784487fb8cfbe4e76693e07205b66675bda.tar.gz |
Add nvstorage / crossystem support for new vboot2 fields
This allows testing vboot2. These fields are ignored by original
vboot firmware.
BUG=chromium:370082
BRANCH=none
TEST=manual
crossystem -> fw_tried=A, fw_result=unknown, fw_try_next=A
crossystem fw_tried=B
echo $? -> 1
crossystem -> fw_tried=A, fw_result=unknown, fw_try_next=A
crossystem fw_try_next=B
crossystem -> fw_tried=A, fw_result=unknown, fw_try_next=B
crossystem fw_try_next=beats_me
echo $? -> 1
crossystem -> fw_tried=A, fw_result=unknown, fw_try_next=B
crossystem fw_try_next=A
crossystem -> fw_tried=A, fw_result=unknown, fw_try_next=A
crossystem fw_result=trying
crossystem -> fw_tried=A, fw_result=trying, fw_try_next=A
crossystem fw_result=bupkis
echo $? -> 1
crossystem -> fw_tried=A, fw_result=trying, fw_try_next=A
crossystem fw_result=success
crossystem -> fw_tried=A, fw_result=success, fw_try_next=A
crossystem fw_result=failure
crossystem -> fw_tried=A, fw_result=failure, fw_try_next=A
crossystem fw_result=unknown
crossystem -> fw_tried=A, fw_result=unknown, fw_try_next=A
crossystem -> fw_try_count = 0, fwb_tries = 0
crossystem fw_try_count=6
crossystem -> fw_try_count = 6, fwb_tries = 6
crossystem fwb_tries=0
crossystem -> fw_try_count = 0, fwb_tries = 0
Change-Id: I1532f3384f8c05de2a7ff3f35abcc35d18049491
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/205475
Diffstat (limited to 'host/lib/crossystem.c')
-rw-r--r-- | host/lib/crossystem.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c index f88d22c6..d6555c67 100644 --- a/host/lib/crossystem.c +++ b/host/lib/crossystem.c @@ -60,6 +60,7 @@ typedef enum VbBuildOption { VB_BUILD_OPTION_NODEBUG } VbBuildOption; +static const char *fw_results[] = {"unknown", "trying", "success", "failure"}; /* Masks for kern_nv usage by kernel. */ #define KERN_NV_FWUPDATE_TRIES_MASK 0x0000000F @@ -464,6 +465,8 @@ int VbGetSystemPropertyInt(const char* name) { value = VbGetNvStorage(VBNV_TRY_B_COUNT); } else if (!strcasecmp(name,"fw_vboot2")) { value = GetVdatInt(VDAT_INT_FW_BOOT2); + } else if (!strcasecmp(name,"fw_try_count")) { + value = VbGetNvStorage(VBNV_FW_TRY_COUNT); } else if (!strcasecmp(name,"fwupdate_tries")) { value = VbGetNvStorage(VBNV_KERNEL_FIELD); if (value != -1) @@ -547,6 +550,16 @@ const char* VbGetSystemPropertyString(const char* name, char* dest, return GetVdatString(dest, size, VDAT_STRING_LOAD_KERNEL_DEBUG); } else if (!strcasecmp(name, "ddr_type")) { return unknown_string; + } else if (!strcasecmp(name, "fw_try_next")) { + return VbGetNvStorage(VBNV_FW_TRY_NEXT) ? "B" : "A"; + } else if (!strcasecmp(name, "fw_tried")) { + return VbGetNvStorage(VBNV_FW_TRIED) ? "B" : "A"; + } else if (!strcasecmp(name, "fw_result")) { + int v = VbGetNvStorage(VBNV_FW_RESULT); + if (v < ARRAY_SIZE(fw_results)) + return fw_results[v]; + else + return "unknown"; } return NULL; @@ -578,6 +591,8 @@ int VbSetSystemPropertyInt(const char* name, int value) { return VbSetNvStorage(VBNV_CLEAR_TPM_OWNER_DONE, 0); } else if (!strcasecmp(name,"fwb_tries")) { return VbSetNvStorage(VBNV_TRY_B_COUNT, value); + } else if (!strcasecmp(name,"fw_try_count")) { + return VbSetNvStorage(VBNV_FW_TRY_COUNT, value); } else if (!strcasecmp(name,"oprom_needed")) { return VbSetNvStorage(VBNV_OPROM_NEEDED, value); } else if (!strcasecmp(name,"backup_nvram_request")) { @@ -614,5 +629,26 @@ int VbSetSystemPropertyInt(const char* name, int value) { int VbSetSystemPropertyString(const char* name, const char* value) { /* Chain to architecture-dependent properties */ - return VbSetArchPropertyString(name, value); + if (0 == VbSetArchPropertyString(name, value)) + return 0; + + if (!strcasecmp(name, "fw_try_next")) { + if (!strcasecmp(value, "A")) + return VbSetNvStorage(VBNV_FW_TRY_NEXT, 0); + else if (!strcasecmp(value, "B")) + return VbSetNvStorage(VBNV_FW_TRY_NEXT, 1); + else + return -1; + + } else if (!strcasecmp(name, "fw_result")) { + int i; + + for (i = 0; i < ARRAY_SIZE(fw_results); i++) { + if (!strcasecmp(value, fw_results[i])) + return VbSetNvStorage(VBNV_FW_RESULT, i); + } + return -1; + } + + return -1; } |