All, sorry for the wide CC, I’m trying to find somebody who understands this corder of the code…. This is perhaps a obscure, but I think it should work. I am trying to access an MMIO region through an IOMMU, from TCG. The IOMMU translation has provided an address space that is different from the CPU’s own address space.
In address_space_translate_for_iotlb the section is calculated using the address space provide by the IOMMU translation. > d = flatview_to_dispatch(address_space_to_flatview(iotlb.target_as)); > Later, we come to do the actual access (via e.g. do_st_mmio_leN), and at this point we pick up the cpu’s address spaces in iotlb_to_section, which is different, and the recorded section therefore seems to be incorrect. > CPUAddressSpace *cpuas = &cpu->cpu_ases[asidx]; > AddressSpaceDispatch *d = cpuas->memory_dispatch; > int section_index = index & ~TARGET_PAGE_MASK; > MemoryRegionSection *ret; > > assert(section_index < d->map.sections_nb); > ret = d->map.sections + section_index; What I don’t fully understand is how this is supposed to work….? Have I missed something obvious? Cheers Mark.
