On Wed May 8, 2024 at 10:15 AM AEST, BALATON Zoltan wrote: > Repurpose get_segment_6xx_tlb() to do the whole address translation > for POWERPC_MMU_SOFT_6xx MMU model by moving the BAT check there and > renaming it to match other similar functions. These are only called > once together so no need to keep these separate functions and > combining them simplifies the caller allowing further restructuring. >
Reviewed-by: Nicholas Piggin <npig...@gmail.com> > Signed-off-by: BALATON Zoltan <bala...@eik.bme.hu> > --- > target/ppc/mmu_common.c | 26 ++++++++++++-------------- > 1 file changed, 12 insertions(+), 14 deletions(-) > > diff --git a/target/ppc/mmu_common.c b/target/ppc/mmu_common.c > index aa137123a4..181273579b 100644 > --- a/target/ppc/mmu_common.c > +++ b/target/ppc/mmu_common.c > @@ -360,19 +360,23 @@ static int get_bat_6xx_tlb(CPUPPCState *env, mmu_ctx_t > *ctx, > return ret; > } > > -/* Perform segment based translation */ > -static int get_segment_6xx_tlb(CPUPPCState *env, mmu_ctx_t *ctx, > - target_ulong eaddr, MMUAccessType access_type, > - int type) > +static int mmu6xx_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx, > + target_ulong eaddr, > + MMUAccessType access_type, int type) > { > PowerPCCPU *cpu = env_archcpu(env); > hwaddr hash; > - target_ulong vsid; > + target_ulong vsid, sr, pgidx; > int ds, target_page_bits; > bool pr; > int ret; > - target_ulong sr, pgidx; > > + /* First try to find a BAT entry if there are any */ > + if (env->nb_BATs && get_bat_6xx_tlb(env, ctx, eaddr, access_type) == 0) { > + return 0; > + } > + > + /* Perform segment based translation when no BATs matched */ > pr = FIELD_EX64(env->msr, MSR, PR); > ctx->eaddr = eaddr; > > @@ -1194,14 +1198,8 @@ int get_physical_address_wtlb(CPUPPCState *env, > mmu_ctx_t *ctx, > if (real_mode) { > ret = check_physical(env, ctx, eaddr, access_type); > } else { > - /* Try to find a BAT */ > - if (env->nb_BATs != 0) { > - ret = get_bat_6xx_tlb(env, ctx, eaddr, access_type); > - } > - if (ret < 0) { > - /* We didn't match any BAT entry or don't have BATs */ > - ret = get_segment_6xx_tlb(env, ctx, eaddr, access_type, > type); > - } > + ret = mmu6xx_get_physical_address(env, ctx, eaddr, access_type, > + type); > } > break; >