mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 18:14:24 +00:00
Merge changes from topic "od/sme" into integration
* changes: fix(fvp): permit enabling SME for SPD=spmd feat(spmd): pass SMCCCv1.3 SVE hint to lower EL
This commit is contained in:
commit
4da4a1a61d
4 changed files with 20 additions and 7 deletions
|
@ -34,7 +34,8 @@ uint64_t spmd_smc_switch_state(uint32_t smc_fid,
|
||||||
uint64_t x2,
|
uint64_t x2,
|
||||||
uint64_t x3,
|
uint64_t x3,
|
||||||
uint64_t x4,
|
uint64_t x4,
|
||||||
void *handle);
|
void *handle,
|
||||||
|
uint64_t flags);
|
||||||
#endif /* __ASSEMBLER__ */
|
#endif /* __ASSEMBLER__ */
|
||||||
|
|
||||||
#endif /* SPMD_SVC_H */
|
#endif /* SPMD_SVC_H */
|
||||||
|
|
|
@ -57,7 +57,6 @@ ifneq (${SPD}, tspd)
|
||||||
ENABLE_FEAT_TWED := 2
|
ENABLE_FEAT_TWED := 2
|
||||||
ENABLE_FEAT_GCS := 2
|
ENABLE_FEAT_GCS := 2
|
||||||
ifeq (${ARCH}, aarch64)
|
ifeq (${ARCH}, aarch64)
|
||||||
ifneq (${SPD}, spmd)
|
|
||||||
ifeq (${SPM_MM}, 0)
|
ifeq (${SPM_MM}, 0)
|
||||||
ifeq (${CTX_INCLUDE_FPREGS}, 0)
|
ifeq (${CTX_INCLUDE_FPREGS}, 0)
|
||||||
ENABLE_SME_FOR_NS := 2
|
ENABLE_SME_FOR_NS := 2
|
||||||
|
@ -66,7 +65,6 @@ endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
|
||||||
|
|
||||||
# enable unconditionally for all builds
|
# enable unconditionally for all builds
|
||||||
ifeq (${ARCH}, aarch64)
|
ifeq (${ARCH}, aarch64)
|
||||||
|
|
|
@ -234,7 +234,7 @@ static uint64_t spmc_smc_return(uint32_t smc_fid,
|
||||||
/* If we originated in the normal world then switch contexts. */
|
/* If we originated in the normal world then switch contexts. */
|
||||||
else if (!secure_origin && ffa_is_secure_world_id(dst_id)) {
|
else if (!secure_origin && ffa_is_secure_world_id(dst_id)) {
|
||||||
return spmd_smc_switch_state(smc_fid, secure_origin, x1, x2,
|
return spmd_smc_switch_state(smc_fid, secure_origin, x1, x2,
|
||||||
x3, x4, handle);
|
x3, x4, handle, flags);
|
||||||
} else {
|
} else {
|
||||||
/* Unknown State. */
|
/* Unknown State. */
|
||||||
panic();
|
panic();
|
||||||
|
@ -2490,9 +2490,11 @@ static uint64_t spmc_sp_interrupt_handler(uint32_t id,
|
||||||
/*
|
/*
|
||||||
* Forward the interrupt to the S-EL1 SP. The interrupt ID is not
|
* Forward the interrupt to the S-EL1 SP. The interrupt ID is not
|
||||||
* populated as the SP can determine this by itself.
|
* populated as the SP can determine this by itself.
|
||||||
|
* The flags field is forced to 0 mainly to pass the SVE hint bit
|
||||||
|
* cleared for consumption by the lower EL.
|
||||||
*/
|
*/
|
||||||
return spmd_smc_switch_state(FFA_INTERRUPT, false,
|
return spmd_smc_switch_state(FFA_INTERRUPT, false,
|
||||||
FFA_PARAM_MBZ, FFA_PARAM_MBZ,
|
FFA_PARAM_MBZ, FFA_PARAM_MBZ,
|
||||||
FFA_PARAM_MBZ, FFA_PARAM_MBZ,
|
FFA_PARAM_MBZ, FFA_PARAM_MBZ,
|
||||||
handle);
|
handle, 0ULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -667,11 +667,22 @@ uint64_t spmd_smc_switch_state(uint32_t smc_fid,
|
||||||
uint64_t x2,
|
uint64_t x2,
|
||||||
uint64_t x3,
|
uint64_t x3,
|
||||||
uint64_t x4,
|
uint64_t x4,
|
||||||
void *handle)
|
void *handle,
|
||||||
|
uint64_t flags)
|
||||||
{
|
{
|
||||||
unsigned int secure_state_in = (secure_origin) ? SECURE : NON_SECURE;
|
unsigned int secure_state_in = (secure_origin) ? SECURE : NON_SECURE;
|
||||||
unsigned int secure_state_out = (!secure_origin) ? SECURE : NON_SECURE;
|
unsigned int secure_state_out = (!secure_origin) ? SECURE : NON_SECURE;
|
||||||
|
|
||||||
|
#if SPMD_SPM_AT_SEL2
|
||||||
|
if ((secure_state_out == SECURE) && (is_sve_hint_set(flags) == true)) {
|
||||||
|
/*
|
||||||
|
* Set the SVE hint bit in x0 and pass to the lower secure EL,
|
||||||
|
* if it was set by the caller.
|
||||||
|
*/
|
||||||
|
smc_fid |= (FUNCID_SVE_HINT_MASK << FUNCID_SVE_HINT_SHIFT);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Save incoming security state */
|
/* Save incoming security state */
|
||||||
#if SPMD_SPM_AT_SEL2
|
#if SPMD_SPM_AT_SEL2
|
||||||
if (secure_state_in == NON_SECURE) {
|
if (secure_state_in == NON_SECURE) {
|
||||||
|
@ -746,8 +757,9 @@ static uint64_t spmd_smc_forward(uint32_t smc_fid,
|
||||||
return spmc_smc_handler(smc_fid, secure_origin, x1, x2, x3, x4,
|
return spmc_smc_handler(smc_fid, secure_origin, x1, x2, x3, x4,
|
||||||
cookie, handle, flags);
|
cookie, handle, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return spmd_smc_switch_state(smc_fid, secure_origin, x1, x2, x3, x4,
|
return spmd_smc_switch_state(smc_fid, secure_origin, x1, x2, x3, x4,
|
||||||
handle);
|
handle, flags);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue