• A
    KVM: arm/arm64: VGIC: Properly initialise private IRQ affinity · b8727dff
    Andre Przywara 提交于
    [ Upstream commit 2e16f3e926ed48373c98edea85c6ad0ef69425d1 ]
    
    At the moment we initialise the target *mask* of a virtual IRQ to the
    VCPU it belongs to, even though this mask is only defined for GICv2 and
    quickly runs out of bits for many GICv3 guests.
    This behaviour triggers an UBSAN complaint for more than 32 VCPUs:
    ------
    [ 5659.462377] UBSAN: Undefined behaviour in virt/kvm/arm/vgic/vgic-init.c:223:21
    [ 5659.471689] shift exponent 32 is too large for 32-bit type 'unsigned int'
    ------
    Also for GICv3 guests the reporting of TARGET in the "vgic-state" debugfs
    dump is wrong, due to this very same problem.
    
    Because there is no requirement to create the VGIC device before the
    VCPUs (and QEMU actually does it the other way round), we can't safely
    initialise mpidr or targets in kvm_vgic_vcpu_init(). But since we touch
    every private IRQ for each VCPU anyway later (in vgic_init()), we can
    just move the initialisation of those fields into there, where we
    definitely know the VGIC type.
    
    On the way make sure we really have either a VGICv2 or a VGICv3 device,
    since the existing code is just checking for "VGICv3 or not", silently
    ignoring the uninitialised case.
    Signed-off-by: NAndre Przywara <andre.przywara@arm.com>
    Reported-by: NDave Martin <dave.martin@arm.com>
    Tested-by: NJulien Grall <julien.grall@arm.com>
    Signed-off-by: NMarc Zyngier <maz@kernel.org>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    b8727dff
vgic-init.c 14.0 KB