mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 10:13:56 -06:00
target/ppc: introduce ppc_maybe_interrupt
This new method will check if any pending interrupt was unmasked and then call cpu_interrupt/cpu_reset_interrupt accordingly. Code that raises/lowers or masks/unmasks interrupts should call this method to keep CPU_INTERRUPT_HARD coherent with env->pending_interrupts. Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20221021142156.4134411-2-matheus.ferst@eldorado.org.br> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
parent
6a8e8188c3
commit
2fdedcbc69
10 changed files with 67 additions and 8 deletions
|
@ -490,6 +490,7 @@ static target_ulong h_cede(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
|||
|
||||
env->msr |= (1ULL << MSR_EE);
|
||||
hreg_compute_hflags(env);
|
||||
ppc_maybe_interrupt(env);
|
||||
|
||||
if (spapr_cpu->prod) {
|
||||
spapr_cpu->prod = false;
|
||||
|
@ -500,6 +501,7 @@ static target_ulong h_cede(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
|||
cs->halted = 1;
|
||||
cs->exception_index = EXCP_HLT;
|
||||
cs->exit_request = 1;
|
||||
ppc_maybe_interrupt(env);
|
||||
}
|
||||
|
||||
return H_SUCCESS;
|
||||
|
@ -521,6 +523,7 @@ static target_ulong h_confer_self(PowerPCCPU *cpu)
|
|||
cs->halted = 1;
|
||||
cs->exception_index = EXCP_HALTED;
|
||||
cs->exit_request = 1;
|
||||
ppc_maybe_interrupt(&cpu->env);
|
||||
|
||||
return H_SUCCESS;
|
||||
}
|
||||
|
@ -633,6 +636,7 @@ static target_ulong h_prod(PowerPCCPU *cpu, SpaprMachineState *spapr,
|
|||
spapr_cpu = spapr_cpu_state(tcpu);
|
||||
spapr_cpu->prod = true;
|
||||
cs->halted = 0;
|
||||
ppc_maybe_interrupt(&cpu->env);
|
||||
qemu_cpu_kick(cs);
|
||||
|
||||
return H_SUCCESS;
|
||||
|
@ -1669,6 +1673,7 @@ static target_ulong h_enter_nested(PowerPCCPU *cpu,
|
|||
spapr_cpu->in_nested = true;
|
||||
|
||||
hreg_compute_hflags(env);
|
||||
ppc_maybe_interrupt(env);
|
||||
tlb_flush(cs);
|
||||
env->reserve_addr = -1; /* Reset the reservation */
|
||||
|
||||
|
@ -1810,6 +1815,7 @@ out_restore_l1:
|
|||
spapr_cpu->in_nested = false;
|
||||
|
||||
hreg_compute_hflags(env);
|
||||
ppc_maybe_interrupt(env);
|
||||
tlb_flush(cs);
|
||||
env->reserve_addr = -1; /* Reset the reservation */
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue