On reset, restore the default address translation mode for all the address spaces managed by the vIOMMU.
Signed-off-by: Alejandro Jimenez <alejandro.j.jime...@oracle.com> --- hw/i386/amd_iommu.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c index 3f9aa2cc8d31..0df658712ec0 100644 --- a/hw/i386/amd_iommu.c +++ b/hw/i386/amd_iommu.c @@ -1548,6 +1548,33 @@ static void amdvi_switch_address_space(AMDVIAddressSpace *amdvi_as) } } +/* + * For all existing address spaces managed by the IOMMU, enable/disable the + * corresponding memory regions depending on the address translation mode + * as determined by the global and individual address space settings. + */ +static void amdvi_switch_address_space_all(AMDVIState *s) +{ + AMDVIAddressSpace **iommu_as; + + for (int bus_num = 0; bus_num < PCI_BUS_MAX; bus_num++) { + + /* Nothing to do if there are no devices on the current bus */ + if (!s->address_spaces[bus_num]) { + continue; + } + iommu_as = s->address_spaces[bus_num]; + + for (int devfn = 0; devfn < PCI_DEVFN_MAX; devfn++) { + + if (!iommu_as[devfn]) { + continue; + } + amdvi_switch_address_space(iommu_as[devfn]); + } + } +} + static AddressSpace *amdvi_host_dma_iommu(PCIBus *bus, void *opaque, int devfn) { char name[128]; @@ -1745,6 +1772,7 @@ static void amdvi_sysbus_reset(DeviceState *dev) /* Discard all mappings on device reset */ amdvi_address_space_unmap_all(s); + amdvi_switch_address_space_all(s); } static void amdvi_sysbus_realize(DeviceState *dev, Error **errp) -- 2.43.5