@@ -15,6 +15,10 @@
#include <asm/thread_info.h>
#include <asm/sysreg.h>
+#ifdef CONFIG_EFI
+#include "efi/crt0-efi-aarch64.S"
+#else
+
.macro zero_range, tmp1, tmp2
9998: cmp \tmp1, \tmp2
b.eq 9997f
@@ -107,6 +111,8 @@ start:
bl exit
b halt
+#endif
+
.text
/*
@@ -111,10 +111,19 @@ section_table:
.align 12
_start:
- stp x29, x30, [sp, #-32]!
+ stp x29, x30, [sp, #-16]!
+
+ // Align sp; this is necessary due to way we store cpu0's thread_info
mov x29, sp
+ and x29, x29, #THREAD_MASK
+ mov x30, sp
+ mov sp, x29
+ str x30, [sp, #-32]!
+
+ mov x29, sp
stp x0, x1, [sp, #16]
+
mov x2, x0
mov x3, x1
adr x0, ImageBase
@@ -126,5 +135,9 @@ _start:
ldp x0, x1, [sp, #16]
bl efi_main
-0: ldp x29, x30, [sp], #32
+ // Restore sp
+ ldr x30, [sp]
+ mov sp, x30
+
+0: ldp x29, x30, [sp], #16
ret
arm/efi/crt0-efi-aarch64.S defines the header and the handover sequence from EFI to a efi_main. This change includes the whole file in arm/cstart64.S when we compile with EFI support. In addition, we change the handover code in arm/efi/crt0-efi-aarch64.S to align the stack pointer. This alignment is necessary because we make assumptions about cpu0's stack alignment and most importantly we place its thread_info at the bottom of this stack. Signed-off-by: Nikos Nikoleris <nikos.nikoleris@arm.com> --- arm/cstart64.S | 6 ++++++ arm/efi/crt0-efi-aarch64.S | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-)