mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-25 18:55:24 +00:00
vboot2: Add previously tried slot and result to NV storage
This gives recovery mode information on two boots back instead of one, which may be handy for debugging. It also allows determining whether a failure of the current boot should try the other slot or go to recovery, using only information stored in NV storage. Added crossystem support for printing the fields, and unit tests. BUG=chrome-os-partner:32585 BRANCH=none TEST=make runtests; VBOOT2=1 make runtests Change-Id: Ia9f4186210d30217b902db7c513ae4ab8851f8f4 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/221230 Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
This commit is contained in:
committed by
chrome-internal-fetch
parent
80872dbffc
commit
782300d093
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user