xref: /qemu/target/s390x/interrupt.c (revision 79afc36d91be7550affbe7db227b4552451da41d)
1000a1a38SChristian Borntraeger /*
2000a1a38SChristian Borntraeger  * QEMU S/390 Interrupt support
3000a1a38SChristian Borntraeger  *
479afc36dSCornelia Huck  * Copyright IBM Corp. 2012, 2014
5000a1a38SChristian Borntraeger  *
6000a1a38SChristian Borntraeger  * This work is licensed under the terms of the GNU GPL, version 2 or (at your
7000a1a38SChristian Borntraeger  * option) any later version.  See the COPYING file in the top-level directory.
8000a1a38SChristian Borntraeger  */
9000a1a38SChristian Borntraeger 
10000a1a38SChristian Borntraeger #include "cpu.h"
119c17d615SPaolo Bonzini #include "sysemu/kvm.h"
12000a1a38SChristian Borntraeger 
1379afc36dSCornelia Huck /*
1479afc36dSCornelia Huck  * All of the following interrupts are floating, i.e. not per-vcpu.
1579afc36dSCornelia Huck  * We just need a dummy cpustate in order to be able to inject.
1679afc36dSCornelia Huck  */
17000a1a38SChristian Borntraeger #if !defined(CONFIG_USER_ONLY)
18000a1a38SChristian Borntraeger void s390_sclp_extint(uint32_t parm)
19000a1a38SChristian Borntraeger {
20000a1a38SChristian Borntraeger     S390CPU *dummy_cpu = s390_cpu_addr2state(0);
21000a1a38SChristian Borntraeger     CPUS390XState *env = &dummy_cpu->env;
22000a1a38SChristian Borntraeger 
23000a1a38SChristian Borntraeger     if (kvm_enabled()) {
2479afc36dSCornelia Huck         kvm_s390_service_interrupt(dummy_cpu, parm);
25000a1a38SChristian Borntraeger     } else {
26000a1a38SChristian Borntraeger         env->psw.addr += 4;
27f9466733SAndreas Färber         cpu_inject_ext(dummy_cpu, EXT_SERVICE, parm, 0);
28000a1a38SChristian Borntraeger     }
29000a1a38SChristian Borntraeger }
3079afc36dSCornelia Huck 
3179afc36dSCornelia Huck void s390_virtio_irq(S390CPU *cpu, int config_change, uint64_t token)
3279afc36dSCornelia Huck {
3379afc36dSCornelia Huck     if (kvm_enabled()) {
3479afc36dSCornelia Huck         kvm_s390_virtio_irq(cpu, config_change, token);
3579afc36dSCornelia Huck     } else {
3679afc36dSCornelia Huck         cpu_inject_ext(cpu, EXT_VIRTIO, config_change, token);
3779afc36dSCornelia Huck     }
3879afc36dSCornelia Huck }
3979afc36dSCornelia Huck 
4079afc36dSCornelia Huck void s390_io_interrupt(S390CPU *cpu, uint16_t subchannel_id,
4179afc36dSCornelia Huck                        uint16_t subchannel_nr, uint32_t io_int_parm,
4279afc36dSCornelia Huck                        uint32_t io_int_word)
4379afc36dSCornelia Huck {
4479afc36dSCornelia Huck     if (kvm_enabled()) {
4579afc36dSCornelia Huck         kvm_s390_io_interrupt(cpu, subchannel_id, subchannel_nr, io_int_parm,
4679afc36dSCornelia Huck                               io_int_word);
4779afc36dSCornelia Huck     } else {
4879afc36dSCornelia Huck         cpu_inject_io(cpu, subchannel_id, subchannel_nr, io_int_parm,
4979afc36dSCornelia Huck                       io_int_word);
5079afc36dSCornelia Huck     }
5179afc36dSCornelia Huck }
5279afc36dSCornelia Huck 
5379afc36dSCornelia Huck void s390_crw_mchk(S390CPU *cpu)
5479afc36dSCornelia Huck {
5579afc36dSCornelia Huck     if (kvm_enabled()) {
5679afc36dSCornelia Huck         kvm_s390_crw_mchk(cpu);
5779afc36dSCornelia Huck     } else {
5879afc36dSCornelia Huck         cpu_inject_crw_mchk(cpu);
5979afc36dSCornelia Huck     }
6079afc36dSCornelia Huck }
6179afc36dSCornelia Huck 
62000a1a38SChristian Borntraeger #endif
63