aboutsummaryrefslogtreecommitdiff
path: root/virt/kvm/arm/vgic/vgic-v3.c
diff options
context:
space:
mode:
authorGravatar Marc Zyngier <marc.zyngier@arm.com> 2017-06-09 12:49:40 +0100
committerGravatar Marc Zyngier <marc.zyngier@arm.com> 2017-06-15 09:45:01 +0100
commit9c7bfc288c71068ab323b802dba2eb87fd08b127 (patch)
tree2284e6b5fa39ea9289a929c2f66b89d6d6a08c8c /virt/kvm/arm/vgic/vgic-v3.c
parentKVM: arm64: vgic-v3: Add ICV_HPPIR1_EL1 handler (diff)
downloadlinux-9c7bfc288c71068ab323b802dba2eb87fd08b127.tar.gz
linux-9c7bfc288c71068ab323b802dba2eb87fd08b127.tar.bz2
linux-9c7bfc288c71068ab323b802dba2eb87fd08b127.zip
KVM: arm64: vgic-v3: Enable trapping of Group-1 system registers
In order to be able to trap Group-1 GICv3 system registers, we need to set ICH_HCR_EL2.TALL1 before entering the guest. This is conditionally done after having restored the guest's state, and cleared on exit. Tested-by: Alexander Graf <agraf@suse.de> Acked-by: David Daney <david.daney@cavium.com> Acked-by: Christoffer Dall <cdall@linaro.org> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Christoffer Dall <cdall@linaro.org>
Diffstat (limited to 'virt/kvm/arm/vgic/vgic-v3.c')
-rw-r--r--virt/kvm/arm/vgic/vgic-v3.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c
index fac6e23cd0b3..722bdebdfbb5 100644
--- a/virt/kvm/arm/vgic/vgic-v3.c
+++ b/virt/kvm/arm/vgic/vgic-v3.c
@@ -21,6 +21,8 @@
#include "vgic.h"
+static bool group1_trap;
+
void vgic_v3_set_underflow(struct kvm_vcpu *vcpu)
{
struct vgic_v3_cpu_if *cpuif = &vcpu->arch.vgic_cpu.vgic_v3;
@@ -258,6 +260,8 @@ void vgic_v3_enable(struct kvm_vcpu *vcpu)
/* Get the show on the road... */
vgic_v3->vgic_hcr = ICH_HCR_EN;
+ if (group1_trap)
+ vgic_v3->vgic_hcr |= ICH_HCR_TALL1;
}
int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq)