From 7d1996cc4af563f614455db23fe91a6feccd2560 Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Mon, 24 Feb 2014 22:27:39 -0600 Subject: coreboot: introduce arch_payload_run() The selfboot() function relied on global variables within the selfboot.c compilation unit. Now that the bounce buffer is a part of struct payload use a new architecture-specific arch_payload_run() function for jumping to the payload. selfboot() can then be removed. Change-Id: Icec74942e94599542148561b3311ce5096ac5ea5 Signed-off-by: Aaron Durbin Reviewed-on: http://review.coreboot.org/5300 Tested-by: build bot (Jenkins) Reviewed-by: Alexandru Gagniuc Reviewed-by: Paul Menzel --- src/arch/armv7/boot.c | 7 ++++--- src/arch/armv7/include/arch/stages.h | 1 - src/arch/x86/boot/boot.c | 18 ++++++++++++------ src/arch/x86/include/arch/stages.h | 1 - 4 files changed, 16 insertions(+), 11 deletions(-) (limited to 'src/arch') diff --git a/src/arch/armv7/boot.c b/src/arch/armv7/boot.c index 677480230b..d872a79151 100644 --- a/src/arch/armv7/boot.c +++ b/src/arch/armv7/boot.c @@ -19,9 +19,10 @@ #include #include +#include -void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size) +void arch_payload_run(const struct payload *payload) { - printk(BIOS_SPEW, "entry = %p\n", entry); - stage_exit(entry); + printk(BIOS_SPEW, "entry = %p\n", payload->entry); + stage_exit(payload->entry); } diff --git a/src/arch/armv7/include/arch/stages.h b/src/arch/armv7/include/arch/stages.h index 3fd54b9bb4..671c02b3dd 100644 --- a/src/arch/armv7/include/arch/stages.h +++ b/src/arch/armv7/include/arch/stages.h @@ -24,6 +24,5 @@ extern void main(void); void stage_entry(void) __attribute__((section(".text.stage_entry.armv7"))); void stage_exit(void *); -void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size); #endif diff --git a/src/arch/x86/boot/boot.c b/src/arch/x86/boot/boot.c index 3ef46a5bf0..29070a0ce1 100644 --- a/src/arch/x86/boot/boot.c +++ b/src/arch/x86/boot/boot.c @@ -1,12 +1,12 @@ #include #include +#include #include #include -#if CONFIG_RELOCATABLE_RAMSTAGE /* When the ramstage is relocatable the elf loading ensures an elf image cannot * be loaded over the ramstage code. */ -void jmp_to_elf_entry(void *entry, unsigned long unused1, unsigned long unused2) +static void jmp_payload_no_bounce_buffer(void *entry) { /* Jump to kernel */ __asm__ __volatile__( @@ -22,8 +22,8 @@ void jmp_to_elf_entry(void *entry, unsigned long unused1, unsigned long unused2) "r" (entry) ); } -#else -void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size) + +static void jmp_payload(void *entry, unsigned long buffer, unsigned long size) { extern unsigned char _ram_seg, _eram_seg; unsigned long lb_start, lb_size; @@ -122,6 +122,12 @@ void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size) "ri"(0), "ri" (0) ); } -#endif /* CONFIG_RELOCATABLE_RAMSTAGE */ - +void arch_payload_run(const struct payload *payload) +{ + if (IS_ENABLED(CONFIG_RELOCATABLE_RAMSTAGE)) + jmp_payload_no_bounce_buffer(payload->entry); + else + jmp_payload(payload->entry, (uintptr_t)payload->bounce.data, + payload->bounce.size); +} diff --git a/src/arch/x86/include/arch/stages.h b/src/arch/x86/include/arch/stages.h index 91d0db6957..4eae69850d 100644 --- a/src/arch/x86/include/arch/stages.h +++ b/src/arch/x86/include/arch/stages.h @@ -23,7 +23,6 @@ #include void asmlinkage copy_and_run(void); -void jmp_to_elf_entry(void *entry, unsigned long buffer, unsigned long size); static inline void stage_exit(void *entry) { -- cgit v1.2.3