X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=cpu-exec-common.c;h=e81da276bb0cd78ab2c655f60e7a6001ab8161fd;hb=ac0038f18299353580388e969992dab49ae90531;hp=43edf3677753d8dac7562abe2c59123624a27c19;hpb=526d5809a0714edc7f19196f14ec2e607dbd9753;p=mirror_qemu.git diff --git a/cpu-exec-common.c b/cpu-exec-common.c index 43edf36777..e81da276bb 100644 --- a/cpu-exec-common.c +++ b/cpu-exec-common.c @@ -17,19 +17,14 @@ * License along with this library; if not, see . */ -#include "config.h" +#include "qemu/osdep.h" #include "cpu.h" #include "sysemu/cpus.h" +#include "exec/exec-all.h" #include "exec/memory-internal.h" -bool exit_request; -CPUState *tcg_current_cpu; - -/* exit the current TB from a signal handler. The host registers are - restored in a state compatible with the CPU emulator - */ -#if defined(CONFIG_SOFTMMU) -void cpu_resume_from_signal(CPUState *cpu, void *puc) +/* exit the current TB, but without causing any exception to be raised */ +void cpu_loop_exit_noexc(CPUState *cpu) { /* XXX: restore cpu registers saved in host registers */ @@ -37,9 +32,10 @@ void cpu_resume_from_signal(CPUState *cpu, void *puc) siglongjmp(cpu->jmp_env, 1); } +#if defined(CONFIG_SOFTMMU) void cpu_reloading_memory_map(void) { - if (qemu_in_vcpu_thread()) { + if (qemu_in_vcpu_thread() && current_cpu->running) { /* The guest can in theory prolong the RCU critical section as long * as it feels like. The major problem with this is that because it * can do multiple reconfigurations of the memory map within the @@ -68,7 +64,6 @@ void cpu_reloading_memory_map(void) void cpu_loop_exit(CPUState *cpu) { - cpu->current_tb = NULL; siglongjmp(cpu->jmp_env, 1); } @@ -77,6 +72,11 @@ void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc) if (pc) { cpu_restore_state(cpu, pc); } - cpu->current_tb = NULL; siglongjmp(cpu->jmp_env, 1); } + +void cpu_loop_exit_atomic(CPUState *cpu, uintptr_t pc) +{ + cpu->exception_index = EXCP_ATOMIC; + cpu_loop_exit_restore(cpu, pc); +}