@@ -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,17 @@ 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
+ mov x30, sp
+ and x30, x30, #THREAD_MASK
+ mov sp, x30
+ str x29, [sp, #-16]!
+
+ stp x0, x1, [sp, #-16]!
- stp x0, x1, [sp, #16]
mov x2, x0
mov x3, x1
adr x0, ImageBase
@@ -123,8 +130,12 @@ _start:
bl _relocate
cbnz x0, 0f
- ldp x0, x1, [sp, #16]
+ ldp x0, x1, [sp], #16
bl efi_main
-0: ldp x29, x30, [sp], #32
+ /* Restore sp */
+ ldr x30, [sp], #16
+ 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 | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-)