[coreboot-gerrit] Patch set updated for coreboot: vbnv: Do not silently reset cache in read_vbnv

Furquan Shaikh (furquan@google.com) gerrit at coreboot.org
Tue Jun 28 01:23:36 CEST 2016


Furquan Shaikh (furquan at google.com) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/15457

-gerrit

commit 2aed33345f3fc90da0e14c49f3fbc98fc7424b61
Author: Furquan Shaikh <furquan at google.com>
Date:   Mon Jun 27 16:19:09 2016 -0700

    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 at google.com>
---
 src/vendorcode/google/chromeos/vbnv.c               | 15 +++++++++++----
 src/vendorcode/google/chromeos/vbnv.h               |  2 +-
 src/vendorcode/google/chromeos/vboot2/vboot_logic.c |  3 ++-
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/vendorcode/google/chromeos/vbnv.c b/src/vendorcode/google/chromeos/vbnv.c
index 92f03fb..7b257f7 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.
+ */
+uint8_t 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;
 }
 
 /*
diff --git a/src/vendorcode/google/chromeos/vbnv.h b/src/vendorcode/google/chromeos/vbnv.h
index 5d21cc8..e8cd99d 100644
--- a/src/vendorcode/google/chromeos/vbnv.h
+++ b/src/vendorcode/google/chromeos/vbnv.h
@@ -19,7 +19,7 @@
 #include <types.h>
 
 /* Generic functions */
-void read_vbnv(uint8_t *vbnv_copy);
+uint8_t 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);
diff --git a/src/vendorcode/google/chromeos/vboot2/vboot_logic.c b/src/vendorcode/google/chromeos/vboot2/vboot_logic.c
index a81a9c2..e704d1f 100644
--- a/src/vendorcode/google/chromeos/vboot2/vboot_logic.c
+++ b/src/vendorcode/google/chromeos/vboot2/vboot_logic.c
@@ -302,7 +302,8 @@ void verstage_main(void)
 	vb2_init_work_context(&ctx);
 
 	/* Read nvdata from a non-volatile storage */
-	read_vbnv(ctx.nvdata);
+	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



More information about the coreboot-gerrit mailing list