mirror of https://github.com/xemu-project/xemu.git
target-arm: A32: Emulate the SMC instruction
Implements SMC instruction in AArch32 using the A32 syndrome. When executing SMC instruction from monitor CPU mode SCR.NS bit is reset. Signed-off-by: Sergey Fedorov <s.fedorov@samsung.com> Signed-off-by: Fabian Aggeler <aggelerf@ethz.ch> Signed-off-by: Greg Bellows <greg.bellows@linaro.org> Message-id: 1413910544-20150-7-git-send-email-greg.bellows@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
592125f83a
commit
dbe9d16367
|
@ -4091,6 +4091,12 @@ void arm_cpu_do_interrupt(CPUState *cs)
|
||||||
mask = CPSR_A | CPSR_I | CPSR_F;
|
mask = CPSR_A | CPSR_I | CPSR_F;
|
||||||
offset = 4;
|
offset = 4;
|
||||||
break;
|
break;
|
||||||
|
case EXCP_SMC:
|
||||||
|
new_mode = ARM_CPU_MODE_MON;
|
||||||
|
addr = 0x08;
|
||||||
|
mask = CPSR_A | CPSR_I | CPSR_F;
|
||||||
|
offset = 0;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
cpu_abort(cs, "Unhandled exception 0x%x\n", cs->exception_index);
|
cpu_abort(cs, "Unhandled exception 0x%x\n", cs->exception_index);
|
||||||
return; /* Never happens. Keep compiler happy. */
|
return; /* Never happens. Keep compiler happy. */
|
||||||
|
@ -4109,6 +4115,11 @@ void arm_cpu_do_interrupt(CPUState *cs)
|
||||||
*/
|
*/
|
||||||
addr += env->cp15.vbar_el[1];
|
addr += env->cp15.vbar_el[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_MON) {
|
||||||
|
env->cp15.scr_el3 &= ~SCR_NS;
|
||||||
|
}
|
||||||
|
|
||||||
switch_mode (env, new_mode);
|
switch_mode (env, new_mode);
|
||||||
/* For exceptions taken to AArch32 we must clear the SS bit in both
|
/* For exceptions taken to AArch32 we must clear the SS bit in both
|
||||||
* PSTATE and in the old-state value we save to SPSR_<mode>, so zero it now.
|
* PSTATE and in the old-state value we save to SPSR_<mode>, so zero it now.
|
||||||
|
|
|
@ -429,8 +429,7 @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome)
|
||||||
{
|
{
|
||||||
ARMCPU *cpu = arm_env_get_cpu(env);
|
ARMCPU *cpu = arm_env_get_cpu(env);
|
||||||
int cur_el = arm_current_el(env);
|
int cur_el = arm_current_el(env);
|
||||||
/* FIXME: Use real secure state. */
|
bool secure = arm_is_secure(env);
|
||||||
bool secure = false;
|
|
||||||
bool smd = env->cp15.scr_el3 & SCR_SMD;
|
bool smd = env->cp15.scr_el3 & SCR_SMD;
|
||||||
/* On ARMv8 AArch32, SMD only applies to NS state.
|
/* On ARMv8 AArch32, SMD only applies to NS state.
|
||||||
* On ARMv7 SMD only applies to NS state and only if EL2 is available.
|
* On ARMv7 SMD only applies to NS state and only if EL2 is available.
|
||||||
|
|
Loading…
Reference in New Issue