mirror of
https://git.yoctoproject.org/meta-arm
synced 2026-05-07 04:58:57 +00:00
arm-bsp/tc0: add managed exit patch for optee
Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com> Change-Id: I2a8db6024af35bf95e94963b58011daebb3c666b Signed-off-by: Jon Mason <jon.mason@arm.com>
This commit is contained in:
committed by
Jon Mason
parent
e5f3ae665d
commit
3f9d822025
+123
@@ -0,0 +1,123 @@
|
|||||||
|
From 14b84786e85483bf3c737ef8b392204e307c0ff1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Olivier Deprez <olivier.deprez@arm.com>
|
||||||
|
Date: Mon, 16 Nov 2020 10:14:02 +0100
|
||||||
|
Subject: [PATCH] WIP: Enable managed exit
|
||||||
|
|
||||||
|
This change declares OP-TEE SP as supporting managed exit in response to
|
||||||
|
a NS interrupt triggering while the SWd runs.
|
||||||
|
|
||||||
|
At init OP-TEE enables (HF_INTERRUPT_ENABLE) the managed exit virtual
|
||||||
|
interrupt through the Hafnium para-virtualized interface.
|
||||||
|
|
||||||
|
Physical interrupts are trapped to the SPMC which injects a managed exit
|
||||||
|
interrupt to OP-TEE. The managed exit interrupt is acknowledged by
|
||||||
|
OP-TEE by HF_INTERUPT_GET hvc call.
|
||||||
|
|
||||||
|
Note: this code change is meant with in mind the SPMC runs at SEL2. It
|
||||||
|
needs slight refactoring such that it does not break the SEL1 SPMC
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
Change-Id: I9a95f36cf517c11048ff04680007f40259c4f636
|
||||||
|
Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
|
||||||
|
Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com>
|
||||||
|
|
||||||
|
Upstream-Status: Pending [Not submitted to upstream yet]
|
||||||
|
Signed-off-by: Arunachalam Ganapathy <arunachalam.ganapathy@arm.com>
|
||||||
|
---
|
||||||
|
core/arch/arm/kernel/boot.c | 12 ++++++++++++
|
||||||
|
core/arch/arm/kernel/thread_a64.S | 11 ++++++++++-
|
||||||
|
core/arch/arm/kernel/thread_spmc.c | 11 +++++++++++
|
||||||
|
.../arm/plat-totalcompute/fdts/optee_sp_manifest.dts | 2 +-
|
||||||
|
4 files changed, 34 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/core/arch/arm/kernel/boot.c b/core/arch/arm/kernel/boot.c
|
||||||
|
index 09c1b811..d130107f 100644
|
||||||
|
--- a/core/arch/arm/kernel/boot.c
|
||||||
|
+++ b/core/arch/arm/kernel/boot.c
|
||||||
|
@@ -1279,6 +1279,18 @@ static void init_secondary_helper(unsigned long nsec_entry)
|
||||||
|
init_vfp_sec();
|
||||||
|
init_vfp_nsec();
|
||||||
|
|
||||||
|
+ /* Enable managed exit interrupt for secondary core. */
|
||||||
|
+ __asm__ volatile (
|
||||||
|
+ "mov x0, %0;"
|
||||||
|
+ "mov x1, %1;"
|
||||||
|
+ "mov x2, %2;"
|
||||||
|
+ "mov x3, %3;"
|
||||||
|
+ "hvc #0"
|
||||||
|
+ : : "i" (0xff03), "i" (4), "i" (1), "i" (1));
|
||||||
|
+
|
||||||
|
+ IMSG("%s core %lu: enabled managed exit interrupt.",
|
||||||
|
+ __func__, get_core_pos());
|
||||||
|
+
|
||||||
|
IMSG("Secondary CPU %zu switching to normal world boot", get_core_pos());
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/core/arch/arm/kernel/thread_a64.S b/core/arch/arm/kernel/thread_a64.S
|
||||||
|
index 3e0f5115..63bf396a 100644
|
||||||
|
--- a/core/arch/arm/kernel/thread_a64.S
|
||||||
|
+++ b/core/arch/arm/kernel/thread_a64.S
|
||||||
|
@@ -904,6 +904,14 @@ END_FUNC el0_sync_abort
|
||||||
|
bl dcache_op_louis
|
||||||
|
ic iallu
|
||||||
|
#endif
|
||||||
|
+
|
||||||
|
+ /* HF_INTERRUPT_GET */
|
||||||
|
+ mov x0, #0xff04
|
||||||
|
+ hvc #0
|
||||||
|
+ /* Expect managed exit interrupt */
|
||||||
|
+ cmp x0, #4
|
||||||
|
+ bne .
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Mark current thread as suspended
|
||||||
|
*/
|
||||||
|
@@ -1021,8 +1029,9 @@ LOCAL_FUNC elx_irq , :
|
||||||
|
#endif
|
||||||
|
END_FUNC elx_irq
|
||||||
|
|
||||||
|
+#define HF_MANAGED_EXIT 1
|
||||||
|
LOCAL_FUNC elx_fiq , :
|
||||||
|
-#if defined(CFG_ARM_GICV3)
|
||||||
|
+#if defined(CFG_ARM_GICV3) || defined (HF_MANAGED_EXIT)
|
||||||
|
foreign_intr_handler fiq
|
||||||
|
#else
|
||||||
|
native_intr_handler fiq
|
||||||
|
diff --git a/core/arch/arm/kernel/thread_spmc.c b/core/arch/arm/kernel/thread_spmc.c
|
||||||
|
index bd7930e7..89ff82bc 100644
|
||||||
|
--- a/core/arch/arm/kernel/thread_spmc.c
|
||||||
|
+++ b/core/arch/arm/kernel/thread_spmc.c
|
||||||
|
@@ -1394,6 +1394,17 @@ static TEE_Result spmc_init(void)
|
||||||
|
my_endpoint_id = spmc_get_id();
|
||||||
|
DMSG("My endpoint ID %#x", my_endpoint_id);
|
||||||
|
|
||||||
|
+ /* Enable managed exit interrupt for boot core. */
|
||||||
|
+ __asm__ volatile (
|
||||||
|
+ "mov x0, %0;"
|
||||||
|
+ "mov x1, %1;"
|
||||||
|
+ "mov x2, %2;"
|
||||||
|
+ "mov x3, %3;"
|
||||||
|
+ "hvc #0"
|
||||||
|
+ : : "i" (0xff03), "i" (4), "i" (1), "i" (1));
|
||||||
|
+
|
||||||
|
+ IMSG("%s enabled managed exit interrupt.", __func__);
|
||||||
|
+
|
||||||
|
return TEE_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif /*CFG_CORE_SEL2_SPMC*/
|
||||||
|
diff --git a/core/arch/arm/plat-totalcompute/fdts/optee_sp_manifest.dts b/core/arch/arm/plat-totalcompute/fdts/optee_sp_manifest.dts
|
||||||
|
index 4b8b3681..04847c4d 100644
|
||||||
|
--- a/core/arch/arm/plat-totalcompute/fdts/optee_sp_manifest.dts
|
||||||
|
+++ b/core/arch/arm/plat-totalcompute/fdts/optee_sp_manifest.dts
|
||||||
|
@@ -23,7 +23,7 @@
|
||||||
|
entrypoint-offset = <0x1000>;
|
||||||
|
xlat-granule = <0>; /* 4KiB */
|
||||||
|
boot-order = <0>;
|
||||||
|
- messaging-method = <0>; /* Direct messaging only */
|
||||||
|
+ messaging-method = <3>; /* Direct messaging and managed exit supported */
|
||||||
|
|
||||||
|
device-regions {
|
||||||
|
compatible = "arm,ffa-manifest-device-regions";
|
||||||
|
--
|
||||||
|
2.29.2
|
||||||
|
|
||||||
@@ -6,7 +6,10 @@ SRCREV = "49dbb9ef65643c4322cf3f848910fa880d1c02f6"
|
|||||||
PV = "3.14.0+git${SRCPV}"
|
PV = "3.14.0+git${SRCPV}"
|
||||||
|
|
||||||
FILESEXTRAPATHS_prepend_tc0 := "${THISDIR}/files/optee-os/tc0:"
|
FILESEXTRAPATHS_prepend_tc0 := "${THISDIR}/files/optee-os/tc0:"
|
||||||
SRC_URI_append = "file://sp_layout.json"
|
SRC_URI_append = " \
|
||||||
|
file://sp_layout.json \
|
||||||
|
file://0001-WIP-Enable-managed-exit.patch \
|
||||||
|
"
|
||||||
|
|
||||||
COMPATIBLE_MACHINE = "tc0"
|
COMPATIBLE_MACHINE = "tc0"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user