crossystem: provide a way to clear wipeout request

For test purposes it should be possible to clear the wipeout request
raised by firmware.

BRANCH=none
BUG=chrome-os-partner:36059
TEST=verified that crossystem wipeout_request=0 changes the bit from 1
     to 0, and wipeout_request=1 does not change it from 0 to 1.

Change-Id: Ic45ec03ed3e40e6fee4244804b8c231ee88af95b
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/262466
Reviewed-by: Randall Spangler <rspangler@chromium.org>
diff --git a/firmware/lib/vboot_nvstorage.c b/firmware/lib/vboot_nvstorage.c
index 9d99b1c..af24fac 100644
--- a/firmware/lib/vboot_nvstorage.c
+++ b/firmware/lib/vboot_nvstorage.c
@@ -366,6 +366,13 @@
 		raw[BOOT2_OFFSET] |= (uint8_t)value << BOOT2_PREV_RESULT_SHIFT;
 		break;
 
+	case VBNV_FW_REQ_WIPEOUT:
+		if (value)
+			raw[HEADER_OFFSET] |= HEADER_WIPEOUT;
+		else
+			raw[HEADER_OFFSET] &= ~HEADER_WIPEOUT;
+		break;
+
 	default:
 		return 1;
 	}
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c
index d97effa..00f4f1d 100644
--- a/host/lib/crossystem.c
+++ b/host/lib/crossystem.c
@@ -617,6 +617,9 @@
     return VbSetNvStorage(VBNV_FW_TRY_COUNT, value);
   } else if (!strcasecmp(name,"oprom_needed")) {
     return VbSetNvStorage(VBNV_OPROM_NEEDED, value);
+  } else if (!strcasecmp(name,"wipeout_request")) {
+    /* Can only clear this flag, set only by firmware. */
+    return VbSetNvStorage(VBNV_FW_REQ_WIPEOUT, 0);
   } else if (!strcasecmp(name,"backup_nvram_request")) {
       /* Best-effort only, since it requires firmware and TPM support. */
     return VbSetNvStorage(VBNV_BACKUP_NVRAM_REQUEST, value);
diff --git a/utility/crossystem.c b/utility/crossystem.c
index 3eaeaae..57eab2f 100644
--- a/utility/crossystem.c
+++ b/utility/crossystem.c
@@ -95,7 +95,7 @@
   {"vdat_lkdebug", IS_STRING|NO_PRINT_ALL,
    "LoadKernel() debug data (not in print-all)"},
   {"vdat_timers", IS_STRING, "Timer values from VbSharedData"},
-  {"wipeout_request", 0, "Firmware requested factory reset (wipeout)"},
+  {"wipeout_request", CAN_WRITE, "Firmware requested factory reset (wipeout)"},
   {"wpsw_boot", 0, "Firmware write protect hardware switch position at boot"},
   {"wpsw_cur", 0, "Firmware write protect hardware switch current position"},
   /* Terminate with null name */