mirror of https://github.com/xemu-project/xemu.git
target/arm: handle M-profile semihosting at translate time
We do this for other semihosting calls so we might as well do it for M-profile as well. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20190913151845.12582-3-alex.bennee@linaro.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
72ab7f9e1d
commit
376214e4f4
|
@ -2114,19 +2114,13 @@ void arm_v7m_cpu_do_interrupt(CPUState *cs)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case EXCP_SEMIHOST:
|
||||||
|
qemu_log_mask(CPU_LOG_INT,
|
||||||
|
"...handling as semihosting call 0x%x\n",
|
||||||
|
env->regs[0]);
|
||||||
|
env->regs[0] = do_arm_semihosting(env);
|
||||||
|
return;
|
||||||
case EXCP_BKPT:
|
case EXCP_BKPT:
|
||||||
if (semihosting_enabled()) {
|
|
||||||
int nr;
|
|
||||||
nr = arm_lduw_code(env, env->regs[15], arm_sctlr_b(env)) & 0xff;
|
|
||||||
if (nr == 0xab) {
|
|
||||||
env->regs[15] += 2;
|
|
||||||
qemu_log_mask(CPU_LOG_INT,
|
|
||||||
"...handling as semihosting call 0x%x\n",
|
|
||||||
env->regs[0]);
|
|
||||||
env->regs[0] = do_arm_semihosting(env);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_DEBUG, false);
|
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_DEBUG, false);
|
||||||
break;
|
break;
|
||||||
case EXCP_IRQ:
|
case EXCP_IRQ:
|
||||||
|
|
|
@ -8424,7 +8424,16 @@ static bool trans_BKPT(DisasContext *s, arg_BKPT *a)
|
||||||
if (!ENABLE_ARCH_5) {
|
if (!ENABLE_ARCH_5) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
gen_exception_bkpt_insn(s, syn_aa32_bkpt(a->imm, false));
|
if (arm_dc_feature(s, ARM_FEATURE_M) &&
|
||||||
|
semihosting_enabled() &&
|
||||||
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
!IS_USER(s) &&
|
||||||
|
#endif
|
||||||
|
(a->imm == 0xab)) {
|
||||||
|
gen_exception_internal_insn(s, s->base.pc_next, EXCP_SEMIHOST);
|
||||||
|
} else {
|
||||||
|
gen_exception_bkpt_insn(s, syn_aa32_bkpt(a->imm, false));
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue