xref: /qemu/target/s390x/interrupt.c (revision 9615495afc84a8bac0652caeedb2ce4e671e8a94)
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 
109615495aSPeter Maydell #include "qemu/osdep.h"
11000a1a38SChristian Borntraeger #include "cpu.h"
129c17d615SPaolo Bonzini #include "sysemu/kvm.h"
13000a1a38SChristian Borntraeger 
1479afc36dSCornelia Huck /*
1579afc36dSCornelia Huck  * All of the following interrupts are floating, i.e. not per-vcpu.
16de13d216SCornelia Huck  * We just need a dummy cpustate in order to be able to inject in the
17de13d216SCornelia Huck  * non-kvm case.
1879afc36dSCornelia Huck  */
19000a1a38SChristian Borntraeger #if !defined(CONFIG_USER_ONLY)
20000a1a38SChristian Borntraeger void s390_sclp_extint(uint32_t parm)
21000a1a38SChristian Borntraeger {
22de13d216SCornelia Huck     if (kvm_enabled()) {
23de13d216SCornelia Huck         kvm_s390_service_interrupt(parm);
24de13d216SCornelia Huck     } else {
25000a1a38SChristian Borntraeger         S390CPU *dummy_cpu = s390_cpu_addr2state(0);
26000a1a38SChristian Borntraeger 
27f9466733SAndreas Färber         cpu_inject_ext(dummy_cpu, EXT_SERVICE, parm, 0);
28000a1a38SChristian Borntraeger     }
29000a1a38SChristian Borntraeger }
3079afc36dSCornelia Huck 
31de13d216SCornelia Huck void s390_virtio_irq(int config_change, uint64_t token)
3279afc36dSCornelia Huck {
3379afc36dSCornelia Huck     if (kvm_enabled()) {
34de13d216SCornelia Huck         kvm_s390_virtio_irq(config_change, token);
3579afc36dSCornelia Huck     } else {
36de13d216SCornelia Huck         S390CPU *dummy_cpu = s390_cpu_addr2state(0);
37de13d216SCornelia Huck 
38de13d216SCornelia Huck         cpu_inject_ext(dummy_cpu, EXT_VIRTIO, config_change, token);
3979afc36dSCornelia Huck     }
4079afc36dSCornelia Huck }
4179afc36dSCornelia Huck 
42de13d216SCornelia Huck void s390_io_interrupt(uint16_t subchannel_id, uint16_t subchannel_nr,
43de13d216SCornelia Huck                        uint32_t io_int_parm, uint32_t io_int_word)
4479afc36dSCornelia Huck {
4579afc36dSCornelia Huck     if (kvm_enabled()) {
46de13d216SCornelia Huck         kvm_s390_io_interrupt(subchannel_id, subchannel_nr, io_int_parm,
4779afc36dSCornelia Huck                               io_int_word);
4879afc36dSCornelia Huck     } else {
49de13d216SCornelia Huck         S390CPU *dummy_cpu = s390_cpu_addr2state(0);
50de13d216SCornelia Huck 
51de13d216SCornelia Huck         cpu_inject_io(dummy_cpu, subchannel_id, subchannel_nr, io_int_parm,
5279afc36dSCornelia Huck                       io_int_word);
5379afc36dSCornelia Huck     }
5479afc36dSCornelia Huck }
5579afc36dSCornelia Huck 
56de13d216SCornelia Huck void s390_crw_mchk(void)
5779afc36dSCornelia Huck {
5879afc36dSCornelia Huck     if (kvm_enabled()) {
59de13d216SCornelia Huck         kvm_s390_crw_mchk();
6079afc36dSCornelia Huck     } else {
61de13d216SCornelia Huck         S390CPU *dummy_cpu = s390_cpu_addr2state(0);
62de13d216SCornelia Huck 
63de13d216SCornelia Huck         cpu_inject_crw_mchk(dummy_cpu);
6479afc36dSCornelia Huck     }
6579afc36dSCornelia Huck }
6679afc36dSCornelia Huck 
67000a1a38SChristian Borntraeger #endif
68