From: "Alex Bennée" <alex.bennee@linaro.org>
To: Richard Henderson <richard.henderson@linaro.org>
Cc: pbonzini@redhat.com, philmd@linaro.org, laurent@vivier.eu,
deller@gmx.de, Akihiko Odaki <akihiko.odaki@daynix.com>,
qemu-devel@nongnu.org
Subject: Re: [PATCH for-8.1 v10 01/14] linux-user: Adjust task_unmapped_base for reserved_va
Date: Tue, 08 Aug 2023 10:10:34 +0100 [thread overview]
Message-ID: <87wmy599j3.fsf@linaro.org> (raw)
In-Reply-To: <20230807163705.9848-2-richard.henderson@linaro.org>
Richard Henderson <richard.henderson@linaro.org> writes:
> Ensure that the chosen values for mmap_next_start and
> task_unmapped_base are within the guest address space.
>
> Tested-by: Helge Deller <deller@gmx.de>
> Reviewed-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> linux-user/user-mmap.h | 18 +++++++++++++++++-
> linux-user/main.c | 28 ++++++++++++++++++++++++++++
> linux-user/mmap.c | 18 +++---------------
> 3 files changed, 48 insertions(+), 16 deletions(-)
>
> diff --git a/linux-user/user-mmap.h b/linux-user/user-mmap.h
> index 7265c2c116..fd456e024e 100644
> --- a/linux-user/user-mmap.h
> +++ b/linux-user/user-mmap.h
> @@ -18,6 +18,23 @@
> #ifndef LINUX_USER_USER_MMAP_H
> #define LINUX_USER_USER_MMAP_H
>
> +#if HOST_LONG_BITS == 64 && TARGET_ABI_BITS == 64
> +#ifdef TARGET_AARCH64
> +# define TASK_UNMAPPED_BASE 0x5500000000
> +#else
> +# define TASK_UNMAPPED_BASE (1ul << 38)
> +#endif
> +#else
> +#ifdef TARGET_HPPA
> +# define TASK_UNMAPPED_BASE 0xfa000000
> +#else
> +# define TASK_UNMAPPED_BASE 0x40000000
> +#endif
> +#endif
> +
> +extern abi_ulong task_unmapped_base;
> +extern abi_ulong mmap_next_start;
> +
> int target_mprotect(abi_ulong start, abi_ulong len, int prot);
> abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
> int flags, int fd, off_t offset);
> @@ -26,7 +43,6 @@ abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
> abi_ulong new_size, unsigned long flags,
> abi_ulong new_addr);
> abi_long target_madvise(abi_ulong start, abi_ulong len_in, int advice);
> -extern abi_ulong mmap_next_start;
> abi_ulong mmap_find_vma(abi_ulong, abi_ulong, abi_ulong);
> void mmap_fork_start(void);
> void mmap_fork_end(int child);
> diff --git a/linux-user/main.c b/linux-user/main.c
> index 556956c363..be621dc792 100644
> --- a/linux-user/main.c
> +++ b/linux-user/main.c
> @@ -821,6 +821,34 @@ int main(int argc, char **argv, char **envp)
> reserved_va = max_reserved_va;
> }
>
> + /*
> + * Temporarily disable
> + * "comparison is always false due to limited range of data type"
> + * due to comparison between (possible) uint64_t and uintptr_t.
> + */
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wtype-limits"
> +
> + /*
> + * Select an initial value for task_unmapped_base that is in range.
> + */
> + if (reserved_va) {
> + if (TASK_UNMAPPED_BASE < reserved_va) {
> + task_unmapped_base = TASK_UNMAPPED_BASE;
> + } else {
> + /* The most common default formula is TASK_SIZE / 3. */
> + task_unmapped_base = TARGET_PAGE_ALIGN(reserved_va / 3);
> + }
> + } else if (TASK_UNMAPPED_BASE < UINTPTR_MAX) {
> + task_unmapped_base = TASK_UNMAPPED_BASE;
> + } else {
> + /* 32-bit host: pick something medium size. */
> + task_unmapped_base = 0x10000000;
> + }
> + mmap_next_start = task_unmapped_base;
> +
> +#pragma GCC diagnostic pop
> +
> {
> Error *err = NULL;
> if (seed_optarg != NULL) {
> diff --git a/linux-user/mmap.c b/linux-user/mmap.c
> index eb04fab8ab..84436d45c8 100644
> --- a/linux-user/mmap.c
> +++ b/linux-user/mmap.c
> @@ -299,20 +299,8 @@ static bool mmap_frag(abi_ulong real_start, abi_ulong start, abi_ulong last,
> return true;
> }
>
> -#if HOST_LONG_BITS == 64 && TARGET_ABI_BITS == 64
> -#ifdef TARGET_AARCH64
> -# define TASK_UNMAPPED_BASE 0x5500000000
> -#else
> -# define TASK_UNMAPPED_BASE (1ul << 38)
> -#endif
> -#else
> -#ifdef TARGET_HPPA
> -# define TASK_UNMAPPED_BASE 0xfa000000
> -#else
> -# define TASK_UNMAPPED_BASE 0x40000000
> -#endif
> -#endif
> -abi_ulong mmap_next_start = TASK_UNMAPPED_BASE;
> +abi_ulong task_unmapped_base;
> +abi_ulong mmap_next_start;
I feel we could help ourselves a bit more by documenting these globals
and what they mean:
task_unmapped_base represents the start of unmapped memory in the
guests programs address space. It is generally a function of the size
of the address space and it defined at the start of execution.
mmap_next_start is the base address for the next anonymous mmap and is
increased after each successful map, starting at task_unmapped_base.
One thing I'm slightly confused by is the ELF_ET_DYN_BASE can be above
this (or sometimes the same). Should the mapping of ELF segments be
handled with mmap_next_start? I assume once mmap_next_start meets the
mappings for the ELF segments we skip over until we get to more free
space after the program code?
>
> /*
> * Subroutine of mmap_find_vma, used when we have pre-allocated
> @@ -391,7 +379,7 @@ abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size, abi_ulong align)
>
> if ((addr & (align - 1)) == 0) {
> /* Success. */
> - if (start == mmap_next_start && addr >= TASK_UNMAPPED_BASE) {
> + if (start == mmap_next_start && addr >= task_unmapped_base) {
> mmap_next_start = addr + size;
> }
> return addr;
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
next prev parent reply other threads:[~2023-08-08 9:19 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-07 16:36 [PATCH for-8.1 v10 00/14] linux-user: image mapping fixes Richard Henderson
2023-08-07 16:36 ` [PATCH for-8.1 v10 01/14] linux-user: Adjust task_unmapped_base for reserved_va Richard Henderson
2023-08-08 9:10 ` Alex Bennée [this message]
2023-08-08 15:16 ` Richard Henderson
2023-08-08 16:59 ` Alex Bennée
2023-08-08 17:40 ` Richard Henderson
2023-08-08 15:35 ` Helge Deller
2023-08-07 16:36 ` [PATCH for-8.1 v10 02/14] linux-user: Define TASK_UNMAPPED_BASE in $guest/target_mman.h Richard Henderson
2023-08-08 9:19 ` Alex Bennée
2023-08-07 16:36 ` [PATCH for-8.1 v10 03/14] linux-user: Define ELF_ET_DYN_BASE " Richard Henderson
2023-08-07 16:36 ` [PATCH for-8.1 v10 04/14] linux-user: Use MAP_FIXED_NOREPLACE for initial image mmap Richard Henderson
2023-08-08 9:43 ` Alex Bennée
2023-08-08 11:57 ` Akihiko Odaki
2023-08-08 13:48 ` Alex Bennée
2023-08-08 14:08 ` Akihiko Odaki
2023-08-08 14:20 ` Alex Bennée
2023-08-07 16:36 ` [PATCH for-8.1 v10 05/14] linux-user: Use elf_et_dyn_base for ET_DYN with interpreter Richard Henderson
2023-08-08 9:49 ` Alex Bennée
2023-08-07 16:36 ` [PATCH for-8.1 v10 06/14] linux-user: Adjust initial brk when interpreter is close to executable Richard Henderson
2023-08-08 10:54 ` Alex Bennée
2023-08-07 16:36 ` [PATCH for-8.1 v10 07/14] linux-user: Do not adjust image mapping for host page size Richard Henderson
2023-08-08 10:59 ` Alex Bennée
2023-08-07 16:36 ` [PATCH for-8.1 v10 08/14] linux-user: Do not adjust zero_bss " Richard Henderson
2023-08-08 11:38 ` Alex Bennée
2023-08-08 15:56 ` Richard Henderson
2023-08-07 16:37 ` [PATCH for-8.1 v10 09/14] linux-user: Use zero_bss for PT_LOAD with no file contents too Richard Henderson
2023-08-08 11:43 ` Alex Bennée
2023-08-07 16:37 ` [PATCH for-8.1 v10 10/14] util/selfmap: Rewrite using qemu/interval-tree.h Richard Henderson
2023-08-07 18:17 ` Richard Henderson
2023-08-09 15:11 ` Fix interval_tree_iter_first() to check root node value Helge Deller
2023-08-09 15:23 ` Richard Henderson
2023-08-09 15:53 ` Helge Deller
2023-08-09 16:33 ` Richard Henderson
2023-08-10 21:31 ` [PATCH for-8.1 v10 10/14] util/selfmap: Rewrite using qemu/interval-tree.h Ilya Leoshkevich
2023-08-10 22:06 ` Helge Deller
2023-08-08 6:15 ` Michael Tokarev
2023-08-07 16:37 ` [PATCH for-8.1 v10 11/14] linux-user: Remove duplicate CPU_LOG_PAGE from probe_guest_base Richard Henderson
2023-08-08 11:45 ` Alex Bennée
2023-08-07 16:37 ` [PATCH for-8.1 v10 12/14] linux-user: Consolidate guest bounds check in probe_guest_base Richard Henderson
2023-08-08 11:46 ` Alex Bennée
2023-08-07 16:37 ` [PATCH for-8.1 v10 13/14] linux-user: Rewrite fixed probe_guest_base Richard Henderson
2023-08-08 16:39 ` Alex Bennée
2023-08-07 16:37 ` [PATCH for-8.1 v10 14/14] linux-user: Rewrite non-fixed probe_guest_base Richard Henderson
2023-08-08 16:58 ` Alex Bennée
2023-08-08 17:00 ` [PATCH for-8.1 v10 00/14] linux-user: image mapping fixes Alex Bennée
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wmy599j3.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=akihiko.odaki@daynix.com \
--cc=deller@gmx.de \
--cc=laurent@vivier.eu \
--cc=pbonzini@redhat.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.