diff options
Diffstat (limited to 'target-arm/op_helper.c')
-rw-r--r-- | target-arm/op_helper.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c index 5652096dce..464a5ce567 100644 --- a/target-arm/op_helper.c +++ b/target-arm/op_helper.c @@ -387,11 +387,19 @@ void HELPER(clear_pstate_ss)(CPUARMState *env) void HELPER(pre_hvc)(CPUARMState *env) { + ARMCPU *cpu = arm_env_get_cpu(env); int cur_el = arm_current_pl(env); /* FIXME: Use actual secure state. */ bool secure = false; bool undef; + if (arm_is_psci_call(cpu, EXCP_HVC)) { + /* If PSCI is enabled and this looks like a valid PSCI call then + * that overrides the architecturally mandated HVC behaviour. + */ + return; + } + if (!arm_feature(env, ARM_FEATURE_EL2)) { /* If EL2 doesn't exist, HVC always UNDEFs */ undef = true; @@ -419,6 +427,7 @@ void HELPER(pre_hvc)(CPUARMState *env) void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome) { + ARMCPU *cpu = arm_env_get_cpu(env); int cur_el = arm_current_pl(env); /* FIXME: Use real secure state. */ bool secure = false; @@ -430,6 +439,13 @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome) */ bool undef = is_a64(env) ? smd : (!secure && smd); + if (arm_is_psci_call(cpu, EXCP_SMC)) { + /* If PSCI is enabled and this looks like a valid PSCI call then + * that overrides the architecturally mandated SMC behaviour. + */ + return; + } + if (!arm_feature(env, ARM_FEATURE_EL3)) { /* If we have no EL3 then SMC always UNDEFs */ undef = true; |