summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/include/boot/coreboot_tables.h6
-rw-r--r--src/lib/coreboot_table.c13
2 files changed, 19 insertions, 0 deletions
diff --git a/src/include/boot/coreboot_tables.h b/src/include/boot/coreboot_tables.h
index 8fde5458b5..dda1e1aaa4 100644
--- a/src/include/boot/coreboot_tables.h
+++ b/src/include/boot/coreboot_tables.h
@@ -9,6 +9,12 @@ unsigned long write_coreboot_table(
unsigned long low_table_start, unsigned long low_table_end,
unsigned long rom_table_start, unsigned long rom_table_end);
+/*
+ * Write forwarding table of target address at entry address returning size
+ * of table written.
+ */
+size_t write_coreboot_forwarding_table(uintptr_t entry, uintptr_t target);
+
void fill_lb_gpios(struct lb_gpios *gpios);
void lb_add_gpios(struct lb_gpios *gpios, const struct lb_gpio *gpio_table,
size_t count);
diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c
index 091ceaf06d..6967217b6a 100644
--- a/src/lib/coreboot_table.c
+++ b/src/lib/coreboot_table.c
@@ -445,6 +445,19 @@ static unsigned long lb_table_fini(struct lb_header *head)
return (unsigned long)rec + rec->size;
}
+size_t write_coreboot_forwarding_table(uintptr_t entry, uintptr_t target)
+{
+ struct lb_header *head;
+
+ printk(BIOS_DEBUG, "Writing table forward entry at 0x%p\n",
+ (void *)entry);
+
+ head = lb_table_init(entry);
+ lb_forward(head, (struct lb_header*)target);
+
+ return (uintptr_t)lb_table_fini(head) - entry;
+}
+
unsigned long write_coreboot_table(
unsigned long low_table_start, unsigned long low_table_end,
unsigned long rom_table_start __unused, unsigned long rom_table_end)