[kvm-unit-tests PATCH v3 22/27] arm64: Use code from the gnu-efi when booting with EFI

Nikos Nikoleris
2022-06-30T10:04:30Z

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 | 21 +++++++++++++++++----
2 files changed, 23 insertions(+), 4 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..03d29b0 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, #-16]!
+
+ mov x29, sp
+
+ stp x0, x1, [sp, #-16]!

- stp x0, x1, [sp, #16]
mov x2, x0
mov x3, x1
adr x0, ImageBase
@@ -123,8 +132,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