arm64: move seeding stack to C
Move the stack seeding out of assembly and into C so the code in stage_entry.S can more easily be used. The seeding of the stack doesn't touch at least 256 bytes to account for current usage at time fo the call. BUG=chrome-os-partner:31545 BRANCH=None TEST=Built and booted into kernel on ryu. Change-Id: Ib9659ec4265652461bde746140567f21533cc265 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: f478cfe175aa674cdfdbbd890663eeaad9d82b1f Original-Change-Id: I44004220a02b1ff06d27a0555eb4e96d9e213544 Original-Signed-off-by: Aaron Durbin <adurbin@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/214770 Original-Reviewed-by: Furquan Shaikh <furquan@chromium.org> Reviewed-on: http://review.coreboot.org/9014 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
committed by
Patrick Georgi
parent
a5c7f66810
commit
30f08ff094
@@ -18,14 +18,34 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <arch/stages.h>
|
#include <arch/stages.h>
|
||||||
|
#include <arch/cpu.h>
|
||||||
|
|
||||||
void __attribute__((weak)) arm64_soc_init(void)
|
void __attribute__((weak)) arm64_soc_init(void)
|
||||||
{
|
{
|
||||||
/* Default weak implementation does nothing. */
|
/* Default weak implementation does nothing. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void seed_stack(void)
|
||||||
|
{
|
||||||
|
char *stack_begin;
|
||||||
|
uint64_t *slot;
|
||||||
|
int i;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
stack_begin = cpu_get_stack(smp_processor_id());
|
||||||
|
stack_begin -= CONFIG_STACK_SIZE;
|
||||||
|
slot = (void *)stack_begin;
|
||||||
|
|
||||||
|
/* Pad out 256 bytes for current usage. */
|
||||||
|
size = CONFIG_STACK_SIZE - 256;
|
||||||
|
size /= sizeof(*slot);
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
*slot++ = 0xdeadbeefdeadbeefULL;
|
||||||
|
}
|
||||||
|
|
||||||
void arm64_init(void)
|
void arm64_init(void)
|
||||||
{
|
{
|
||||||
|
seed_stack();
|
||||||
arm64_soc_init();
|
arm64_soc_init();
|
||||||
main();
|
main();
|
||||||
}
|
}
|
||||||
|
@@ -74,30 +74,6 @@ ENTRY(cpu_get_exception_stack)
|
|||||||
.quad _estack_exceptions
|
.quad _estack_exceptions
|
||||||
ENDPROC(cpu_get_exception_stack)
|
ENDPROC(cpu_get_exception_stack)
|
||||||
|
|
||||||
|
|
||||||
ENTRY(seed_stack)
|
|
||||||
/*
|
|
||||||
* Initialize the stack to a known value. This is used to check for
|
|
||||||
* stack overflow later in the boot process.
|
|
||||||
*/
|
|
||||||
ldr x0, .stack_bottom
|
|
||||||
mov x1, sp
|
|
||||||
ldr x2, =0xdeadbeefdeadbeef
|
|
||||||
ldr x3, =0x8
|
|
||||||
|
|
||||||
init_stack_loop:
|
|
||||||
str x2, [x0]
|
|
||||||
add x0, x0, x3
|
|
||||||
cmp x0, x1
|
|
||||||
bne init_stack_loop
|
|
||||||
|
|
||||||
load_stack:
|
|
||||||
b arm64_init
|
|
||||||
.align 4
|
|
||||||
.stack_bottom:
|
|
||||||
.quad _stack
|
|
||||||
ENDPROC(seed_stack)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Boot strap the processor into a C environemnt. That consists of providing
|
* Boot strap the processor into a C environemnt. That consists of providing
|
||||||
* 16-byte aligned stack. The programming enviroment uses SP_EL0 as its main
|
* 16-byte aligned stack. The programming enviroment uses SP_EL0 as its main
|
||||||
@@ -123,7 +99,7 @@ ENTRY(arm64_c_environment)
|
|||||||
bl cpu_get_stack
|
bl cpu_get_stack
|
||||||
mov sp, x0
|
mov sp, x0
|
||||||
|
|
||||||
b seed_stack
|
b arm64_init
|
||||||
ENDPROC(arm64_c_environment)
|
ENDPROC(arm64_c_environment)
|
||||||
|
|
||||||
CPU_RESET_ENTRY(arm64_cpu_startup)
|
CPU_RESET_ENTRY(arm64_cpu_startup)
|
||||||
|
Reference in New Issue
Block a user