Move this function to common code. It has no arch specific dependencies. Prepares support for multi-arch where the translate-all interface needs to be virtualised. One less thing to virtualise.
Reviewed-by: Richard Henderson <r...@twiddle.net> Signed-off-by: Peter Crosthwaite <crosthwaite.pe...@gmail.com> --- translate-all.c | 32 -------------------------------- translate-common.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 32 deletions(-) diff --git a/translate-all.c b/translate-all.c index 1228f9c..950e991 100644 --- a/translate-all.c +++ b/translate-all.c @@ -1457,38 +1457,6 @@ void tb_check_watchpoint(CPUState *cpu) } #ifndef CONFIG_USER_ONLY -/* mask must never be zero, except for A20 change call */ -static void tcg_handle_interrupt(CPUState *cpu, int mask) -{ - int old_mask; - - old_mask = cpu->interrupt_request; - cpu->interrupt_request |= mask; - - /* - * If called from iothread context, wake the target cpu in - * case its halted. - */ - if (!qemu_cpu_is_self(cpu)) { - qemu_cpu_kick(cpu); - return; - } - - if (use_icount) { - cpu->icount_decr.u16.high = 0xffff; - if (!cpu->can_do_io - && (mask & ~old_mask) != 0) { - cpu_abort(cpu, "Raised interrupt while not in I/O function"); - } - } else { - cpu->tcg_exit_req = 1; - } -} - -CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt; - -/* in deterministic execution mode, instructions doing device I/Os - must be at the end of the TB */ void cpu_io_recompile(CPUState *cpu, uintptr_t retaddr) { #if defined(TARGET_MIPS) || defined(TARGET_SH4) diff --git a/translate-common.c b/translate-common.c index 563ae5a..368a117 100644 --- a/translate-common.c +++ b/translate-common.c @@ -1,6 +1,7 @@ /* * Host code generation common components * + * Copyright (c) 2003 Fabrice Bellard * Copyright (c) 2015 Peter Crosthwaite <crosthwaite.pe...@gmail.com> * * This library is free software; you can redistribute it and/or @@ -18,6 +19,39 @@ */ #include "qemu-common.h" +#include "qom/cpu.h" + +#ifndef CONFIG_USER_ONLY +/* mask must never be zero, except for A20 change call */ +static void tcg_handle_interrupt(CPUState *cpu, int mask) +{ + int old_mask; + + old_mask = cpu->interrupt_request; + cpu->interrupt_request |= mask; + + /* + * If called from iothread context, wake the target cpu in + * case its halted. + */ + if (!qemu_cpu_is_self(cpu)) { + qemu_cpu_kick(cpu); + return; + } + + if (use_icount) { + cpu->icount_decr.u16.high = 0xffff; + if (!cpu->can_do_io + && (mask & ~old_mask) != 0) { + cpu_abort(cpu, "Raised interrupt while not in I/O function"); + } + } else { + cpu->tcg_exit_req = 1; + } +} + +CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt; +#endif typedef struct TCGExecInitFn { void (*do_tcg_exec_init)(unsigned long tb_size); -- 1.9.1