diff --git a/payloads/libpayload/arch/arm/Config.in b/payloads/libpayload/arch/arm/Config.in index b2ee527ab7..b1f2bb4a80 100644 --- a/payloads/libpayload/arch/arm/Config.in +++ b/payloads/libpayload/arch/arm/Config.in @@ -33,12 +33,4 @@ config ARCH_SPECIFIC_OPTIONS # dummy def_bool y select LITTLE_ENDIAN -config COREBOOT_INFO_RANGE_BASE - hex "Base of the range to search for the coreboot tables" - -config COREBOOT_INFO_RANGE_SIZE - hex "Size of the range to search for the coreboot tables" - default 0x4000000 - - endif diff --git a/payloads/libpayload/arch/arm/coreboot.c b/payloads/libpayload/arch/arm/coreboot.c index 876601009b..4630947e24 100644 --- a/payloads/libpayload/arch/arm/coreboot.c +++ b/payloads/libpayload/arch/arm/coreboot.c @@ -32,6 +32,9 @@ #include #include +/* This pointer gets set in head.S and is passed in from coreboot. */ +void *cb_header_ptr; + /* * Some of this is x86 specific, and the rest of it is generic. Right now, * since we only support x86, we'll avoid trying to make lots of infrastructure @@ -169,22 +172,16 @@ static void cb_parse_string(unsigned char *ptr, char **info) *info = (char *)((struct cb_string *)ptr)->string; } -static int cb_parse_header(void *addr, int len, struct sysinfo_t *info) +static int cb_parse_header(void *addr, struct sysinfo_t *info) { - struct cb_header *header; + struct cb_header *header = addr; unsigned char *ptr = addr; void *forward; int i; - for (i = 0; i < len; i += 16, ptr += 16) { - header = (struct cb_header *)ptr; - if (!strncmp((const char *)header->signature, "LBIO", 4)) - break; - } - - /* We walked the entire space and didn't find anything. */ - if (i >= len) - return -1; + /* No signature found. */ + if (strncmp((const char *)header->signature, "LBIO", 4)) + return -1; if (!header->table_bytes) return 0; @@ -209,7 +206,7 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info) switch (rec->tag) { case CB_TAG_FORWARD: forward = phys_to_virt((void *)(unsigned long)((struct cb_forward *)rec)->forward); - return cb_parse_header(forward, len, info); + return cb_parse_header(forward, info); continue; case CB_TAG_MEMORY: cb_parse_memory(ptr, info); @@ -304,9 +301,7 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info) int get_coreboot_info(struct sysinfo_t *info) { - int ret = cb_parse_header( - phys_to_virt(CONFIG_LP_COREBOOT_INFO_RANGE_BASE), - CONFIG_LP_COREBOOT_INFO_RANGE_SIZE, info); + int ret = cb_parse_header(cb_header_ptr, info); return (ret == 1) ? 0 : -1; } diff --git a/payloads/libpayload/arch/arm/head.S b/payloads/libpayload/arch/arm/head.S index 54fdb5defd..c5c96ea38f 100644 --- a/payloads/libpayload/arch/arm/head.S +++ b/payloads/libpayload/arch/arm/head.S @@ -34,12 +34,16 @@ */ ENTRY(_entry) + /* Save off the location of the coreboot tables */ + ldr r1, 1f + str r0, [r1] + /* TODO: disable interrupts */ /* TODO: Clear BSS */ /* Setup new stack */ - ldr sp, 1f + ldr sp, 2f /* TODO: Save old stack pointer and link register */ @@ -56,4 +60,6 @@ ENDPROC(_entry) .align 4 1: +.word cb_header_ptr +2: .word _stack diff --git a/payloads/libpayload/configs/config.daisy b/payloads/libpayload/configs/config.daisy index 6b01b8fcb6..f8fb26b4b5 100644 --- a/payloads/libpayload/configs/config.daisy +++ b/payloads/libpayload/configs/config.daisy @@ -19,8 +19,6 @@ CONFIG_LP_ARCH_ARM=y # CONFIG_LP_ARCH_POWERPC is not set # CONFIG_LP_ARCH_X86 is not set # CONFIG_LP_MEMMAP_RAM_ONLY is not set -CONFIG_LP_COREBOOT_INFO_RANGE_BASE=0xbfb00000 -CONFIG_LP_COREBOOT_INFO_RANGE_SIZE=0x00100000 # # Standard Libraries diff --git a/payloads/libpayload/configs/config.nyan b/payloads/libpayload/configs/config.nyan index 726411393e..0952bcf0f3 100644 --- a/payloads/libpayload/configs/config.nyan +++ b/payloads/libpayload/configs/config.nyan @@ -19,8 +19,6 @@ CONFIG_LP_ARCH_ARM=y # CONFIG_LP_ARCH_POWERPC is not set # CONFIG_LP_ARCH_X86 is not set # CONFIG_LP_MEMMAP_RAM_ONLY is not set -CONFIG_LP_COREBOOT_INFO_RANGE_BASE=0xfdf00000 -CONFIG_LP_COREBOOT_INFO_RANGE_SIZE=0x00100000 # # Standard Libraries diff --git a/payloads/libpayload/configs/config.nyan_big b/payloads/libpayload/configs/config.nyan_big index 726411393e..0952bcf0f3 100644 --- a/payloads/libpayload/configs/config.nyan_big +++ b/payloads/libpayload/configs/config.nyan_big @@ -19,8 +19,6 @@ CONFIG_LP_ARCH_ARM=y # CONFIG_LP_ARCH_POWERPC is not set # CONFIG_LP_ARCH_X86 is not set # CONFIG_LP_MEMMAP_RAM_ONLY is not set -CONFIG_LP_COREBOOT_INFO_RANGE_BASE=0xfdf00000 -CONFIG_LP_COREBOOT_INFO_RANGE_SIZE=0x00100000 # # Standard Libraries diff --git a/payloads/libpayload/configs/config.peach_pit b/payloads/libpayload/configs/config.peach_pit index b7671bf97a..7af36f5598 100644 --- a/payloads/libpayload/configs/config.peach_pit +++ b/payloads/libpayload/configs/config.peach_pit @@ -19,8 +19,6 @@ CONFIG_LP_ARCH_ARM=y # CONFIG_LP_ARCH_POWERPC is not set # CONFIG_LP_ARCH_X86 is not set # CONFIG_LP_MEMMAP_RAM_ONLY is not set -CONFIG_LP_COREBOOT_INFO_RANGE_BASE=0x9fb00000 -CONFIG_LP_COREBOOT_INFO_RANGE_SIZE=0x00100000 # # Standard Libraries diff --git a/src/arch/arm/boot.c b/src/arch/arm/boot.c index 677480230b..6fb0e650b5 100644 --- a/src/arch/arm/boot.c +++ b/src/arch/arm/boot.c @@ -17,11 +17,17 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include +#include +#include void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size) { + void (*doit)(void *) = entry; + void *cb_tables = cbmem_find(CBMEM_ID_CBTABLE); + printk(BIOS_SPEW, "entry = %p\n", entry); - stage_exit(entry); + cache_sync_instructions(); + doit(cb_tables); }