From 5481c961b265ef5128ab67b24d0416df22d1f693 Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Tue, 19 Apr 2016 20:37:51 -0500 Subject: [PATCH] lib/coreboot_table: add architecture hooks for adding tables Add a architecture specific function, arch_write_tables(), that allows an architecture to add its required tables for booting. This callback helps write_tables() to be de-duplicated. Change-Id: I805c2f166b1e75942ad28b6e7e1982d64d2d5498 Signed-off-by: Aaron Durbin Reviewed-on: https://review.coreboot.org/14435 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi --- src/arch/arm/tables.c | 4 ++++ src/arch/arm64/tables.c | 4 ++++ src/arch/mips/tables.c | 4 ++++ src/arch/power8/tables.c | 4 ++++ src/arch/riscv/tables.c | 4 ++++ src/arch/x86/tables.c | 46 ++++++++++++++++++++------------------- src/include/boot/tables.h | 12 ++++++++++ src/lib/coreboot_table.c | 3 +++ 8 files changed, 59 insertions(+), 22 deletions(-) diff --git a/src/arch/arm/tables.c b/src/arch/arm/tables.c index 20891e8d67..92213c5b9c 100644 --- a/src/arch/arm/tables.c +++ b/src/arch/arm/tables.c @@ -24,6 +24,10 @@ #include #include +void arch_write_tables(uintptr_t coreboot_table) +{ +} + void bootmem_arch_add_ranges(void) { } diff --git a/src/arch/arm64/tables.c b/src/arch/arm64/tables.c index 20891e8d67..92213c5b9c 100644 --- a/src/arch/arm64/tables.c +++ b/src/arch/arm64/tables.c @@ -24,6 +24,10 @@ #include #include +void arch_write_tables(uintptr_t coreboot_table) +{ +} + void bootmem_arch_add_ranges(void) { } diff --git a/src/arch/mips/tables.c b/src/arch/mips/tables.c index d54b8d6e20..32e73bc1e2 100644 --- a/src/arch/mips/tables.c +++ b/src/arch/mips/tables.c @@ -25,6 +25,10 @@ #include #include +void arch_write_tables(uintptr_t coreboot_table) +{ +} + void bootmem_arch_add_ranges(void) { } diff --git a/src/arch/power8/tables.c b/src/arch/power8/tables.c index 17e678a999..ff07c31066 100644 --- a/src/arch/power8/tables.c +++ b/src/arch/power8/tables.c @@ -24,6 +24,10 @@ #include #include +void arch_write_tables(uintptr_t coreboot_table) +{ +} + void bootmem_arch_add_ranges(void) { } diff --git a/src/arch/riscv/tables.c b/src/arch/riscv/tables.c index 20891e8d67..92213c5b9c 100644 --- a/src/arch/riscv/tables.c +++ b/src/arch/riscv/tables.c @@ -24,6 +24,10 @@ #include #include +void arch_write_tables(uintptr_t coreboot_table) +{ +} + void bootmem_arch_add_ranges(void) { } diff --git a/src/arch/x86/tables.c b/src/arch/x86/tables.c index 4fba509a96..94fe691bcb 100644 --- a/src/arch/x86/tables.c +++ b/src/arch/x86/tables.c @@ -181,29 +181,9 @@ static unsigned long write_smbios_table(unsigned long rom_table_end) return rom_table_end; } -void bootmem_arch_add_ranges(void) +void arch_write_tables(uintptr_t coreboot_table) { -} - -void write_tables(void) -{ - unsigned long low_table_start, low_table_end; - unsigned long rom_table_end; - - /* Even if high tables are configured, some tables are copied both to - * the low and the high area, so payloads and OSes don't need to know - * about the high tables. - */ - unsigned long high_table_pointer; - - rom_table_end = 0xf0000; - - /* Start low addr at 0x500, so we don't run into conflicts with the BDA - * in case our data structures grow beyond 0x400. Only GDT - * and the coreboot table use low_tables. - */ - low_table_start = 0; - low_table_end = 0x500; + unsigned long rom_table_end = 0xf0000; /* This table must be between 0x0f0000 and 0x100000 */ if (IS_ENABLED(CONFIG_GENERATE_PIRQ_TABLE)) @@ -218,6 +198,28 @@ void write_tables(void) if (IS_ENABLED(CONFIG_GENERATE_SMBIOS_TABLES)) rom_table_end = write_smbios_table(rom_table_end); +} + +void bootmem_arch_add_ranges(void) +{ +} + +void write_tables(void) +{ + unsigned long low_table_start, low_table_end; + + /* Even if high tables are configured, some tables are copied both to + * the low and the high area, so payloads and OSes don't need to know + * about the high tables. + */ + unsigned long high_table_pointer; + + /* Start low addr at 0x500, so we don't run into conflicts with the BDA + * in case our data structures grow beyond 0x400. Only GDT + * and the coreboot table use low_tables. + */ + low_table_start = 0; + low_table_end = 0x500; post_code(0x9e); diff --git a/src/include/boot/tables.h b/src/include/boot/tables.h index e86adfc27b..c2d7b48841 100644 --- a/src/include/boot/tables.h +++ b/src/include/boot/tables.h @@ -3,6 +3,18 @@ #include +/* + * Write architecture specific tables as well as the common + * coreboot table. + */ void write_tables(void); +/* + * Allow per-architecture table writes called from write_tables(). The + * coreboot_table parameter provides a reference to where the coreboot + * table will be written. The parameter is to allow architectures to + * provide a forwarding table to real coreboot table. + */ +void arch_write_tables(uintptr_t coreboot_table); + #endif /* BOOT_TABLES_H */ diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c index 6967217b6a..583f609a3e 100644 --- a/src/lib/coreboot_table.c +++ b/src/lib/coreboot_table.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -464,6 +465,8 @@ unsigned long write_coreboot_table( { struct lb_header *head; + arch_write_tables(rom_table_end); + if (low_table_start || low_table_end) { printk(BIOS_DEBUG, "Writing table forward entry at 0x%08lx\n", low_table_end);