summaryrefslogtreecommitdiff
path: root/host/lib/crossystem.c
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2014-06-24 15:31:04 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-06-28 00:56:17 +0000
commit9e1da784487fb8cfbe4e76693e07205b66675bda (patch)
tree9beada3e8c3667c27765702708b537aaa76d5062 /host/lib/crossystem.c
parentd11086caf05c692815ae6f90aa83a4fc30d50ed7 (diff)
downloadvboot-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.c38
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;
}