aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--payloads/libpayload/include/coreboot_tables.h1
-rw-r--r--payloads/libpayload/include/sysinfo.h2
-rw-r--r--payloads/libpayload/libc/coreboot.c11
-rw-r--r--src/commonlib/include/commonlib/coreboot_tables.h1
-rw-r--r--src/lib/coreboot_table.c30
-rw-r--r--src/security/vboot/common.c20
-rw-r--r--src/security/vboot/misc.h19
7 files changed, 57 insertions, 27 deletions
diff --git a/payloads/libpayload/include/coreboot_tables.h b/payloads/libpayload/include/coreboot_tables.h
index 15685264be..92e3f26180 100644
--- a/payloads/libpayload/include/coreboot_tables.h
+++ b/payloads/libpayload/include/coreboot_tables.h
@@ -202,6 +202,7 @@ struct cb_gpios {
#define CB_TAG_VBNV 0x0019
#define CB_TAG_VBOOT_HANDOFF 0x0020
+#define CB_TAG_VBOOT_WORKBUF 0x0034
#define CB_TAG_DMA 0x0022
#define CB_TAG_RAM_OOPS 0x0023
#define CB_TAG_MTC 0x002b
diff --git a/payloads/libpayload/include/sysinfo.h b/payloads/libpayload/include/sysinfo.h
index 845b7c4c84..7e6e74809d 100644
--- a/payloads/libpayload/include/sysinfo.h
+++ b/payloads/libpayload/include/sysinfo.h
@@ -97,6 +97,8 @@ struct sysinfo_t {
void *vboot_handoff;
u32 vboot_handoff_size;
+ void *vboot_workbuf;
+ uint32_t vboot_workbuf_size;
#if CONFIG(LP_ARCH_X86)
int x86_rom_var_mtrr_index;
diff --git a/payloads/libpayload/libc/coreboot.c b/payloads/libpayload/libc/coreboot.c
index ba5bb27294..3982e47ec2 100644
--- a/payloads/libpayload/libc/coreboot.c
+++ b/payloads/libpayload/libc/coreboot.c
@@ -86,6 +86,14 @@ static void cb_parse_vboot_handoff(unsigned char *ptr, struct sysinfo_t *info)
info->vboot_handoff_size = vbho->range_size;
}
+static void cb_parse_vboot_workbuf(unsigned char *ptr, struct sysinfo_t *info)
+{
+ struct lb_range *vbwb = (struct lb_range *)ptr;
+
+ info->vboot_workbuf = (void *)(uintptr_t)vbwb->range_start;
+ info->vboot_workbuf_size = vbwb->range_size;
+}
+
static void cb_parse_vbnv(unsigned char *ptr, struct sysinfo_t *info)
{
struct lb_range *vbnv = (struct lb_range *)ptr;
@@ -355,6 +363,9 @@ int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
case CB_TAG_VBOOT_HANDOFF:
cb_parse_vboot_handoff(ptr, info);
break;
+ case CB_TAG_VBOOT_WORKBUF:
+ cb_parse_vboot_workbuf(ptr, info);
+ break;
case CB_TAG_MAC_ADDRS:
cb_parse_mac_addresses(ptr, info);
break;
diff --git a/src/commonlib/include/commonlib/coreboot_tables.h b/src/commonlib/include/commonlib/coreboot_tables.h
index 6ca0f779aa..198ad27b87 100644
--- a/src/commonlib/include/commonlib/coreboot_tables.h
+++ b/src/commonlib/include/commonlib/coreboot_tables.h
@@ -292,6 +292,7 @@ struct lb_gpios {
#define LB_TAG_VBNV 0x0019
#define LB_TAB_VBOOT_HANDOFF 0x0020
+#define LB_TAB_VBOOT_WORKBUF 0x0034
#define LB_TAB_DMA 0x0022
#define LB_TAG_RAM_OOPS 0x0023
#define LB_TAG_MTC 0x002b
diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c
index 960ab0f9eb..6e44f5d3d5 100644
--- a/src/lib/coreboot_table.c
+++ b/src/lib/coreboot_table.c
@@ -32,6 +32,7 @@
#include <cbmem.h>
#include <bootmem.h>
#include <spi_flash.h>
+#include <security/vboot/misc.h>
#include <security/vboot/vbnv_layout.h>
#if CONFIG(USE_OPTION_TABLE)
#include <option_table.h>
@@ -206,8 +207,8 @@ static void lb_vbnv(struct lb_header *header)
vbnv->range_size = VBOOT_VBNV_BLOCK_SIZE;
#endif
}
+#endif /* CONFIG_CHROMEOS */
-#if CONFIG(VBOOT)
static void lb_vboot_handoff(struct lb_header *header)
{
void *addr;
@@ -223,10 +224,18 @@ static void lb_vboot_handoff(struct lb_header *header)
vbho->range_start = (intptr_t)addr;
vbho->range_size = size;
}
-#else
-static inline void lb_vboot_handoff(struct lb_header *header) {}
-#endif /* CONFIG_VBOOT */
-#endif /* CONFIG_CHROMEOS */
+
+static void lb_vboot_workbuf(struct lb_header *header)
+{
+ struct lb_range *vbwb;
+ struct vboot_working_data *wd = vboot_get_working_data();
+
+ vbwb = (struct lb_range *)lb_new_record(header);
+ vbwb->tag = LB_TAB_VBOOT_WORKBUF;
+ vbwb->size = sizeof(*vbwb);
+ vbwb->range_start = (uintptr_t)wd + wd->buffer_offset;
+ vbwb->range_size = wd->buffer_size;
+}
__weak uint32_t board_id(void) { return UNDEFINED_STRAPPING_ID; }
__weak uint32_t ram_code(void) { return UNDEFINED_STRAPPING_ID; }
@@ -535,11 +544,16 @@ static uintptr_t write_coreboot_table(uintptr_t rom_table_end)
/* pass along VBNV offsets in CMOS */
lb_vbnv(head);
-
- /* pass along the vboot_handoff address. */
- lb_vboot_handoff(head);
#endif
+ if (CONFIG(VBOOT)) {
+ /* pass along the vboot_handoff address. */
+ lb_vboot_handoff(head);
+
+ /* pass along the vboot workbuf address. */
+ lb_vboot_workbuf(head);
+ }
+
/* Add strapping IDs if available */
lb_board_id(head);
lb_ram_code(head);
diff --git a/src/security/vboot/common.c b/src/security/vboot/common.c
index 47e1aa4f56..2348d31088 100644
--- a/src/security/vboot/common.c
+++ b/src/security/vboot/common.c
@@ -25,24 +25,6 @@
#include <security/vboot/symbols.h>
#include <security/vboot/vboot_common.h>
-struct selected_region {
- uint32_t offset;
- uint32_t size;
-};
-
-/*
- * 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. Keep the struct CPU architecture agnostic as it crosses
- * stage boundaries.
- */
-struct vboot_working_data {
- struct selected_region selected_region;
- /* offset of the buffer from the start of this struct */
- uint32_t buffer_offset;
- uint32_t buffer_size;
-};
-
/* TODO(kitching): Use VB2_FIRMWARE_WORKBUF_RECOMMENDED_SIZE instead. */
static size_t vboot_working_data_size(void)
{
@@ -56,7 +38,7 @@ static size_t vboot_working_data_size(void)
die("impossible!");
}
-static struct vboot_working_data * const vboot_get_working_data(void)
+struct vboot_working_data * const vboot_get_working_data(void)
{
struct vboot_working_data *wd = NULL;
diff --git a/src/security/vboot/misc.h b/src/security/vboot/misc.h
index 24e349d804..27317ad32d 100644
--- a/src/security/vboot/misc.h
+++ b/src/security/vboot/misc.h
@@ -21,9 +21,28 @@
struct vb2_context;
struct vb2_shared_data;
+struct selected_region {
+ uint32_t offset;
+ uint32_t size;
+};
+
+/*
+ * 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. Keep the struct CPU architecture agnostic as it crosses
+ * stage boundaries.
+ */
+struct vboot_working_data {
+ struct selected_region selected_region;
+ /* offset of the buffer from the start of this struct */
+ uint32_t buffer_offset;
+ uint32_t buffer_size;
+};
+
/*
* Source: security/vboot/common.c
*/
+struct vboot_working_data * const vboot_get_working_data(void);
void vboot_init_work_context(struct vb2_context *ctx);
void vboot_finalize_work_context(struct vb2_context *ctx);
struct vb2_shared_data *vboot_get_shared_data(void);