diff options
author | Christoffer Dall <christoffer.dall@arm.com> | 2018-07-16 09:06:19 -0400 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2018-07-21 11:02:21 -0400 |
commit | aa075b0f30b53e397fd4d4162ebf4a3a236b9206 (patch) | |
tree | 7b8aee3c4dcde15178d6ecec6e0aba17cdd84193 /virt/kvm | |
parent | a2dca217dae29c4ff6420e8c78d56b3f61ae0797 (diff) |
KVM: arm/arm64: vgic: Keep track of implementation revision
As we are about to tweak implementation aspects of the VGIC emulation,
while still preserving some level of backwards compatibility support,
add a field to keep track of the implementation revision field which is
reported to the VM and to userspace.
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Christoffer Dall <christoffer.dall@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Diffstat (limited to 'virt/kvm')
-rw-r--r-- | virt/kvm/arm/vgic/vgic-init.c | 1 | ||||
-rw-r--r-- | virt/kvm/arm/vgic/vgic-mmio-v2.c | 6 | ||||
-rw-r--r-- | virt/kvm/arm/vgic/vgic-mmio-v3.c | 6 |
3 files changed, 9 insertions, 4 deletions
diff --git a/virt/kvm/arm/vgic/vgic-init.c b/virt/kvm/arm/vgic/vgic-init.c index b71417913741..8b6fc45c42fe 100644 --- a/virt/kvm/arm/vgic/vgic-init.c +++ b/virt/kvm/arm/vgic/vgic-init.c | |||
@@ -298,6 +298,7 @@ int vgic_init(struct kvm *kvm) | |||
298 | 298 | ||
299 | vgic_debug_init(kvm); | 299 | vgic_debug_init(kvm); |
300 | 300 | ||
301 | dist->implementation_rev = 0; | ||
301 | dist->initialized = true; | 302 | dist->initialized = true; |
302 | 303 | ||
303 | out: | 304 | out: |
diff --git a/virt/kvm/arm/vgic/vgic-mmio-v2.c b/virt/kvm/arm/vgic/vgic-mmio-v2.c index af44e569373a..f0c5351805b6 100644 --- a/virt/kvm/arm/vgic/vgic-mmio-v2.c +++ b/virt/kvm/arm/vgic/vgic-mmio-v2.c | |||
@@ -25,19 +25,21 @@ | |||
25 | static unsigned long vgic_mmio_read_v2_misc(struct kvm_vcpu *vcpu, | 25 | static unsigned long vgic_mmio_read_v2_misc(struct kvm_vcpu *vcpu, |
26 | gpa_t addr, unsigned int len) | 26 | gpa_t addr, unsigned int len) |
27 | { | 27 | { |
28 | struct vgic_dist *vgic = &vcpu->kvm->arch.vgic; | ||
28 | u32 value; | 29 | u32 value; |
29 | 30 | ||
30 | switch (addr & 0x0c) { | 31 | switch (addr & 0x0c) { |
31 | case GIC_DIST_CTRL: | 32 | case GIC_DIST_CTRL: |
32 | value = vcpu->kvm->arch.vgic.enabled ? GICD_ENABLE : 0; | 33 | value = vgic->enabled ? GICD_ENABLE : 0; |
33 | break; | 34 | break; |
34 | case GIC_DIST_CTR: | 35 | case GIC_DIST_CTR: |
35 | value = vcpu->kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS; | 36 | value = vgic->nr_spis + VGIC_NR_PRIVATE_IRQS; |
36 | value = (value >> 5) - 1; | 37 | value = (value >> 5) - 1; |
37 | value |= (atomic_read(&vcpu->kvm->online_vcpus) - 1) << 5; | 38 | value |= (atomic_read(&vcpu->kvm->online_vcpus) - 1) << 5; |
38 | break; | 39 | break; |
39 | case GIC_DIST_IIDR: | 40 | case GIC_DIST_IIDR: |
40 | value = (PRODUCT_ID_KVM << GICD_IIDR_PRODUCT_ID_SHIFT) | | 41 | value = (PRODUCT_ID_KVM << GICD_IIDR_PRODUCT_ID_SHIFT) | |
42 | (vgic->implementation_rev << GICD_IIDR_REVISION_SHIFT) | | ||
41 | (IMPLEMENTER_ARM << GICD_IIDR_IMPLEMENTER_SHIFT); | 43 | (IMPLEMENTER_ARM << GICD_IIDR_IMPLEMENTER_SHIFT); |
42 | break; | 44 | break; |
43 | default: | 45 | default: |
diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c index c03f42409b98..ebe10a015bfb 100644 --- a/virt/kvm/arm/vgic/vgic-mmio-v3.c +++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c | |||
@@ -62,16 +62,17 @@ bool vgic_supports_direct_msis(struct kvm *kvm) | |||
62 | static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu, | 62 | static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu, |
63 | gpa_t addr, unsigned int len) | 63 | gpa_t addr, unsigned int len) |
64 | { | 64 | { |
65 | struct vgic_dist *vgic = &vcpu->kvm->arch.vgic; | ||
65 | u32 value = 0; | 66 | u32 value = 0; |
66 | 67 | ||
67 | switch (addr & 0x0c) { | 68 | switch (addr & 0x0c) { |
68 | case GICD_CTLR: | 69 | case GICD_CTLR: |
69 | if (vcpu->kvm->arch.vgic.enabled) | 70 | if (vgic->enabled) |
70 | value |= GICD_CTLR_ENABLE_SS_G1; | 71 | value |= GICD_CTLR_ENABLE_SS_G1; |
71 | value |= GICD_CTLR_ARE_NS | GICD_CTLR_DS; | 72 | value |= GICD_CTLR_ARE_NS | GICD_CTLR_DS; |
72 | break; | 73 | break; |
73 | case GICD_TYPER: | 74 | case GICD_TYPER: |
74 | value = vcpu->kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS; | 75 | value = vgic->nr_spis + VGIC_NR_PRIVATE_IRQS; |
75 | value = (value >> 5) - 1; | 76 | value = (value >> 5) - 1; |
76 | if (vgic_has_its(vcpu->kvm)) { | 77 | if (vgic_has_its(vcpu->kvm)) { |
77 | value |= (INTERRUPT_ID_BITS_ITS - 1) << 19; | 78 | value |= (INTERRUPT_ID_BITS_ITS - 1) << 19; |
@@ -82,6 +83,7 @@ static unsigned long vgic_mmio_read_v3_misc(struct kvm_vcpu *vcpu, | |||
82 | break; | 83 | break; |
83 | case GICD_IIDR: | 84 | case GICD_IIDR: |
84 | value = (PRODUCT_ID_KVM << GICD_IIDR_PRODUCT_ID_SHIFT) | | 85 | value = (PRODUCT_ID_KVM << GICD_IIDR_PRODUCT_ID_SHIFT) | |
86 | (vgic->implementation_rev << GICD_IIDR_REVISION_SHIFT) | | ||
85 | (IMPLEMENTER_ARM << GICD_IIDR_IMPLEMENTER_SHIFT); | 87 | (IMPLEMENTER_ARM << GICD_IIDR_IMPLEMENTER_SHIFT); |
86 | break; | 88 | break; |
87 | default: | 89 | default: |