target/ppc: Split off real mode cases in get_physical_address_wtlb()
The real mode handling is identical in the remaining switch cases. Split off these common real mode cases into a separate conditional to leave only the else branches in the switch that are different. Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
parent
279fe98d0d
commit
549685161d
@ -1172,7 +1172,6 @@ int get_physical_address_wtlb(CPUPPCState *env, mmu_ctx_t *ctx,
|
|||||||
MMUAccessType access_type, int type,
|
MMUAccessType access_type, int type,
|
||||||
int mmu_idx)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
|
||||||
bool real_mode;
|
bool real_mode;
|
||||||
|
|
||||||
if (env->mmu_model == POWERPC_MMU_BOOKE) {
|
if (env->mmu_model == POWERPC_MMU_BOOKE) {
|
||||||
@ -1184,38 +1183,23 @@ int get_physical_address_wtlb(CPUPPCState *env, mmu_ctx_t *ctx,
|
|||||||
|
|
||||||
real_mode = (type == ACCESS_CODE) ? !FIELD_EX64(env->msr, MSR, IR)
|
real_mode = (type == ACCESS_CODE) ? !FIELD_EX64(env->msr, MSR, IR)
|
||||||
: !FIELD_EX64(env->msr, MSR, DR);
|
: !FIELD_EX64(env->msr, MSR, DR);
|
||||||
|
if (real_mode && (env->mmu_model == POWERPC_MMU_SOFT_6xx ||
|
||||||
|
env->mmu_model == POWERPC_MMU_SOFT_4xx ||
|
||||||
|
env->mmu_model == POWERPC_MMU_REAL)) {
|
||||||
|
return check_physical(env, ctx, eaddr, access_type);
|
||||||
|
}
|
||||||
|
|
||||||
switch (env->mmu_model) {
|
switch (env->mmu_model) {
|
||||||
case POWERPC_MMU_SOFT_6xx:
|
case POWERPC_MMU_SOFT_6xx:
|
||||||
if (real_mode) {
|
return mmu6xx_get_physical_address(env, ctx, eaddr, access_type, type);
|
||||||
ret = check_physical(env, ctx, eaddr, access_type);
|
|
||||||
} else {
|
|
||||||
ret = mmu6xx_get_physical_address(env, ctx, eaddr, access_type,
|
|
||||||
type);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case POWERPC_MMU_SOFT_4xx:
|
case POWERPC_MMU_SOFT_4xx:
|
||||||
if (real_mode) {
|
return mmu40x_get_physical_address(env, ctx, eaddr, access_type);
|
||||||
ret = check_physical(env, ctx, eaddr, access_type);
|
|
||||||
} else {
|
|
||||||
ret = mmu40x_get_physical_address(env, ctx, eaddr, access_type);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case POWERPC_MMU_REAL:
|
case POWERPC_MMU_REAL:
|
||||||
if (real_mode) {
|
|
||||||
ret = check_physical(env, ctx, eaddr, access_type);
|
|
||||||
} else {
|
|
||||||
cpu_abort(env_cpu(env),
|
cpu_abort(env_cpu(env),
|
||||||
"PowerPC in real mode do not do any translation\n");
|
"PowerPC in real mode do not do any translation\n");
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
default:
|
default:
|
||||||
cpu_abort(env_cpu(env), "Unknown or invalid MMU model\n");
|
cpu_abort(env_cpu(env), "Unknown or invalid MMU model\n");
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void booke206_update_mas_tlb_miss(CPUPPCState *env, target_ulong address,
|
static void booke206_update_mas_tlb_miss(CPUPPCState *env, target_ulong address,
|
||||||
|
Loading…
Reference in New Issue
Block a user