KVM: arm/arm64: Revisit Redistributor TYPER last bit computation
authorEric Auger <eric.auger@redhat.com>
Tue, 22 May 2018 07:55:10 +0000 (09:55 +0200)
committerMarc Zyngier <marc.zyngier@arm.com>
Fri, 25 May 2018 11:29:26 +0000 (12:29 +0100)
The TYPER of an redistributor reflects whether the rdist is
the last one of the redistributor region. Let's compare the TYPER
GPA against the address of the last occupied slot within the
redistributor region.

Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Christoffer Dall <christoffer.dall@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
virt/kvm/arm/vgic/vgic-mmio-v3.c

index 49ca176e2e0890a6ab8044bf6e1614f3c16aae4f..ce5c927fad06da3f102412dcacbf687145c19c36 100644 (file)
@@ -184,12 +184,17 @@ static unsigned long vgic_mmio_read_v3r_typer(struct kvm_vcpu *vcpu,
                                              gpa_t addr, unsigned int len)
 {
        unsigned long mpidr = kvm_vcpu_get_mpidr_aff(vcpu);
+       struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
+       struct vgic_redist_region *rdreg = vgic_cpu->rdreg;
        int target_vcpu_id = vcpu->vcpu_id;
+       gpa_t last_rdist_typer = rdreg->base + GICR_TYPER +
+                       (rdreg->free_index - 1) * KVM_VGIC_V3_REDIST_SIZE;
        u64 value;
 
        value = (u64)(mpidr & GENMASK(23, 0)) << 32;
        value |= ((target_vcpu_id & 0xffff) << 8);
-       if (target_vcpu_id == atomic_read(&vcpu->kvm->online_vcpus) - 1)
+
+       if (addr == last_rdist_typer)
                value |= GICR_TYPER_LAST;
        if (vgic_has_its(vcpu->kvm))
                value |= GICR_TYPER_PLPIS;