Skip to content

Commit

Permalink
KVM: arm64: check for ITS device on MSI injection
Browse files Browse the repository at this point in the history
When userspace provides the doorbell address for an MSI to be
injected into the guest, we find a KVM device which feels responsible.
Lets check that this device is really an emulated ITS before we make
real use of the container_of-ed pointer.

  [ Moved NULL-pointer check to caller of static function
    - Christoffer ]

Signed-off-by: Andre Przywara <[email protected]>
Reviewed-by: Christoffer Dall <[email protected]>
Signed-off-by: Christoffer Dall <[email protected]>
  • Loading branch information
Andre-ARM authored and chazy committed Aug 15, 2016
1 parent c773576 commit 505a19e
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions virt/kvm/arm/vgic/vgic-its.c
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,21 @@ static int vgic_its_trigger_msi(struct kvm *kvm, struct vgic_its *its,
return 0;
}

static struct vgic_io_device *vgic_get_its_iodev(struct kvm_io_device *dev)
{
struct vgic_io_device *iodev;

if (dev->ops != &kvm_io_gic_ops)
return NULL;

iodev = container_of(dev, struct vgic_io_device, dev);

if (iodev->iodev_type != IODEV_ITS)
return NULL;

return iodev;
}

/*
* Queries the KVM IO bus framework to get the ITS pointer from the given
* doorbell address.
Expand All @@ -494,9 +509,11 @@ int vgic_its_inject_msi(struct kvm *kvm, struct kvm_msi *msi)

kvm_io_dev = kvm_io_bus_get_dev(kvm, KVM_MMIO_BUS, address);
if (!kvm_io_dev)
return -ENODEV;
return -EINVAL;

iodev = container_of(kvm_io_dev, struct vgic_io_device, dev);
iodev = vgic_get_its_iodev(kvm_io_dev);
if (!iodev)
return -EINVAL;

mutex_lock(&iodev->its->its_lock);
ret = vgic_its_trigger_msi(kvm, iodev->its, msi->devid, msi->data);
Expand Down

0 comments on commit 505a19e

Please sign in to comment.