[coreboot-gerrit] Patch set updated for coreboot: 5b33ad3 coreboot: add vboot_handoff to coreboot tables

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Wed Mar 20 22:09:28 CET 2013


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/2857

-gerrit

commit 5b33ad31a128220f7cec666bd553e9fbf4d6bbea
Author: Aaron Durbin <adurbin at chromium.org>
Date:   Thu Mar 7 23:15:06 2013 -0600

    coreboot: add vboot_handoff to coreboot tables
    
    The vboot_handoff structure contians the VbInitParams as well as the
    shared vboot data. In order for the boot loader to find it, the
    structure address and size needs to be obtained from the coreboot
    tables.
    
    Change-Id: I6573d479009ccbf373a7325f861bebe8dc9f5cf8
    Signed-off-by: Aaron Durbin <adurbin at chromium.org>
---
 src/arch/x86/boot/coreboot_table.c        | 26 +++++++++++++++++++++++++-
 src/include/boot/coreboot_tables.h        |  9 +++++++++
 src/vendorcode/google/chromeos/chromeos.c | 14 ++++++++++++++
 src/vendorcode/google/chromeos/chromeos.h |  2 ++
 4 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/src/arch/x86/boot/coreboot_table.c b/src/arch/x86/boot/coreboot_table.c
index 530849f..a456484 100644
--- a/src/arch/x86/boot/coreboot_table.c
+++ b/src/arch/x86/boot/coreboot_table.c
@@ -36,6 +36,7 @@
 #endif
 #if CONFIG_CHROMEOS
 #include <arch/acpi.h>
+#include <vendorcode/google/chromeos/chromeos.h>
 #include <vendorcode/google/chromeos/gnvs.h>
 #endif
 
@@ -219,7 +220,27 @@ static void lb_vbnv(struct lb_header *header)
 	vbnv->vbnv_start = CONFIG_VBNV_OFFSET + 14;
 	vbnv->vbnv_size = CONFIG_VBNV_SIZE;
 }
-#endif
+
+#if CONFIG_VBOOT_VERIFY_FIRMWARE
+static void lb_vboot_handoff(struct lb_header *header)
+{
+	void *addr;
+	uint32_t size;
+	struct lb_vboot_handoff* vbho;
+
+	if (vboot_get_handoff_info(&addr, &size))
+		return;
+
+	vbho = (struct lb_vboot_handoff *)lb_new_record(header);
+	vbho->tag = LB_TAB_VBOOT_HANDOFF;
+	vbho->size = sizeof(*vbho);
+	vbho->vboot_handoff_addr = addr;
+	vbho->vboot_handoff_size = size;
+}
+#else
+static inline void lb_vboot_handoff(struct lb_header *header) {}
+#endif /* CONFIG_VBOOT_VERIFY_FIRMWARE */
+#endif /* CONFIG_CHROMEOS */
 
 static void add_cbmem_pointers(struct lb_header *header)
 {
@@ -697,6 +718,9 @@ unsigned long write_coreboot_table(
 
 	/* pass along VBNV offsets in CMOS */
 	lb_vbnv(head);
+
+	/* pass along the vboot_handoff address. */
+	lb_vboot_handoff(head);
 #endif
 	add_cbmem_pointers(head);
 
diff --git a/src/include/boot/coreboot_tables.h b/src/include/boot/coreboot_tables.h
index 9cf90d3..71ad3f0 100644
--- a/src/include/boot/coreboot_tables.h
+++ b/src/include/boot/coreboot_tables.h
@@ -241,6 +241,15 @@ struct lb_vbnv {
 	uint32_t vbnv_size;
 };
 
+#define LB_TAB_VBOOT_HANDOFF	0x0020
+struct lb_vboot_handoff {
+	uint32_t tag;
+	uint32_t size;
+
+	void *vboot_handoff_addr;
+	uint32_t vboot_handoff_size;
+};
+
 /* The following structures are for the cmos definitions table */
 #define LB_TAG_CMOS_OPTION_TABLE 200
 /* cmos header record */
diff --git a/src/vendorcode/google/chromeos/chromeos.c b/src/vendorcode/google/chromeos/chromeos.c
index 559f1f0..abe7104 100644
--- a/src/vendorcode/google/chromeos/chromeos.c
+++ b/src/vendorcode/google/chromeos/chromeos.c
@@ -66,4 +66,18 @@ void *vboot_get_payload(int *len)
 
 	return (void *)fwc->address;
 }
+
+int vboot_get_handoff_info(void **addr, uint32_t *size)
+{
+	struct vboot_handoff *vboot_handoff;
+
+	vboot_handoff = cbmem_find(CBMEM_ID_VBOOT_HANDOFF);
+
+	if (vboot_handoff == NULL)
+		return -1;
+
+	*addr = vboot_handoff;
+	*size = sizeof(*vboot_handoff);
+	return 0;
+}
 #endif
diff --git a/src/vendorcode/google/chromeos/chromeos.h b/src/vendorcode/google/chromeos/chromeos.h
index 8410707..d241085 100644
--- a/src/vendorcode/google/chromeos/chromeos.h
+++ b/src/vendorcode/google/chromeos/chromeos.h
@@ -49,6 +49,8 @@ void init_chromeos(int bootmode);
 struct romstage_handoff;
 void vboot_verify_firmware(struct romstage_handoff *handoff);
 void *vboot_get_payload(int *len);
+/* Returns 0 on success < 0 on error. */
+int vboot_get_handoff_info(void **addr, uint32_t *size);
 #endif
 
 #endif



More information about the coreboot-gerrit mailing list