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;
|
||||
|
||||
/* Check reservation */
|
||||
if ((env->reserve_addr & mask) == addr) {
|
||||
if (unlikely((env->reserve_addr & mask) == addr)) {
|
||||
env->reserve_addr = (target_ulong)-1ULL;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
if (haddr) {
|
||||
memset(haddr, 0, dcbz_size);
|
||||
} else {
|
||||
if (unlikely(!haddr)) {
|
||||
/* Slow path */
|
||||
for (int i = 0; i < dcbz_size; i += 8) {
|
||||
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)
|
||||
|
|
Loading…
Reference in New Issue