exec: clamp accesses against the MemoryRegionSection

Because the clamping was done against the MemoryRegion,
address_space_rw was effectively broken if a write spanned
multiple sections that are not linear in underlying memory
(with the memory not being under an IOMMU).

This is visible with the MIPS rc4030 IOMMU, which is implemented
as a series of alias memory regions that point to the actual RAM.

Backports commit e4a511f8cc6f4a46d409fb5c9f72c38ba45f8d83 from qemu
This commit is contained in:
Paolo Bonzini 2018-02-18 17:52:55 -05:00 committed by Lioncash
parent 7c21d3059e
commit 32996e48fc
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -324,7 +324,7 @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
mr = section->mr;
if (memory_region_is_ram(mr)) {
diff = int128_sub(mr->size, int128_make64(addr));
diff = int128_sub(section->size, int128_make64(addr));
*plen = int128_get64(int128_min(diff, int128_make64(*plen)));
}
return section;