@@ -364,86 +364,22 @@ void ppc_intr_system_reset(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
}
}
+void ppc_intr_hv(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
+{
+ CPUPPCState *env = &cpu->env;
+
+ regs->sprn_srr0 = SPR_HSRR0;
+ regs->sprn_srr1 = SPR_HSRR1;
+ regs->new_msr |= (target_ulong)MSR_HVB;
+ regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
+}
+
void ppc_intr_hv_insn_storage(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
{
CPUPPCState *env = &cpu->env;
regs->msr |= env->error_code;
-
- regs->sprn_srr0 = SPR_HSRR0;
- regs->sprn_srr1 = SPR_HSRR1;
- regs->new_msr |= (target_ulong)MSR_HVB;
- regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
-}
-
-void ppc_intr_hv_decrementer(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
-{
- CPUPPCState *env = &cpu->env;
-
- regs->sprn_srr0 = SPR_HSRR0;
- regs->sprn_srr1 = SPR_HSRR1;
- regs->new_msr |= (target_ulong)MSR_HVB;
- regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
-}
-
-void ppc_intr_hv_data_storage(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
-{
- CPUPPCState *env = &cpu->env;
-
- regs->sprn_srr0 = SPR_HSRR0;
- regs->sprn_srr1 = SPR_HSRR1;
- regs->new_msr |= (target_ulong)MSR_HVB;
- regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
-}
-
-void ppc_intr_hv_data_segment(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
-{
- CPUPPCState *env = &cpu->env;
-
- regs->sprn_srr0 = SPR_HSRR0;
- regs->sprn_srr1 = SPR_HSRR1;
- regs->new_msr |= (target_ulong)MSR_HVB;
- regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
-}
-
-void ppc_intr_hv_insn_segment(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
-{
- CPUPPCState *env = &cpu->env;
-
- regs->sprn_srr0 = SPR_HSRR0;
- regs->sprn_srr1 = SPR_HSRR1;
- regs->new_msr |= (target_ulong)MSR_HVB;
- regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
-}
-
-void ppc_intr_hv_doorbell(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
-{
- CPUPPCState *env = &cpu->env;
-
- regs->sprn_srr0 = SPR_HSRR0;
- regs->sprn_srr1 = SPR_HSRR1;
- regs->new_msr |= (target_ulong)MSR_HVB;
- regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
-}
-
-void ppc_intr_hv_emulation(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
-{
- CPUPPCState *env = &cpu->env;
-
- regs->sprn_srr0 = SPR_HSRR0;
- regs->sprn_srr1 = SPR_HSRR1;
- regs->new_msr |= (target_ulong)MSR_HVB;
- regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
-}
-
-void ppc_intr_hv_virtualization(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
-{
- CPUPPCState *env = &cpu->env;
-
- regs->sprn_srr0 = SPR_HSRR0;
- regs->sprn_srr1 = SPR_HSRR1;
- regs->new_msr |= (target_ulong)MSR_HVB;
- regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
+ ppc_intr_hv(cpu, regs, ignore);
}
void ppc_intr_facility_unavail(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore)
@@ -459,11 +395,7 @@ void ppc_intr_hv_facility_unavail(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *igno
#ifdef TARGET_PPC64
CPUPPCState *env = &cpu->env;
env->spr[SPR_FSCR] |= ((target_ulong)env->error_code << FSCR_IC_POS);
-
- regs->sprn_srr0 = SPR_HSRR0;
- regs->sprn_srr1 = SPR_HSRR1;
- regs->new_msr |= (target_ulong)MSR_HVB;
- regs->new_msr |= env->msr & ((target_ulong)1 << MSR_RI);
+ ppc_intr_hv(cpu, regs, ignore);
#endif
}
@@ -571,34 +503,10 @@ PPCInterrupt interrupts[POWERPC_EXCP_NB] = {
"Facility unavailable", ppc_intr_facility_unavail
},
- [POWERPC_EXCP_HDECR] = {
- "Hypervisor decrementer", ppc_intr_hv_decrementer
- },
-
- [POWERPC_EXCP_HDSEG] = {
- "Hypervisor data segment", ppc_intr_hv_data_segment
- },
-
- [POWERPC_EXCP_HDSI] = {
- "Hypervisor data storage", ppc_intr_hv_data_storage
- },
-
- [POWERPC_EXCP_HISEG] = {
- "Hypervisor insn segment", ppc_intr_hv_insn_segment
- },
-
[POWERPC_EXCP_HISI] = {
"Hypervisor instruction storage", ppc_intr_hv_insn_storage
},
- [POWERPC_EXCP_HVIRT] = {
- "Hypervisor virtualization", ppc_intr_hv_virtualization
- },
-
- [POWERPC_EXCP_HV_EMU] = {
- "Hypervisor emulation assist", ppc_intr_hv_emulation
- },
-
[POWERPC_EXCP_HV_FU] = {
"Hypervisor facility unavailable" , ppc_intr_hv_facility_unavail
},
@@ -627,10 +535,6 @@ PPCInterrupt interrupts[POWERPC_EXCP_NB] = {
"System reset", ppc_intr_system_reset
},
- [POWERPC_EXCP_SDOOR_HV] = {
- "Hypervisor doorbell", ppc_intr_hv_doorbell
- },
-
[POWERPC_EXCP_SPEU] = {
"SPE/embedded FP unavailable/VPU", ppc_intr_spe_unavailable
},
@@ -655,6 +559,14 @@ PPCInterrupt interrupts[POWERPC_EXCP_NB] = {
"Watchdog timer", ppc_intr_watchdog
},
+ [POWERPC_EXCP_HDECR] = { "Hypervisor decrementer", ppc_intr_hv },
+ [POWERPC_EXCP_HDSEG] = { "Hypervisor data segment", ppc_intr_hv },
+ [POWERPC_EXCP_HDSI] = { "Hypervisor data storage", ppc_intr_hv },
+ [POWERPC_EXCP_HISEG] = { "Hypervisor insn segment", ppc_intr_hv },
+ [POWERPC_EXCP_HVIRT] = { "Hypervisor virtualization", ppc_intr_hv },
+ [POWERPC_EXCP_HV_EMU] = { "Hypervisor emulation assist", ppc_intr_hv },
+ [POWERPC_EXCP_SDOOR_HV] = { "Hypervisor doorbell", ppc_intr_hv },
+
[POWERPC_EXCP_APU] = { "Aux. processor unavailable", ppc_intr_noop },
[POWERPC_EXCP_DECR] = { "Decrementer", ppc_intr_noop },
[POWERPC_EXCP_DOORI] = { "Embedded doorbell", ppc_intr_noop },
@@ -27,15 +27,9 @@ void ppc_intr_embedded_doorbell_crit(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *i
void ppc_intr_external(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
void ppc_intr_facility_unavail(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
void ppc_intr_fit(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
-void ppc_intr_hv_data_segment(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
-void ppc_intr_hv_data_storage(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
-void ppc_intr_hv_decrementer(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
-void ppc_intr_hv_doorbell(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
-void ppc_intr_hv_emulation(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
+void ppc_intr_hv(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
void ppc_intr_hv_facility_unavail(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
-void ppc_intr_hv_insn_segment(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
void ppc_intr_hv_insn_storage(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
-void ppc_intr_hv_virtualization(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
void ppc_intr_insn_storage(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
void ppc_intr_machine_check(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
void ppc_intr_noop(PowerPCCPU *cpu, PPCIntrArgs *regs, bool *ignore);
The Hypervisor interrupts all set the MSR_HV bit, and use HSRRs instead of SRRs, so we can use the same code to setup them all. No functional change. Signed-off-by: Fabiano Rosas <farosas@linux.ibm.com> --- target/ppc/interrupts.c | 128 +++++++--------------------------------- target/ppc/ppc_intr.h | 8 +-- 2 files changed, 21 insertions(+), 115 deletions(-)