On Mon, 6 Mar 2023 at 02:14, Richard Henderson <richard.hender...@linaro.org> wrote: > > The primary issue is that of overflow, where "end" for the last > page of the 32-bit address space overflows to 0. The fix is to > use "last" instead, which can always be represented. > > This requires that we adjust reserved_va as well, because of > > -/* > - * There are a number of places where we assign reserved_va to a variable > - * of type abi_ulong and expect it to fit. Avoid the last page. > - */ > -# define MAX_RESERVED_VA (0xfffffffful & TARGET_PAGE_MASK) > > and the related > > - /* > - * reserved_va must be aligned with the host page size > - * as it is used with mmap() > - */ > - reserved_va = local_max_va & qemu_host_page_mask; > > whereby we avoided the final (host | guest) page of the address space > because of said overflow. With the change in representation, we can > always use UINT32_MAX as the end of the 32-bit address space. > > This was observable on ppc64le (or any other 64k page host) not being > able to load any arm32 binary, because the COMMPAGE goes at 0xffff0000, > which violated that last host page problem above. > > The issue is resolved in patch 4, but the rest clean up other interfaces > with the same issue. I'm not touching any interfaces that use start+len > instead of start+end.
Thanks for looking at this Richard. I gave it a spin on a ppc64le host and it resolved the assert. Tested-by: Joel Stanley <j...@jms.id.au> Cheers, Joel