mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 01:33:56 -06:00
cpu: Move exception_index field from CPU_COMMON to CPUState
Signed-off-by: Andreas Färber <afaerber@suse.de>
This commit is contained in:
parent
6f03bef0ff
commit
27103424c4
60 changed files with 389 additions and 319 deletions
|
@ -1491,6 +1491,7 @@ static void booke206_update_mas_tlb_miss(CPUPPCState *env, target_ulong address,
|
|||
static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
||||
int rw, int mmu_idx)
|
||||
{
|
||||
CPUState *cs = CPU(ppc_env_get_cpu(env));
|
||||
mmu_ctx_t ctx;
|
||||
int access_type;
|
||||
int ret = 0;
|
||||
|
@ -1510,24 +1511,24 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
mmu_idx, TARGET_PAGE_SIZE);
|
||||
ret = 0;
|
||||
} else if (ret < 0) {
|
||||
LOG_MMU_STATE(CPU(ppc_env_get_cpu(env)));
|
||||
LOG_MMU_STATE(cs);
|
||||
if (access_type == ACCESS_CODE) {
|
||||
switch (ret) {
|
||||
case -1:
|
||||
/* No matches in page tables or TLB */
|
||||
switch (env->mmu_model) {
|
||||
case POWERPC_MMU_SOFT_6xx:
|
||||
env->exception_index = POWERPC_EXCP_IFTLB;
|
||||
cs->exception_index = POWERPC_EXCP_IFTLB;
|
||||
env->error_code = 1 << 18;
|
||||
env->spr[SPR_IMISS] = address;
|
||||
env->spr[SPR_ICMP] = 0x80000000 | ctx.ptem;
|
||||
goto tlb_miss;
|
||||
case POWERPC_MMU_SOFT_74xx:
|
||||
env->exception_index = POWERPC_EXCP_IFTLB;
|
||||
cs->exception_index = POWERPC_EXCP_IFTLB;
|
||||
goto tlb_miss_74xx;
|
||||
case POWERPC_MMU_SOFT_4xx:
|
||||
case POWERPC_MMU_SOFT_4xx_Z:
|
||||
env->exception_index = POWERPC_EXCP_ITLB;
|
||||
cs->exception_index = POWERPC_EXCP_ITLB;
|
||||
env->error_code = 0;
|
||||
env->spr[SPR_40x_DEAR] = address;
|
||||
env->spr[SPR_40x_ESR] = 0x00000000;
|
||||
|
@ -1536,7 +1537,7 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
booke206_update_mas_tlb_miss(env, address, rw);
|
||||
/* fall through */
|
||||
case POWERPC_MMU_BOOKE:
|
||||
env->exception_index = POWERPC_EXCP_ITLB;
|
||||
cs->exception_index = POWERPC_EXCP_ITLB;
|
||||
env->error_code = 0;
|
||||
env->spr[SPR_BOOKE_DEAR] = address;
|
||||
return -1;
|
||||
|
@ -1555,7 +1556,7 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
break;
|
||||
case -2:
|
||||
/* Access rights violation */
|
||||
env->exception_index = POWERPC_EXCP_ISI;
|
||||
cs->exception_index = POWERPC_EXCP_ISI;
|
||||
env->error_code = 0x08000000;
|
||||
break;
|
||||
case -3:
|
||||
|
@ -1564,13 +1565,13 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
(env->mmu_model == POWERPC_MMU_BOOKE206)) {
|
||||
env->spr[SPR_BOOKE_ESR] = 0x00000000;
|
||||
}
|
||||
env->exception_index = POWERPC_EXCP_ISI;
|
||||
cs->exception_index = POWERPC_EXCP_ISI;
|
||||
env->error_code = 0x10000000;
|
||||
break;
|
||||
case -4:
|
||||
/* Direct store exception */
|
||||
/* No code fetch is allowed in direct-store areas */
|
||||
env->exception_index = POWERPC_EXCP_ISI;
|
||||
cs->exception_index = POWERPC_EXCP_ISI;
|
||||
env->error_code = 0x10000000;
|
||||
break;
|
||||
}
|
||||
|
@ -1581,10 +1582,10 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
switch (env->mmu_model) {
|
||||
case POWERPC_MMU_SOFT_6xx:
|
||||
if (rw == 1) {
|
||||
env->exception_index = POWERPC_EXCP_DSTLB;
|
||||
cs->exception_index = POWERPC_EXCP_DSTLB;
|
||||
env->error_code = 1 << 16;
|
||||
} else {
|
||||
env->exception_index = POWERPC_EXCP_DLTLB;
|
||||
cs->exception_index = POWERPC_EXCP_DLTLB;
|
||||
env->error_code = 0;
|
||||
}
|
||||
env->spr[SPR_DMISS] = address;
|
||||
|
@ -1598,9 +1599,9 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
break;
|
||||
case POWERPC_MMU_SOFT_74xx:
|
||||
if (rw == 1) {
|
||||
env->exception_index = POWERPC_EXCP_DSTLB;
|
||||
cs->exception_index = POWERPC_EXCP_DSTLB;
|
||||
} else {
|
||||
env->exception_index = POWERPC_EXCP_DLTLB;
|
||||
cs->exception_index = POWERPC_EXCP_DLTLB;
|
||||
}
|
||||
tlb_miss_74xx:
|
||||
/* Implement LRU algorithm */
|
||||
|
@ -1611,7 +1612,7 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
break;
|
||||
case POWERPC_MMU_SOFT_4xx:
|
||||
case POWERPC_MMU_SOFT_4xx_Z:
|
||||
env->exception_index = POWERPC_EXCP_DTLB;
|
||||
cs->exception_index = POWERPC_EXCP_DTLB;
|
||||
env->error_code = 0;
|
||||
env->spr[SPR_40x_DEAR] = address;
|
||||
if (rw) {
|
||||
|
@ -1628,7 +1629,7 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
booke206_update_mas_tlb_miss(env, address, rw);
|
||||
/* fall through */
|
||||
case POWERPC_MMU_BOOKE:
|
||||
env->exception_index = POWERPC_EXCP_DTLB;
|
||||
cs->exception_index = POWERPC_EXCP_DTLB;
|
||||
env->error_code = 0;
|
||||
env->spr[SPR_BOOKE_DEAR] = address;
|
||||
env->spr[SPR_BOOKE_ESR] = rw ? ESR_ST : 0;
|
||||
|
@ -1644,7 +1645,7 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
break;
|
||||
case -2:
|
||||
/* Access rights violation */
|
||||
env->exception_index = POWERPC_EXCP_DSI;
|
||||
cs->exception_index = POWERPC_EXCP_DSI;
|
||||
env->error_code = 0;
|
||||
if (env->mmu_model == POWERPC_MMU_SOFT_4xx
|
||||
|| env->mmu_model == POWERPC_MMU_SOFT_4xx_Z) {
|
||||
|
@ -1670,13 +1671,13 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
switch (access_type) {
|
||||
case ACCESS_FLOAT:
|
||||
/* Floating point load/store */
|
||||
env->exception_index = POWERPC_EXCP_ALIGN;
|
||||
cs->exception_index = POWERPC_EXCP_ALIGN;
|
||||
env->error_code = POWERPC_EXCP_ALIGN_FP;
|
||||
env->spr[SPR_DAR] = address;
|
||||
break;
|
||||
case ACCESS_RES:
|
||||
/* lwarx, ldarx or stwcx. */
|
||||
env->exception_index = POWERPC_EXCP_DSI;
|
||||
cs->exception_index = POWERPC_EXCP_DSI;
|
||||
env->error_code = 0;
|
||||
env->spr[SPR_DAR] = address;
|
||||
if (rw == 1) {
|
||||
|
@ -1687,7 +1688,7 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
break;
|
||||
case ACCESS_EXT:
|
||||
/* eciwx or ecowx */
|
||||
env->exception_index = POWERPC_EXCP_DSI;
|
||||
cs->exception_index = POWERPC_EXCP_DSI;
|
||||
env->error_code = 0;
|
||||
env->spr[SPR_DAR] = address;
|
||||
if (rw == 1) {
|
||||
|
@ -1698,7 +1699,7 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
break;
|
||||
default:
|
||||
printf("DSI: invalid exception (%d)\n", ret);
|
||||
env->exception_index = POWERPC_EXCP_PROGRAM;
|
||||
cs->exception_index = POWERPC_EXCP_PROGRAM;
|
||||
env->error_code =
|
||||
POWERPC_EXCP_INVAL | POWERPC_EXCP_INVAL_INVAL;
|
||||
env->spr[SPR_DAR] = address;
|
||||
|
@ -1709,7 +1710,7 @@ static int cpu_ppc_handle_mmu_fault(CPUPPCState *env, target_ulong address,
|
|||
}
|
||||
#if 0
|
||||
printf("%s: set exception to %d %02x\n", __func__,
|
||||
env->exception, env->error_code);
|
||||
cs->exception, env->error_code);
|
||||
#endif
|
||||
ret = 1;
|
||||
}
|
||||
|
@ -2909,6 +2910,6 @@ void tlb_fill(CPUPPCState *env, target_ulong addr, int is_write, int mmu_idx,
|
|||
/* now we have a real cpu fault */
|
||||
cpu_restore_state(env, retaddr);
|
||||
}
|
||||
helper_raise_exception_err(env, env->exception_index, env->error_code);
|
||||
helper_raise_exception_err(env, cpu->exception_index, env->error_code);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue