qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: deller@gmx.de, laurent@vivier.eu, akihiko.odaki@daynix.com,
	joel@jms.id.au
Subject: [PATCH v7 09/14] linux-user: Adjust task_unmapped_base for reserved_va
Date: Wed,  2 Aug 2023 18:52:57 -0700	[thread overview]
Message-ID: <20230803015302.407219-10-richard.henderson@linaro.org> (raw)
In-Reply-To: <20230803015302.407219-1-richard.henderson@linaro.org>

Ensure that the chosen values for mmap_next_start and
task_unmapped_base are within the guest address space.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
 linux-user/user-mmap.h | 18 +++++++++++++++++-
 linux-user/main.c      | 26 ++++++++++++++++++++++++++
 linux-user/mmap.c      | 18 +++---------------
 3 files changed, 46 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 dba67ffa36..c207b783d5 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -821,6 +821,32 @@ int main(int argc, char **argv, char **envp)
         reserved_va = max_reserved_va;
     }
 
+    /*
+     * Promote X and Y to a common type and compare.
+     * ??? Perhaps better to locally disable -Werror=type-limits.
+     */
+#define LESS(X, Y) ((1 ? X : Y) < (1 ? Y : X))
+
+    /*
+     * Select an initial value for task_unmapped_base that is in range.
+     */
+    if (reserved_va) {
+        if (LESS(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 (LESS(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;
+
+#undef LESS
+
     {
         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;
 
 /*
  * 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;
-- 
2.34.1



  parent reply	other threads:[~2023-08-03  1:55 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-03  1:52 [PATCH v7 00/14] linux-user: brk fixes Richard Henderson
2023-08-03  1:52 ` [PATCH v7 01/14] linux-user: Unset MAP_FIXED_NOREPLACE for host Richard Henderson
2023-08-03  1:52 ` [PATCH v7 02/14] linux-user: Fix MAP_FIXED_NOREPLACE on old kernels Richard Henderson
2023-08-03  1:52 ` [PATCH v7 03/14] linux-user: Do not call get_errno() in do_brk() Richard Henderson
2023-08-03  1:52 ` [PATCH v7 04/14] linux-user: Use MAP_FIXED_NOREPLACE for do_brk() Richard Henderson
2023-08-03  1:52 ` [PATCH v7 05/14] linux-user: Do nothing if too small brk is specified Richard Henderson
2023-08-03  1:52 ` [PATCH v7 06/14] linux-user: Do not align brk with host page size Richard Henderson
2023-08-03  1:52 ` [PATCH v7 07/14] linux-user: Remove last_brk Richard Henderson
2023-08-03  1:52 ` [PATCH v7 08/14] bsd-user: " Richard Henderson
2023-08-03  1:52 ` Richard Henderson [this message]
2023-08-03  1:52 ` [PATCH v7 10/14] linux-user: Define TASK_UNMAPPED_BASE in $guest/target_mman.h Richard Henderson
2023-08-03  1:52 ` [PATCH v7 11/14] linux-user: Add ELF_ET_DYN_BASE Richard Henderson
2023-08-03  1:53 ` [PATCH v7 12/14] linux-user: Use elf_et_dyn_base for ET_DYN with interpreter Richard Henderson
2023-08-03  1:53 ` [PATCH v7 13/14] linux-user: Adjust initial brk when interpreter is close to executable Richard Henderson
2023-08-03 13:00   ` Helge Deller
2023-08-03  1:53 ` [PATCH v7 14/14] linux-user: Properly set image_info.brk in flatload Richard Henderson
2023-08-03 13:11 ` [PATCH v7 00/14] linux-user: brk fixes Joel Stanley
2023-08-03 13:55   ` Helge Deller
2023-08-03 14:17     ` Joel Stanley
2023-08-03 15:01       ` Helge Deller
2023-08-03 15:11         ` Richard Henderson
2023-08-03 16:09           ` Helge Deller
2023-08-03 15:20         ` Richard Henderson
2023-08-03 16:10           ` Helge Deller

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=20230803015302.407219-10-richard.henderson@linaro.org \
    --to=richard.henderson@linaro.org \
    --cc=akihiko.odaki@daynix.com \
    --cc=deller@gmx.de \
    --cc=joel@jms.id.au \
    --cc=laurent@vivier.eu \
    --cc=qemu-devel@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).