Message ID | 20230306021307.1879483-1-richard.henderson@linaro.org |
---|---|
Headers | show |
Series | accel/tcg: Fix page_set_flags and related [#1528] | expand |
On Mon, 6 Mar 2023 at 02:14, Richard Henderson <richard.henderson@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 <joel@jms.id.au> Cheers, Joel
On 3/6/23 9:19 PM, Joel Stanley wrote: > On Mon, 6 Mar 2023 at 02:14, Richard Henderson > <richard.henderson@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. Richard, I tested it on ppc64le host and it fix is working. Tested-by:NinadPalsule <ninad@linux.ibm.com<mailto:ninad@linux.ibm.com>> Thx, Ninad Palsule