exec: do not clamp accesses to MMIO regions
It is common for MMIO registers to overlap, for example a 4 byte register at 0xcf8 (totally random choice... :)) and a 1 byte register at 0xcf9. If these registers are implemented via separate MemoryRegions, it is wrong to clamp the accesses as the value written would be truncated. Hence for these regions the effects of commit23820db
(exec: Respect as_translate_internal length clamp, 2015-03-16, previously applied as commitc3c1bb99
) must be skipped. Tested-by: Hervé Poussineau <hpoussin@reactos.org> Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
ae46e23964
commit
965eb2fcdf
8
exec.c
8
exec.c
@ -341,6 +341,7 @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
|
||||
hwaddr *plen, bool resolve_subpage)
|
||||
{
|
||||
MemoryRegionSection *section;
|
||||
MemoryRegion *mr;
|
||||
Int128 diff;
|
||||
|
||||
section = address_space_lookup_region(d, addr, resolve_subpage);
|
||||
@ -350,8 +351,11 @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
|
||||
/* Compute offset within MemoryRegion */
|
||||
*xlat = addr + section->offset_within_region;
|
||||
|
||||
diff = int128_sub(section->mr->size, int128_make64(addr));
|
||||
*plen = int128_get64(int128_min(diff, int128_make64(*plen)));
|
||||
mr = section->mr;
|
||||
if (memory_region_is_ram(mr)) {
|
||||
diff = int128_sub(mr->size, int128_make64(addr));
|
||||
*plen = int128_get64(int128_min(diff, int128_make64(*plen)));
|
||||
}
|
||||
return section;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user