summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMadhukar Pappireddy <madhukar.pappireddy@arm.com>2023-08-24 16:57:22 -0500
committerMadhukar Pappireddy <madhukar.pappireddy@arm.com>2023-10-19 22:42:45 -0500
commit20324013b17706751ecdd68f57c0ab95c522ca7e (patch)
treea351ca3e95ff8ac6a4bac7e2d976cdd32f64b048
parent7a2130b4a51eefb138e3aeb8d7f261613eab04a7 (diff)
feat(fvp): new SiP call to set an interrupt pending
This patch introduces an SiP SMC call for FVP platform to set an interrupt pending. This is needed for testing purposes. Change-Id: I3dc68ffbec36d90207c30571dc1fa7ebfb75046e Signed-off-by: Madhukar Pappireddy <madhukar.pappireddy@arm.com>
-rw-r--r--include/plat/arm/common/arm_sip_svc.h7
-rw-r--r--plat/arm/board/fvp/fdts/fvp_spmc_manifest.dts5
-rw-r--r--plat/arm/board/fvp/platform.mk6
-rw-r--r--plat/arm/common/plat_arm_sip_svc.c22
4 files changed, 40 insertions, 0 deletions
diff --git a/include/plat/arm/common/arm_sip_svc.h b/include/plat/arm/common/arm_sip_svc.h
index e2d6ee45f..266092e30 100644
--- a/include/plat/arm/common/arm_sip_svc.h
+++ b/include/plat/arm/common/arm_sip_svc.h
@@ -35,6 +35,13 @@
#define ARM_SIP_SVC_VERSION_MAJOR U(0x0)
#define ARM_SIP_SVC_VERSION_MINOR U(0x2)
+/*
+ * Arm SiP SMC calls that are primarily used for testing purposes.
+ */
+#if PLAT_TEST_SPM
+#define ARM_SIP_SET_INTERRUPT_PENDING U(0x82000100)
+#endif
+
/* SiP handler specific to each Arm platform. */
uintptr_t plat_arm_sip_handler(uint32_t smc_fid,
u_register_t x1,
diff --git a/plat/arm/board/fvp/fdts/fvp_spmc_manifest.dts b/plat/arm/board/fvp/fdts/fvp_spmc_manifest.dts
index 4f97339f7..e159248b4 100644
--- a/plat/arm/board/fvp/fdts/fvp_spmc_manifest.dts
+++ b/plat/arm/board/fvp/fdts/fvp_spmc_manifest.dts
@@ -35,6 +35,11 @@
load_address = <0x7000000>;
vcpu_count = <8>;
mem_size = <1048576>;
+ /*
+ * Platform specific SiP SMC call handled at EL3. Used
+ * to pend an interrupt for testing purpose.
+ */
+ smc_whitelist = <0x82000100>;
};
vm2 {
is_ffa_partition;
diff --git a/plat/arm/board/fvp/platform.mk b/plat/arm/board/fvp/platform.mk
index 3c02485f6..72f94b0a1 100644
--- a/plat/arm/board/fvp/platform.mk
+++ b/plat/arm/board/fvp/platform.mk
@@ -28,6 +28,9 @@ FVP_DT_PREFIX := fvp-base-gicv3-psci
# the FVP platform. This option defaults to 256.
FVP_TRUSTED_SRAM_SIZE := 256
+# Macro to enable helpers for running SPM tests. Disabled by default.
+PLAT_TEST_SPM := 0
+
# This is a very trickly TEMPORARY fix. Enabling ALL features exceeds BL31's
# progbits limit. We need a way to build all useful configurations while waiting
# on the fvp to increase its SRAM size. The problem is twofild:
@@ -535,3 +538,6 @@ endif
ifeq (${ERRATA_ABI_SUPPORT}, 1)
include plat/arm/board/fvp/fvp_cpu_errata.mk
endif
+
+# Build macro necessary for running SPM tests on FVP platform
+$(eval $(call add_define,PLAT_TEST_SPM))
diff --git a/plat/arm/common/plat_arm_sip_svc.c b/plat/arm/common/plat_arm_sip_svc.c
index 33e872b58..b1dab165b 100644
--- a/plat/arm/common/plat_arm_sip_svc.c
+++ b/plat/arm/common/plat_arm_sip_svc.c
@@ -25,6 +25,28 @@ uintptr_t plat_arm_sip_handler(uint32_t smc_fid,
void *handle,
u_register_t flags)
{
+#if PLAT_TEST_SPM
+ bool secure_origin;
+
+ /* Determine which security state this SMC originated from */
+ secure_origin = is_caller_secure(flags);
+
+ switch (smc_fid) {
+ case ARM_SIP_SET_INTERRUPT_PENDING:
+ if (!secure_origin) {
+ SMC_RET1(handle, SMC_UNK);
+ }
+
+ VERBOSE("SiP Call- Set interrupt pending %d\n", (uint32_t)x1);
+ plat_ic_set_interrupt_pending(x1);
+
+ SMC_RET1(handle, SMC_OK);
+ break; /* Not reached */
+ default:
+ break;
+ }
+#endif
+
#if ENABLE_SPMD_LP
return plat_spmd_logical_sp_smc_handler(smc_fid, x1, x2, x3, x4,
cookie, handle, flags);