From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Cc: laurent@vivier.eu
Subject: [Qemu-devel] [PATCH v7 16/74] linux-user: Split out brk
Date: Sun, 19 May 2019 13:36:28 -0700 [thread overview]
Message-ID: <20190519203726.20729-17-richard.henderson@linaro.org> (raw)
In-Reply-To: <20190519203726.20729-1-richard.henderson@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
linux-user/syscall-defs.h | 3 ++
linux-user/strace.c | 35 --------------
linux-user/syscall-mem.inc.c | 90 ++++++++++++++++++++++++++++++++++
linux-user/syscall.c | 93 ------------------------------------
linux-user/strace.list | 3 --
5 files changed, 93 insertions(+), 131 deletions(-)
diff --git a/linux-user/syscall-defs.h b/linux-user/syscall-defs.h
index 88aa1a6bfd..c3ed22ff16 100644
--- a/linux-user/syscall-defs.h
+++ b/linux-user/syscall-defs.h
@@ -16,6 +16,9 @@
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
+SYSCALL_DEF_FULL(brk, .impl = impl_brk,
+ .print_ret = print_syscall_ptr_ret,
+ .arg_type = { ARG_PTR });
SYSCALL_DEF(close, ARG_DEC);
SYSCALL_DEF(exit, ARG_DEC);
#ifdef TARGET_NR_ipc
diff --git a/linux-user/strace.c b/linux-user/strace.c
index a767227ac1..0a2c6764db 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -604,29 +604,6 @@ print_execve(const struct syscallname *name,
* Variants for the return value output function
*/
-static void
-print_syscall_ret_addr(const struct syscallname *name, abi_long ret)
-{
- const char *errstr = NULL;
-
- if (ret < 0) {
- errstr = target_strerror(-ret);
- }
- if (errstr) {
- gemu_log(" = -1 errno=%d (%s)\n", (int)-ret, errstr);
- } else {
- gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret);
- }
-}
-
-#if 0 /* currently unused */
-static void
-print_syscall_ret_raw(struct syscallname *name, abi_long ret)
-{
- gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret);
-}
-#endif
-
#ifdef TARGET_NR__newselect
static void
print_syscall_ret_newselect(const struct syscallname *name, abi_long ret)
@@ -1168,18 +1145,6 @@ print_access(const struct syscallname *name,
}
#endif
-#ifdef TARGET_NR_brk
-static void
-print_brk(const struct syscallname *name,
- abi_long arg0, abi_long arg1, abi_long arg2,
- abi_long arg3, abi_long arg4, abi_long arg5)
-{
- print_syscall_prologue(name);
- print_pointer(arg0, 1);
- print_syscall_epilogue(name);
-}
-#endif
-
#ifdef TARGET_NR_chdir
static void
print_chdir(const struct syscallname *name,
diff --git a/linux-user/syscall-mem.inc.c b/linux-user/syscall-mem.inc.c
index d2ce0cb8cc..17ba8e3d97 100644
--- a/linux-user/syscall-mem.inc.c
+++ b/linux-user/syscall-mem.inc.c
@@ -42,6 +42,96 @@ static bitmask_transtbl const mmap_flags_tbl[] = {
{ 0, 0, 0, 0 }
};
+static abi_ulong target_brk;
+static abi_ulong target_original_brk;
+static abi_ulong brk_page;
+
+void target_set_brk(abi_ulong new_brk)
+{
+ target_original_brk = target_brk = HOST_PAGE_ALIGN(new_brk);
+ brk_page = HOST_PAGE_ALIGN(target_brk);
+}
+
+/* do_brk() must return target values and target errnos. */
+abi_long do_brk(abi_ulong new_brk)
+{
+ abi_long mapped_addr;
+ abi_ulong new_alloc_size;
+
+ if (!new_brk) {
+ return target_brk;
+ }
+ if (new_brk < target_original_brk) {
+ return target_brk;
+ }
+
+ /*
+ * If the new brk is less than the highest page reserved to the
+ * target heap allocation, set it and we're almost done...
+ */
+ if (new_brk <= brk_page) {
+ /*
+ * Heap contents are initialized to zero,
+ * as for anonymous mapped pages.
+ */
+ if (new_brk > target_brk) {
+ memset(g2h(target_brk), 0, new_brk - target_brk);
+ }
+ target_brk = new_brk;
+ return target_brk;
+ }
+
+ /*
+ * We need to allocate more memory after the brk... Note that
+ * we don't use MAP_FIXED because that will map over the top of
+ * any existing mapping (like the one with the host libc or qemu
+ * itself); instead we treat "mapped but at wrong address" as
+ * a failure and unmap again.
+ */
+ new_alloc_size = HOST_PAGE_ALIGN(new_brk - brk_page);
+ mapped_addr = get_errno(target_mmap(brk_page, new_alloc_size,
+ PROT_READ | PROT_WRITE,
+ MAP_ANON | MAP_PRIVATE, 0, 0));
+
+ if (mapped_addr == brk_page) {
+ /*
+ * Heap contents are initialized to zero, as for anonymous
+ * mapped pages. Technically the new pages are already
+ * initialized to zero since they *are* anonymous mapped
+ * pages, however we have to take care with the contents that
+ * come from the remaining part of the previous page: it may
+ * contains garbage data due to a previous heap usage (grown
+ * then shrunken).
+ */
+ memset(g2h(target_brk), 0, brk_page - target_brk);
+
+ target_brk = new_brk;
+ brk_page = HOST_PAGE_ALIGN(target_brk);
+ return target_brk;
+ } else if (mapped_addr != -1) {
+ /*
+ * Mapped but at wrong address, meaning there wasn't actually
+ * enough space for this brk.
+ */
+ target_munmap(mapped_addr, new_alloc_size);
+ mapped_addr = -1;
+ }
+
+#if defined(TARGET_ALPHA)
+ /*
+ * We (partially) emulate OSF/1 on Alpha, which requires we
+ * return a proper errno, not an unchanged brk value.
+ */
+ return -TARGET_ENOMEM;
+#endif
+ /* For everything else, return the previous break. */
+ return target_brk;
+}
+
+SYSCALL_IMPL(brk)
+{
+ return do_brk(arg1);
+}
SYSCALL_IMPL(mlock)
{
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index c72d24aa76..4c9953a7ab 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -820,97 +820,6 @@ static inline int host_to_target_sock_type(int host_type)
return target_type;
}
-static abi_ulong target_brk;
-static abi_ulong target_original_brk;
-static abi_ulong brk_page;
-
-void target_set_brk(abi_ulong new_brk)
-{
- target_original_brk = target_brk = HOST_PAGE_ALIGN(new_brk);
- brk_page = HOST_PAGE_ALIGN(target_brk);
-}
-
-//#define DEBUGF_BRK(message, args...) do { fprintf(stderr, (message), ## args); } while (0)
-#define DEBUGF_BRK(message, args...)
-
-/* do_brk() must return target values and target errnos. */
-abi_long do_brk(abi_ulong new_brk)
-{
- abi_long mapped_addr;
- abi_ulong new_alloc_size;
-
- DEBUGF_BRK("do_brk(" TARGET_ABI_FMT_lx ") -> ", new_brk);
-
- if (!new_brk) {
- DEBUGF_BRK(TARGET_ABI_FMT_lx " (!new_brk)\n", target_brk);
- return target_brk;
- }
- if (new_brk < target_original_brk) {
- DEBUGF_BRK(TARGET_ABI_FMT_lx " (new_brk < target_original_brk)\n",
- target_brk);
- return target_brk;
- }
-
- /* If the new brk is less than the highest page reserved to the
- * target heap allocation, set it and we're almost done... */
- if (new_brk <= brk_page) {
- /* Heap contents are initialized to zero, as for anonymous
- * mapped pages. */
- if (new_brk > target_brk) {
- memset(g2h(target_brk), 0, new_brk - target_brk);
- }
- target_brk = new_brk;
- DEBUGF_BRK(TARGET_ABI_FMT_lx " (new_brk <= brk_page)\n", target_brk);
- return target_brk;
- }
-
- /* We need to allocate more memory after the brk... Note that
- * we don't use MAP_FIXED because that will map over the top of
- * any existing mapping (like the one with the host libc or qemu
- * itself); instead we treat "mapped but at wrong address" as
- * a failure and unmap again.
- */
- new_alloc_size = HOST_PAGE_ALIGN(new_brk - brk_page);
- mapped_addr = get_errno(target_mmap(brk_page, new_alloc_size,
- PROT_READ|PROT_WRITE,
- MAP_ANON|MAP_PRIVATE, 0, 0));
-
- if (mapped_addr == brk_page) {
- /* Heap contents are initialized to zero, as for anonymous
- * mapped pages. Technically the new pages are already
- * initialized to zero since they *are* anonymous mapped
- * pages, however we have to take care with the contents that
- * come from the remaining part of the previous page: it may
- * contains garbage data due to a previous heap usage (grown
- * then shrunken). */
- memset(g2h(target_brk), 0, brk_page - target_brk);
-
- target_brk = new_brk;
- brk_page = HOST_PAGE_ALIGN(target_brk);
- DEBUGF_BRK(TARGET_ABI_FMT_lx " (mapped_addr == brk_page)\n",
- target_brk);
- return target_brk;
- } else if (mapped_addr != -1) {
- /* Mapped but at wrong address, meaning there wasn't actually
- * enough space for this brk.
- */
- target_munmap(mapped_addr, new_alloc_size);
- mapped_addr = -1;
- DEBUGF_BRK(TARGET_ABI_FMT_lx " (mapped_addr != -1)\n", target_brk);
- }
- else {
- DEBUGF_BRK(TARGET_ABI_FMT_lx " (otherwise)\n", target_brk);
- }
-
-#if defined(TARGET_ALPHA)
- /* We (partially) emulate OSF/1 on Alpha, which requires we
- return a proper errno, not an unchanged brk value. */
- return -TARGET_ENOMEM;
-#endif
- /* For everything else, return the previous break. */
- return target_brk;
-}
-
static inline abi_long copy_from_user_fdset(fd_set *fds,
abi_ulong target_fds_addr,
int n)
@@ -5681,8 +5590,6 @@ static abi_long do_syscall1(void *cpu_env, int num, abi_long arg1,
void *p;
switch(num) {
- case TARGET_NR_brk:
- return do_brk(arg1);
#ifdef TARGET_NR_fork
case TARGET_NR_fork:
return get_errno(do_fork(cpu_env, TARGET_SIGCHLD, 0, 0, 0, 0));
diff --git a/linux-user/strace.list b/linux-user/strace.list
index cc0bb10a7a..aff6d1d73d 100644
--- a/linux-user/strace.list
+++ b/linux-user/strace.list
@@ -49,9 +49,6 @@
#ifdef TARGET_NR_break
{ TARGET_NR_break, "break" , NULL, NULL, NULL },
#endif
-#ifdef TARGET_NR_brk
-{ TARGET_NR_brk, "brk" , NULL, print_brk, print_syscall_ret_addr },
-#endif
#ifdef TARGET_NR_cachectl
{ TARGET_NR_cachectl, "cachectl" , NULL, NULL, NULL },
#endif
--
2.17.1
next prev parent reply other threads:[~2019-05-19 20:49 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-19 20:36 [Qemu-devel] [PATCH v7 00/74] linux-user: Split do_syscall Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 01/74] linux-user: Setup split syscall infrastructure Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 02/74] linux-user: Split out open, open_at Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 03/74] linux-user: Share more code for open and openat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 04/74] linux-user: Tidy do_openat loop over fakes Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 05/74] linux-user: Split out readlink, readlinkat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 06/74] linux-user: Split out close Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 07/74] linux-user: Split out read, write Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 08/74] linux-user: Reduce regpairs_aligned & target_offset64 ifdefs Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 09/74] linux-user: Split out readv, writev Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 10/74] linux-user: Split out pread64, pwrite64 Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 11/74] linux-user: Split out preadv, pwritev Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 12/74] linux-user: Split out name_to_handle_at, open_by_handle_at Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 13/74] linux-user: Split out ipc syscalls Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 14/74] linux-user: Split out memory syscalls Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 15/74] linux-user: Split out exit Richard Henderson
2019-05-19 20:36 ` Richard Henderson [this message]
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 17/74] linux-user: Split out clone, fork, vfork Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 18/74] linux-user: Split out wait4, waitid, waitpid Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 19/74] linux-user: Implement rusage argument to waitid Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 20/74] linux-user: Split out creat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 21/74] linux-user: Split out link, linkat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 22/74] linux-user: Split out unlink, unlinkat, rmdir Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 23/74] linux-user: Split out execve Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 24/74] linux-user: Implement execveat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 25/74] linux-user: Split out chdir Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 26/74] linux-user: Split out time Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 27/74] linux-user: Split out mknod, mknodat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 28/74] linux-user: Split out chmod, fchmod, fchmodat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 29/74] linux-user: Split out lseek, llseek Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 30/74] linux-user: Split out getpid, getppid, getxpid Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 31/74] linux-user: Split out mount Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 32/74] linux-user: Split out umount, umount2 Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 33/74] linux-user: Split out stime Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 34/74] linux-user: Split out alarm, pause Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 35/74] linux-user: Split out utime, utimes, futimesat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 36/74] linux-user: Split out access, faccessat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 37/74] linux-user: Split out nice Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 38/74] linux-user: Split out sync, syncfs Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 39/74] linux-user: Split out kill Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 40/74] linux-user: Split out rename, renameat, renameat2 Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 41/74] linux-user: Split out mkdir, mkdirat Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 42/74] linux-user: Split out dup, dup2, dup3 Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 43/74] linux-user: Split out pipe, pipe2 Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 44/74] linux-user: Split out times Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 45/74] linux-user: Split out acct Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 46/74] linux-user: Move syscall_init to the end Richard Henderson
2019-05-19 20:36 ` [Qemu-devel] [PATCH v7 47/74] linux-user: Split out ioctl Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 48/74] linux-user: Fix types in ioctl logging Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 49/74] linux-user: Remove sentinel from ioctl_entries Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 50/74] linux-user: Split out fcntl, fcntl64 Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 51/74] linux-user: Split out setpgid Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 52/74] linux-user: Split out umask Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 53/74] linux-user: Split out chroot Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 54/74] linux-user: Split out getpgid, getpgrp Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 55/74] linux-user: Split out getsid, setsid Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 56/74] linux-user: Split out sigaction, rt_sigaction Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 57/74] linux-user: Split out sgetmask, ssetmask Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 58/74] linux-user: Split out sigprocmask, rt_sigprocmask Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 59/74] linux-user: Split out sigpending, rt_sigpending Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 60/74] linux-user: Split out sigsuspend, rt_sigsuspend Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 61/74] linux-user: Split out rt_sigtimedwait Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 62/74] linux-user: Split out rt_sigqueueinfo, rt_tgsigqueueinfo Richard Henderson
2019-05-20 6:04 ` Aleksandar Markovic
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 63/74] linux-user: Split out sigreturn, rt_sigreturn Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 64/74] linux-user: Split out gethostname, sethostname Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 65/74] linux-user: Split out getrlimit, setrlimit Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 66/74] linux-user: Split out getrusage Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 67/74] linux-user: Split out gettimeofday, settimeofday Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 68/74] linux-user: Split out select, _newselect Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 69/74] linux-user: Split out pselect6 Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 70/74] linux-user: Split out symlink, symlinkat Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 71/74] linux-user: Split out swapon, swapoff Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 72/74] linux-user: Split out reboot Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 73/74] linux-user: Split out truncate, truncate64, ftruncate, ftruncate64 Richard Henderson
2019-05-19 20:37 ` [Qemu-devel] [PATCH v7 74/74] linux-user: Split out getpriority, setpriority Richard Henderson
2019-05-20 6:21 ` [Qemu-devel] [PATCH v7 00/74] linux-user: Split do_syscall Laurent Vivier
2019-05-20 9:42 ` Peter Maydell
2019-05-20 10:13 ` Aleksandar Markovic
2019-05-22 6:11 ` Aleksandar Markovic
[not found] ` <CAL1e-=i_=EQ02A1DGmVgqNi1ik=h39FZTOsxkGWfMa4ZoM6rjg@mail.gmail.com>
2019-05-22 11:29 ` Richard Henderson
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=20190519203726.20729-17-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--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).