diff -r 54dec90cbea9 xen/drivers/passthrough/vtd/dmar.c --- a/xen/drivers/passthrough/vtd/dmar.c Fri Jul 11 15:37:31 2008 +0100 +++ b/xen/drivers/passthrough/vtd/dmar.c Mon Jul 14 16:56:47 2008 +0800 @@ -333,6 +333,8 @@ acpi_parse_one_rmrr(struct acpi_dmar_ent rmrru->base_address = rmrr->base_address; rmrru->end_address = rmrr->end_address; + printk("RMRR: base address = %"PRIx64", end address = %"PRIx64"\n", + rmrr->base_address, rmrr->end_address); dev_scope_start = (void *)(rmrr + 1); dev_scope_end = ((void *)rmrr) + header->length; ret = acpi_parse_dev_scope(dev_scope_start, dev_scope_end, diff -r 54dec90cbea9 xen/drivers/passthrough/vtd/iommu.c --- a/xen/drivers/passthrough/vtd/iommu.c Fri Jul 11 15:37:31 2008 +0100 +++ b/xen/drivers/passthrough/vtd/iommu.c Mon Jul 14 16:50:49 2008 +0800 @@ -1558,10 +1558,13 @@ static int iommu_prepare_rmrr_dev(struct u8 bus, u8 devfn) { u64 size; - int ret; + int ret = 0; /* page table init */ size = rmrr->end_address - rmrr->base_address + 1; + if ( size >> PAGE_SHIFT_4K <= 0 ) + return ret; + ret = iommu_page_mapping(d, rmrr->base_address, rmrr->base_address, size, DMA_PTE_READ|DMA_PTE_WRITE);