target/ppc: Move common check in exception handlers to a function
All powerpc exception handlers share some code when handling machine check exceptions. Move this to a common function. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> Reviewed-by: Nicholas Piggin <npiggin@gmail.com> Message-ID: <9cfffaa35aa894086dd092af6b0b26f2d62ff3de.1686868895.git.balaton@eik.bme.hu> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
3f88a89d10
commit
819b31b0b4
@ -424,6 +424,25 @@ static void powerpc_set_excp_state(PowerPCCPU *cpu, target_ulong vector,
|
||||
env->reserve_addr = -1;
|
||||
}
|
||||
|
||||
static void powerpc_mcheck_checkstop(CPUPPCState *env)
|
||||
{
|
||||
CPUState *cs = env_cpu(env);
|
||||
|
||||
if (FIELD_EX64(env->msr, MSR, ME)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Machine check exception is not enabled. Enter checkstop state. */
|
||||
fprintf(stderr, "Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
if (qemu_log_separate()) {
|
||||
qemu_log("Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
}
|
||||
cs->halted = 1;
|
||||
cpu_interrupt_exittb(cs);
|
||||
}
|
||||
|
||||
static void powerpc_excp_40x(PowerPCCPU *cpu, int excp)
|
||||
{
|
||||
CPUState *cs = CPU(cpu);
|
||||
@ -466,21 +485,7 @@ static void powerpc_excp_40x(PowerPCCPU *cpu, int excp)
|
||||
srr1 = SPR_40x_SRR3;
|
||||
break;
|
||||
case POWERPC_EXCP_MCHECK: /* Machine check exception */
|
||||
if (!FIELD_EX64(env->msr, MSR, ME)) {
|
||||
/*
|
||||
* Machine check exception is not enabled. Enter
|
||||
* checkstop state.
|
||||
*/
|
||||
fprintf(stderr, "Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
if (qemu_log_separate()) {
|
||||
qemu_log("Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
}
|
||||
cs->halted = 1;
|
||||
cpu_interrupt_exittb(cs);
|
||||
}
|
||||
|
||||
powerpc_mcheck_checkstop(env);
|
||||
/* machine check exceptions don't have ME set */
|
||||
new_msr &= ~((target_ulong)1 << MSR_ME);
|
||||
|
||||
@ -597,21 +602,7 @@ static void powerpc_excp_6xx(PowerPCCPU *cpu, int excp)
|
||||
case POWERPC_EXCP_CRITICAL: /* Critical input */
|
||||
break;
|
||||
case POWERPC_EXCP_MCHECK: /* Machine check exception */
|
||||
if (!FIELD_EX64(env->msr, MSR, ME)) {
|
||||
/*
|
||||
* Machine check exception is not enabled. Enter
|
||||
* checkstop state.
|
||||
*/
|
||||
fprintf(stderr, "Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
if (qemu_log_separate()) {
|
||||
qemu_log("Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
}
|
||||
cs->halted = 1;
|
||||
cpu_interrupt_exittb(cs);
|
||||
}
|
||||
|
||||
powerpc_mcheck_checkstop(env);
|
||||
/* machine check exceptions don't have ME set */
|
||||
new_msr &= ~((target_ulong)1 << MSR_ME);
|
||||
|
||||
@ -770,21 +761,7 @@ static void powerpc_excp_7xx(PowerPCCPU *cpu, int excp)
|
||||
|
||||
switch (excp) {
|
||||
case POWERPC_EXCP_MCHECK: /* Machine check exception */
|
||||
if (!FIELD_EX64(env->msr, MSR, ME)) {
|
||||
/*
|
||||
* Machine check exception is not enabled. Enter
|
||||
* checkstop state.
|
||||
*/
|
||||
fprintf(stderr, "Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
if (qemu_log_separate()) {
|
||||
qemu_log("Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
}
|
||||
cs->halted = 1;
|
||||
cpu_interrupt_exittb(cs);
|
||||
}
|
||||
|
||||
powerpc_mcheck_checkstop(env);
|
||||
/* machine check exceptions don't have ME set */
|
||||
new_msr &= ~((target_ulong)1 << MSR_ME);
|
||||
|
||||
@ -955,21 +932,7 @@ static void powerpc_excp_74xx(PowerPCCPU *cpu, int excp)
|
||||
|
||||
switch (excp) {
|
||||
case POWERPC_EXCP_MCHECK: /* Machine check exception */
|
||||
if (!FIELD_EX64(env->msr, MSR, ME)) {
|
||||
/*
|
||||
* Machine check exception is not enabled. Enter
|
||||
* checkstop state.
|
||||
*/
|
||||
fprintf(stderr, "Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
if (qemu_log_separate()) {
|
||||
qemu_log("Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
}
|
||||
cs->halted = 1;
|
||||
cpu_interrupt_exittb(cs);
|
||||
}
|
||||
|
||||
powerpc_mcheck_checkstop(env);
|
||||
/* machine check exceptions don't have ME set */
|
||||
new_msr &= ~((target_ulong)1 << MSR_ME);
|
||||
|
||||
@ -1150,21 +1113,7 @@ static void powerpc_excp_booke(PowerPCCPU *cpu, int excp)
|
||||
srr1 = SPR_BOOKE_CSRR1;
|
||||
break;
|
||||
case POWERPC_EXCP_MCHECK: /* Machine check exception */
|
||||
if (!FIELD_EX64(env->msr, MSR, ME)) {
|
||||
/*
|
||||
* Machine check exception is not enabled. Enter
|
||||
* checkstop state.
|
||||
*/
|
||||
fprintf(stderr, "Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
if (qemu_log_separate()) {
|
||||
qemu_log("Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
}
|
||||
cs->halted = 1;
|
||||
cpu_interrupt_exittb(cs);
|
||||
}
|
||||
|
||||
powerpc_mcheck_checkstop(env);
|
||||
/* machine check exceptions don't have ME set */
|
||||
new_msr &= ~((target_ulong)1 << MSR_ME);
|
||||
|
||||
@ -1467,20 +1416,7 @@ static void powerpc_excp_books(PowerPCCPU *cpu, int excp)
|
||||
|
||||
switch (excp) {
|
||||
case POWERPC_EXCP_MCHECK: /* Machine check exception */
|
||||
if (!FIELD_EX64(env->msr, MSR, ME)) {
|
||||
/*
|
||||
* Machine check exception is not enabled. Enter
|
||||
* checkstop state.
|
||||
*/
|
||||
fprintf(stderr, "Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
if (qemu_log_separate()) {
|
||||
qemu_log("Machine check while not allowed. "
|
||||
"Entering checkstop state\n");
|
||||
}
|
||||
cs->halted = 1;
|
||||
cpu_interrupt_exittb(cs);
|
||||
}
|
||||
powerpc_mcheck_checkstop(env);
|
||||
if (env->msr_mask & MSR_HVB) {
|
||||
/*
|
||||
* ISA specifies HV, but can be delivered to guest with HV
|
||||
|
Loading…
x
Reference in New Issue
Block a user