From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tiejun Chen Subject: [v4][PATCH 18/19] xen/vtd: prevent from assign the device with shared rmrr Date: Tue, 23 Jun 2015 17:57:29 +0800 Message-ID: <1435053450-25131-19-git-send-email-tiejun.chen@intel.com> References: <1435053450-25131-1-git-send-email-tiejun.chen@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1435053450-25131-1-git-send-email-tiejun.chen@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Yang Zhang , Kevin Tian List-Id: xen-devel@lists.xenproject.org Currently we're intending to cover this kind of devices with shared RMRR simply since the case of shared RMRR is a rare case according to our previous experiences. But late we can group these devices which shared rmrr, and then allow all devices within a group to be assigned to same domain. CC: Yang Zhang CC: Kevin Tian Signed-off-by: Tiejun Chen Acked-by: Kevin Tian --- v4: * Refine one code comment. xen/drivers/passthrough/vtd/iommu.c | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 07f5c7c..43ba131 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -2291,13 +2291,39 @@ static int intel_iommu_assign_device( if ( list_empty(&acpi_drhd_units) ) return -ENODEV; + seg = pdev->seg; + bus = pdev->bus; + /* + * In rare cases one given rmrr is shared by multiple devices but + * obviously this would put the security of a system at risk. So + * we should prevent from this sort of device assignment. + * + * TODO: in the future we can introduce group device assignment + * interface to make sure devices sharing RMRR are assigned to the + * same domain together. + */ + for_each_rmrr_device( rmrr, bdf, i ) + { + if ( rmrr->segment == seg && + PCI_BUS(bdf) == bus && + PCI_DEVFN2(bdf) == devfn ) + { + if ( rmrr->scope.devices_cnt > 1 ) + { + printk(XENLOG_G_ERR VTDPREFIX + " cannot assign %04x:%02x:%02x.%u" + " with shared RMRR for Dom%d.\n", + seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), + d->domain_id); + return -EPERM; + } + } + } + ret = reassign_device_ownership(hardware_domain, d, devfn, pdev); if ( ret ) return ret; - seg = pdev->seg; - bus = pdev->bus; - /* Setup rmrr identity mapping */ for_each_rmrr_device( rmrr, bdf, i ) { -- 1.9.1