|
@@ -129,6 +129,7 @@ static void vgic_mmio_write_target(struct kvm_vcpu *vcpu,
|
|
|
unsigned long val)
|
|
unsigned long val)
|
|
|
{
|
|
{
|
|
|
u32 intid = VGIC_ADDR_TO_INTID(addr, 8);
|
|
u32 intid = VGIC_ADDR_TO_INTID(addr, 8);
|
|
|
|
|
+ u8 cpu_mask = GENMASK(atomic_read(&vcpu->kvm->online_vcpus) - 1, 0);
|
|
|
int i;
|
|
int i;
|
|
|
|
|
|
|
|
/* GICD_ITARGETSR[0-7] are read-only */
|
|
/* GICD_ITARGETSR[0-7] are read-only */
|
|
@@ -141,7 +142,7 @@ static void vgic_mmio_write_target(struct kvm_vcpu *vcpu,
|
|
|
|
|
|
|
|
spin_lock(&irq->irq_lock);
|
|
spin_lock(&irq->irq_lock);
|
|
|
|
|
|
|
|
- irq->targets = (val >> (i * 8)) & 0xff;
|
|
|
|
|
|
|
+ irq->targets = (val >> (i * 8)) & cpu_mask;
|
|
|
target = irq->targets ? __ffs(irq->targets) : 0;
|
|
target = irq->targets ? __ffs(irq->targets) : 0;
|
|
|
irq->target_vcpu = kvm_get_vcpu(vcpu->kvm, target);
|
|
irq->target_vcpu = kvm_get_vcpu(vcpu->kvm, target);
|
|
|
|
|
|