summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/2lib/2misc.c3
-rw-r--r--firmware/2lib/2nvstorage.c7
-rw-r--r--firmware/2lib/include/2api.h3
-rw-r--r--firmware/2lib/include/2nvstorage.h2
-rw-r--r--firmware/2lib/include/2nvstorage_fields.h3
-rw-r--r--firmware/include/vboot_nvstorage.h2
-rw-r--r--firmware/lib/vboot_nvstorage.c5
-rw-r--r--host/lib/crossystem.c2
-rw-r--r--utility/crossystem.c1
9 files changed, 27 insertions, 1 deletions
diff --git a/firmware/2lib/2misc.c b/firmware/2lib/2misc.c
index 5fc76042..53f713b5 100644
--- a/firmware/2lib/2misc.c
+++ b/firmware/2lib/2misc.c
@@ -257,6 +257,9 @@ int vb2_check_dev_switch(struct vb2_context *ctx)
vb2_nv_set(ctx, VB2_NV_DEV_BOOT_SIGNED_ONLY, 0);
}
+ if (ctx->flags & VB2_CONTEXT_FORCE_WIPEOUT_MODE)
+ vb2_nv_set(ctx, VB2_NV_REQ_WIPEOUT, 1);
+
if (flags != old_flags) {
/*
* Just changed dev mode state. Clear TPM owner. This must be
diff --git a/firmware/2lib/2nvstorage.c b/firmware/2lib/2nvstorage.c
index 93d704c8..4d3c8bad 100644
--- a/firmware/2lib/2nvstorage.c
+++ b/firmware/2lib/2nvstorage.c
@@ -149,6 +149,9 @@ uint32_t vb2_nv_get(struct vb2_context *ctx, enum vb2_nv_param param)
case VB2_NV_CLEAR_TPM_OWNER_DONE:
return GETBIT(VB2_NV_OFFS_TPM, VB2_NV_TPM_CLEAR_OWNER_DONE);
+
+ case VB2_NV_REQ_WIPEOUT:
+ return GETBIT(VB2_NV_OFFS_HEADER , VB2_NV_HEADER_WIPEOUT);
}
/*
@@ -291,6 +294,10 @@ void vb2_nv_set(struct vb2_context *ctx,
case VB2_NV_CLEAR_TPM_OWNER_DONE:
SETBIT(VB2_NV_OFFS_TPM, VB2_NV_TPM_CLEAR_OWNER_DONE);
break;
+
+ case VB2_NV_REQ_WIPEOUT:
+ SETBIT(VB2_NV_OFFS_HEADER , VB2_NV_HEADER_WIPEOUT);
+ break;
}
/*
diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h
index 9d63e449..92b815f8 100644
--- a/firmware/2lib/include/2api.h
+++ b/firmware/2lib/include/2api.h
@@ -87,6 +87,9 @@ enum vb2_context_flags {
/* RAM should be cleared by caller this boot */
VB2_CONTEXT_CLEAR_RAM = (1 << 7),
+
+ /* Wipeout by the app should be requested. */
+ VB2_CONTEXT_FORCE_WIPEOUT_MODE = (1 << 8),
};
/*
diff --git a/firmware/2lib/include/2nvstorage.h b/firmware/2lib/include/2nvstorage.h
index 3bda9d78..3b3f34c8 100644
--- a/firmware/2lib/include/2nvstorage.h
+++ b/firmware/2lib/include/2nvstorage.h
@@ -78,6 +78,8 @@ enum vb2_nv_param {
VB2_NV_FW_PREV_TRIED,
/* Result of trying that firmware (see vb2_fw_result) */
VB2_NV_FW_PREV_RESULT,
+ /* Request wipeout of the device by the app. */
+ VB2_NV_REQ_WIPEOUT,
};
/* Firmware result codes for VB2_NV_FW_RESULT and VB2_NV_FW_PREV_RESULT */
diff --git a/firmware/2lib/include/2nvstorage_fields.h b/firmware/2lib/include/2nvstorage_fields.h
index a794f383..1c4fdf41 100644
--- a/firmware/2lib/include/2nvstorage_fields.h
+++ b/firmware/2lib/include/2nvstorage_fields.h
@@ -34,7 +34,8 @@ enum vb2_nv_offset {
VB2_NV_OFFS_CRC = 15
};
-/* Fields in VB2_NV_OFFS_HEADER (unused = 0x0f) */
+/* Fields in VB2_NV_OFFS_HEADER (unused = 0x07) */
+#define VB2_NV_HEADER_WIPEOUT 0x08
#define VB2_NV_HEADER_KERNEL_SETTINGS_RESET 0x10
#define VB2_NV_HEADER_FW_SETTINGS_RESET 0x20
#define VB2_NV_HEADER_SIGNATURE 0x40
diff --git a/firmware/include/vboot_nvstorage.h b/firmware/include/vboot_nvstorage.h
index 4401777e..65cd2e5b 100644
--- a/firmware/include/vboot_nvstorage.h
+++ b/firmware/include/vboot_nvstorage.h
@@ -102,6 +102,8 @@ typedef enum VbNvParam {
VBNV_FW_PREV_TRIED,
/* Result of trying that firmware (see vb2_fw_result) */
VBNV_FW_PREV_RESULT,
+ /* Wipeout request from firmware present. */
+ VBNV_FW_REQ_WIPEOUT,
} VbNvParam;
diff --git a/firmware/lib/vboot_nvstorage.c b/firmware/lib/vboot_nvstorage.c
index a0721d7c..9d99b1c7 100644
--- a/firmware/lib/vboot_nvstorage.c
+++ b/firmware/lib/vboot_nvstorage.c
@@ -25,6 +25,7 @@
#define HEADER_SIGNATURE 0x40
#define HEADER_FIRMWARE_SETTINGS_RESET 0x20
#define HEADER_KERNEL_SETTINGS_RESET 0x10
+#define HEADER_WIPEOUT 0x08
#define BOOT_OFFSET 1
#define BOOT_DEBUG_RESET_MODE 0x80
@@ -191,6 +192,10 @@ int VbNvGet(VbNvContext *context, VbNvParam param, uint32_t *dest)
>> BOOT2_PREV_RESULT_SHIFT;
return 0;
+ case VBNV_FW_REQ_WIPEOUT:
+ *dest = (raw[HEADER_OFFSET] & HEADER_WIPEOUT) ? 1 : 0;
+ return 0;
+
default:
return 1;
}
diff --git a/host/lib/crossystem.c b/host/lib/crossystem.c
index 43dcc2a4..1eef737b 100644
--- a/host/lib/crossystem.c
+++ b/host/lib/crossystem.c
@@ -496,6 +496,8 @@ int VbGetSystemPropertyInt(const char* name) {
value = VbGetNvStorage(VBNV_OPROM_NEEDED);
} else if (!strcasecmp(name,"recovery_subcode")) {
value = VbGetNvStorage(VBNV_RECOVERY_SUBCODE);
+ } else if (!strcasecmp(name,"wipeout_request")) {
+ value = VbGetNvStorage(VBNV_FW_REQ_WIPEOUT);
}
/* Other parameters */
else if (!strcasecmp(name,"cros_debug")) {
diff --git a/utility/crossystem.c b/utility/crossystem.c
index 41ed8494..adc828d7 100644
--- a/utility/crossystem.c
+++ b/utility/crossystem.c
@@ -94,6 +94,7 @@ const Param sys_param_list[] = {
{"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)"},
{"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 */