From: Keir Fraser Date: Tue, 23 Oct 2007 08:31:03 +0000 (+0100) Subject: vt-d: Fix a bug in pmr register disabling code. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14845^2~6 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=24852cb74458c8bb1f68be9f1178b8eac4c744bd;p=xen.git vt-d: Fix a bug in pmr register disabling code. Signed-off-by: Allen Kay --- diff --git a/xen/arch/x86/hvm/vmx/vtd/utils.c b/xen/arch/x86/hvm/vmx/vtd/utils.c index 57964b2b6e..66b3ce18c8 100644 --- a/xen/arch/x86/hvm/vmx/vtd/utils.c +++ b/xen/arch/x86/hvm/vmx/vtd/utils.c @@ -64,24 +64,28 @@ int vtd_hw_check(void) return 0; } -/* disable vt-d protected memory registers */ +/* Disable vt-d protected memory registers. */ void disable_pmr(struct iommu *iommu) { unsigned long start_time, status; + unsigned int val; - gdprintk(XENLOG_INFO VTDPREFIX, - "disabling protected memory registers\n"); - - dmar_writel(iommu->reg, DMAR_PMEN_REG, 0); + val = dmar_readl(iommu->reg, DMAR_PMEN_REG); + dmar_writel(iommu->reg, DMAR_PMEN_REG, val & ~DMA_PMEN_EPM); start_time = jiffies; - while (1) { + + for ( ; ; ) + { status = dmar_readl(iommu->reg, DMAR_PMEN_REG); if ( (status & DMA_PMEN_PRS) == 0 ) break; - if (time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT)) + if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) ) panic("Cannot set QIE field for queue invalidation\n"); cpu_relax(); } + + dprintk(XENLOG_INFO VTDPREFIX, + "disabled protected memory registers\n"); } #if defined(__x86_64__) diff --git a/xen/include/asm-x86/hvm/vmx/intel-iommu.h b/xen/include/asm-x86/hvm/vmx/intel-iommu.h index 893cfaa70a..b4c7d410bf 100644 --- a/xen/include/asm-x86/hvm/vmx/intel-iommu.h +++ b/xen/include/asm-x86/hvm/vmx/intel-iommu.h @@ -147,7 +147,7 @@ /* PMEN_REG */ #define DMA_PMEN_EPM (((u32)1) << 31) -#define DMA_PMEN_PRS (((u32)1) << 1) +#define DMA_PMEN_PRS (((u32)1) << 0) /* CCMD_REG */ #define DMA_CCMD_INVL_GRANU_OFFSET 61