On Sat, May 30, 2026 at 3:12 PM Richard Henderson <
[email protected]> wrote:

> Collect into range instead of loaddr+hiaddr.
>
> Signed-off-by: Richard Henderson <[email protected]>
> ---
>  linux-user/elfload.c | 24 ++++++++++++------------
>  1 file changed, 12 insertions(+), 12 deletions(-)
>

Reviewed-by: Warner Losh <[email protected]>


> diff --git a/linux-user/elfload.c b/linux-user/elfload.c
> index e1e1ee4674..fb774adf25 100644
> --- a/linux-user/elfload.c
> +++ b/linux-user/elfload.c
> @@ -1278,7 +1278,8 @@ static void load_elf_image(const char *image_name,
> const ImageSource *src,
>                             char **pinterp_name)
>  {
>      g_autofree struct elf_phdr *phdr = NULL;
> -    abi_ulong load_addr, load_bias, loaddr, hiaddr, error, align;
> +    PGBRange range = { -1, 0 };
> +    abi_ulong load_addr, load_bias, error, align;
>      size_t reserve_size, align_size;
>      int i, prot_exec;
>      Error *err = NULL;
> @@ -1318,19 +1319,18 @@ static void load_elf_image(const char *image_name,
> const ImageSource *src,
>       * Find the maximum size of the image and allocate an appropriate
>       * amount of memory to handle that.  Locate the interpreter, if any.
>       */
> -    loaddr = -1, hiaddr = 0;
>      align = 0;
>      info->exec_stack = EXSTACK_DEFAULT;
>      for (i = 0; i < ehdr->e_phnum; ++i) {
>          struct elf_phdr *eppnt = phdr + i;
>          if (eppnt->p_type == PT_LOAD) {
>              abi_ulong a = eppnt->p_vaddr & TARGET_PAGE_MASK;
> -            if (a < loaddr) {
> -                loaddr = a;
> +            if (a < range.lo) {
> +                range.lo = a;
>              }
>              a = eppnt->p_vaddr + eppnt->p_memsz - 1;
> -            if (a > hiaddr) {
> -                hiaddr = a;
> +            if (a > range.hi) {
> +                range.hi = a;
>              }
>              ++info->nsegs;
>              align |= eppnt->p_align;
> @@ -1361,7 +1361,7 @@ static void load_elf_image(const char *image_name,
> const ImageSource *src,
>          }
>      }
>
> -    load_addr = loaddr;
> +    load_addr = range.lo;
>
>      align = pow2ceil(align);
>
> @@ -1371,13 +1371,13 @@ static void load_elf_image(const char *image_name,
> const ImageSource *src,
>               * Make sure that the low address does not conflict with
>               * MMAP_MIN_ADDR or the QEMU application itself.
>               */
> -            probe_guest_base(image_name, loaddr, hiaddr);
> +            probe_guest_base(image_name, range.lo, range.hi);
>          } else {
>              /*
>               * The binary is dynamic, but we still need to
>               * select guest_base.  In this case we pass a size.
>               */
> -            probe_guest_base(image_name, 0, hiaddr - loaddr);
> +            probe_guest_base(image_name, 0, range.hi - range.lo);
>
>              /*
>               * Avoid collision with the loader by providing a different
> @@ -1414,7 +1414,7 @@ static void load_elf_image(const char *image_name,
> const ImageSource *src,
>       * In both cases, we will overwrite pages in this range with mappings
>       * from the executable.
>       */
> -    reserve_size = (size_t)hiaddr - loaddr + 1;
> +    reserve_size = range.hi - range.lo + 1;
>      align_size = reserve_size;
>
>      if (ehdr->e_type != ET_EXEC && align > qemu_real_host_page_size()) {
> @@ -1443,7 +1443,7 @@ static void load_elf_image(const char *image_name,
> const ImageSource *src,
>          load_addr = align_addr;
>      }
>
> -    load_bias = load_addr - loaddr;
> +    load_bias = load_addr - range.lo;
>
>      if (elf_is_fdpic(ehdr)) {
>          struct elf32_fdpic_loadseg *loadsegs = info->loadsegs =
> @@ -1474,7 +1474,7 @@ static void load_elf_image(const char *image_name,
> const ImageSource *src,
>      info->start_data = -1;
>      info->end_data = 0;
>      /* Usual start for brk is after all sections of the main executable.
> */
> -    info->brk = TARGET_PAGE_ALIGN(hiaddr + load_bias);
> +    info->brk = TARGET_PAGE_ALIGN(range.hi + load_bias);
>      info->elf_flags = ehdr->e_flags;
>  #ifdef TARGET_MIPS
>      info->use_k0_tls = (ehdr->e_flags & EF_MIPS_MACH) ==
> EF_MIPS_MACH_OCTEON;
> --
> 2.43.0
>
>

Reply via email to