All of lore.kernel.org
 help / color / mirror / Atom feed
From: imp@bsdimp.com
To: qemu-devel@nongnu.org
Cc: Stacey Son <sson@FreeBSD.org>,
	Richard Henderson <richard.henderson@linaro.org>,
	Warner Losh <imp@FreeBSD.org>, Warner Losh <imp@bsdimp.com>
Subject: [PATCH v2 28/43] bsd-user: Add system independent stack, data and text limiting
Date: Thu, 26 Aug 2021 15:11:46 -0600	[thread overview]
Message-ID: <20210826211201.98877-29-imp@bsdimp.com> (raw)
In-Reply-To: <20210826211201.98877-1-imp@bsdimp.com>

From: Warner Losh <imp@FreeBSD.org>

Eliminate the x86 specific stack stuff in favor of more generic control
over the process size:
    target_maxtsiz  max text size
    target_dfldsiz  initial data size limit
    target_maxdsiz  max data size
    target_dflssiz  initial stack size limit
    target_maxssiz  max stack size
    target_sgrowsiz amount to grow stack
These can be set on a per-arch basis, and the stack size can be set
on the command line. Adjust the stack size parameters at startup.

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/elfload.c |  2 +-
 bsd-user/main.c    | 51 +++++++++++++++++++++++++++++++++-------------
 bsd-user/qemu.h    |  7 ++++++-
 3 files changed, 44 insertions(+), 16 deletions(-)

diff --git a/bsd-user/elfload.c b/bsd-user/elfload.c
index 70a0f81f3d..5ceb60b1c2 100644
--- a/bsd-user/elfload.c
+++ b/bsd-user/elfload.c
@@ -204,7 +204,7 @@ static abi_ulong setup_arg_pages(abi_ulong p, struct bsd_binprm *bprm,
     /* Create enough stack to hold everything.  If we don't use
      * it for args, we'll use it for something else...
      */
-    size = x86_stack_size;
+    size = target_dflssiz;
     if (size < MAX_ARG_PAGES * TARGET_PAGE_SIZE)
         size = MAX_ARG_PAGES * TARGET_PAGE_SIZE;
     error = target_mmap(0,
diff --git a/bsd-user/main.c b/bsd-user/main.c
index f16d6c80e2..f6643896f6 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -18,6 +18,11 @@
  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/sysctl.h>
+
 #include "qemu/osdep.h"
 #include "qemu-common.h"
 #include "qemu/units.h"
@@ -44,8 +49,6 @@
 #include "host-os.h"
 #include "target_arch_cpu.h"
 
-#include <sys/sysctl.h>
-
 int singlestep;
 unsigned long mmap_min_addr;
 uintptr_t guest_base;
@@ -57,12 +60,12 @@ const char *qemu_uname_release;
 enum BSDType bsd_type;
 char qemu_proc_pathname[PATH_MAX];  /* full path to exeutable */
 
-/*
- * XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
- * we allocate a bigger stack. Need a better solution, for example
- * by remapping the process stack directly at the right place
- */
-unsigned long x86_stack_size = 512 * 1024;
+unsigned long target_maxtsiz = TARGET_MAXTSIZ;   /* max text size */
+unsigned long target_dfldsiz = TARGET_DFLDSIZ;   /* initial data size limit */
+unsigned long target_maxdsiz = TARGET_MAXDSIZ;   /* max data size */
+unsigned long target_dflssiz = TARGET_DFLSSIZ;   /* initial data size limit */
+unsigned long target_maxssiz = TARGET_MAXSSIZ;   /* max stack size */
+unsigned long target_sgrowsiz = TARGET_SGROWSIZ; /* amount to grow stack */
 
 void gemu_log(const char *fmt, ...)
 {
@@ -112,7 +115,6 @@ static void usage(void)
            "-d item1[,...]    enable logging of specified items\n"
            "                  (use '-d help' for a list of log items)\n"
            "-D logfile        write logs to 'logfile' (default stderr)\n"
-           "-p pagesize       set the host page size to 'pagesize'\n"
            "-singlestep       always run in singlestep mode\n"
            "-strace           log system calls\n"
            "-trace            [[enable=]<pattern>][,events=<file>][,file=<file>]\n"
@@ -132,7 +134,7 @@ static void usage(void)
            ,
            TARGET_NAME,
            interp_prefix,
-           x86_stack_size);
+           target_dflssiz);
     exit(1);
 }
 
@@ -161,6 +163,22 @@ void init_task_state(TaskState *ts)
     ts->sigqueue_table[i].next = NULL;
 }
 
+static void
+adjust_ssize(void)
+{
+    struct rlimit rl;
+
+    if (getrlimit(RLIMIT_STACK, &rl) != 0)
+        return;
+
+    target_maxssiz = MIN(target_maxssiz, rl.rlim_max);
+    target_dflssiz = MIN(MAX(target_dflssiz, rl.rlim_cur), target_maxssiz);
+
+    rl.rlim_max = target_maxssiz;
+    rl.rlim_cur = target_dflssiz;
+    setrlimit(RLIMIT_STACK, &rl);
+}
+
 static void save_proc_pathname(char *argv0)
 {
     int mib[4];
@@ -197,6 +215,8 @@ int main(int argc, char **argv)
     envlist_t *envlist = NULL;
     bsd_type = HOST_DEFAULT_BSD_TYPE;
 
+    adjust_ssize();
+
     if (argc <= 1) {
         usage();
     }
@@ -257,14 +277,17 @@ int main(int argc, char **argv)
             }
         } else if (!strcmp(r, "s")) {
             r = argv[optind++];
-            rv = qemu_strtoul(r, &r, 0, &x86_stack_size);
-            if (rv < 0 || x86_stack_size <= 0) {
+            rv = qemu_strtoul(r, &r, 0, &target_dflssiz);
+            if (rv < 0 || target_dflssiz <= 0) {
                 usage();
             }
             if (*r == 'M') {
-                x86_stack_size *= MiB;
+                target_dflssiz *= 1024 * 1024;
             } else if (*r == 'k' || *r == 'K') {
-                x86_stack_size *= KiB;
+                target_dflssiz *= 1024;
+            }
+            if (target_dflssiz > target_maxssiz) {
+                usage();
             }
         } else if (!strcmp(r, "L")) {
             interp_prefix = argv[optind++];
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index a9df7ab874..3e3bd96cff 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -220,7 +220,12 @@ void mmap_fork_end(int child);
 
 /* main.c */
 extern char qemu_proc_pathname[];
-extern unsigned long x86_stack_size;
+extern unsigned long target_maxtsiz;
+extern unsigned long target_dfldsiz;
+extern unsigned long target_maxdsiz;
+extern unsigned long target_dflssiz;
+extern unsigned long target_maxssiz;
+extern unsigned long target_sgrowsiz;
 
 /* user access */
 
-- 
2.32.0



  parent reply	other threads:[~2021-08-26 21:37 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-26 21:11 [PATCH v2 00/43] bsd-user updates to run hello world imp
2021-08-26 21:11 ` [PATCH v2 01/43] bsd-user: remove sparc and sparc64 imp
2021-08-26 21:11 ` [PATCH v2 02/43] bsd-user: add copyright header to elfload.c imp
2021-08-26 21:11 ` [PATCH v2 03/43] bsd-user: Add Stacey's copyright to main.c imp
2021-08-26 21:11 ` [PATCH v2 04/43] bsd-user: add license to bsdload.c imp
2021-08-26 21:11 ` [PATCH v2 05/43] bsd-user: style nits: bsdload.c whitespace to qemu standard imp
2021-08-26 21:11 ` [PATCH v2 06/43] bsd-user: Remove all non-x86 code from elfload.c imp
2021-08-26 21:11 ` [PATCH v2 07/43] bsd-user: move arch specific defines out of elfload.c imp
2021-08-27  4:19   ` Philippe Mathieu-Daudé
2021-08-27 15:50     ` Warner Losh
2021-08-26 21:11 ` [PATCH v2 08/43] bsd-user: pass the bsd_param into loader_exec imp
2021-08-27  4:22   ` Philippe Mathieu-Daudé
2021-08-27 15:49     ` Warner Losh
2021-08-26 21:11 ` [PATCH v2 09/43] bsd-user: Fix calculation of size to allocate imp
2021-08-26 21:11 ` [PATCH v2 10/43] bsd-user: implement path searching imp
2021-08-26 21:11 ` [PATCH v2 11/43] bsd-user: Eliminate elf personality imp
2021-08-26 21:11 ` [PATCH v2 12/43] bsd-user: remove a.out support imp
2021-08-27  4:27   ` Philippe Mathieu-Daudé
2021-08-26 21:11 ` [PATCH v2 13/43] bsd-user: TARGET_NGROUPS unused in this file, remove imp
2021-08-26 21:11 ` [PATCH v2 14/43] bsd-user: elfload: simplify bswap a bit imp
2021-08-26 21:11 ` [PATCH v2 15/43] bsd-user: assume pthreads and support of __thread imp
2021-08-27  4:35   ` Philippe Mathieu-Daudé
2021-08-26 21:11 ` [PATCH v2 16/43] bsd-user: add host-os.h imp
2021-08-26 21:11 ` [PATCH v2 17/43] bsd-user: Include host-os.h from main imp
2021-08-26 21:11 ` [PATCH v2 18/43] bsd-user: save the path to the qemu emulator imp
2021-08-26 21:11 ` [PATCH v2 19/43] bsd-user: start to move target CPU functions to target_arch* imp
2021-08-27  4:39   ` Philippe Mathieu-Daudé
2021-08-27 15:41     ` Warner Losh
2021-08-26 21:11 ` [PATCH v2 20/43] bsd-user: Move per-cpu code into target_arch_cpu.h imp
2021-08-26 21:11 ` [PATCH v2 21/43] bsd-user: pull in target_arch_thread.h update target_arch_elf.h imp
2021-08-26 21:11 ` [PATCH v2 22/43] bsd-user: Include more things in qemu.h imp
2021-08-26 21:11 ` [PATCH v2 23/43] bsd-user: define max args in terms of pages imp
2021-08-26 21:11 ` [PATCH v2 24/43] bsd-user: Create target specific vmparam.h imp
2021-08-26 21:11 ` [PATCH v2 25/43] bsd-user: Add architecture specific signal tramp code imp
2021-08-26 21:11 ` [PATCH v2 26/43] bsd-user: *BSD specific siginfo defintions imp
2021-08-26 21:11 ` [PATCH v2 27/43] bsd-user: Move stack initializtion into a per-os file imp
2021-08-26 21:11 ` imp [this message]
2021-08-26 21:11 ` [PATCH v2 29/43] bsd-user: elf cleanup imp
2021-08-26 21:11 ` [PATCH v2 30/43] bsd-user: Remove dead #ifdefs from elfload.c imp
2021-08-27  4:42   ` Philippe Mathieu-Daudé
2021-08-27 15:02     ` Warner Losh
2021-08-27 15:58       ` Philippe Mathieu-Daudé
2021-08-27 16:28         ` Warner Losh
2021-08-26 21:11 ` [PATCH v2 31/43] bsd-user: Rewrite target system call definintion glue imp
2021-08-26 21:11 ` [PATCH v2 32/43] bsd-user: Make cpu_model and cpu_type visible to all of main.c imp
2021-08-26 21:11 ` [PATCH v2 33/43] bsd-user: update debugging in mmap.c imp
2021-08-26 21:11 ` [PATCH v2 34/43] bsd-user: Add target_arch_reg to describe a target's register set imp
2021-08-26 21:11 ` [PATCH v2 35/43] bsd-user: Add target_os_user.h to capture the user/kernel structures imp
2021-08-26 21:11 ` [PATCH v2 36/43] bsd-user: add stubbed out core dump support imp
2021-08-26 21:11 ` [PATCH v2 37/43] bsd-user: elfload.c style catch up patch imp
2021-08-26 21:11 ` [PATCH v2 38/43] bsd-user: Refactor load_elf_sections and is_target_elf_binary imp
2021-08-27 21:23   ` Warner Losh
2021-08-26 21:11 ` [PATCH v2 39/43] bsd-user: move qemu_log to later in the file imp
2021-08-26 21:11 ` [PATCH v2 40/43] bsd-user: Implement interlock for atomic operations imp
2021-08-26 21:11 ` [PATCH v2 41/43] bsd-user: Implement cpu_copy() helper routine imp
2021-08-27  4:47   ` Philippe Mathieu-Daudé
2021-08-27 14:56     ` Warner Losh
2021-08-27 16:00       ` Philippe Mathieu-Daudé
2021-08-27 16:30         ` Warner Losh
2021-08-26 21:12 ` [PATCH v2 42/43] bsd-user: Add '-0 argv0' option to bsd-user/main.c imp
2021-08-27  4:48   ` Philippe Mathieu-Daudé
2021-08-27 14:52     ` Warner Losh
2021-08-26 21:12 ` [PATCH v2 43/43] bsd-user: Update mapping to handle reserved and starting conditions imp

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=20210826211201.98877-29-imp@bsdimp.com \
    --to=imp@bsdimp.com \
    --cc=imp@FreeBSD.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=sson@FreeBSD.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.