diff options
author | Marc Zyngier <marc.zyngier@arm.com> | 2017-06-09 07:49:52 -0400 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2017-06-15 04:45:05 -0400 |
commit | 6293d6514d6b0945210e15edcecc71d99cfca97c (patch) | |
tree | c1fdc547fed051b2f47c5963d1bc075afba08421 | |
parent | d840b2d37d3ef2463db38274c6fd72619acbe216 (diff) |
KVM: arm64: vgic-v3: Add ICV_PMR_EL1 handler
Add a handler for reading/writing the guest's view of the ICC_PMR_EL1
register, which is located in the ICH_VMCR_EL2.VPMR field.
Tested-by: Alexander Graf <agraf@suse.de>
Acked-by: David Daney <david.daney@cavium.com>
Acked-by: Christoffer Dall <cdall@linaro.org>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Signed-off-by: Christoffer Dall <cdall@linaro.org>
-rw-r--r-- | virt/kvm/arm/hyp/vgic-v3-sr.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/virt/kvm/arm/hyp/vgic-v3-sr.c b/virt/kvm/arm/hyp/vgic-v3-sr.c index a8a58dedc38e..15b557697086 100644 --- a/virt/kvm/arm/hyp/vgic-v3-sr.c +++ b/virt/kvm/arm/hyp/vgic-v3-sr.c | |||
@@ -884,6 +884,27 @@ spurious: | |||
884 | vcpu_set_reg(vcpu, rt, lr_val & ICH_LR_VIRTUAL_ID_MASK); | 884 | vcpu_set_reg(vcpu, rt, lr_val & ICH_LR_VIRTUAL_ID_MASK); |
885 | } | 885 | } |
886 | 886 | ||
887 | static void __hyp_text __vgic_v3_read_pmr(struct kvm_vcpu *vcpu, | ||
888 | u32 vmcr, int rt) | ||
889 | { | ||
890 | vmcr &= ICH_VMCR_PMR_MASK; | ||
891 | vmcr >>= ICH_VMCR_PMR_SHIFT; | ||
892 | vcpu_set_reg(vcpu, rt, vmcr); | ||
893 | } | ||
894 | |||
895 | static void __hyp_text __vgic_v3_write_pmr(struct kvm_vcpu *vcpu, | ||
896 | u32 vmcr, int rt) | ||
897 | { | ||
898 | u32 val = vcpu_get_reg(vcpu, rt); | ||
899 | |||
900 | val <<= ICH_VMCR_PMR_SHIFT; | ||
901 | val &= ICH_VMCR_PMR_MASK; | ||
902 | vmcr &= ~ICH_VMCR_PMR_MASK; | ||
903 | vmcr |= val; | ||
904 | |||
905 | write_gicreg(vmcr, ICH_VMCR_EL2); | ||
906 | } | ||
907 | |||
887 | static void __hyp_text __vgic_v3_read_rpr(struct kvm_vcpu *vcpu, | 908 | static void __hyp_text __vgic_v3_read_rpr(struct kvm_vcpu *vcpu, |
888 | u32 vmcr, int rt) | 909 | u32 vmcr, int rt) |
889 | { | 910 | { |
@@ -1029,6 +1050,12 @@ int __hyp_text __vgic_v3_perform_cpuif_access(struct kvm_vcpu *vcpu) | |||
1029 | else | 1050 | else |
1030 | fn = __vgic_v3_write_ctlr; | 1051 | fn = __vgic_v3_write_ctlr; |
1031 | break; | 1052 | break; |
1053 | case SYS_ICC_PMR_EL1: | ||
1054 | if (is_read) | ||
1055 | fn = __vgic_v3_read_pmr; | ||
1056 | else | ||
1057 | fn = __vgic_v3_write_pmr; | ||
1058 | break; | ||
1032 | default: | 1059 | default: |
1033 | return 0; | 1060 | return 0; |
1034 | } | 1061 | } |