iommu/vt-d: Don't copy translation tables if RTT bit needs to be changed
We can't change the RTT bit when translation is enabled, so don't copy translation tables when we would change the bit with our new root entry. Tested-by: ZhenHua Li <zhen-hual@hp.com> Tested-by: Baoquan He <bhe@redhat.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
a87f491890
commit
c3361f2f6e
|
@ -2934,10 +2934,20 @@ static int copy_translation_tables(struct intel_iommu *iommu)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u64 rtaddr_reg;
|
u64 rtaddr_reg;
|
||||||
int bus, ret;
|
int bus, ret;
|
||||||
bool ext;
|
bool new_ext, ext;
|
||||||
|
|
||||||
rtaddr_reg = dmar_readq(iommu->reg + DMAR_RTADDR_REG);
|
rtaddr_reg = dmar_readq(iommu->reg + DMAR_RTADDR_REG);
|
||||||
ext = !!(rtaddr_reg & DMA_RTADDR_RTT);
|
ext = !!(rtaddr_reg & DMA_RTADDR_RTT);
|
||||||
|
new_ext = !!ecap_ecs(iommu->ecap);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The RTT bit can only be changed when translation is disabled,
|
||||||
|
* but disabling translation means to open a window for data
|
||||||
|
* corruption. So bail out and don't copy anything if we would
|
||||||
|
* have to change the bit.
|
||||||
|
*/
|
||||||
|
if (new_ext != ext)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
old_rt_phys = rtaddr_reg & VTD_PAGE_MASK;
|
old_rt_phys = rtaddr_reg & VTD_PAGE_MASK;
|
||||||
if (!old_rt_phys)
|
if (!old_rt_phys)
|
||||||
|
|
Loading…
Reference in a new issue