X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=translate-common.c;h=40fe5a19bb3c2ec14f0f2ac58e78db95cbc89aea;hb=d1c136885ba5b302f9781b8927a8ea2ee38cccd2;hp=171222d03722d37f1558546a2b45889872add3b4;hpb=cf22132367a188426ac07cf1805b214dd2d0cc80;p=mirror_qemu.git diff --git a/translate-common.c b/translate-common.c index 171222d037..40fe5a19bb 100644 --- a/translate-common.c +++ b/translate-common.c @@ -17,8 +17,11 @@ * License along with this library; if not, see . */ +#include "qemu/osdep.h" #include "qemu-common.h" #include "qom/cpu.h" +#include "sysemu/cpus.h" +#include "qemu/main-loop.h" uintptr_t qemu_real_host_page_size; intptr_t qemu_real_host_page_mask; @@ -28,6 +31,7 @@ intptr_t qemu_real_host_page_mask; static void tcg_handle_interrupt(CPUState *cpu, int mask) { int old_mask; + g_assert(qemu_mutex_iothread_locked()); old_mask = cpu->interrupt_request; cpu->interrupt_request |= mask; @@ -38,17 +42,13 @@ static void tcg_handle_interrupt(CPUState *cpu, int mask) */ 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 + } else { + cpu->icount_decr.u16.high = -1; + if (use_icount && + !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; } }