From: Simon Gaiser <simon@xxxxxxxxxxxxxxxxxxxxxx> By setting the permissive flag the guest access to the PCI config space is not filtered. This might be a security risk, but it's required for some devices and the IOMMU and interrupt remapping should (mostly?) contain it. Signed-off-by: Simon Gaiser <simon@xxxxxxxxxxxxxxxxxxxxxx> Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> --- docs/formatdomain.html.in | 3 +++ docs/schemas/domaincommon.rng | 5 +++++ src/conf/domain_conf.c | 12 ++++++++++++ src/conf/domain_conf.h | 1 + src/libxl/libxl_conf.c | 1 + 5 files changed, 22 insertions(+) diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 6f43976815..79a5176ccd 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -5051,6 +5051,9 @@ or hot-plugging the device and <code>virNodeDeviceReAttach</code> (or <code>virsh nodedev-reattach</code>) after hot-unplug or stopping the guest. + When <code>permissive</code> is "yes" the pci config space access + will not be filtered. This might be a security issue. The default + is "no". </dd> <dt><code>scsi</code></dt> <dd>For SCSI devices, user is responsible to make sure the device diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 65d6580434..9389eec3d8 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -3064,6 +3064,11 @@ <ref name="virYesNo"/> </attribute> </optional> + <optional> + <attribute name="permissive"> + <ref name="virYesNo"/> + </attribute> + </optional> <interleave> <element name="source"> <optional> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8e8146374c..607cae61d4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8419,6 +8419,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, virDomainHostdevSubsysSCSIVHostPtr scsihostsrc = &def->source.subsys.u.scsi_host; virDomainHostdevSubsysMediatedDevPtr mdevsrc = &def->source.subsys.u.mdev; g_autofree char *managed = NULL; + g_autofree char *permissive = NULL; g_autofree char *sgio = NULL; g_autofree char *rawio = NULL; g_autofree char *backendStr = NULL; @@ -8434,6 +8435,11 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, if ((managed = virXMLPropString(node, "managed")) != NULL) ignore_value(virStringParseYesNo(managed, &def->managed)); + if ((permissive = virXMLPropString(node, "permissive")) != NULL) { + if (STREQ(permissive, "yes")) + def->permissive = true; + } + sgio = virXMLPropString(node, "sgio"); rawio = virXMLPropString(node, "rawio"); model = virXMLPropString(node, "model"); @@ -25942,6 +25948,8 @@ virDomainActualNetDefFormat(virBufferPtr buf, virDomainHostdevDefPtr hostdef = virDomainNetGetActualHostdev(def); if (hostdef && hostdef->managed) virBufferAddLit(buf, " managed='yes'"); + if (hostdef && hostdef->permissive) + virBufferAddLit(buf, " permissive='yes'"); } if (def->trustGuestRxFilters) virBufferAsprintf(buf, " trustGuestRxFilters='%s'", @@ -26130,6 +26138,8 @@ virDomainNetDefFormat(virBufferPtr buf, virBufferAsprintf(buf, "<interface type='%s'", typeStr); if (hostdef && hostdef->managed) virBufferAddLit(buf, " managed='yes'"); + if (hostdef && hostdef->permissive) + virBufferAddLit(buf, " permissive='yes'"); if (def->trustGuestRxFilters) virBufferAsprintf(buf, " trustGuestRxFilters='%s'", virTristateBoolTypeToString(def->trustGuestRxFilters)); @@ -27914,6 +27924,8 @@ virDomainHostdevDefFormat(virBufferPtr buf, if (def->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) { virBufferAsprintf(buf, " managed='%s'", def->managed ? "yes" : "no"); + if (def->permissive) + virBufferAddLit(buf, " permissive='yes'"); if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI && scsisrc->sgio) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index aad3f82db7..b81a3ce901 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -345,6 +345,7 @@ struct _virDomainHostdevDef { bool missing; bool readonly; bool shareable; + bool permissive; union { virDomainHostdevSubsys subsys; virDomainHostdevCaps caps; diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index b3f67f817a..55f2a09e3e 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -2249,6 +2249,7 @@ libxlMakePCI(virDomainHostdevDefPtr hostdev, libxl_device_pci *pcidev) pcidev->bus = pcisrc->addr.bus; pcidev->dev = pcisrc->addr.slot; pcidev->func = pcisrc->addr.function; + pcidev->permissive = hostdev->permissive; return 0; } -- 2.21.1