target/ppc/mmu_common.c: Stop using ctx in ppc6xx_tlb_check()

Pass raddr and prot in function parameters instead.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
BALATON Zoltan 2024-05-27 01:12:58 +02:00 committed by Nicholas Piggin
parent da5c1d20e9
commit aa781c102a

View file

@ -91,10 +91,9 @@ int ppc6xx_tlb_getnum(CPUPPCState *env, target_ulong eaddr,
/* Software driven TLB helpers */ /* Software driven TLB helpers */
static int ppc6xx_tlb_check(CPUPPCState *env, static int ppc6xx_tlb_check(CPUPPCState *env, hwaddr *raddr, int *prot,
mmu_ctx_t *ctx, target_ulong eaddr, target_ulong eaddr, MMUAccessType access_type,
MMUAccessType access_type, target_ulong ptem, target_ulong ptem, bool key, bool nx)
bool key, bool nx)
{ {
ppc6xx_tlb_t *tlb; ppc6xx_tlb_t *tlb;
target_ulong *pte1p; target_ulong *pte1p;
@ -102,7 +101,7 @@ static int ppc6xx_tlb_check(CPUPPCState *env,
bool is_code = (access_type == MMU_INST_FETCH); bool is_code = (access_type == MMU_INST_FETCH);
/* Initialize real address with an invalid value */ /* Initialize real address with an invalid value */
ctx->raddr = (hwaddr)-1ULL; *raddr = (hwaddr)-1ULL;
best = -1; best = -1;
ret = -1; /* No TLB found */ ret = -1; /* No TLB found */
for (way = 0; way < env->nb_ways; way++) { for (way = 0; way < env->nb_ways; way++) {
@ -130,17 +129,17 @@ static int ppc6xx_tlb_check(CPUPPCState *env,
continue; continue;
} }
/* all matches should have equal RPN, WIMG & PP */ /* all matches should have equal RPN, WIMG & PP */
if (ctx->raddr != (hwaddr)-1ULL && if (*raddr != (hwaddr)-1ULL &&
(ctx->raddr & PTE_CHECK_MASK) != (tlb->pte1 & PTE_CHECK_MASK)) { (*raddr & PTE_CHECK_MASK) != (tlb->pte1 & PTE_CHECK_MASK)) {
qemu_log_mask(CPU_LOG_MMU, "Bad RPN/WIMG/PP\n"); qemu_log_mask(CPU_LOG_MMU, "Bad RPN/WIMG/PP\n");
/* TLB inconsistency */ /* TLB inconsistency */
continue; continue;
} }
/* Keep the matching PTE information */ /* Keep the matching PTE information */
best = nr; best = nr;
ctx->raddr = tlb->pte1; *raddr = tlb->pte1;
ctx->prot = ppc_hash32_prot(key, tlb->pte1 & HPTE32_R_PP, nx); *prot = ppc_hash32_prot(key, tlb->pte1 & HPTE32_R_PP, nx);
if (check_prot_access_type(ctx->prot, access_type)) { if (check_prot_access_type(*prot, access_type)) {
qemu_log_mask(CPU_LOG_MMU, "PTE access granted !\n"); qemu_log_mask(CPU_LOG_MMU, "PTE access granted !\n");
ret = 0; ret = 0;
break; break;
@ -152,7 +151,7 @@ static int ppc6xx_tlb_check(CPUPPCState *env,
if (best != -1) { if (best != -1) {
qemu_log_mask(CPU_LOG_MMU, "found TLB at addr " HWADDR_FMT_plx qemu_log_mask(CPU_LOG_MMU, "found TLB at addr " HWADDR_FMT_plx
" prot=%01x ret=%d\n", " prot=%01x ret=%d\n",
ctx->raddr & TARGET_PAGE_MASK, ctx->prot, ret); *raddr & TARGET_PAGE_MASK, *prot, ret);
/* Update page flags */ /* Update page flags */
pte1p = &env->tlb.tlb6[best].pte1; pte1p = &env->tlb.tlb6[best].pte1;
*pte1p |= 0x00000100; /* Update accessed flag */ *pte1p |= 0x00000100; /* Update accessed flag */
@ -162,7 +161,7 @@ static int ppc6xx_tlb_check(CPUPPCState *env,
*pte1p |= 0x00000080; *pte1p |= 0x00000080;
} else { } else {
/* Force page fault for first write access */ /* Force page fault for first write access */
ctx->prot &= ~PAGE_WRITE; *prot &= ~PAGE_WRITE;
} }
} }
} }
@ -344,7 +343,8 @@ static int mmu6xx_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
*hashp = hash; *hashp = hash;
/* Software TLB search */ /* Software TLB search */
return ppc6xx_tlb_check(env, ctx, eaddr, access_type, ptem, key, nx); return ppc6xx_tlb_check(env, &ctx->raddr, &ctx->prot, eaddr,
access_type, ptem, key, nx);
} }
/* Direct-store segment : absolutely *BUGGY* for now */ /* Direct-store segment : absolutely *BUGGY* for now */