[coreboot-gerrit] New patch to review for coreboot: 397e838 vboot: allow non-relocatable ramstage loading

Marc Jones (marc.jones@se-eng.com) gerrit at coreboot.org
Tue Oct 28 02:56:53 CET 2014


Marc Jones (marc.jones at se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/7220

-gerrit

commit 397e83838f466715b8e789389e387c72f20d1a1d
Author: Aaron Durbin <adurbin at chromium.org>
Date:   Thu Mar 20 15:24:03 2014 -0500

    vboot: allow non-relocatable ramstage loading
    
    The vboot implementation previously assumed that ramstage would
    be a relocatable module. Allow for ramstage not being a relocatable
    module.
    
    BUG=chrome-os-partner:27094
    BRANCH=None
    TEST=Built nyan with vboot.
    
    Original-Change-Id: Id3544533740d77e2db6be3960bef0c129173bacc
    Original-Signed-off-by: Aaron Durbin <adurbin at chromium.org>
    Original-Reviewed-on: https://chromium-review.googlesource.com/190923
    Original-Reviewed-by: Gabe Black <gabeblack at chromium.org>
    (cherry picked from commit 756ee3a6987097c65588c8784ee9653fd6e735e4)
    Signed-off-by: Marc Jones <marc.jones at se-eng.com>
    
    Change-Id: I813b07e1bec75640ad4066aca749ba8dccec31d4
---
 src/lib/Makefile.inc                          |  3 +-
 src/vendorcode/google/chromeos/Kconfig        |  1 +
 src/vendorcode/google/chromeos/vboot_loader.c | 57 +++++++++++++++++++++++++++
 3 files changed, 60 insertions(+), 1 deletion(-)

diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index c104ce3..fe4455b 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -101,7 +101,8 @@ ramstage-y += bootmode.c
 
 ifeq ($(CONFIG_RELOCATABLE_MODULES),y)
 ramstage-y += rmodule.c
-romstage-$(CONFIG_RELOCATABLE_RAMSTAGE) += rmodule.c
+# Include rmodule.c in romstage if vboot verification is selected.
+romstage-$(CONFIG_VBOOT_VERIFY_FIRMWARE) += rmodule.c
 
 RMODULE_LDSCRIPT := $(src)/lib/rmodule.ld
 RMODULE_LDFLAGS  := -nostartfiles -Wl,--emit-relocs -Wl,-z,defs -Wl,-Bsymbolic -Wl,-T,$(RMODULE_LDSCRIPT)
diff --git a/src/vendorcode/google/chromeos/Kconfig b/src/vendorcode/google/chromeos/Kconfig
index a1a9d9a..8156758 100644
--- a/src/vendorcode/google/chromeos/Kconfig
+++ b/src/vendorcode/google/chromeos/Kconfig
@@ -80,6 +80,7 @@ config FLASHMAP_OFFSET
 config VBOOT_VERIFY_FIRMWARE
 	bool "Verify firmware with vboot."
 	default n
+	select RELOCATABLE_MODULES
 	help
 	  Enabling VBOOT_VERIFY_FIRMWARE will use vboot to verify the ramstage
 	  and boot loader.
diff --git a/src/vendorcode/google/chromeos/vboot_loader.c b/src/vendorcode/google/chromeos/vboot_loader.c
index 2f786ad..cfdc5af 100644
--- a/src/vendorcode/google/chromeos/vboot_loader.c
+++ b/src/vendorcode/google/chromeos/vboot_loader.c
@@ -141,6 +141,7 @@ static void vboot_invoke_wrapper(struct vboot_handoff *vboot_handoff)
 	vboot_run_stub(&context);
 }
 
+#if CONFIG_RELOCATABLE_RAMSTAGE
 static void *vboot_load_ramstage(uint32_t cbmem_id, const char *name,
 				const struct cbmem_entry **cbmem_entry)
 {
@@ -204,6 +205,62 @@ static void *vboot_load_ramstage(uint32_t cbmem_id, const char *name,
 
 	return rmod_load.entry;
 }
+#else /* CONFIG_RELOCATABLE_RAMSTAGE */
+static void vboot_load_ramstage(struct vboot_handoff *vboot_handoff,
+                                struct romstage_handoff *handoff)
+{
+	struct cbfs_stage *stage;
+	const struct firmware_component *fwc;
+
+	if (CONFIG_VBOOT_RAMSTAGE_INDEX >= MAX_PARSED_FW_COMPONENTS) {
+		printk(BIOS_ERR, "Invalid ramstage index: %d\n",
+		       CONFIG_VBOOT_RAMSTAGE_INDEX);
+		return;
+	}
+
+	/* Check for invalid address. */
+	fwc = &vboot_handoff->components[CONFIG_VBOOT_RAMSTAGE_INDEX];
+	if (fwc->address == 0) {
+		printk(BIOS_DEBUG, "RW ramstage image address invalid.\n");
+		return;
+	}
+
+	printk(BIOS_DEBUG, "RW ramstage image at 0x%08x, 0x%08x bytes.\n",
+	       fwc->address, fwc->size);
+
+	stage = vboot_get_region(fwc->address, fwc->size);
+
+	if (stage == NULL) {
+		printk(BIOS_DEBUG, "Unable to get RW ramstage region.\n");
+		return;
+	}
+
+	timestamp_add_now(TS_START_COPYRAM);
+
+	/* Stages rely the below clearing so that the bss is initialized. */
+	memset((void *) (uintptr_t) stage->load, 0, stage->memlen);
+
+	if (cbfs_decompress(stage->compression,
+			     ((unsigned char *) stage) +
+			     sizeof(struct cbfs_stage),
+			     (void *) (uintptr_t) stage->load,
+			     stage->len))
+		return;
+
+	timestamp_add_now(TS_END_COPYRAM);
+
+#if CONFIG_ARCH_X86
+	__asm__ volatile (
+		"movl $0, %%ebp\n"
+		"jmp  *%%edi\n"
+		:: "D"(stage->entry)
+	);
+#elif CONFIG_ARCH_ARM
+	stage_exit((void *)(uintptr_t)stage->entry);
+#endif
+}
+#endif /* CONFIG_RELOCATABLE_RAMSTAGE */
+
 
 const struct ramstage_loader_ops vboot_ramstage_loader = {
 	.name = "VBOOT",



More information about the coreboot-gerrit mailing list