diff options
author | Furquan Shaikh <furquan@google.com> | 2016-06-27 16:19:09 -0700 |
---|---|---|
committer | Furquan Shaikh <furquan@google.com> | 2016-06-29 07:59:44 +0200 |
commit | 165b6cf5c1192439838df83158c92313451f7777 (patch) | |
tree | 866886d32768b3a3a691d2aea9ab084a6fd04d0e /src/vendorcode/google/chromeos/vbnv.c | |
parent | c30bfcaa9ebbe4d3e2ea0cac11784e13e56fe281 (diff) |
vbnv: Do not silently reset cache in read_vbnv
Currently, read_vbnv performs a reset of the vbnv cache if it is not
valid. However, this information is not passed up to the vboot layer,
thus resulting in missed write-back of vbnv cache to storage if vboot
does not update the cache itself.
Update read_vbnv to return a value depending upon whether it wants a
write-back to be performed when save is called.
Return value:
0 = No write-back required
1 = Write-back of VBNV cache is required.
Change-Id: I239939d5f9731d89a9d53fe662321b93fc1ab113
Signed-off-by: Furquan Shaikh <furquan@google.com>
Reviewed-on: https://review.coreboot.org/15457
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'src/vendorcode/google/chromeos/vbnv.c')
-rw-r--r-- | src/vendorcode/google/chromeos/vbnv.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/vendorcode/google/chromeos/vbnv.c b/src/vendorcode/google/chromeos/vbnv.c index 92f03fbfe3..baccb2313d 100644 --- a/src/vendorcode/google/chromeos/vbnv.c +++ b/src/vendorcode/google/chromeos/vbnv.c @@ -85,8 +85,12 @@ int verify_vbnv(uint8_t *vbnv_copy) (crc8_vbnv(vbnv_copy, CRC_OFFSET) == vbnv_copy[CRC_OFFSET]); } -/* Read VBNV data from configured storage backend. */ -void read_vbnv(uint8_t *vbnv_copy) +/* + * Read VBNV data from configured storage backend. + * If VBNV verification fails, reset the vbnv copy. + * Returns 1 if write-back of vbnv copy is required. Else, returns 0. + */ +int read_vbnv(uint8_t *vbnv_copy) { if (IS_ENABLED(CONFIG_CHROMEOS_VBNV_CMOS)) read_vbnv_cmos(vbnv_copy); @@ -96,8 +100,11 @@ void read_vbnv(uint8_t *vbnv_copy) read_vbnv_flash(vbnv_copy); /* Check data for consistency */ - if (!verify_vbnv(vbnv_copy)) - reset_vbnv(vbnv_copy); + if (verify_vbnv(vbnv_copy)) + return 0; + + reset_vbnv(vbnv_copy); + return 1; } /* |