mirror of https://gitlab.com/qemu-project/qemu
tcg: update the cpu running flag in cpu_exec_step_atomic
The cpu_exec_step_atomic() function is called with the cpu->running clear and proceeds to run target code without setting this flag. If this target code generates an exception then handle_cpu_signal() will unnecessarily abort. For example if atomic code generates a memory protection fault. This patch at least sets and clears this running flag, and adds some assertions to help detect other cases. Signed-off-by: Douglas Crosher <dtc-ubuntu@scieneer.com> Message-Id: <a272c656-f7c5-019d-1cc0-499b8f80f2fc@scieneer.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
0e32462630
commit
bfff072c50
|
@ -285,6 +285,9 @@ void cpu_exec_step_atomic(CPUState *cpu)
|
||||||
|
|
||||||
if (sigsetjmp(cpu->jmp_env, 0) == 0) {
|
if (sigsetjmp(cpu->jmp_env, 0) == 0) {
|
||||||
start_exclusive();
|
start_exclusive();
|
||||||
|
g_assert(cpu == current_cpu);
|
||||||
|
g_assert(!cpu->running);
|
||||||
|
cpu->running = true;
|
||||||
|
|
||||||
tb = tb_lookup__cpu_state(cpu, &pc, &cs_base, &flags, cf_mask);
|
tb = tb_lookup__cpu_state(cpu, &pc, &cs_base, &flags, cf_mask);
|
||||||
if (tb == NULL) {
|
if (tb == NULL) {
|
||||||
|
@ -323,6 +326,7 @@ void cpu_exec_step_atomic(CPUState *cpu)
|
||||||
*/
|
*/
|
||||||
g_assert(cpu_in_exclusive_context(cpu));
|
g_assert(cpu_in_exclusive_context(cpu));
|
||||||
parallel_cpus = true;
|
parallel_cpus = true;
|
||||||
|
cpu->running = false;
|
||||||
end_exclusive();
|
end_exclusive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue