diff options
Diffstat (limited to 'firmware/lib/vboot_nvstorage.c')
-rw-r--r-- | firmware/lib/vboot_nvstorage.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/firmware/lib/vboot_nvstorage.c b/firmware/lib/vboot_nvstorage.c index 5476e85b..a0721d7c 100644 --- a/firmware/lib/vboot_nvstorage.c +++ b/firmware/lib/vboot_nvstorage.c @@ -51,6 +51,9 @@ #define BOOT2_RESULT_MASK 0x03 #define BOOT2_TRIED 0x04 #define BOOT2_TRY_NEXT 0x08 +#define BOOT2_PREV_RESULT_MASK 0x30 +#define BOOT2_PREV_RESULT_SHIFT 4 /* Number of bits to shift result */ +#define BOOT2_PREV_TRIED 0x40 #define KERNEL_FIELD_OFFSET 11 #define CRC_OFFSET 15 @@ -179,6 +182,15 @@ int VbNvGet(VbNvContext *context, VbNvParam param, uint32_t *dest) *dest = raw[BOOT2_OFFSET] & BOOT2_RESULT_MASK; return 0; + case VBNV_FW_PREV_TRIED: + *dest = (raw[BOOT2_OFFSET] & BOOT2_PREV_TRIED ? 1 : 0); + return 0; + + case VBNV_FW_PREV_RESULT: + *dest = (raw[BOOT2_OFFSET] & BOOT2_PREV_RESULT_MASK) + >> BOOT2_PREV_RESULT_SHIFT; + return 0; + default: return 1; } @@ -333,6 +345,22 @@ int VbNvSet(VbNvContext *context, VbNvParam param, uint32_t value) raw[BOOT2_OFFSET] |= (uint8_t)value; break; + case VBNV_FW_PREV_TRIED: + if (value) + raw[BOOT2_OFFSET] |= BOOT2_PREV_TRIED; + else + raw[BOOT2_OFFSET] &= ~BOOT2_PREV_TRIED; + break; + + case VBNV_FW_PREV_RESULT: + /* Map out of range values to unknown */ + if (value > BOOT2_RESULT_MASK) + value = VBNV_FW_RESULT_UNKNOWN; + + raw[BOOT2_OFFSET] &= ~BOOT2_PREV_RESULT_MASK; + raw[BOOT2_OFFSET] |= (uint8_t)value << BOOT2_PREV_RESULT_SHIFT; + break; + default: return 1; } |