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.

Reply via email to