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