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 | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/arm/cstart64.S b/arm/cstart64.S index 223c1092..cbd6b511 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 d50e78dd..5d0dc04a 100644 --- a/arm/efi/crt0-efi-aarch64.S +++ b/arm/efi/crt0-efi-aarch64.S @@ -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 -- 2.25.1