mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
AMD/IOMMU: restore DTE fields in amd_iommu_setup_domain_device()
Commit 1b00c16bdf ("AMD/IOMMU: pre-fill all DTEs right after table
allocation") moved ourselves into a more secure default state, but
didn't take sufficient care to also undo the effects when handing a
previously disabled device back to a(nother) domain. Put the fields
that may have been changed elsewhere back to their intended values
(some fields amd_iommu_disable_domain_device() touches don't
currently get written anywhere else, and hence don't need modifying
here).
Reported-by: Sander Eikelenboom <linux@eikelenboom.it>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Igor Druzhinin <igor.druzhinin@citrix.com>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
Release-acked-by: Juergen Gross <jgross@suse.com>
This commit is contained in:
1 parent
a72c508656
commit
f06d11d5a8
1 file changed
+10
@@ -114,11 +114,21 @@ static void amd_iommu_setup_domain_device(
|
||||
|
||||
if ( !dte->v || !dte->tv )
|
||||
{
|
||||
const struct ivrs_mappings *ivrs_dev;
|
||||
|
||||
/* bind DTE to domain page-tables */
|
||||
amd_iommu_set_root_page_table(
|
||||
dte, page_to_maddr(hd->arch.root_table), domain->domain_id,
|
||||
hd->arch.paging_mode, valid);
|
||||
|
||||
/* Undo what amd_iommu_disable_domain_device() may have done. */
|
||||
ivrs_dev = &get_ivrs_mappings(iommu->seg)[req_id];
|
||||
if ( dte->it_root )
|
||||
dte->int_ctl = IOMMU_DEV_TABLE_INT_CONTROL_TRANSLATED;
|
||||
dte->iv = iommu_intremap;
|
||||
dte->ex = ivrs_dev->dte_allow_exclusion;
|
||||
dte->sys_mgt = MASK_EXTR(ivrs_dev->device_flags, ACPI_IVHD_SYSTEM_MGMT);
|
||||
|
||||
if ( pci_ats_device(iommu->seg, bus, pdev->devfn) &&
|
||||
iommu_has_cap(iommu, PCI_CAP_IOTLB_SHIFT) )
|
||||
dte->i = ats_enabled;
|
||||
|
||||