On Sat, May 30, 2026 at 3:12 PM Richard Henderson <
[email protected]> wrote:
> This simplifies check for no commpage to a NULL pointer
> check, rather than reserved values for LO_COMMPAGE and
> HI_COMMPAGE.
>
> Unify {LO,HI}_COMMPAGE into a single COMMPAGE define.
>
> Signed-off-by: Richard Henderson <[email protected]>
> ---
> linux-user/arm/target_elf.h | 2 +-
> linux-user/hppa/target_elf.h | 2 +-
> linux-user/arm/elfload.c | 2 +-
> linux-user/elfload.c | 64 ++++++++++++++----------------------
> linux-user/hppa/elfload.c | 4 +--
> 5 files changed, 30 insertions(+), 44 deletions(-)
>
Acked-by: Warner Losh <[email protected]>
(I think that's what I should do when it looks good, but I don't understand
COMMPAGE to know if everything is right or not)
> diff --git a/linux-user/arm/target_elf.h b/linux-user/arm/target_elf.h
> index 12cdc8e5a7..531b486bf9 100644
> --- a/linux-user/arm/target_elf.h
> +++ b/linux-user/arm/target_elf.h
> @@ -20,7 +20,7 @@
> #define HAVE_ELF_CORE_DUMP 1
> #define HAVE_VDSO_IMAGE_INFO 1
>
> -#define HI_COMMPAGE ((intptr_t)0xffff0f00u)
> +#define COMMPAGE ((intptr_t)0xffff0f00u)
>
> /*
> * See linux kernel: arch/arm/include/asm/elf.h, where
> diff --git a/linux-user/hppa/target_elf.h b/linux-user/hppa/target_elf.h
> index e1c5033242..22547b1437 100644
> --- a/linux-user/hppa/target_elf.h
> +++ b/linux-user/hppa/target_elf.h
> @@ -34,7 +34,7 @@ typedef struct target_elf_gregset_t {
> abi_ulong pad[16]; /* pad to 80 elements [64..79]
> */
> } target_elf_gregset_t;
>
> -#define LO_COMMPAGE 0
> +#define COMMPAGE 0
> #define STACK_GROWS_DOWN 0
> #define STACK_ALIGNMENT 64
> #define VDSO_HEADER "vdso.c.inc"
> diff --git a/linux-user/arm/elfload.c b/linux-user/arm/elfload.c
> index fef61022a3..3c2ccf289c 100644
> --- a/linux-user/arm/elfload.c
> +++ b/linux-user/arm/elfload.c
> @@ -219,7 +219,7 @@ bool init_guest_commpage(void)
> return true;
> }
>
> - commpage = HI_COMMPAGE & -host_page_size;
> + commpage = COMMPAGE & -host_page_size;
> want = g2h_untagged(commpage);
> addr = mmap(want, host_page_size, PROT_READ | PROT_WRITE,
> MAP_ANONYMOUS | MAP_PRIVATE |
> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
> index 10a826e658..5a30cebcc3 100644
> --- a/linux-user/elfload.c
> +++ b/linux-user/elfload.c
> @@ -757,17 +757,9 @@ static abi_ulong create_elf_tables(abi_ulong p, int
> argc, int envc,
> return sp;
> }
>
> -#if defined(HI_COMMPAGE)
> -#define LO_COMMPAGE -1
> -#elif defined(LO_COMMPAGE)
> -#define HI_COMMPAGE 0
> -#else
> -#define HI_COMMPAGE 0
> -#define LO_COMMPAGE -1
> -#ifndef HAVE_GUEST_COMMPAGE
> +#if !defined(COMMPAGE) && !defined(HAVE_GUEST_COMMPAGE)
> bool init_guest_commpage(void) { return true; }
> #endif
> -#endif
>
> /**
> * pgb_try_mmap:
> @@ -853,7 +845,7 @@ static bool pgb_try_mmap_set(const PGBAddrs *ga,
> uintptr_t base, uintptr_t brk)
> * Fill in @ga with the image, COMMPAGE and NULL page.
> */
> static bool pgb_addr_set(PGBAddrs *ga, const PGBRange *image_range,
> - bool try_identity)
> + const PGBRange *commpage_range, bool
> try_identity)
> {
> int n;
>
> @@ -862,7 +854,7 @@ static bool pgb_addr_set(PGBAddrs *ga, const PGBRange
> *image_range,
> * we may not be able to use the identity map.
> */
> if (try_identity) {
> - if (LO_COMMPAGE != -1 && LO_COMMPAGE < mmap_min_addr) {
> + if (commpage_range && commpage_range->lo < mmap_min_addr) {
> return false;
> }
> if (image_range && image_range->lo < mmap_min_addr) {
> @@ -877,14 +869,10 @@ static bool pgb_addr_set(PGBAddrs *ga, const
> PGBRange *image_range,
> ga->bounds[n].lo = try_identity ? mmap_min_addr : 0;
> ga->bounds[n].hi = reserved_va;
> n++;
> - /* LO_COMMPAGE and NULL handled by reserving from 0. */
> + /* Low COMMPAGE and NULL handled by reserving from 0. */
> } else {
> - /* Add any LO_COMMPAGE or NULL page. */
> - if (LO_COMMPAGE != -1) {
> - ga->bounds[n].lo = 0;
> - ga->bounds[n].hi = LO_COMMPAGE + TARGET_PAGE_SIZE - 1;
> - n++;
> - } else if (!try_identity) {
> + /* Add any low COMMPAGE or NULL page. */
> + if (!try_identity || (commpage_range && commpage_range->lo == 0))
> {
> ga->bounds[n].lo = 0;
> ga->bounds[n].hi = TARGET_PAGE_SIZE - 1;
> n++;
> @@ -896,23 +884,13 @@ static bool pgb_addr_set(PGBAddrs *ga, const
> PGBRange *image_range,
> }
> }
>
> - /*
> - * Temporarily disable
> - * "comparison is always false due to limited range of data type"
> - * due to comparison between unsigned and (possible) 0.
> - */
> -#pragma GCC diagnostic push
> -#pragma GCC diagnostic ignored "-Wtype-limits"
> -
> - /* Add any HI_COMMPAGE not covered by reserved_va. */
> - if (reserved_va < HI_COMMPAGE) {
> - ga->bounds[n].lo = HI_COMMPAGE & qemu_real_host_page_mask();
> - ga->bounds[n].hi = HI_COMMPAGE + TARGET_PAGE_SIZE - 1;
> + /* Add any high COMMPAGE not covered by reserved_va. */
> + if (commpage_range && reserved_va < commpage_range->hi) {
> + ga->bounds[n].lo = commpage_range->lo &
> qemu_real_host_page_mask();
> + ga->bounds[n].hi = commpage_range->hi;
> n++;
> }
>
> -#pragma GCC diagnostic pop
> -
> ga->nbounds = n;
> return true;
> }
> @@ -926,7 +904,7 @@ static void pgb_fail_in_use(const char *image_name)
> }
>
> static void pgb_fixed(const char *image_name, const PGBRange *image_range,
> - uintptr_t align)
> + const PGBRange *commpage_range, uintptr_t align)
> {
> PGBAddrs ga;
> uintptr_t brk = (uintptr_t)sbrk(0);
> @@ -938,7 +916,7 @@ static void pgb_fixed(const char *image_name, const
> PGBRange *image_range,
> exit(EXIT_FAILURE);
> }
>
> - if (!pgb_addr_set(&ga, image_range, !guest_base)
> + if (!pgb_addr_set(&ga, image_range, commpage_range, !guest_base)
> || !pgb_try_mmap_set(&ga, guest_base, brk)) {
> pgb_fail_in_use(image_name);
> }
> @@ -1024,14 +1002,14 @@ static uintptr_t pgb_find_itree(const PGBAddrs
> *ga, IntervalTreeRoot *root,
> }
>
> static void pgb_dynamic(const char *image_name, const PGBRange
> *image_range,
> - uintptr_t align)
> + const PGBRange *commpage_range, uintptr_t align)
> {
> IntervalTreeRoot *root;
> uintptr_t brk, ret;
> PGBAddrs ga;
>
> /* Try the identity map first. */
> - if (pgb_addr_set(&ga, image_range, true)) {
> + if (pgb_addr_set(&ga, image_range, commpage_range, true)) {
> brk = (uintptr_t)sbrk(0);
> if (pgb_try_mmap_set(&ga, 0, brk)) {
> guest_base = 0;
> @@ -1043,7 +1021,7 @@ static void pgb_dynamic(const char *image_name,
> const PGBRange *image_range,
> * Rebuild the address set for non-identity map.
> * This differs in the mapping of the guest NULL page.
> */
> - pgb_addr_set(&ga, image_range, false);
> + pgb_addr_set(&ga, image_range, commpage_range, false);
>
> root = read_self_maps();
>
> @@ -1084,6 +1062,14 @@ static void pgb_dynamic(const char *image_name,
> const PGBRange *image_range,
>
> void probe_guest_base(const char *image_name, const PGBRange *image_range)
> {
> +#ifdef COMMPAGE
> + const PGBRange * const commpage_range = &(PGBRange){
> + COMMPAGE, COMMPAGE + TARGET_PAGE_SIZE - 1
> + };
> +#else
> + const PGBRange * const commpage_range = NULL;
> +#endif
> +
> /* In order to use host shmat, we must be able to honor SHMLBA. */
> uintptr_t align = MAX(SHMLBA, TARGET_PAGE_SIZE);
>
> @@ -1096,9 +1082,9 @@ void probe_guest_base(const char *image_name, const
> PGBRange *image_range)
> }
>
> if (have_guest_base) {
> - pgb_fixed(image_name, image_range, align);
> + pgb_fixed(image_name, image_range, commpage_range, align);
> } else {
> - pgb_dynamic(image_name, image_range, align);
> + pgb_dynamic(image_name, image_range, commpage_range, align);
> }
>
> /* Reserve and initialize the commpage. */
> diff --git a/linux-user/hppa/elfload.c b/linux-user/hppa/elfload.c
> index 3354e1b840..3bfe93ada8 100644
> --- a/linux-user/hppa/elfload.c
> +++ b/linux-user/hppa/elfload.c
> @@ -35,7 +35,7 @@ bool init_guest_commpage(void)
> if (!reserved_va) {
> void *want, *addr;
>
> - want = g2h_untagged(LO_COMMPAGE);
> + want = g2h_untagged(COMMPAGE);
> addr = mmap(want, TARGET_PAGE_SIZE, PROT_NONE,
> MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED_NOREPLACE,
> -1, 0);
> if (addr == MAP_FAILED) {
> @@ -54,7 +54,7 @@ bool init_guest_commpage(void)
> * and implement syscalls. Here, simply mark the page executable.
> * Special case the entry points during translation (see
> do_page_zero).
> */
> - page_set_flags(LO_COMMPAGE, LO_COMMPAGE | ~TARGET_PAGE_MASK,
> + page_set_flags(COMMPAGE, COMMPAGE | ~TARGET_PAGE_MASK,
> PAGE_EXEC | PAGE_VALID, PAGE_VALID);
> return true;
> }
> --
> 2.43.0
>
>