diff options
author | Eric Auger <eric.auger@redhat.com> | 2016-07-18 06:57:36 -0400 |
---|---|---|
committer | Marc Zyngier <marc.zyngier@arm.com> | 2016-07-18 13:15:15 -0400 |
commit | 9d5fcb9dd74b5e0070ef2f66f7f4ae14a23b0206 (patch) | |
tree | f212c76226e3226c0efb42abdbb5ed7cf1e7230d | |
parent | 0e4e82f154e387969ea7ecd2c8876689fb68f710 (diff) |
KVM: arm/arm64: Fix vGICv2 KVM_DEV_ARM_VGIC_GRP_CPU/DIST_REGS
For VGICv2 save and restore the CPU interface registers
are accessed. Restore the modality which has been altered.
Also explicitly set the iodev_type for both the DIST and CPU
interface.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
-rw-r--r-- | virt/kvm/arm/vgic/vgic-mmio-v2.c | 2 | ||||
-rw-r--r-- | virt/kvm/arm/vgic/vgic-mmio.c | 4 |
2 files changed, 5 insertions, 1 deletions
diff --git a/virt/kvm/arm/vgic/vgic-mmio-v2.c b/virt/kvm/arm/vgic/vgic-mmio-v2.c index 4152348f5e4f..b44b359cbbad 100644 --- a/virt/kvm/arm/vgic/vgic-mmio-v2.c +++ b/virt/kvm/arm/vgic/vgic-mmio-v2.c | |||
@@ -437,6 +437,7 @@ int vgic_v2_cpuif_uaccess(struct kvm_vcpu *vcpu, bool is_write, | |||
437 | struct vgic_io_device dev = { | 437 | struct vgic_io_device dev = { |
438 | .regions = vgic_v2_cpu_registers, | 438 | .regions = vgic_v2_cpu_registers, |
439 | .nr_regions = ARRAY_SIZE(vgic_v2_cpu_registers), | 439 | .nr_regions = ARRAY_SIZE(vgic_v2_cpu_registers), |
440 | .iodev_type = IODEV_CPUIF, | ||
440 | }; | 441 | }; |
441 | 442 | ||
442 | return vgic_uaccess(vcpu, &dev, is_write, offset, val); | 443 | return vgic_uaccess(vcpu, &dev, is_write, offset, val); |
@@ -448,6 +449,7 @@ int vgic_v2_dist_uaccess(struct kvm_vcpu *vcpu, bool is_write, | |||
448 | struct vgic_io_device dev = { | 449 | struct vgic_io_device dev = { |
449 | .regions = vgic_v2_dist_registers, | 450 | .regions = vgic_v2_dist_registers, |
450 | .nr_regions = ARRAY_SIZE(vgic_v2_dist_registers), | 451 | .nr_regions = ARRAY_SIZE(vgic_v2_dist_registers), |
452 | .iodev_type = IODEV_DIST, | ||
451 | }; | 453 | }; |
452 | 454 | ||
453 | return vgic_uaccess(vcpu, &dev, is_write, offset, val); | 455 | return vgic_uaccess(vcpu, &dev, is_write, offset, val); |
diff --git a/virt/kvm/arm/vgic/vgic-mmio.c b/virt/kvm/arm/vgic/vgic-mmio.c index 26be827bbfcc..3bad3c5ed431 100644 --- a/virt/kvm/arm/vgic/vgic-mmio.c +++ b/virt/kvm/arm/vgic/vgic-mmio.c | |||
@@ -484,7 +484,8 @@ static int dispatch_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, | |||
484 | 484 | ||
485 | switch (iodev->iodev_type) { | 485 | switch (iodev->iodev_type) { |
486 | case IODEV_CPUIF: | 486 | case IODEV_CPUIF: |
487 | return 1; | 487 | data = region->read(vcpu, addr, len); |
488 | break; | ||
488 | case IODEV_DIST: | 489 | case IODEV_DIST: |
489 | data = region->read(vcpu, addr, len); | 490 | data = region->read(vcpu, addr, len); |
490 | break; | 491 | break; |
@@ -517,6 +518,7 @@ static int dispatch_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, | |||
517 | 518 | ||
518 | switch (iodev->iodev_type) { | 519 | switch (iodev->iodev_type) { |
519 | case IODEV_CPUIF: | 520 | case IODEV_CPUIF: |
521 | region->write(vcpu, addr, len, data); | ||
520 | break; | 522 | break; |
521 | case IODEV_DIST: | 523 | case IODEV_DIST: |
522 | region->write(vcpu, addr, len, data); | 524 | region->write(vcpu, addr, len, data); |