|
@@ -476,7 +476,8 @@ static MemoryRegionSection address_space_do_translate(AddressSpace *as,
|
|
|
hwaddr *xlat,
|
|
|
hwaddr *plen,
|
|
|
bool is_write,
|
|
|
- bool is_mmio)
|
|
|
+ bool is_mmio,
|
|
|
+ AddressSpace **target_as)
|
|
|
{
|
|
|
IOMMUTLBEntry iotlb;
|
|
|
MemoryRegionSection *section;
|
|
@@ -503,6 +504,7 @@ static MemoryRegionSection address_space_do_translate(AddressSpace *as,
|
|
|
}
|
|
|
|
|
|
as = iotlb.target_as;
|
|
|
+ *target_as = iotlb.target_as;
|
|
|
}
|
|
|
|
|
|
*xlat = addr;
|
|
@@ -525,7 +527,7 @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
|
|
|
|
|
|
/* This can never be MMIO. */
|
|
|
section = address_space_do_translate(as, addr, &xlat, &plen,
|
|
|
- is_write, false);
|
|
|
+ is_write, false, &as);
|
|
|
|
|
|
/* Illegal translation */
|
|
|
if (section.mr == &io_mem_unassigned) {
|
|
@@ -548,7 +550,7 @@ IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
|
|
|
plen -= 1;
|
|
|
|
|
|
return (IOMMUTLBEntry) {
|
|
|
- .target_as = section.address_space,
|
|
|
+ .target_as = as,
|
|
|
.iova = addr & ~plen,
|
|
|
.translated_addr = xlat & ~plen,
|
|
|
.addr_mask = plen,
|
|
@@ -569,7 +571,8 @@ MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,
|
|
|
MemoryRegionSection section;
|
|
|
|
|
|
/* This can be MMIO, so setup MMIO bit. */
|
|
|
- section = address_space_do_translate(as, addr, xlat, plen, is_write, true);
|
|
|
+ section = address_space_do_translate(as, addr, xlat, plen, is_write, true,
|
|
|
+ &as);
|
|
|
mr = section.mr;
|
|
|
|
|
|
if (xen_enabled() && memory_access_is_direct(mr, is_write)) {
|