diff -r 0901aec1d00b xen/drivers/passthrough/vtd/dmar.h --- a/xen/drivers/passthrough/vtd/dmar.h Wed Mar 19 00:01:25 2008 +0000 +++ b/xen/drivers/passthrough/vtd/dmar.h Wed Mar 19 09:16:18 2008 +0800 @@ -100,5 +100,6 @@ struct acpi_rmrr_unit * acpi_find_matche int vtd_hw_check(void); void disable_pmr(struct iommu *iommu); +int is_usb_device(struct pci_dev *pdev); #endif // _DMAR_H_ diff -r 0901aec1d00b xen/drivers/passthrough/vtd/iommu.c --- a/xen/drivers/passthrough/vtd/iommu.c Wed Mar 19 00:01:25 2008 +0000 +++ b/xen/drivers/passthrough/vtd/iommu.c Wed Mar 19 09:29:07 2008 +0800 @@ -2019,6 +2019,12 @@ int intel_iommu_assign_device(struct dom for_each_rmrr_device( rmrr, pdev ) if ( pdev->bus == bus && pdev->devfn == devfn ) { + /* FIXME: Because USB RMRR conflicts with guest bios region, + * ignore USB RMRR temporarily. + */ + if ( is_usb_device(pdev) ) + return 0; + ret = iommu_prepare_rmrr_dev(d, rmrr, pdev); if ( ret ) { diff -r 0901aec1d00b xen/drivers/passthrough/vtd/utils.c --- a/xen/drivers/passthrough/vtd/utils.c Wed Mar 19 00:01:25 2008 +0000 +++ b/xen/drivers/passthrough/vtd/utils.c Wed Mar 19 09:16:18 2008 +0800 @@ -29,6 +29,20 @@ #define INTEL 0x8086 #define SEABURG 0x4000 #define C_STEP 2 + +int is_usb_device(struct pci_dev *pdev) +{ + u8 bus = pdev->bus; + u8 dev = PCI_SLOT(pdev->devfn); + u8 func = PCI_FUNC(pdev->devfn); + + u16 class = read_pci_config_16(bus, dev, func, PCI_CLASS_DEVICE); + + if ( class == 0xc03 ) + return 1; + else + return 0; +} int vtd_hw_check(void) {