103 lines
2.8 KiB
Diff
103 lines
2.8 KiB
Diff
|
|
From 5995f83592aea874f5b423538e36675e2204582b Mon Sep 17 00:00:00 2001
|
||
|
|
From: Jaxson Han <jaxson.han@arm.com>
|
||
|
|
Date: Tue, 4 Jan 2022 17:01:55 +0800
|
||
|
|
Subject: [PATCH] boot: Add the --enable-keep-el compile option
|
||
|
|
|
||
|
|
Add --enable-keep-el compile option to enable boot-wrapper booting next
|
||
|
|
stage at EL2.
|
||
|
|
The Armv8R AArch64 boots at EL2. If the next stage requires EL2 booting,
|
||
|
|
the boot-wrapper should not drop to EL1.
|
||
|
|
Currently, this option only works for Armv8R AArch64. Also, to work with
|
||
|
|
Linux PSCI, this option will cause secondary cores booting at EL1.
|
||
|
|
|
||
|
|
Issue-Id: SCM-3813
|
||
|
|
Upstream-Status: Inappropriate [other]
|
||
|
|
Implementation pending further discussion
|
||
|
|
Signed-off-by: Jaxson Han <jaxson.han@arm.com>
|
||
|
|
Change-Id: I3ba9c87cf0b59d163ca433f74c9e3a46e5ca2c63
|
||
|
|
---
|
||
|
|
Makefile.am | 4 ++++
|
||
|
|
arch/aarch64/boot.S | 6 +++++-
|
||
|
|
common/psci.c | 6 ++++++
|
||
|
|
configure.ac | 5 +++++
|
||
|
|
4 files changed, 20 insertions(+), 1 deletion(-)
|
||
|
|
|
||
|
|
diff --git a/Makefile.am b/Makefile.am
|
||
|
|
index e905602..6604baa 100644
|
||
|
|
--- a/Makefile.am
|
||
|
|
+++ b/Makefile.am
|
||
|
|
@@ -33,6 +33,10 @@ PSCI_CPU_ON := 0xc4000003
|
||
|
|
endif
|
||
|
|
PSCI_CPU_OFF := 0x84000002
|
||
|
|
|
||
|
|
+if KEEP_EL
|
||
|
|
+DEFINES += -DKEEP_EL
|
||
|
|
+endif
|
||
|
|
+
|
||
|
|
COMMON_SRC := common/
|
||
|
|
COMMON_OBJ := boot.o bakery_lock.o platform.o lib.o device_tree.o
|
||
|
|
|
||
|
|
diff --git a/arch/aarch64/boot.S b/arch/aarch64/boot.S
|
||
|
|
index 27b1139..c079d22 100644
|
||
|
|
--- a/arch/aarch64/boot.S
|
||
|
|
+++ b/arch/aarch64/boot.S
|
||
|
|
@@ -254,7 +254,11 @@ el2_init:
|
||
|
|
msr cnthctl_el2, x0
|
||
|
|
isb
|
||
|
|
|
||
|
|
+#ifdef KEEP_EL
|
||
|
|
+ mov w0, #SPSR_KERNEL
|
||
|
|
+#else
|
||
|
|
mov w0, #SPSR_KERNEL_EL1
|
||
|
|
+#endif
|
||
|
|
ldr x1, =spsr_to_elx
|
||
|
|
str w0, [x1]
|
||
|
|
// fall through
|
||
|
|
@@ -334,5 +338,5 @@ ASM_FUNC(jump_kernel)
|
||
|
|
.align 3
|
||
|
|
flag_keep_el:
|
||
|
|
.long 0
|
||
|
|
-spsr_to_elx:
|
||
|
|
+ASM_DATA(spsr_to_elx)
|
||
|
|
.long 0
|
||
|
|
diff --git a/common/psci.c b/common/psci.c
|
||
|
|
index a0e8700..945780b 100644
|
||
|
|
--- a/common/psci.c
|
||
|
|
+++ b/common/psci.c
|
||
|
|
@@ -18,6 +18,8 @@
|
||
|
|
#error "No MPIDRs provided"
|
||
|
|
#endif
|
||
|
|
|
||
|
|
+extern unsigned int spsr_to_elx;
|
||
|
|
+
|
||
|
|
static unsigned long branch_table[NR_CPUS];
|
||
|
|
|
||
|
|
bakery_ticket_t branch_table_lock[NR_CPUS];
|
||
|
|
@@ -44,6 +46,10 @@ static int psci_cpu_on(unsigned long target_mpidr, unsigned long address)
|
||
|
|
ret = psci_store_address(cpu, address);
|
||
|
|
bakery_unlock(branch_table_lock, this_cpu);
|
||
|
|
|
||
|
|
+#ifdef KEEP_EL
|
||
|
|
+ spsr_to_elx = SPSR_KERNEL_EL1;
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
diff --git a/configure.ac b/configure.ac
|
||
|
|
index 53e51be..0e07db3 100644
|
||
|
|
--- a/configure.ac
|
||
|
|
+++ b/configure.ac
|
||
|
|
@@ -25,6 +25,11 @@ AS_IF([test "x$BOOTWRAPPER_ES" = x32 -a "x$KERNEL_ES" != x32],
|
||
|
|
[AC_MSG_ERROR([a 32-bit boot-wrapper cannot launch a 64-bit kernel])]
|
||
|
|
)
|
||
|
|
|
||
|
|
+AC_ARG_ENABLE([keep-el],
|
||
|
|
+ AC_HELP_STRING([--enable-keep-el], [keep exception level when start kernel]),
|
||
|
|
+ [KEEP_EL=yes], [KEEP_EL=no])
|
||
|
|
+AM_CONDITIONAL([KEEP_EL], [test "x$KEEP_EL" = xyes])
|
||
|
|
+
|
||
|
|
# Allow a user to pass --with-kernel-dir
|
||
|
|
AC_ARG_WITH([kernel-dir],
|
||
|
|
AS_HELP_STRING([--with-kernel-dir], [specify the root Linux kernel build directory (required)]),
|