summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/arm64/c_entry.c20
-rw-r--r--src/arch/arm64/stage_entry.S26
2 files changed, 21 insertions, 25 deletions
diff --git a/src/arch/arm64/c_entry.c b/src/arch/arm64/c_entry.c
index a4d4b0c24f..f08a5853f4 100644
--- a/src/arch/arm64/c_entry.c
+++ b/src/arch/arm64/c_entry.c
@@ -18,14 +18,34 @@
*/
#include <arch/stages.h>
+#include <arch/cpu.h>
void __attribute__((weak)) arm64_soc_init(void)
{
/* 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)
{
+ seed_stack();
arm64_soc_init();
main();
}
diff --git a/src/arch/arm64/stage_entry.S b/src/arch/arm64/stage_entry.S
index 1de8894f2a..86136555dc 100644
--- a/src/arch/arm64/stage_entry.S
+++ b/src/arch/arm64/stage_entry.S
@@ -74,30 +74,6 @@ ENTRY(cpu_get_exception_stack)
.quad _estack_exceptions
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
* 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
mov sp, x0
- b seed_stack
+ b arm64_init
ENDPROC(arm64_c_environment)
CPU_RESET_ENTRY(arm64_cpu_startup)