diff options
-rw-r--r-- | firmware/2lib/2misc.c | 3 | ||||
-rw-r--r-- | firmware/2lib/2nvstorage.c | 7 | ||||
-rw-r--r-- | firmware/2lib/include/2api.h | 3 | ||||
-rw-r--r-- | firmware/2lib/include/2nvstorage.h | 2 | ||||
-rw-r--r-- | firmware/2lib/include/2nvstorage_fields.h | 3 | ||||
-rw-r--r-- | firmware/include/vboot_nvstorage.h | 2 | ||||
-rw-r--r-- | firmware/lib/vboot_nvstorage.c | 5 | ||||
-rw-r--r-- | host/lib/crossystem.c | 2 | ||||
-rw-r--r-- | utility/crossystem.c | 1 |
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 */ |