mirror of https://github.com/xemu-project/xemu.git
target/ppc: Improve helper_dcbz for user-only
Mark the reserve_addr check unlikely. Use tlb_vaddr_to_host instead of probe_write, relying on the memset itself to test for page writability. Use set/clear_helper_retaddr so that we can properly unwind on segfault. With this, a trivial loop around guest memset will no longer spend nearly 25% of runtime within page_get_flags. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
c6d84fd7cf
commit
f6bcc5b8f9
|
@ -280,20 +280,27 @@ static void dcbz_common(CPUPPCState *env, target_ulong addr,
|
||||||
addr &= mask;
|
addr &= mask;
|
||||||
|
|
||||||
/* Check reservation */
|
/* Check reservation */
|
||||||
if ((env->reserve_addr & mask) == addr) {
|
if (unlikely((env->reserve_addr & mask) == addr)) {
|
||||||
env->reserve_addr = (target_ulong)-1ULL;
|
env->reserve_addr = (target_ulong)-1ULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try fast path translate */
|
/* Try fast path translate */
|
||||||
|
#ifdef CONFIG_USER_ONLY
|
||||||
|
haddr = tlb_vaddr_to_host(env, addr, MMU_DATA_STORE, mmu_idx);
|
||||||
|
#else
|
||||||
haddr = probe_write(env, addr, dcbz_size, mmu_idx, retaddr);
|
haddr = probe_write(env, addr, dcbz_size, mmu_idx, retaddr);
|
||||||
if (haddr) {
|
if (unlikely(!haddr)) {
|
||||||
memset(haddr, 0, dcbz_size);
|
|
||||||
} else {
|
|
||||||
/* Slow path */
|
/* Slow path */
|
||||||
for (int i = 0; i < dcbz_size; i += 8) {
|
for (int i = 0; i < dcbz_size; i += 8) {
|
||||||
cpu_stq_mmuidx_ra(env, addr + i, 0, mmu_idx, retaddr);
|
cpu_stq_mmuidx_ra(env, addr + i, 0, mmu_idx, retaddr);
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
set_helper_retaddr(retaddr);
|
||||||
|
memset(haddr, 0, dcbz_size);
|
||||||
|
clear_helper_retaddr();
|
||||||
}
|
}
|
||||||
|
|
||||||
void helper_dcbz(CPUPPCState *env, target_ulong addr, int mmu_idx)
|
void helper_dcbz(CPUPPCState *env, target_ulong addr, int mmu_idx)
|
||||||
|
|
Loading…
Reference in New Issue