mirror of https://github.com/xemu-project/xemu.git
ppc/ppc405: Fix TLB flushing
Commitcd0c6f4735
did not take into account 405 CPUs when adding support to batching of TCG tlb flushes. Set the TLB_NEED_LOCAL_FLUSH flag when the SPR_40x_PID is set or a TLB updated. Cc: Thomas Huth <thuth@redhat.com> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Fabiano Rosas <farosas@linux.ibm.com> Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com> Fixes:cd0c6f4735
("ppc: Do some batching of TCG tlb flushes") Signed-off-by: Cédric Le Goater <clg@kaod.org> Message-Id: <20220113180352.1234512-1-clg@kaod.org> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
dc10da64e1
commit
47822486f5
|
@ -707,6 +707,7 @@ DEF_HELPER_FLAGS_1(load_40x_pit, TCG_CALL_NO_RWG, tl, env)
|
|||
DEF_HELPER_FLAGS_2(store_40x_pit, TCG_CALL_NO_RWG, void, env, tl)
|
||||
DEF_HELPER_FLAGS_2(store_40x_tcr, TCG_CALL_NO_RWG, void, env, tl)
|
||||
DEF_HELPER_FLAGS_2(store_40x_tsr, TCG_CALL_NO_RWG, void, env, tl)
|
||||
DEF_HELPER_2(store_40x_pid, void, env, tl)
|
||||
DEF_HELPER_2(store_40x_dbcr0, void, env, tl)
|
||||
DEF_HELPER_2(store_40x_sler, void, env, tl)
|
||||
DEF_HELPER_FLAGS_2(store_booke_tcr, TCG_CALL_NO_RWG, void, env, tl)
|
||||
|
|
|
@ -664,6 +664,14 @@ static inline int booke_page_size_to_tlb(target_ulong page_size)
|
|||
#define PPC4XX_TLBLO_ATTR_MASK 0x000000FF
|
||||
#define PPC4XX_TLBLO_RPN_MASK 0xFFFFFC00
|
||||
|
||||
void helper_store_40x_pid(CPUPPCState *env, target_ulong val)
|
||||
{
|
||||
if (env->spr[SPR_40x_PID] != val) {
|
||||
env->spr[SPR_40x_PID] = val;
|
||||
env->tlb_need_flush |= TLB_NEED_LOCAL_FLUSH;
|
||||
}
|
||||
}
|
||||
|
||||
target_ulong helper_4xx_tlbre_hi(CPUPPCState *env, target_ulong entry)
|
||||
{
|
||||
ppcemb_tlb_t *tlb;
|
||||
|
@ -681,7 +689,7 @@ target_ulong helper_4xx_tlbre_hi(CPUPPCState *env, target_ulong entry)
|
|||
size = PPC4XX_TLBHI_SIZE_DEFAULT;
|
||||
}
|
||||
ret |= size << PPC4XX_TLBHI_SIZE_SHIFT;
|
||||
env->spr[SPR_40x_PID] = tlb->PID;
|
||||
helper_store_40x_pid(env, tlb->PID);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -794,6 +802,8 @@ void helper_4xx_tlbwe_lo(CPUPPCState *env, target_ulong entry,
|
|||
tlb->prot & PAGE_WRITE ? 'w' : '-',
|
||||
tlb->prot & PAGE_EXEC ? 'x' : '-',
|
||||
tlb->prot & PAGE_VALID ? 'v' : '-', (int)tlb->PID);
|
||||
|
||||
env->tlb_need_flush |= TLB_NEED_LOCAL_FLUSH;
|
||||
}
|
||||
|
||||
target_ulong helper_4xx_tlbsx(CPUPPCState *env, target_ulong address)
|
||||
|
|
|
@ -894,7 +894,7 @@ void spr_write_40x_pid(DisasContext *ctx, int sprn, int gprn)
|
|||
{
|
||||
TCGv t0 = tcg_temp_new();
|
||||
tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xFF);
|
||||
gen_store_spr(SPR_40x_PID, t0);
|
||||
gen_helper_store_40x_pid(cpu_env, t0);
|
||||
tcg_temp_free(t0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue