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:
Nicholas Piggin 2022-02-18 08:34:14 +01:00 committed by Cédric Le Goater
parent 4c6cf6b295
commit 3680e99461

View file

@ -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;
} }