Message ID | 67350d0b2e2773d02536ba9cce812361ff1b5a16.1716763435.git.balaton@eik.bme.hu |
---|---|
State | New |
Headers | show |
Series | Remaining MMU clean up patches | expand |
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 <npiggin@gmail.com> > > Signed-off-by: BALATON Zoltan <balaton@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);
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);
This function is only called once and we can make the caller simpler by inlining it. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> --- target/ppc/mmu_common.c | 71 +++++++++++++---------------------------- 1 file changed, 22 insertions(+), 49 deletions(-)