mirror of https://github.com/xemu-project/xemu.git
target-ppc: Disentangle hash mmu versions of cpu_get_phys_page_debug()
cpu_get_phys_page_debug() is a trivial wrapper around get_physical_address(). But even the signature of get_physical_address() has some things we'd like to clean up on a per-mmu basis, so this patch moves the test on mmu model out to cpu_get_phys_page_debug(), moving the version for 64-bit hash MMUs out to mmu-hash64.c and the version for 32-bit hash MMUs to mmu-hash32.c Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
25de24ab83
commit
f2ad6be83b
|
@ -304,8 +304,9 @@ static int get_segment32(CPUPPCState *env, mmu_ctx_t *ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ppc_hash32_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
static int ppc_hash32_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
||||||
target_ulong eaddr, int rw, int access_type)
|
target_ulong eaddr, int rw,
|
||||||
|
int access_type)
|
||||||
{
|
{
|
||||||
bool real_mode = (access_type == ACCESS_CODE && msr_ir == 0)
|
bool real_mode = (access_type == ACCESS_CODE && msr_ir == 0)
|
||||||
|| (access_type != ACCESS_CODE && msr_dr == 0);
|
|| (access_type != ACCESS_CODE && msr_dr == 0);
|
||||||
|
@ -329,6 +330,18 @@ int ppc_hash32_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hwaddr ppc_hash32_get_phys_page_debug(CPUPPCState *env, target_ulong addr)
|
||||||
|
{
|
||||||
|
mmu_ctx_t ctx;
|
||||||
|
|
||||||
|
if (unlikely(ppc_hash32_get_physical_address(env, &ctx, addr, 0, ACCESS_INT)
|
||||||
|
!= 0)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.raddr & TARGET_PAGE_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
int ppc_hash32_handle_mmu_fault(CPUPPCState *env, target_ulong address, int rw,
|
int ppc_hash32_handle_mmu_fault(CPUPPCState *env, target_ulong address, int rw,
|
||||||
int mmu_idx)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,8 +4,7 @@
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
|
||||||
int pte32_is_valid(target_ulong pte0);
|
int pte32_is_valid(target_ulong pte0);
|
||||||
int ppc_hash32_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
hwaddr ppc_hash32_get_phys_page_debug(CPUPPCState *env, target_ulong addr);
|
||||||
target_ulong eaddr, int rw, int access_type);
|
|
||||||
int ppc_hash32_handle_mmu_fault(CPUPPCState *env, target_ulong address, int rw,
|
int ppc_hash32_handle_mmu_fault(CPUPPCState *env, target_ulong address, int rw,
|
||||||
int mmu_idx);
|
int mmu_idx);
|
||||||
|
|
||||||
|
|
|
@ -436,8 +436,9 @@ static int get_segment64(CPUPPCState *env, mmu_ctx_t *ctx,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ppc_hash64_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
static int ppc_hash64_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
||||||
target_ulong eaddr, int rw, int access_type)
|
target_ulong eaddr, int rw,
|
||||||
|
int access_type)
|
||||||
{
|
{
|
||||||
bool real_mode = (access_type == ACCESS_CODE && msr_ir == 0)
|
bool real_mode = (access_type == ACCESS_CODE && msr_ir == 0)
|
||||||
|| (access_type != ACCESS_CODE && msr_dr == 0);
|
|| (access_type != ACCESS_CODE && msr_dr == 0);
|
||||||
|
@ -451,6 +452,18 @@ int ppc_hash64_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hwaddr ppc_hash64_get_phys_page_debug(CPUPPCState *env, target_ulong addr)
|
||||||
|
{
|
||||||
|
mmu_ctx_t ctx;
|
||||||
|
|
||||||
|
if (unlikely(ppc_hash64_get_physical_address(env, &ctx, addr, 0, ACCESS_INT)
|
||||||
|
!= 0)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.raddr & TARGET_PAGE_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
int ppc_hash64_handle_mmu_fault(CPUPPCState *env, target_ulong address, int rw,
|
int ppc_hash64_handle_mmu_fault(CPUPPCState *env, target_ulong address, int rw,
|
||||||
int mmu_idx)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,8 +6,7 @@
|
||||||
#ifdef TARGET_PPC64
|
#ifdef TARGET_PPC64
|
||||||
void dump_slb(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env);
|
void dump_slb(FILE *f, fprintf_function cpu_fprintf, CPUPPCState *env);
|
||||||
int ppc_store_slb (CPUPPCState *env, target_ulong rb, target_ulong rs);
|
int ppc_store_slb (CPUPPCState *env, target_ulong rb, target_ulong rs);
|
||||||
int ppc_hash64_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
hwaddr ppc_hash64_get_phys_page_debug(CPUPPCState *env, target_ulong addr);
|
||||||
target_ulong eaddr, int rw, int access_type);
|
|
||||||
int ppc_hash64_handle_mmu_fault(CPUPPCState *env, target_ulong address, int rw,
|
int ppc_hash64_handle_mmu_fault(CPUPPCState *env, target_ulong address, int rw,
|
||||||
int mmu_idx);
|
int mmu_idx);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1310,11 +1310,6 @@ static int get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch (env->mmu_model) {
|
switch (env->mmu_model) {
|
||||||
case POWERPC_MMU_32B:
|
|
||||||
case POWERPC_MMU_601:
|
|
||||||
ret = ppc_hash32_get_physical_address(env, ctx, eaddr, rw, access_type);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case POWERPC_MMU_SOFT_6xx:
|
case POWERPC_MMU_SOFT_6xx:
|
||||||
case POWERPC_MMU_SOFT_74xx:
|
case POWERPC_MMU_SOFT_74xx:
|
||||||
if (real_mode) {
|
if (real_mode) {
|
||||||
|
@ -1331,14 +1326,6 @@ static int get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if defined(TARGET_PPC64)
|
|
||||||
case POWERPC_MMU_64B:
|
|
||||||
case POWERPC_MMU_2_06:
|
|
||||||
case POWERPC_MMU_2_06d:
|
|
||||||
ret = ppc_hash64_get_physical_address(env, ctx, eaddr, rw, access_type);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case POWERPC_MMU_SOFT_4xx:
|
case POWERPC_MMU_SOFT_4xx:
|
||||||
case POWERPC_MMU_SOFT_4xx_Z:
|
case POWERPC_MMU_SOFT_4xx_Z:
|
||||||
if (real_mode) {
|
if (real_mode) {
|
||||||
|
@ -1383,6 +1370,22 @@ hwaddr cpu_get_phys_page_debug(CPUPPCState *env, target_ulong addr)
|
||||||
{
|
{
|
||||||
mmu_ctx_t ctx;
|
mmu_ctx_t ctx;
|
||||||
|
|
||||||
|
switch (env->mmu_model) {
|
||||||
|
#if defined(TARGET_PPC64)
|
||||||
|
case POWERPC_MMU_64B:
|
||||||
|
case POWERPC_MMU_2_06:
|
||||||
|
case POWERPC_MMU_2_06d:
|
||||||
|
return ppc_hash64_get_phys_page_debug(env, addr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
case POWERPC_MMU_32B:
|
||||||
|
case POWERPC_MMU_601:
|
||||||
|
return ppc_hash32_get_phys_page_debug(env, addr);
|
||||||
|
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
if (unlikely(get_physical_address(env, &ctx, addr, 0, ACCESS_INT) != 0)) {
|
if (unlikely(get_physical_address(env, &ctx, addr, 0, ACCESS_INT) != 0)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue