diff options
-rw-r--r-- | cpu-defs.h | 1 | ||||
-rw-r--r-- | cpus.c | 27 | ||||
-rw-r--r-- | include/qemu/cpu.h | 2 |
3 files changed, 20 insertions, 10 deletions
diff --git a/cpu-defs.h b/cpu-defs.h index 3b8bc20329..7a6378c5a1 100644 --- a/cpu-defs.h +++ b/cpu-defs.h @@ -205,7 +205,6 @@ typedef struct CPUWatchpoint { /* user data */ \ void *opaque; \ \ - uint32_t stop; /* Stop request */ \ uint32_t stopped; /* Artificially stopped */ \ struct QemuCond *halt_cond; \ struct qemu_work_item *queued_work_first, *queued_work_last; \ @@ -64,7 +64,9 @@ static CPUArchState *next_cpu; static bool cpu_thread_is_idle(CPUArchState *env) { - if (env->stop || env->queued_work_first) { + CPUState *cpu = ENV_GET_CPU(env); + + if (cpu->stop || env->queued_work_first) { return false; } if (env->stopped || !runstate_is_running()) { @@ -448,7 +450,9 @@ static void do_vm_stop(RunState state) static int cpu_can_run(CPUArchState *env) { - if (env->stop) { + CPUState *cpu = ENV_GET_CPU(env); + + if (cpu->stop) { return 0; } if (env->stopped || !runstate_is_running()) { @@ -687,8 +691,8 @@ static void qemu_wait_io_event_common(CPUArchState *env) { CPUState *cpu = ENV_GET_CPU(env); - if (env->stop) { - env->stop = 0; + if (cpu->stop) { + cpu->stop = false; env->stopped = 1; qemu_cond_signal(&qemu_pause_cond); } @@ -941,7 +945,8 @@ void pause_all_vcpus(void) qemu_clock_enable(vm_clock, false); while (penv) { - penv->stop = 1; + CPUState *pcpu = ENV_GET_CPU(penv); + pcpu->stop = true; qemu_cpu_kick(penv); penv = penv->next_cpu; } @@ -950,7 +955,8 @@ void pause_all_vcpus(void) cpu_stop_current(); if (!kvm_enabled()) { while (penv) { - penv->stop = 0; + CPUState *pcpu = ENV_GET_CPU(penv); + pcpu->stop = 0; penv->stopped = 1; penv = penv->next_cpu; } @@ -974,7 +980,8 @@ void resume_all_vcpus(void) qemu_clock_enable(vm_clock, true); while (penv) { - penv->stop = 0; + CPUState *pcpu = ENV_GET_CPU(penv); + pcpu->stop = false; penv->stopped = 0; qemu_cpu_kick(penv); penv = penv->next_cpu; @@ -1054,7 +1061,8 @@ void qemu_init_vcpu(void *_env) void cpu_stop_current(void) { if (cpu_single_env) { - cpu_single_env->stop = 0; + CPUState *cpu_single_cpu = ENV_GET_CPU(cpu_single_env); + cpu_single_cpu->stop = false; cpu_single_env->stopped = 1; cpu_exit(cpu_single_env); qemu_cond_signal(&qemu_pause_cond); @@ -1136,6 +1144,7 @@ static void tcg_exec_all(void) } for (; next_cpu != NULL && !exit_request; next_cpu = next_cpu->next_cpu) { CPUArchState *env = next_cpu; + CPUState *cpu = ENV_GET_CPU(env); qemu_clock_enable(vm_clock, (env->singlestep_enabled & SSTEP_NOTIMER) == 0); @@ -1146,7 +1155,7 @@ static void tcg_exec_all(void) cpu_handle_guest_debug(env); break; } - } else if (env->stop || env->stopped) { + } else if (cpu->stop || env->stopped) { break; } } diff --git a/include/qemu/cpu.h b/include/qemu/cpu.h index 3ab2e2567f..04c7848b8f 100644 --- a/include/qemu/cpu.h +++ b/include/qemu/cpu.h @@ -55,6 +55,7 @@ typedef struct CPUClass { /** * CPUState: * @created: Indicates whether the CPU thread has been successfully created. + * @stop: Indicates a pending stop request. * * State of one CPU core or thread. */ @@ -69,6 +70,7 @@ struct CPUState { #endif bool thread_kicked; bool created; + bool stop; /* TODO Move common fields from CPUArchState here. */ }; |