|
@@ -107,6 +107,10 @@ static bool ptw_setl_slow(const PTETranslate *in, uint32_t old, uint32_t new)
|
|
{
|
|
{
|
|
uint32_t cmp;
|
|
uint32_t cmp;
|
|
|
|
|
|
|
|
+ CPUState *cpu = env_cpu(in->env);
|
|
|
|
+ /* We are in cpu_exec, and start_exclusive can't be called directly.*/
|
|
|
|
+ g_assert(cpu->running);
|
|
|
|
+ cpu_exec_end(cpu);
|
|
/* Does x86 really perform a rmw cycle on mmio for ptw? */
|
|
/* Does x86 really perform a rmw cycle on mmio for ptw? */
|
|
start_exclusive();
|
|
start_exclusive();
|
|
cmp = cpu_ldl_mmuidx_ra(in->env, in->gaddr, in->ptw_idx, 0);
|
|
cmp = cpu_ldl_mmuidx_ra(in->env, in->gaddr, in->ptw_idx, 0);
|
|
@@ -114,6 +118,7 @@ static bool ptw_setl_slow(const PTETranslate *in, uint32_t old, uint32_t new)
|
|
cpu_stl_mmuidx_ra(in->env, in->gaddr, new, in->ptw_idx, 0);
|
|
cpu_stl_mmuidx_ra(in->env, in->gaddr, new, in->ptw_idx, 0);
|
|
}
|
|
}
|
|
end_exclusive();
|
|
end_exclusive();
|
|
|
|
+ cpu_exec_start(cpu);
|
|
return cmp == old;
|
|
return cmp == old;
|
|
}
|
|
}
|
|
|
|
|