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>
This commit is contained in:
parent
c30bfcaa9e
commit
165b6cf5c1
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -19,7 +19,12 @@
|
|||
#include <types.h>
|
||||
|
||||
/* Generic functions */
|
||||
void read_vbnv(uint8_t *vbnv_copy);
|
||||
/*
|
||||
* Return value for read_vbnv:
|
||||
* 1 = write-back of vbnv copy is required.
|
||||
* 0 = otherwise
|
||||
*/
|
||||
int read_vbnv(uint8_t *vbnv_copy);
|
||||
void save_vbnv(const uint8_t *vbnv_copy);
|
||||
int verify_vbnv(uint8_t *vbnv_copy);
|
||||
int get_recovery_mode_from_vbnv(void);
|
||||
|
|
|
@ -301,8 +301,12 @@ void verstage_main(void)
|
|||
/* Set up context and work buffer */
|
||||
vb2_init_work_context(&ctx);
|
||||
|
||||
/* Read nvdata from a non-volatile storage */
|
||||
read_vbnv(ctx.nvdata);
|
||||
/*
|
||||
* Read nvdata from a non-volatile storage and mark data as changed
|
||||
* if instructed.
|
||||
*/
|
||||
if (read_vbnv(ctx.nvdata))
|
||||
ctx.flags |= VB2_CONTEXT_NVDATA_CHANGED;
|
||||
|
||||
/* Set S3 resume flag if vboot should behave differently when selecting
|
||||
* which slot to boot. This is only relevant to vboot if the platform
|
||||
|
|
Loading…
Reference in New Issue