fix(smccc): use full GP regs set on physical FF-A instance
For the following ABIs where Hafnium/S-EL2 is caller and SPMD/EL3 is
callee, assuming it runs in the AArch64 execution state:
FFA_SECONDARY_EP_REGISTER
FFA_EL3_INTR_HANDLE
FFA_ID_GET
On S-EL2 emitting an SMC, clear GP registers that are not required for
those ABIs up to x17.
On return to S-EL2, consume the full x0-x17 GP registers set.
Apply the same to the following SiP calls towards EL3:
PLAT_PROTECT_MEM_64
PLAT_UNPROTECT_MEM_64
Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
Change-Id: I193f6bb06d13dbc7eb8496c64f9c44271548352d
diff --git a/src/arch/aarch64/hypervisor/handler.c b/src/arch/aarch64/hypervisor/handler.c
index 4f544c0..7bacd2e 100644
--- a/src/arch/aarch64/hypervisor/handler.c
+++ b/src/arch/aarch64/hypervisor/handler.c
@@ -974,7 +974,8 @@
dlog_verbose("Delegating Group0 interrupt to SPMD\n");
- ret = smc_ffa_call((struct ffa_value){.func = FFA_EL3_INTR_HANDLE_32});
+ ret = smc_ffa_call_ext(
+ (struct ffa_value){.func = FFA_EL3_INTR_HANDLE_32});
/* Check if the Group0 interrupt was handled successfully. */
CHECK(ret.func == FFA_SUCCESS_32);
diff --git a/src/arch/aarch64/memory_protect/rme.c b/src/arch/aarch64/memory_protect/rme.c
index 7c9a0c8..307c45e 100644
--- a/src/arch/aarch64/memory_protect/rme.c
+++ b/src/arch/aarch64/memory_protect/rme.c
@@ -34,9 +34,9 @@
return ffa_error(FFA_NOT_SUPPORTED);
}
- ret = smc_ffa_call((struct ffa_value){.func = PLAT_PROTECT_MEM_64,
- .arg1 = pa_addr(begin),
- .arg2 = size});
+ ret = smc_ffa_call_ext((struct ffa_value){.func = PLAT_PROTECT_MEM_64,
+ .arg1 = pa_addr(begin),
+ .arg2 = size});
switch (ret.func) {
case SMCCC_OK:
@@ -83,9 +83,9 @@
*/
assert(is_arch_feat_rme_supported());
- ret = smc_ffa_call((struct ffa_value){.func = PLAT_UNPROTECT_MEM_64,
- .arg1 = pa_addr(begin),
- .arg2 = size});
+ ret = smc_ffa_call_ext((struct ffa_value){.func = PLAT_UNPROTECT_MEM_64,
+ .arg1 = pa_addr(begin),
+ .arg2 = size});
return ret.func == SMCCC_OK;
}
diff --git a/src/arch/aarch64/plat/psci/spmc.c b/src/arch/aarch64/plat/psci/spmc.c
index 1aa2789..81574f1 100644
--- a/src/arch/aarch64/plat/psci/spmc.c
+++ b/src/arch/aarch64/plat/psci/spmc.c
@@ -40,7 +40,7 @@
* Register the SPMC secondary cold boot entry point at the secure
* physical FF-A instance (to the SPMD).
*/
- res = smc_ffa_call(
+ res = smc_ffa_call_ext(
(struct ffa_value){.func = FFA_SECONDARY_EP_REGISTER_64,
.arg1 = (uintreg_t)&cpu_entry});
diff --git a/src/arch/aarch64/smc.c b/src/arch/aarch64/smc.c
index 0fc76fb..754b2f7 100644
--- a/src/arch/aarch64/smc.c
+++ b/src/arch/aarch64/smc.c
@@ -138,12 +138,6 @@
struct ffa_value smc_ffa_call_ext(struct ffa_value args)
{
- /* Only these FF-A v1.2 SMC functions allowed to use this helper. */
- assert(args.func == FFA_PARTITION_INFO_GET_REGS_64 ||
- args.func == FFA_RUN_32 ||
- args.func == FFA_MSG_SEND_DIRECT_REQ2_64 ||
- args.func == FFA_MSG_SEND_DIRECT_RESP2_64);
-
return smc_internal_ext(
args.func, args.arg1, args.arg2, args.arg3, args.arg4,
args.arg5, args.arg6, args.arg7, args.extended_val.arg8,
diff --git a/src/ffa/spmc/setup_and_discovery.c b/src/ffa/spmc/setup_and_discovery.c
index fbb3b52..ab61b98 100644
--- a/src/ffa/spmc/setup_and_discovery.c
+++ b/src/ffa/spmc/setup_and_discovery.c
@@ -20,7 +20,7 @@
* Since we are running in the SPMC use FFA_ID_GET to fetch our
* ID from the SPMD.
*/
- return smc_ffa_call((struct ffa_value){.func = FFA_ID_GET_32});
+ return smc_ffa_call_ext((struct ffa_value){.func = FFA_ID_GET_32});
}
/**