From: Xudong Hao Date: Wed, 25 Apr 2012 10:18:45 +0000 (+0100) Subject: libxl: passthrough: avoid passing through devices not owned by pciback X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~8561 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=a7c6b15049c42bfd45b2384a57b047d2f605e7ec;p=xen.git libxl: passthrough: avoid passing through devices not owned by pciback This patch makes sure the passthrough device belongs to pciback before allow them passthrough to the guest. There are still many other checks missing. xm terminates the guest startup process when this type of condition is found. This patch just allows the guest to continue to boot but with no device passthrough. Signed-off-by: Allen Kay Signed-off-by: Xudong Hao Acked-by: Ian Jackson Committed-by: Ian Jackson --- diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index e8b8839847..3856bd99e7 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -664,6 +664,24 @@ int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcide return rc; } +static int libxl_pcidev_assignable(libxl_ctx *ctx, libxl_device_pci *pcidev) +{ + libxl_device_pci *pcidevs; + int num, i; + + pcidevs = libxl_device_pci_list_assignable(ctx, &num); + for (i = 0; i < num; i++) { + if (pcidevs[i].domain == pcidev->domain && + pcidevs[i].bus == pcidev->bus && + pcidevs[i].dev == pcidev->dev && + pcidevs[i].func == pcidev->func) + { + return 1; + } + } + return 0; +} + int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting) { libxl_ctx *ctx = libxl__gc_owner(gc); @@ -675,6 +693,13 @@ int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcide rc = libxl__device_pci_setdefault(gc, pcidev); if (rc) goto out; + if (!libxl_pcidev_assignable(ctx, pcidev)) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device %x:%x:%x.%x is not assignable", + pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func); + rc = ERROR_FAIL; + goto out; + } + rc = get_all_assigned_devices(gc, &assigned, &num_assigned); if ( rc ) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot determine if device is assigned, refusing to continue");