diff options
-rw-r--r-- | payloads/libpayload/include/coreboot_tables.h | 1 | ||||
-rw-r--r-- | payloads/libpayload/include/sysinfo.h | 2 | ||||
-rw-r--r-- | payloads/libpayload/libc/coreboot.c | 11 | ||||
-rw-r--r-- | src/commonlib/include/commonlib/coreboot_tables.h | 1 | ||||
-rw-r--r-- | src/lib/coreboot_table.c | 30 | ||||
-rw-r--r-- | src/security/vboot/common.c | 20 | ||||
-rw-r--r-- | src/security/vboot/misc.h | 19 |
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); |