mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
target/ppc: Add powerpc_reset_excp_state helper
This moves the logic to reset the QEMU exception state into its own function. Reviewed-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> [ clg: checkpatch fixes ] Message-Id: <20220216102545.1808018-8-npiggin@gmail.com> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
4c6cf6b295
commit
3680e99461
1 changed files with 22 additions and 20 deletions
|
@ -360,12 +360,21 @@ static void ppc_excp_apply_ail(PowerPCCPU *cpu, int excp, target_ulong msr,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void powerpc_set_excp_state(PowerPCCPU *cpu,
|
static void powerpc_reset_excp_state(PowerPCCPU *cpu)
|
||||||
target_ulong vector, target_ulong msr)
|
|
||||||
{
|
{
|
||||||
CPUState *cs = CPU(cpu);
|
CPUState *cs = CPU(cpu);
|
||||||
CPUPPCState *env = &cpu->env;
|
CPUPPCState *env = &cpu->env;
|
||||||
|
|
||||||
|
/* Reset exception state */
|
||||||
|
cs->exception_index = POWERPC_EXCP_NONE;
|
||||||
|
env->error_code = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void powerpc_set_excp_state(PowerPCCPU *cpu, target_ulong vector,
|
||||||
|
target_ulong msr)
|
||||||
|
{
|
||||||
|
CPUPPCState *env = &cpu->env;
|
||||||
|
|
||||||
assert((msr & env->msr_mask) == msr);
|
assert((msr & env->msr_mask) == msr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -376,21 +385,20 @@ static void powerpc_set_excp_state(PowerPCCPU *cpu,
|
||||||
* will prevent setting of the HV bit which some exceptions might need
|
* will prevent setting of the HV bit which some exceptions might need
|
||||||
* to do.
|
* to do.
|
||||||
*/
|
*/
|
||||||
|
env->nip = vector;
|
||||||
env->msr = msr;
|
env->msr = msr;
|
||||||
hreg_compute_hflags(env);
|
hreg_compute_hflags(env);
|
||||||
env->nip = vector;
|
|
||||||
/* Reset exception state */
|
|
||||||
cs->exception_index = POWERPC_EXCP_NONE;
|
|
||||||
env->error_code = 0;
|
|
||||||
|
|
||||||
/* Reset the reservation */
|
powerpc_reset_excp_state(cpu);
|
||||||
env->reserve_addr = -1;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Any interrupt is context synchronizing, check if TCG TLB needs
|
* Any interrupt is context synchronizing, check if TCG TLB needs
|
||||||
* a delayed flush on ppc64
|
* a delayed flush on ppc64
|
||||||
*/
|
*/
|
||||||
check_tlb_flush(env, false);
|
check_tlb_flush(env, false);
|
||||||
|
|
||||||
|
/* Reset the reservation */
|
||||||
|
env->reserve_addr = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void powerpc_excp_40x(PowerPCCPU *cpu, int excp)
|
static void powerpc_excp_40x(PowerPCCPU *cpu, int excp)
|
||||||
|
@ -471,8 +479,7 @@ static void powerpc_excp_40x(PowerPCCPU *cpu, int excp)
|
||||||
case POWERPC_EXCP_FP:
|
case POWERPC_EXCP_FP:
|
||||||
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
||||||
trace_ppc_excp_fp_ignore();
|
trace_ppc_excp_fp_ignore();
|
||||||
cs->exception_index = POWERPC_EXCP_NONE;
|
powerpc_reset_excp_state(cpu);
|
||||||
env->error_code = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
env->spr[SPR_40x_ESR] = ESR_FP;
|
env->spr[SPR_40x_ESR] = ESR_FP;
|
||||||
|
@ -609,8 +616,7 @@ static void powerpc_excp_6xx(PowerPCCPU *cpu, int excp)
|
||||||
case POWERPC_EXCP_FP:
|
case POWERPC_EXCP_FP:
|
||||||
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
||||||
trace_ppc_excp_fp_ignore();
|
trace_ppc_excp_fp_ignore();
|
||||||
cs->exception_index = POWERPC_EXCP_NONE;
|
powerpc_reset_excp_state(cpu);
|
||||||
env->error_code = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -783,8 +789,7 @@ static void powerpc_excp_7xx(PowerPCCPU *cpu, int excp)
|
||||||
case POWERPC_EXCP_FP:
|
case POWERPC_EXCP_FP:
|
||||||
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
||||||
trace_ppc_excp_fp_ignore();
|
trace_ppc_excp_fp_ignore();
|
||||||
cs->exception_index = POWERPC_EXCP_NONE;
|
powerpc_reset_excp_state(cpu);
|
||||||
env->error_code = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -969,8 +974,7 @@ static void powerpc_excp_74xx(PowerPCCPU *cpu, int excp)
|
||||||
case POWERPC_EXCP_FP:
|
case POWERPC_EXCP_FP:
|
||||||
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
||||||
trace_ppc_excp_fp_ignore();
|
trace_ppc_excp_fp_ignore();
|
||||||
cs->exception_index = POWERPC_EXCP_NONE;
|
powerpc_reset_excp_state(cpu);
|
||||||
env->error_code = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1168,8 +1172,7 @@ static void powerpc_excp_booke(PowerPCCPU *cpu, int excp)
|
||||||
case POWERPC_EXCP_FP:
|
case POWERPC_EXCP_FP:
|
||||||
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
||||||
trace_ppc_excp_fp_ignore();
|
trace_ppc_excp_fp_ignore();
|
||||||
cs->exception_index = POWERPC_EXCP_NONE;
|
powerpc_reset_excp_state(cpu);
|
||||||
env->error_code = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1406,8 +1409,7 @@ static void powerpc_excp_books(PowerPCCPU *cpu, int excp)
|
||||||
case POWERPC_EXCP_FP:
|
case POWERPC_EXCP_FP:
|
||||||
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
if ((msr_fe0 == 0 && msr_fe1 == 0) || msr_fp == 0) {
|
||||||
trace_ppc_excp_fp_ignore();
|
trace_ppc_excp_fp_ignore();
|
||||||
cs->exception_index = POWERPC_EXCP_NONE;
|
powerpc_reset_excp_state(cpu);
|
||||||
env->error_code = 0;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue