arm/arm64: KVM: Fix unaligned access bug on gicv2 access
authorChristoffer Dall <christoffer.dall@linaro.org>
Mon, 22 Sep 2014 20:10:36 +0000 (22:10 +0200)
committerChristoffer Dall <christoffer.dall@linaro.org>
Mon, 22 Sep 2014 21:05:56 +0000 (23:05 +0200)
We were using an atomic bitop on the vgic_v2.vgic_elrsr field which was
not aligned to the natural size on 64-bit platforms.  This bug showed up
after QEMU correctly identifies the pl011 line as being level-triggered,
and not edge-triggered.

These data structures are protected by a spinlock so simply use a
non-atomic version of the accessor instead.

Tested-by: Joel Schopp <joel.schopp@amd.com>
Reported-by: Riku Voipio <riku.voipio@linaro.org>
Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
virt/kvm/arm/vgic-v2.c

index 01124ef3690a03e1c9ecdc464b954b19c6354440..416baedfc89fb249830a54850de7ecfde4b1cf60 100644 (file)
@@ -71,7 +71,7 @@ static void vgic_v2_sync_lr_elrsr(struct kvm_vcpu *vcpu, int lr,
                                  struct vgic_lr lr_desc)
 {
        if (!(lr_desc.state & LR_STATE_MASK))
-               set_bit(lr, (unsigned long *)vcpu->arch.vgic_cpu.vgic_v2.vgic_elrsr);
+               __set_bit(lr, (unsigned long *)vcpu->arch.vgic_cpu.vgic_v2.vgic_elrsr);
 }
 
 static u64 vgic_v2_get_elrsr(const struct kvm_vcpu *vcpu)