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@xxxxxxx> --- arm/cstart64.S | 6 ++++++ arm/efi/crt0-efi-aarch64.S | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/arm/cstart64.S b/arm/cstart64.S index 55b41ea..08cf02f 100644 --- a/arm/cstart64.S +++ b/arm/cstart64.S @@ -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 /* diff --git a/arm/efi/crt0-efi-aarch64.S b/arm/efi/crt0-efi-aarch64.S index d50e78d..11a062d 100644 --- a/arm/efi/crt0-efi-aarch64.S +++ b/arm/efi/crt0-efi-aarch64.S @@ -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 -- 2.25.1