@@ -259,6 +259,7 @@ enum {
EXC_USER,
EXC_DOUBLE,
EXC_DEBUG,
+ EXC_SEMIHOST,
EXC_MAX
};
@@ -574,6 +575,7 @@ void xtensa_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr, vaddr addr,
unsigned size, MMUAccessType access_type,
int mmu_idx, MemTxAttrs attrs,
MemTxResult response, uintptr_t retaddr);
+void xtensa_semihosting(CPUXtensaState *env);
#endif
void xtensa_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
hwaddr xtensa_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
@@ -11,9 +11,6 @@ DEF_HELPER_2(retw, void, env, i32)
DEF_HELPER_3(window_check, noreturn, env, i32, i32)
DEF_HELPER_1(restore_owb, void, env)
DEF_HELPER_2(movsp, void, env, i32)
-#ifndef CONFIG_USER_ONLY
-DEF_HELPER_1(simcall, void, env)
-#endif
#ifndef CONFIG_USER_ONLY
DEF_HELPER_3(waiti, void, env, i32, i32)
@@ -219,6 +219,10 @@ void xtensa_cpu_do_interrupt(CPUState *cs)
}
switch (cs->exception_index) {
+ case EXC_SEMIHOST:
+ xtensa_semihosting(env);
+ return;
+
case EXC_WINDOW_OVERFLOW4:
case EXC_WINDOW_UNDERFLOW4:
case EXC_WINDOW_OVERFLOW8:
@@ -2416,7 +2416,8 @@ static void translate_simcall(DisasContext *dc, const OpcodeArg arg[],
{
#ifndef CONFIG_USER_ONLY
if (semihosting_enabled()) {
- gen_helper_simcall(cpu_env);
+ tcg_gen_movi_i32(cpu_pc, dc->base.pc_next);
+ gen_exception(dc, EXC_SEMIHOST);
}
#endif
}
@@ -28,7 +28,6 @@
#include "qemu/osdep.h"
#include "cpu.h"
#include "chardev/char-fe.h"
-#include "exec/helper-proto.h"
#include "semihosting/semihost.h"
#include "qapi/error.h"
#include "qemu/log.h"
@@ -188,7 +187,7 @@ void xtensa_sim_open_console(Chardev *chr)
sim_console = &console;
}
-void HELPER(simcall)(CPUXtensaState *env)
+void xtensa_semihosting(CPUXtensaState *env)
{
CPUState *cs = env_cpu(env);
uint32_t *regs = env->regs;
Within do_interrupt, we hold the iothread lock, which is required for Chardev access for the console, and for the round trip for use_gdb_syscalls(). Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/xtensa/cpu.h | 2 ++ target/xtensa/helper.h | 3 --- target/xtensa/exc_helper.c | 4 ++++ target/xtensa/translate.c | 3 ++- target/xtensa/xtensa-semi.c | 3 +-- 5 files changed, 9 insertions(+), 6 deletions(-)