mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
KVM: arm/arm64: vgic-v2: Limit ITARGETSR bits to number of VCPUs
The GICv2 spec says in section 4.3.12 that a "CPU targets field bit that corresponds to an unimplemented CPU interface is RAZ/WI." Currently we allow the guest to write any value in there and it can read that back. Mask the written value with the proper CPU mask to be spec compliant. Signed-off-by: Andre Przywara <andre.przywara@arm.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
This commit is contained in:
parent
fd5ebf99f8
commit
266068eabb
1 changed files with 2 additions and 1 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue