summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2014-02-24 22:27:39 -0600
committerAaron Durbin <adurbin@google.com>2014-03-03 19:50:32 +0100
commit7d1996cc4af563f614455db23fe91a6feccd2560 (patch)
treed8bbaeb40898a3dbf197cbca991acf9962b7c7f9
parente58a24b1b598383eab918dac03be4d7122bf0ac5 (diff)
downloadcoreboot-7d1996cc4af563f614455db23fe91a6feccd2560.tar.xz
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 <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/5300 Tested-by: build bot (Jenkins) Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
-rw-r--r--src/arch/armv7/boot.c7
-rw-r--r--src/arch/armv7/include/arch/stages.h1
-rw-r--r--src/arch/x86/boot/boot.c18
-rw-r--r--src/arch/x86/include/arch/stages.h1
-rw-r--r--src/include/payload_loader.h4
-rw-r--r--src/lib/loaders/load_and_run_payload.c2
-rw-r--r--src/lib/selfboot.c7
7 files changed, 20 insertions, 20 deletions
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 <console/console.h>
#include <arch/stages.h>
+#include <payload_loader.h>
-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 <console/console.h>
#include <arch/stages.h>
+#include <payload_loader.h>
#include <ip_checksum.h>
#include <string.h>
-#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 <arch/cpu.h>
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)
{
diff --git a/src/include/payload_loader.h b/src/include/payload_loader.h
index 73b28bff8f..4948afb6b8 100644
--- a/src/include/payload_loader.h
+++ b/src/include/payload_loader.h
@@ -44,6 +44,9 @@ struct payload *payload_load(void);
/* Run the loaded payload. */
void payload_run(const struct payload *payload);
+/* architecture specific function to run payload. */
+void arch_payload_run(const struct payload *payload);
+
/* Payload loading operations. */
struct payload_loader_ops {
const char *name;
@@ -57,6 +60,5 @@ struct payload_loader_ops {
/* Defined in src/lib/selfboot.c */
struct lb_memory;
void *selfload(struct lb_memory *mem, struct payload *payload);
-void selfboot(void *entry);
#endif /* PAYLOAD_LOADER_H */
diff --git a/src/lib/loaders/load_and_run_payload.c b/src/lib/loaders/load_and_run_payload.c
index f18b57b23a..3e1eafb7b9 100644
--- a/src/lib/loaders/load_and_run_payload.c
+++ b/src/lib/loaders/load_and_run_payload.c
@@ -93,5 +93,5 @@ void payload_run(const struct payload *payload)
*/
checkstack(_estack, 0);
- selfboot(payload->entry);
+ arch_payload_run(payload);
}
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index ba0748039e..6dc3a75374 100644
--- a/src/lib/selfboot.c
+++ b/src/lib/selfboot.c
@@ -19,7 +19,6 @@
*/
#include <arch/byteorder.h>
-#include <arch/stages.h>
#include <console/console.h>
#include <cpu/cpu.h>
#include <boot/coreboot_tables.h>
@@ -526,9 +525,3 @@ void *selfload(struct lb_memory *mem, struct payload *payload)
out:
return NULL;
}
-
-void selfboot(void *entry)
-{
- /* Jump to kernel */
- jmp_to_elf_entry(entry, bounce_buffer, bounce_size);
-}