17b9cbadbSAurelien Jarno /* 27b9cbadbSAurelien Jarno * QEMU MIPS interrupt support 37b9cbadbSAurelien Jarno * 47b9cbadbSAurelien Jarno * Permission is hereby granted, free of charge, to any person obtaining a copy 57b9cbadbSAurelien Jarno * of this software and associated documentation files (the "Software"), to deal 67b9cbadbSAurelien Jarno * in the Software without restriction, including without limitation the rights 77b9cbadbSAurelien Jarno * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 87b9cbadbSAurelien Jarno * copies of the Software, and to permit persons to whom the Software is 97b9cbadbSAurelien Jarno * furnished to do so, subject to the following conditions: 107b9cbadbSAurelien Jarno * 117b9cbadbSAurelien Jarno * The above copyright notice and this permission notice shall be included in 127b9cbadbSAurelien Jarno * all copies or substantial portions of the Software. 137b9cbadbSAurelien Jarno * 147b9cbadbSAurelien Jarno * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 157b9cbadbSAurelien Jarno * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 167b9cbadbSAurelien Jarno * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 177b9cbadbSAurelien Jarno * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 187b9cbadbSAurelien Jarno * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 197b9cbadbSAurelien Jarno * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 207b9cbadbSAurelien Jarno * THE SOFTWARE. 217b9cbadbSAurelien Jarno */ 227b9cbadbSAurelien Jarno 23c684822aSPeter Maydell #include "qemu/osdep.h" 24215581bdSAleksandar Markovic #include "qemu/main-loop.h" 2564552b6bSMarkus Armbruster #include "hw/irq.h" 26*32cad1ffSPhilippe Mathieu-Daudé #include "system/kvm.h" 27b1bd8b28SSanjay Lal #include "kvm_mips.h" 284de9b249Sths 29d537cf6cSpbrook static void cpu_mips_irq_request(void *opaque, int irq, int level) 304de9b249Sths { 31d8ed887bSAndreas Färber MIPSCPU *cpu = opaque; 32d8ed887bSAndreas Färber CPUMIPSState *env = &cpu->env; 33d8ed887bSAndreas Färber CPUState *cs = CPU(cpu); 344de9b249Sths 356c06ea4cSAleksandar Markovic if (irq < 0 || irq > 7) { 364de9b249Sths return; 376c06ea4cSAleksandar Markovic } 384de9b249Sths 3932ead8e6SStefan Hajnoczi BQL_LOCK_GUARD(); 40215581bdSAleksandar Markovic 414de9b249Sths if (level) { 4239d51eb8Sths env->CP0_Cause |= 1 << (irq + CP0Ca_IP); 434de9b249Sths } else { 4439d51eb8Sths env->CP0_Cause &= ~(1 << (irq + CP0Ca_IP)); 4556b92eeeSPhilippe Mathieu-Daudé } 46b1bd8b28SSanjay Lal 47c3173a35SHuacai Chen if (kvm_enabled() && (irq == 2 || irq == 3)) { 48b1bd8b28SSanjay Lal kvm_mips_set_interrupt(cpu, irq, level); 49b1bd8b28SSanjay Lal } 5036388314SEdgar E. Iglesias 5136388314SEdgar E. Iglesias if (env->CP0_Cause & CP0Ca_IP_mask) { 52c3affe56SAndreas Färber cpu_interrupt(cs, CPU_INTERRUPT_HARD); 5336388314SEdgar E. Iglesias } else { 54d8ed887bSAndreas Färber cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD); 5536388314SEdgar E. Iglesias } 564de9b249Sths } 57d537cf6cSpbrook 585a975d43SPaolo Bonzini void cpu_mips_irq_init_cpu(MIPSCPU *cpu) 59d537cf6cSpbrook { 605a975d43SPaolo Bonzini CPUMIPSState *env = &cpu->env; 61d537cf6cSpbrook qemu_irq *qi; 62d537cf6cSpbrook int i; 63d537cf6cSpbrook 640009b4f3SPhilippe Mathieu-Daudé qi = qemu_allocate_irqs(cpu_mips_irq_request, cpu, 8); 65d537cf6cSpbrook for (i = 0; i < 8; i++) { 66d537cf6cSpbrook env->irq[i] = qi[i]; 67d537cf6cSpbrook } 680287d89fSPaolo Bonzini g_free(qi); 69d537cf6cSpbrook } 705dc5d9f0SAurelien Jarno 7161c56c8cSAndreas Färber void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level) 725dc5d9f0SAurelien Jarno { 735dc5d9f0SAurelien Jarno if (irq < 0 || irq > 2) { 745dc5d9f0SAurelien Jarno return; 755dc5d9f0SAurelien Jarno } 765dc5d9f0SAurelien Jarno 775dc5d9f0SAurelien Jarno qemu_set_irq(env->irq[irq], level); 785dc5d9f0SAurelien Jarno } 79