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>
This commit is contained in:
parent
e58a24b1b5
commit
7d1996cc4a
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -93,5 +93,5 @@ void payload_run(const struct payload *payload)
|
|||
*/
|
||||
checkstack(_estack, 0);
|
||||
|
||||
selfboot(payload->entry);
|
||||
arch_payload_run(payload);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue