On Mon May 27, 2024 at 9:12 AM AEST, BALATON Zoltan wrote: > This function is only called once and we can make the caller simpler > by inlining it.
I'm inclined to agree. Splitting into function can be nice, but translating return values here is pretty horrible. I think it looks right. Reviewed-by: Nicholas Piggin <npig...@gmail.com> > > Signed-off-by: BALATON Zoltan <bala...@eik.bme.hu> > --- > target/ppc/mmu_common.c | 71 +++++++++++++---------------------------- > 1 file changed, 22 insertions(+), 49 deletions(-) > > diff --git a/target/ppc/mmu_common.c b/target/ppc/mmu_common.c > index b2993e8563..784e833ff2 100644 > --- a/target/ppc/mmu_common.c > +++ b/target/ppc/mmu_common.c > @@ -91,33 +91,6 @@ int ppc6xx_tlb_getnum(CPUPPCState *env, target_ulong eaddr, > return nr; > } > > -static int ppc6xx_tlb_pte_check(mmu_ctx_t *ctx, target_ulong pte0, > - target_ulong pte1, int pteh, > - MMUAccessType access_type, bool nx) > -{ > - /* Check validity and table match */ > - if (!pte_is_valid(pte0) || ((pte0 >> 6) & 1) != pteh || > - (pte0 & PTE_PTEM_MASK) != ctx->ptem) { > - return -1; > - } > - /* all matches should have equal RPN, WIMG & PP */ > - if (ctx->raddr != (hwaddr)-1ULL && > - (ctx->raddr & PTE_CHECK_MASK) != (pte1 & PTE_CHECK_MASK)) { > - qemu_log_mask(CPU_LOG_MMU, "Bad RPN/WIMG/PP\n"); > - return -3; > - } > - /* Keep the matching PTE information */ > - ctx->raddr = pte1; > - ctx->prot = ppc_hash32_prot(ctx->key, pte1 & HPTE32_R_PP, nx); > - if (check_prot_access_type(ctx->prot, access_type)) { > - qemu_log_mask(CPU_LOG_MMU, "PTE access granted !\n"); > - return 0; > - } else { > - qemu_log_mask(CPU_LOG_MMU, "PTE access rejected\n"); > - return -2; > - } > -} > - > /* Software driven TLB helpers */ > > static int ppc6xx_tlb_check(CPUPPCState *env, > @@ -149,32 +122,32 @@ static int ppc6xx_tlb_check(CPUPPCState *env, > tlb->EPN, eaddr, tlb->pte1, > access_type == MMU_DATA_STORE ? 'S' : 'L', > access_type == MMU_INST_FETCH ? 'I' : 'D'); > - switch (ppc6xx_tlb_pte_check(ctx, tlb->pte0, tlb->pte1, > - 0, access_type, nx)) { > - case -2: > - /* Access violation */ > - ret = -2; > - best = nr; > - break; > - case -1: /* No match */ > - case -3: /* TLB inconsistency */ > - default: > - break; > - case 0: > - /* access granted */ > - /* > - * XXX: we should go on looping to check all TLBs > - * consistency but we can speed-up the whole thing as > - * the result would be undefined if TLBs are not > - * consistent. > - */ > + /* Check validity and table match */ > + if (!pte_is_valid(tlb->pte0) || ((tlb->pte0 >> 6) & 1) != 0 || > + (tlb->pte0 & PTE_PTEM_MASK) != ctx->ptem) { > + continue; > + } > + /* all matches should have equal RPN, WIMG & PP */ > + if (ctx->raddr != (hwaddr)-1ULL && > + (ctx->raddr & PTE_CHECK_MASK) != (tlb->pte1 & PTE_CHECK_MASK)) { > + qemu_log_mask(CPU_LOG_MMU, "Bad RPN/WIMG/PP\n"); > + /* TLB inconsistency */ > + continue; > + } > + /* Keep the matching PTE information */ > + best = nr; > + ctx->raddr = tlb->pte1; > + ctx->prot = ppc_hash32_prot(ctx->key, tlb->pte1 & HPTE32_R_PP, nx); > + if (check_prot_access_type(ctx->prot, access_type)) { > + qemu_log_mask(CPU_LOG_MMU, "PTE access granted !\n"); > ret = 0; > - best = nr; > - goto done; > + break; > + } else { > + qemu_log_mask(CPU_LOG_MMU, "PTE access rejected\n"); > + ret = -2; > } > } > if (best != -1) { > -done: > qemu_log_mask(CPU_LOG_MMU, "found TLB at addr " HWADDR_FMT_plx > " prot=%01x ret=%d\n", > ctx->raddr & TARGET_PAGE_MASK, ctx->prot, ret);