mirror of https://github.com/xqemu/xqemu.git
tcg: synchronize cpu->exit_request and cpu->tcg_exit_req accesses
Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
b0a46fa796
commit
ab096a75cd
|
@ -507,8 +507,12 @@ int cpu_exec(CPUState *cpu)
|
||||||
* loop. Whatever requested the exit will also
|
* loop. Whatever requested the exit will also
|
||||||
* have set something else (eg exit_request or
|
* have set something else (eg exit_request or
|
||||||
* interrupt_request) which we will handle
|
* interrupt_request) which we will handle
|
||||||
* next time around the loop.
|
* next time around the loop. But we need to
|
||||||
|
* ensure the tcg_exit_req read in generated code
|
||||||
|
* comes before the next read of cpu->exit_request
|
||||||
|
* or cpu->interrupt_request.
|
||||||
*/
|
*/
|
||||||
|
smp_rmb();
|
||||||
next_tb = 0;
|
next_tb = 0;
|
||||||
break;
|
break;
|
||||||
case TB_EXIT_ICOUNT_EXPIRED:
|
case TB_EXIT_ICOUNT_EXPIRED:
|
||||||
|
|
|
@ -114,6 +114,8 @@ void cpu_reset_interrupt(CPUState *cpu, int mask)
|
||||||
void cpu_exit(CPUState *cpu)
|
void cpu_exit(CPUState *cpu)
|
||||||
{
|
{
|
||||||
cpu->exit_request = 1;
|
cpu->exit_request = 1;
|
||||||
|
/* Ensure cpu_exec will see the exit request after TCG has exited. */
|
||||||
|
smp_wmb();
|
||||||
cpu->tcg_exit_req = 1;
|
cpu->tcg_exit_req = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue