On Fri, May 06, 2022 at 09:56:01PM +0100, Nikos Nikoleris wrote: > 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]! Is this and the "ldp x29, x30, [sp], #16" change below needed? why is #-32 not good? > + > + // Align sp; this is necessary due to way we store cpu0's thread_info /* */ comment style > 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 /* */ comment style > + ldr x30, [sp] I'm not able to understand this. Is this ldr restoring the value pushed with "str x30, [sp, #-32]!" above? in that case, shouldn't this be at [sp - 32]? But, given that this code is unreachable when efi_main is called, do you even need to restore the sp? > + mov sp, x30 > + > +0: ldp x29, x30, [sp], #16 > ret > -- > 2.25.1 >