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