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>
This commit is contained in:
Madhukar Pappireddy 2023-08-24 16:57:22 -05:00
parent 7a2130b4a5
commit 20324013b1
4 changed files with 40 additions and 0 deletions
include/plat/arm/common
plat/arm

View file

@ -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,

View file

@ -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;

View file

@ -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))

View file

@ -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);