Index: firmware/lib/vboot_nvstorage.c |
diff --git a/firmware/lib/vboot_nvstorage.c b/firmware/lib/vboot_nvstorage.c |
index 81816ac416b0a01c1f746211f91f422dd5436d7e..6e8c1c799a61e0c1ef6741ad9d3ae2250e8bcb71 100644 |
--- a/firmware/lib/vboot_nvstorage.c |
+++ b/firmware/lib/vboot_nvstorage.c |
@@ -61,7 +61,7 @@ int VbNvSetup(VbNvContext* context) { |
|| (Crc8(raw, CRC_OFFSET) != raw[CRC_OFFSET])) { |
/* Data is inconsistent (bad CRC or header), so reset defaults */ |
- Memset(raw, 0, NV_BLOCK_SIZE); |
+ Memset(raw, 0, VBNV_BLOCK_SIZE); |
raw[HEADER_OFFSET] = (HEADER_SIGNATURE | HEADER_FIRMWARE_SETTINGS_RESET | |
HEADER_KERNEL_SETTINGS_RESET); |
@@ -153,19 +153,30 @@ int VbNvSet(VbNvContext* context, VbNvParam param, uint32_t value) { |
if (value) |
raw[BOOT_OFFSET] |= BOOT_DEBUG_RESET_MODE; |
else |
- raw[BOOT_OFFSET] &= BOOT_DEBUG_RESET_MODE; |
+ raw[BOOT_OFFSET] &= ~BOOT_DEBUG_RESET_MODE; |
break; |
case VBNV_TRY_B_COUNT: |
+ /* Clip to valid range. */ |
+ if (value > BOOT_TRY_B_COUNT) |
+ value = BOOT_TRY_B_COUNT - 1; |
+ |
raw[BOOT_OFFSET] &= ~BOOT_TRY_B_COUNT; |
- raw[BOOT_OFFSET] |= (uint8_t)(value & BOOT_TRY_B_COUNT); |
+ raw[BOOT_OFFSET] |= (uint8_t)value; |
break; |
case VBNV_RECOVERY_REQUEST: |
+ /* Map values outside the valid range to the legacy reason, since we |
+ * can't determine if we're called from kernel or user mode. */ |
+ if (value > 0xFF) |
+ value = VBNV_RECOVERY_LEGACY; |
raw[RECOVERY_OFFSET] = (uint8_t)value; |
break; |
case VBNV_LOCALIZATION_INDEX: |
+ /* Map values outside the valid range to the default index. */ |
+ if (value > 0xFF) |
+ value = 0; |
raw[LOCALIZATION_OFFSET] = (uint8_t)value; |
break; |