[coreboot-gerrit] New patch to review for coreboot: cbf74a0 vboot2: Make struct vb2_working_data cpu architecture agnostic

Aaron Durbin (adurbin@google.com) gerrit at coreboot.org
Mon Mar 23 22:59:41 CET 2015


Aaron Durbin (adurbin at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8882

-gerrit

commit cbf74a0a2bf4fb908d3949979917e4ef8e4d43e1
Author: Daisuke Nojiri <dnojiri at chromium.org>
Date:   Fri Sep 12 09:59:46 2014 -0700

    vboot2: Make struct vb2_working_data cpu architecture agnostic
    
    this allows vb2_working_data to be accessed from stages running on different cpu
    architectures.
    
    BUG=none
    TEST=Built firmware for Blaze with USE=+/-vboot2. Ran faft on Blaze.
    BRANCH=none
    Signed-off-by: Daisuke Nojiri <dnojiri at chromium.org>
    
    Original-Change-Id: Ife2844637af8bf9e0d032a50fb516d98b8f80497
    Original-Reviewed-on: https://chromium-review.googlesource.com/217835
    Original-Reviewed-by: Aaron Durbin <adurbin at chromium.org>
    Original-Commit-Queue: Daisuke Nojiri <dnojiri at chromium.org>
    Original-Tested-by: Daisuke Nojiri <dnojiri at chromium.org>
    (cherry picked from commit 2b36749bc5a761003f00b7a0d17edb1629245b88)
    
    Change-Id: Idc10f23ed2927717f5308f0112aa8113a683010e
    Signed-off-by: Aaron Durbin <adurbin at chromium.org>
---
 src/vendorcode/google/chromeos/chromeos.c      | 13 ++-------
 src/vendorcode/google/chromeos/chromeos.h      | 40 ++++++++++++++++++++------
 src/vendorcode/google/chromeos/vboot_handoff.c |  7 +++--
 src/vendorcode/google/chromeos/verstage.c      |  8 ++++--
 src/vendorcode/google/chromeos/verstub.c       | 10 ++++---
 5 files changed, 49 insertions(+), 29 deletions(-)

diff --git a/src/vendorcode/google/chromeos/chromeos.c b/src/vendorcode/google/chromeos/chromeos.c
index d2f62d7..bd72e77 100644
--- a/src/vendorcode/google/chromeos/chromeos.c
+++ b/src/vendorcode/google/chromeos/chromeos.c
@@ -223,7 +223,7 @@ void *vboot_load_stage(int stage_index,
 		       struct vboot_components *fw_info)
 {
 	struct cbfs_stage *stage;
-	uint32_t fc_addr;
+	uintptr_t fc_addr;
 	uint32_t fc_size;
 
 	if (stage_index >= fw_info->num_components) {
@@ -267,18 +267,9 @@ struct vb2_working_data * const vboot_get_working_data(void)
 	return (struct vb2_working_data *)CONFIG_VBOOT_WORK_BUFFER_ADDRESS;
 }
 
-int vboot_is_slot_selected(struct vb2_working_data *wd)
-{
-	return wd->selected_region.size > 0;
-}
-
-int vboot_is_readonly_path(struct vb2_working_data *wd)
-{
-	return wd->selected_region.size == 0;
-}
-
 void vboot_reboot(void)
 {
 	hard_reset();
 }
+
 #endif
diff --git a/src/vendorcode/google/chromeos/chromeos.h b/src/vendorcode/google/chromeos/chromeos.h
index 14e0b10..0d8da8f 100644
--- a/src/vendorcode/google/chromeos/chromeos.h
+++ b/src/vendorcode/google/chromeos/chromeos.h
@@ -130,20 +130,42 @@ void vboot_reboot(void);
 /*
  * this is placed at the start of the vboot work buffer. selected_region is used
  * for the verstage to return the location of the selected slot. buffer is used
- * by the vboot2 core.
- *
- * TODO: Make the sizes of the struct and its members independent of cpu
- * architectures as it crosses stage boundaries.
+ * by the vboot2 core. Keep the struct cpu architecture agnostic as it crosses
+ * stage boundaries.
  */
 struct vb2_working_data {
-	struct vboot_region selected_region;
-	size_t buffer_size;
-	uint8_t *buffer;
+	uint32_t selected_region_offset;
+	uint32_t selected_region_size;
+	uint64_t buffer_size;
+	uint64_t buffer;
 };
 
 struct vb2_working_data * const vboot_get_working_data(void);
-int vboot_is_slot_selected(struct vb2_working_data *wd);
-int vboot_is_readonly_path(struct vb2_working_data *wd);
+
+static inline void vb2_get_selected_region(struct vb2_working_data *wd,
+			     struct vboot_region *region)
+{
+	region->offset_addr = wd->selected_region_offset;
+	region->size = wd->selected_region_size;
+}
+
+static inline void vb2_set_selected_region(struct vb2_working_data *wd,
+			     struct vboot_region *region)
+{
+	wd->selected_region_offset = region->offset_addr;
+	wd->selected_region_size = region->size;
+}
+
+static inline int vboot_is_slot_selected(struct vb2_working_data *wd)
+{
+	return wd->selected_region_size > 0;
+}
+
+static inline int vboot_is_readonly_path(struct vb2_working_data *wd)
+{
+	return wd->selected_region_size == 0;
+}
+
 #endif /* CONFIG_VBOOT2_VERIFY_FIRMWARE */
 
 #endif
diff --git a/src/vendorcode/google/chromeos/vboot_handoff.c b/src/vendorcode/google/chromeos/vboot_handoff.c
index ae3096a..f929a59 100644
--- a/src/vendorcode/google/chromeos/vboot_handoff.c
+++ b/src/vendorcode/google/chromeos/vboot_handoff.c
@@ -143,9 +143,10 @@ void *vboot_load_ramstage(void)
 {
 	struct vboot_handoff *vh;
 	struct vb2_shared_data *sd;
+	struct vboot_region fw_main;
 	struct vb2_working_data *wd = vboot_get_working_data();
 
-	sd = (struct vb2_shared_data *)wd->buffer;
+	sd = (struct vb2_shared_data *)(uintptr_t)wd->buffer;
 	sd->workbuf_hash_offset = 0;
 	sd->workbuf_hash_size = 0;
 
@@ -167,5 +168,7 @@ void *vboot_load_ramstage(void)
 
 	printk(BIOS_INFO,
 	       "loading ramstage from Slot %c\n", sd->fw_slot ? 'B' : 'A');
-	return load_ramstage(vh, &wd->selected_region);
+	vb2_get_selected_region(wd, &fw_main);
+
+	return load_ramstage(vh, &fw_main);
 }
diff --git a/src/vendorcode/google/chromeos/verstage.c b/src/vendorcode/google/chromeos/verstage.c
index 4970124..1b42bb6 100644
--- a/src/vendorcode/google/chromeos/verstage.c
+++ b/src/vendorcode/google/chromeos/verstage.c
@@ -173,12 +173,13 @@ void verstage_main(void)
 #endif /* CONFIG_RETURN_FROM_VERSTAGE */
 {
 	struct vb2_context ctx;
+	struct vboot_region fw_main;
 	struct vb2_working_data *wd = vboot_get_working_data();
 	int rv;
 
 	/* Set up context and work buffer */
 	memset(&ctx, 0, sizeof(ctx));
-	ctx.workbuf = wd->buffer;
+	ctx.workbuf = (uint8_t *)(uintptr_t)wd->buffer;
 	ctx.workbuf_size = wd->buffer_size;
 
 	/* Read nvdata from a non-volatile storage */
@@ -225,11 +226,11 @@ void verstage_main(void)
 	}
 
 	printk(BIOS_INFO, "Phase 4\n");
-	rv = locate_firmware(&ctx, &wd->selected_region);
+	rv = locate_firmware(&ctx, &fw_main);
 	if (rv)
 		die("Failed to read FMAP to locate firmware");
 
-	rv = hash_body(&ctx, &wd->selected_region);
+	rv = hash_body(&ctx, &fw_main);
 	save_if_needed(&ctx);
 	if (rv) {
 		printk(BIOS_INFO, "Reboot requested (%x)\n", rv);
@@ -246,4 +247,5 @@ void verstage_main(void)
 	}
 
 	printk(BIOS_INFO, "Slot %c is selected\n", is_slot_a(&ctx) ? 'A' : 'B');
+	vb2_set_selected_region(wd, &fw_main);
 }
diff --git a/src/vendorcode/google/chromeos/verstub.c b/src/vendorcode/google/chromeos/verstub.c
index 5df1777..a4ed77f 100644
--- a/src/vendorcode/google/chromeos/verstub.c
+++ b/src/vendorcode/google/chromeos/verstub.c
@@ -30,7 +30,7 @@ static struct vb2_working_data *init_vb2_working_data(void)
 	wd = vboot_get_working_data();
 	memset(wd, 0, CONFIG_VBOOT_WORK_BUFFER_SIZE);
 	/* 8-byte alignment for ARMv7 */
-	wd->buffer = (uint8_t *)ALIGN_UP((uintptr_t)&wd[1], 8);
+	wd->buffer = ALIGN_UP((uintptr_t)&wd[1], 8);
 	wd->buffer_size = CONFIG_VBOOT_WORK_BUFFER_SIZE + (uintptr_t)wd
 			- (uintptr_t)wd->buffer;
 
@@ -74,12 +74,14 @@ void vboot2_verify_firmware(void)
 	entry = NULL;
 	if (vboot_is_slot_selected(wd)) {
 		/* RW A or B */
-		struct vboot_components *fw_info =
-				vboot_locate_components(&wd->selected_region);
+		struct vboot_region fw_main;
+		struct vboot_components *fw_info;
+		vb2_get_selected_region(wd, &fw_main);
+		fw_info = vboot_locate_components(&fw_main);
 		if (fw_info == NULL)
 			die("failed to locate firmware components\n");
 		entry = vboot_load_stage(CONFIG_VBOOT_ROMSTAGE_INDEX,
-					 &wd->selected_region, fw_info);
+					 &fw_main, fw_info);
 	} else if (vboot_is_readonly_path(wd)) {
 		/* RO */
 		entry = cbfs_load_stage(CBFS_DEFAULT_MEDIA,



More information about the coreboot-gerrit mailing list