From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1163701AbdAIGev (ORCPT ); Mon, 9 Jan 2017 01:34:51 -0500 Received: from outprodmail01.cc.columbia.edu ([128.59.72.39]:38376 "EHLO outprodmail01.cc.columbia.edu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S939735AbdAIG0N (ORCPT ); Mon, 9 Jan 2017 01:26:13 -0500 From: Jintack Lim To: christoffer.dall@linaro.org, marc.zyngier@arm.com, pbonzini@redhat.com, rkrcmar@redhat.com, linux@armlinux.org.uk, catalin.marinas@arm.com, will.deacon@arm.com, vladimir.murzin@arm.com, suzuki.poulose@arm.com, mark.rutland@arm.com, james.morse@arm.com, lorenzo.pieralisi@arm.com, kevin.brodsky@arm.com, wcohen@redhat.com, shankerd@codeaurora.org, geoff@infradead.org, andre.przywara@arm.com, eric.auger@redhat.com, anna-maria@linutronix.de, shihwei@cs.columbia.edu, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: jintack@cs.columbia.edu Subject: [RFC 30/55] KVM: arm/arm64: Inject irqs to the guest hypervisor Date: Mon, 9 Jan 2017 01:24:26 -0500 Message-Id: <1483943091-1364-31-git-send-email-jintack@cs.columbia.edu> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1483943091-1364-1-git-send-email-jintack@cs.columbia.edu> References: <1483943091-1364-1-git-send-email-jintack@cs.columbia.edu> X-No-Spam-Score: Local Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If we have a pending IRQ for the guest and the guest expects IRQs to be handled in its virtual EL2 mode (the virtual IMO bit is set) and it is not already running in virtual EL2 mode, then we have to emulate an IRQ exception. Signed-off-by: Jintack Lim Signed-off-by: Christoffer Dall --- virt/kvm/arm/vgic/vgic.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c index 6440b56..4a98654 100644 --- a/virt/kvm/arm/vgic/vgic.c +++ b/virt/kvm/arm/vgic/vgic.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "vgic.h" @@ -652,6 +653,28 @@ static void vgic_flush_lr_state(struct kvm_vcpu *vcpu) /* Nuke remaining LRs */ for ( ; count < kvm_vgic_global_state.nr_lr; count++) vgic_clear_lr(vcpu, count); + + /* + * If we have any pending IRQ for the guest and the guest expects IRQs + * to be handled in its virtual EL2 mode (the virtual IMO bit is set) + * and it is not already running in virtual EL2 mode, then we have to + * emulate an IRQ exception to virtual IRQ. Note that a pending IRQ + * means an irq of which state is pending but not active. + */ + if (vcpu_el2_imo_is_set(vcpu) && !vcpu_mode_el2(vcpu)) { + bool pending = false; + + list_for_each_entry(irq, &vgic_cpu->ap_list_head, ap_list) { + spin_lock(&irq->irq_lock); + pending = irq->pending && irq->enabled && !irq->active; + spin_unlock(&irq->irq_lock); + + if (pending) { + kvm_inject_nested_irq(vcpu); + break; + } + } + } } /* Sync back the hardware VGIC state into our emulation after a guest's run. */ -- 1.9.1