mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-02-25 13:56:55 +00:00
exec: Respect as_translate_internal length clamp
address_space_translate_internal will clamp the *plen length argument based on the size of the memory region being queried. The iommu walker logic in addresss_space_translate was ignoring this by discarding the post fn call value of *plen. Fix by just always using *plen as the length argument throughout the fn, removing the len local variable. This fixes a bootloader bug when a single elf section spans multiple QEMU memory regions. Backports commit 23820dbfc79d1c9dce090b4c555994f2bb6a69b3 from qemu
This commit is contained in:
parent
ce997e1caf
commit
fd4e62bc1d
|
@ -349,7 +349,6 @@ MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,
|
||||||
IOMMUTLBEntry iotlb;
|
IOMMUTLBEntry iotlb;
|
||||||
MemoryRegionSection *section;
|
MemoryRegionSection *section;
|
||||||
MemoryRegion *mr;
|
MemoryRegion *mr;
|
||||||
hwaddr len = *plen;
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
section = address_space_translate_internal(as->dispatch, addr, &addr, plen, true);
|
section = address_space_translate_internal(as->dispatch, addr, &addr, plen, true);
|
||||||
|
@ -364,7 +363,7 @@ MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,
|
||||||
iotlb = mr->iommu_ops->translate(mr, addr, is_write);
|
iotlb = mr->iommu_ops->translate(mr, addr, is_write);
|
||||||
addr = ((iotlb.translated_addr & ~iotlb.addr_mask)
|
addr = ((iotlb.translated_addr & ~iotlb.addr_mask)
|
||||||
| (addr & iotlb.addr_mask));
|
| (addr & iotlb.addr_mask));
|
||||||
len = MIN(len, (addr | iotlb.addr_mask) - addr + 1);
|
*plen = MIN(*plen, (addr | iotlb.addr_mask) - addr + 1);
|
||||||
if (!(iotlb.perm & (1 << is_write))) {
|
if (!(iotlb.perm & (1 << is_write))) {
|
||||||
mr = &as->uc->io_mem_unassigned;
|
mr = &as->uc->io_mem_unassigned;
|
||||||
break;
|
break;
|
||||||
|
@ -373,7 +372,6 @@ MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,
|
||||||
as = iotlb.target_as;
|
as = iotlb.target_as;
|
||||||
}
|
}
|
||||||
|
|
||||||
*plen = len;
|
|
||||||
*xlat = addr;
|
*xlat = addr;
|
||||||
return mr;
|
return mr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue