qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD.
@ 2023-09-09 19:36 Karim Taha
  2023-09-09 19:36 ` [PATCH v3 01/23] bsd-user: Implement struct target_ipc_perm Karim Taha
                   ` (22 more replies)
  0 siblings, 23 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Karim Taha

Upstream the implementation of the following mmap system calls, from the
qemu-bsd-user fork:
   mmap(2), munmap(2),
   mprotect(2),
   msync(2),
   mlock(2), munlock(2), mlockall(2), munlockall(2), mincore(2),
   madvise(2),
   minherit(2),
   shm_open(2),shm_open2(2), shm_rename2(2), shm_unlink(2), shmget(2), shmctl(2), shmat(2),
   shmdt(2)
   brk(2)

Karim Taha (2):
  bsd-user: Add bsd-mem.c to meson.build
  bsd-user: Implment madvise(2) to match the linux-user implementation.

Kyle Evans (2):
  bsd-user: Implement shm_open2(2) system call
  bsd-user: Implement shm_rename(2) system call

Stacey Son (18):
  bsd-user: Implement struct target_ipc_perm
  bsd-user: Implement struct target_shmid_ds
  bsd-user: Declarations for ipc_perm and shmid_ds conversion functions
  bsd-user: Introduce freebsd/os-misc.h to the source tree
  bsd-user: Implement target_set_brk function in bsd-mem.c instead of
    os-syscall.c
  bsd-user: Implement ipc_perm conversion between host and target.
  bsd-user: Implement shmid_ds conversion between host and target.
  bsd-user: Introduce bsd-mem.h to the source tree
  bsd-user: Implement mmap(2) and munmap(2)
  bsd-user: Implement mprotect(2)
  bsd-user: Implement msync(2)
  bsd-user: Implement mlock(2), munlock(2), mlockall(2), munlockall(2),
    minherit(2)
  bsd-user: Implement mincore(2)
  bsd-user: Implement do_obreak function
  bsd-user: Implement shm_open(2)
  bsd-user: Implement shm_unlink(2) and shmget(2)
  bsd-user: Implement shmctl(2)
  bsd-user: Implement shmat(2) and shmdt(2)

Warner Losh (1):
  bsd-user: Add stubs for vadvise(), sbrk() and sstk()

 bsd-user/bsd-mem.c            | 100 ++++++++
 bsd-user/bsd-mem.h            | 440 ++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-misc.h    |  94 ++++++++
 bsd-user/freebsd/os-syscall.c | 112 ++++++++-
 bsd-user/meson.build          |   1 +
 bsd-user/qemu-bsd.h           |  45 ++++
 bsd-user/syscall_defs.h       |  39 +++
 7 files changed, 827 insertions(+), 4 deletions(-)
 create mode 100644 bsd-user/bsd-mem.c
 create mode 100644 bsd-user/bsd-mem.h
 create mode 100644 bsd-user/freebsd/os-misc.h
 create mode 100644 bsd-user/qemu-bsd.h

-- 
2.42.0



^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH v3 01/23] bsd-user: Implement struct target_ipc_perm
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 02/23] bsd-user: Implement struct target_shmid_ds Karim Taha
                   ` (21 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/syscall_defs.h | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/bsd-user/syscall_defs.h b/bsd-user/syscall_defs.h
index e4825f2662..39a9bc8ed7 100644
--- a/bsd-user/syscall_defs.h
+++ b/bsd-user/syscall_defs.h
@@ -55,6 +55,23 @@ struct target_iovec {
     abi_long iov_len;   /* Number of bytes */
 };
 
+/*
+ * sys/ipc.h
+ */
+struct target_ipc_perm {
+    uint32_t    cuid;       /* creator user id */
+    uint32_t    cgid;       /* creator group id */
+    uint32_t    uid;        /* user id */
+    uint32_t    gid;        /* group id */
+    uint16_t    mode;       /* r/w permission */
+    uint16_t    seq;        /* sequence # */
+    abi_long    key;        /* user specified msg/sem/shm key */
+};
+
+#define TARGET_IPC_RMID 0   /* remove identifier */
+#define TARGET_IPC_SET  1   /* set options */
+#define TARGET_IPC_STAT 2   /* get options */
+
 /*
  *  sys/mman.h
  */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 02/23] bsd-user: Implement struct target_shmid_ds
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
  2023-09-09 19:36 ` [PATCH v3 01/23] bsd-user: Implement struct target_ipc_perm Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 03/23] bsd-user: Declarations for ipc_perm and shmid_ds conversion functions Karim Taha
                   ` (20 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/syscall_defs.h | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/bsd-user/syscall_defs.h b/bsd-user/syscall_defs.h
index 39a9bc8ed7..074df7bdd6 100644
--- a/bsd-user/syscall_defs.h
+++ b/bsd-user/syscall_defs.h
@@ -72,6 +72,26 @@ struct target_ipc_perm {
 #define TARGET_IPC_SET  1   /* set options */
 #define TARGET_IPC_STAT 2   /* get options */
 
+/*
+ * sys/shm.h
+ */
+struct target_shmid_ds {
+    struct  target_ipc_perm shm_perm; /* peration permission structure */
+    abi_ulong   shm_segsz;  /* size of segment in bytes */
+    int32_t     shm_lpid;   /* process ID of last shared memory op */
+    int32_t     shm_cpid;   /* process ID of creator */
+    int32_t     shm_nattch; /* number of current attaches */
+    target_time_t shm_atime;  /* time of last shmat() */
+    target_time_t shm_dtime;  /* time of last shmdt() */
+    target_time_t shm_ctime;  /* time of last change by shmctl() */
+};
+
+#define N_BSD_SHM_REGIONS   32
+struct bsd_shm_regions {
+    abi_long start;
+    abi_long size;
+};
+
 /*
  *  sys/mman.h
  */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 03/23] bsd-user: Declarations for ipc_perm and shmid_ds conversion functions
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
  2023-09-09 19:36 ` [PATCH v3 01/23] bsd-user: Implement struct target_ipc_perm Karim Taha
  2023-09-09 19:36 ` [PATCH v3 02/23] bsd-user: Implement struct target_shmid_ds Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 04/23] bsd-user: Introduce freebsd/os-misc.h to the source tree Karim Taha
                   ` (19 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/qemu-bsd.h | 45 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100644 bsd-user/qemu-bsd.h

diff --git a/bsd-user/qemu-bsd.h b/bsd-user/qemu-bsd.h
new file mode 100644
index 0000000000..46572ece7d
--- /dev/null
+++ b/bsd-user/qemu-bsd.h
@@ -0,0 +1,45 @@
+/*
+ *  BSD conversion extern declarations
+ *
+ *  Copyright (c) 2013 Stacey D. Son
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef QEMU_BSD_H
+#define QEMU_BSD_H
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <sys/resource.h>
+#include <sys/sem.h>
+#include <sys/shm.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/uuid.h>
+#include <sys/wait.h>
+#include <netinet/in.h>
+
+/* bsd-mem.c */
+void target_to_host_ipc_perm__locked(struct ipc_perm *host_ip,
+        struct target_ipc_perm *target_ip);
+void host_to_target_ipc_perm__locked(struct target_ipc_perm *target_ip,
+        struct ipc_perm *host_ip);
+abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd,
+        abi_ulong target_addr);
+abi_long host_to_target_shmid_ds(abi_ulong target_addr,
+        struct shmid_ds *host_sd);
+
+#endif /* QEMU_BSD_H */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 04/23] bsd-user: Introduce freebsd/os-misc.h to the source tree
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (2 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 03/23] bsd-user: Declarations for ipc_perm and shmid_ds conversion functions Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 05/23] bsd-user: Implement shm_open2(2) system call Karim Taha
                   ` (18 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

To preserve the copyright notice and help with the 'Author' info for
subsequent changes to the file.

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/freebsd/os-misc.h | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100644 bsd-user/freebsd/os-misc.h

diff --git a/bsd-user/freebsd/os-misc.h b/bsd-user/freebsd/os-misc.h
new file mode 100644
index 0000000000..8436ccb2f7
--- /dev/null
+++ b/bsd-user/freebsd/os-misc.h
@@ -0,0 +1,28 @@
+/*
+ *  miscellaneous FreeBSD system call shims
+ *
+ *  Copyright (c) 2013-14 Stacey D. Son
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef OS_MISC_H
+#define OS_MISC_H
+
+#include <sys/cpuset.h>
+#include <sys/random.h>
+#include <sched.h>
+
+
+#endif /* OS_MISC_H */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 05/23] bsd-user: Implement shm_open2(2) system call
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (3 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 04/23] bsd-user: Introduce freebsd/os-misc.h to the source tree Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-11 23:51   ` Richard Henderson
  2023-09-09 19:36 ` [PATCH v3 06/23] bsd-user: Implement shm_rename(2) " Karim Taha
                   ` (17 subsequent siblings)
  22 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Kyle Evans, Karim Taha

From: Kyle Evans <kevans@FreeBSD.org>

Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
---
 bsd-user/freebsd/os-misc.h    | 42 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 13 +++++++++++
 2 files changed, 55 insertions(+)

diff --git a/bsd-user/freebsd/os-misc.h b/bsd-user/freebsd/os-misc.h
index 8436ccb2f7..6b424b7078 100644
--- a/bsd-user/freebsd/os-misc.h
+++ b/bsd-user/freebsd/os-misc.h
@@ -24,5 +24,47 @@
 #include <sys/random.h>
 #include <sched.h>
 
+int shm_open2(const char *path, int flags, mode_t mode, int shmflags,
+    const char *);
+
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
+/* shm_open2(2) */
+static inline abi_long do_freebsd_shm_open2(abi_ulong pathptr, abi_ulong flags,
+    abi_long mode, abi_ulong shmflags, abi_ulong nameptr)
+{
+    int ret;
+    void *uname, *upath;
+
+    if (pathptr == (uintptr_t)SHM_ANON) {
+        upath = SHM_ANON;
+    } else {
+        upath = lock_user_string(pathptr);
+        if (upath == NULL) {
+            return -TARGET_EFAULT;
+        }
+    }
+
+    uname = NULL;
+    if (nameptr != 0) {
+        uname = lock_user_string(nameptr);
+        if (uname == NULL) {
+            unlock_user(upath, pathptr, 0);
+            return -TARGET_EFAULT;
+        }
+    }
+    ret = get_errno(shm_open2(upath,
+                target_to_host_bitmask(flags, fcntl_flags_tbl), mode,
+                target_to_host_bitmask(shmflags, shmflag_flags_tbl), uname));
+
+    if (upath != SHM_ANON) {
+        unlock_user(upath, pathptr, 0);
+    }
+    if (uname != NULL) {
+        unlock_user(uname, nameptr, 0);
+    }
+    return ret;
+}
+#endif /* __FreeBSD_version >= 1300048 */
+
 
 #endif /* OS_MISC_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 2224a280ea..b4311db578 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -33,9 +33,13 @@
 #include "signal-common.h"
 #include "user/syscall-trace.h"
 
+/* BSD independent syscall shims */
 #include "bsd-file.h"
 #include "bsd-proc.h"
 
+/* *BSD dependent syscall shims */
+#include "os-misc.h"
+
 /* I/O */
 safe_syscall3(int, open, const char *, path, int, flags, mode_t, mode);
 safe_syscall4(int, openat, int, fd, const char *, path, int, flags, mode_t,
@@ -482,6 +486,15 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_undelete(arg1);
         break;
 
+        /*
+         * Memory management system calls.
+         */
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
+    case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */
+        ret = do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5);
+        break;
+#endif
+
         /*
          * sys{ctl, arch, call}
          */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 06/23] bsd-user: Implement shm_rename(2) system call
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (4 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 05/23] bsd-user: Implement shm_open2(2) system call Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 07/23] bsd-user: Add bsd-mem.c to meson.build Karim Taha
                   ` (16 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Kyle Evans, Karim Taha, Richard Henderson

From: Kyle Evans <kevans@FreeBSD.org>

Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/freebsd/os-misc.h    | 24 ++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  6 ++++++
 2 files changed, 30 insertions(+)

diff --git a/bsd-user/freebsd/os-misc.h b/bsd-user/freebsd/os-misc.h
index 6b424b7078..67e450fe7c 100644
--- a/bsd-user/freebsd/os-misc.h
+++ b/bsd-user/freebsd/os-misc.h
@@ -66,5 +66,29 @@ static inline abi_long do_freebsd_shm_open2(abi_ulong pathptr, abi_ulong flags,
 }
 #endif /* __FreeBSD_version >= 1300048 */
 
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 1300049
+/* shm_rename(2) */
+static inline abi_long do_freebsd_shm_rename(abi_ulong fromptr, abi_ulong toptr,
+        abi_ulong flags)
+{
+    int ret;
+    void *ufrom, *uto;
+
+    ufrom = lock_user_string(fromptr);
+    if (ufrom == NULL) {
+        return -TARGET_EFAULT;
+    }
+    uto = lock_user_string(toptr);
+    if (uto == NULL) {
+        unlock_user(ufrom, fromptr, 0);
+        return -TARGET_EFAULT;
+    }
+    ret = get_errno(shm_rename(ufrom, uto, flags));
+    unlock_user(ufrom, fromptr, 0);
+    unlock_user(uto, toptr, 0);
+
+    return ret;
+}
+#endif /* __FreeBSD_version >= 1300049 */
 
 #endif /* OS_MISC_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index b4311db578..2920370ad2 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -495,6 +495,12 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         break;
 #endif
 
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 1300049
+    case TARGET_FREEBSD_NR_shm_rename: /* shm_rename(2) */
+        ret = do_freebsd_shm_rename(arg1, arg2, arg3);
+        break;
+#endif
+
         /*
          * sys{ctl, arch, call}
          */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 07/23] bsd-user: Add bsd-mem.c to meson.build
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (5 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 06/23] bsd-user: Implement shm_rename(2) " Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 08/23] bsd-user: Implement target_set_brk function in bsd-mem.c instead of os-syscall.c Karim Taha
                   ` (15 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Karim Taha, Richard Henderson

Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/bsd-mem.c   | 0
 bsd-user/meson.build | 1 +
 2 files changed, 1 insertion(+)
 create mode 100644 bsd-user/bsd-mem.c

diff --git a/bsd-user/bsd-mem.c b/bsd-user/bsd-mem.c
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/bsd-user/meson.build b/bsd-user/meson.build
index 5243122fc5..6ee68fdfe7 100644
--- a/bsd-user/meson.build
+++ b/bsd-user/meson.build
@@ -7,6 +7,7 @@ bsd_user_ss = ss.source_set()
 common_user_inc += include_directories('include')
 
 bsd_user_ss.add(files(
+  'bsd-mem.c',
   'bsdload.c',
   'elfload.c',
   'main.c',
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 08/23] bsd-user: Implement target_set_brk function in bsd-mem.c instead of os-syscall.c
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (6 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 07/23] bsd-user: Add bsd-mem.c to meson.build Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 09/23] bsd-user: Implement ipc_perm conversion between host and target Karim Taha
                   ` (14 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel
  Cc: imp, Stacey Son, Mikaël Urankar, Karim Taha,
	Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

The definitions and variables names matches the corresponding ones in
linux-user/syscall.c, for making later implementation of do_obreak easier

Co-authored-by: Mikaël Urankar <mikael.urankar@gmail.com>
Signed-off-by: Mikaël Urankar <mikael.urankar@gmail.com>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-mem.c            | 32 ++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  4 ----
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/bsd-user/bsd-mem.c b/bsd-user/bsd-mem.c
index e69de29bb2..8834ab2e58 100644
--- a/bsd-user/bsd-mem.c
+++ b/bsd-user/bsd-mem.c
@@ -0,0 +1,32 @@
+/*
+ *  memory management system conversion routines
+ *
+ *  Copyright (c) 2013 Stacey D. Son
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include "qemu/osdep.h"
+#include "qemu.h"
+#include "qemu-bsd.h"
+
+struct bsd_shm_regions bsd_shm_regions[N_BSD_SHM_REGIONS];
+
+abi_ulong target_brk;
+abi_ulong initial_target_brk;
+
+void target_set_brk(abi_ulong new_brk)
+{
+    target_brk = TARGET_PAGE_ALIGN(new_brk);
+    initial_target_brk = target_brk;
+}
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 2920370ad2..c0a22eb746 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -59,10 +59,6 @@ safe_syscall3(ssize_t, writev, int, fd, const struct iovec *, iov, int, iovcnt);
 safe_syscall4(ssize_t, pwritev, int, fd, const struct iovec *, iov, int, iovcnt,
     off_t, offset);
 
-void target_set_brk(abi_ulong new_brk)
-{
-}
-
 /*
  * errno conversion.
  */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 09/23] bsd-user: Implement ipc_perm conversion between host and target.
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (7 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 08/23] bsd-user: Implement target_set_brk function in bsd-mem.c instead of os-syscall.c Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 10/23] bsd-user: Implement shmid_ds " Karim Taha
                   ` (13 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-mem.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/bsd-user/bsd-mem.c b/bsd-user/bsd-mem.c
index 8834ab2e58..46cda8eb5c 100644
--- a/bsd-user/bsd-mem.c
+++ b/bsd-user/bsd-mem.c
@@ -30,3 +30,28 @@ void target_set_brk(abi_ulong new_brk)
     target_brk = TARGET_PAGE_ALIGN(new_brk);
     initial_target_brk = target_brk;
 }
+
+void target_to_host_ipc_perm__locked(struct ipc_perm *host_ip,
+                                     struct target_ipc_perm *target_ip)
+{
+    __get_user(host_ip->cuid, &target_ip->cuid);
+    __get_user(host_ip->cgid, &target_ip->cgid);
+    __get_user(host_ip->uid,  &target_ip->uid);
+    __get_user(host_ip->gid,  &target_ip->gid);
+    __get_user(host_ip->mode, &target_ip->mode);
+    __get_user(host_ip->seq,  &target_ip->seq);
+    __get_user(host_ip->key,  &target_ip->key);
+}
+
+void host_to_target_ipc_perm__locked(struct target_ipc_perm *target_ip,
+                                     struct ipc_perm *host_ip)
+{
+    __put_user(host_ip->cuid, &target_ip->cuid);
+    __put_user(host_ip->cgid, &target_ip->cgid);
+    __put_user(host_ip->uid,  &target_ip->uid);
+    __put_user(host_ip->gid,  &target_ip->gid);
+    __put_user(host_ip->mode, &target_ip->mode);
+    __put_user(host_ip->seq,  &target_ip->seq);
+    __put_user(host_ip->key,  &target_ip->key);
+}
+
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 10/23] bsd-user: Implement shmid_ds conversion between host and target.
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (8 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 09/23] bsd-user: Implement ipc_perm conversion between host and target Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-11 23:53   ` Richard Henderson
  2023-09-09 19:36 ` [PATCH v3 11/23] bsd-user: Introduce bsd-mem.h to the source tree Karim Taha
                   ` (12 subsequent siblings)
  22 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
---
 bsd-user/bsd-mem.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/bsd-user/bsd-mem.c b/bsd-user/bsd-mem.c
index 46cda8eb5c..eea499a727 100644
--- a/bsd-user/bsd-mem.c
+++ b/bsd-user/bsd-mem.c
@@ -43,6 +43,28 @@ void target_to_host_ipc_perm__locked(struct ipc_perm *host_ip,
     __get_user(host_ip->key,  &target_ip->key);
 }
 
+abi_long target_to_host_shmid_ds(struct shmid_ds *host_sd,
+                                 abi_ulong target_addr)
+{
+    struct target_shmid_ds *target_sd;
+
+    if (!lock_user_struct(VERIFY_READ, target_sd, target_addr, 1)) {
+        return -TARGET_EFAULT;
+    }
+
+    target_to_host_ipc_perm__locked(&(host_sd->shm_perm), &(target_sd->shm_perm));
+    __get_user(host_sd->shm_segsz,  &target_sd->shm_segsz);
+    __get_user(host_sd->shm_lpid,   &target_sd->shm_lpid);
+    __get_user(host_sd->shm_cpid,   &target_sd->shm_cpid);
+    __get_user(host_sd->shm_nattch, &target_sd->shm_nattch);
+    __get_user(host_sd->shm_atime,  &target_sd->shm_atime);
+    __get_user(host_sd->shm_dtime,  &target_sd->shm_dtime);
+    __get_user(host_sd->shm_ctime,  &target_sd->shm_ctime);
+    unlock_user_struct(target_sd, target_addr, 0);
+
+    return 0;
+}
+
 void host_to_target_ipc_perm__locked(struct target_ipc_perm *target_ip,
                                      struct ipc_perm *host_ip)
 {
@@ -55,3 +77,24 @@ void host_to_target_ipc_perm__locked(struct target_ipc_perm *target_ip,
     __put_user(host_ip->key,  &target_ip->key);
 }
 
+abi_long host_to_target_shmid_ds(abi_ulong target_addr,
+                                 struct shmid_ds *host_sd)
+{
+    struct target_shmid_ds *target_sd;
+
+    if (!lock_user_struct(VERIFY_WRITE, target_sd, target_addr, 0)) {
+        return -TARGET_EFAULT;
+    }
+
+    host_to_target_ipc_perm__locked(&(target_sd->shm_perm), &(host_sd->shm_perm));
+    __put_user(host_sd->shm_segsz,  &target_sd->shm_segsz);
+    __put_user(host_sd->shm_lpid,   &target_sd->shm_lpid);
+    __put_user(host_sd->shm_cpid,   &target_sd->shm_cpid);
+    __put_user(host_sd->shm_nattch, &target_sd->shm_nattch);
+    __put_user(host_sd->shm_atime,  &target_sd->shm_atime);
+    __put_user(host_sd->shm_dtime,  &target_sd->shm_dtime);
+    __put_user(host_sd->shm_ctime,  &target_sd->shm_ctime);
+    unlock_user_struct(target_sd, target_addr, 1);
+
+    return 0;
+}
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 11/23] bsd-user: Introduce bsd-mem.h to the source tree
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (9 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 10/23] bsd-user: Implement shmid_ds " Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 12/23] bsd-user: Implement mmap(2) and munmap(2) Karim Taha
                   ` (11 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Preserve the copyright notice and help with the 'Author' info for
subsequent changes to the file.

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-mem.h            | 64 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  1 +
 2 files changed, 65 insertions(+)
 create mode 100644 bsd-user/bsd-mem.h

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
new file mode 100644
index 0000000000..d865e0807d
--- /dev/null
+++ b/bsd-user/bsd-mem.h
@@ -0,0 +1,64 @@
+/*
+ *  memory management system call shims and definitions
+ *
+ *  Copyright (c) 2013-15 Stacey D. Son
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Copyright (c) 1982, 1986, 1993
+ *      The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef BSD_USER_BSD_MEM_H
+#define BSD_USER_BSD_MEM_H
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/mman.h>
+#include <sys/shm.h>
+#include <fcntl.h>
+
+#include "qemu-bsd.h"
+
+extern struct bsd_shm_regions bsd_shm_regions[];
+extern abi_ulong target_brk;
+extern abi_ulong initial_target_brk;
+
+#endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index c0a22eb746..7e2a395e0f 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -35,6 +35,7 @@
 
 /* BSD independent syscall shims */
 #include "bsd-file.h"
+#include "bsd-mem.h"
 #include "bsd-proc.h"
 
 /* *BSD dependent syscall shims */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 12/23] bsd-user: Implement mmap(2) and munmap(2)
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (10 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 11/23] bsd-user: Introduce bsd-mem.h to the source tree Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 13/23] bsd-user: Implement mprotect(2) Karim Taha
                   ` (10 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
Reviewed-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-mem.h            | 20 ++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  9 +++++++++
 2 files changed, 29 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index d865e0807d..76b504f70c 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -61,4 +61,24 @@ extern struct bsd_shm_regions bsd_shm_regions[];
 extern abi_ulong target_brk;
 extern abi_ulong initial_target_brk;
 
+/* mmap(2) */
+static inline abi_long do_bsd_mmap(void *cpu_env, abi_long arg1, abi_long arg2,
+    abi_long arg3, abi_long arg4, abi_long arg5, abi_long arg6, abi_long arg7,
+    abi_long arg8)
+{
+    if (regpairs_aligned(cpu_env) != 0) {
+        arg6 = arg7;
+        arg7 = arg8;
+    }
+    return get_errno(target_mmap(arg1, arg2, arg3,
+                                 target_to_host_bitmask(arg4, mmap_flags_tbl),
+                                 arg5, target_arg64(arg6, arg7)));
+}
+
+/* munmap(2) */
+static inline abi_long do_bsd_munmap(abi_long arg1, abi_long arg2)
+{
+    return get_errno(target_munmap(arg1, arg2));
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 7e2a395e0f..d88f62319b 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -486,6 +486,15 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         /*
          * Memory management system calls.
          */
+    case TARGET_FREEBSD_NR_mmap: /* mmap(2) */
+        ret = do_bsd_mmap(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6, arg7,
+                          arg8);
+        break;
+
+    case TARGET_FREEBSD_NR_munmap: /* munmap(2) */
+        ret = do_bsd_munmap(arg1, arg2);
+        break;
+
 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
     case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */
         ret = do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5);
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 13/23] bsd-user: Implement mprotect(2)
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (11 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 12/23] bsd-user: Implement mmap(2) and munmap(2) Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 14/23] bsd-user: Implement msync(2) Karim Taha
                   ` (9 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/bsd-mem.h            | 7 +++++++
 bsd-user/freebsd/os-syscall.c | 4 ++++
 2 files changed, 11 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 76b504f70c..0f9e4a1d4b 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -81,4 +81,11 @@ static inline abi_long do_bsd_munmap(abi_long arg1, abi_long arg2)
     return get_errno(target_munmap(arg1, arg2));
 }
 
+/* mprotect(2) */
+static inline abi_long do_bsd_mprotect(abi_long arg1, abi_long arg2,
+        abi_long arg3)
+{
+    return get_errno(target_mprotect(arg1, arg2, arg3));
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index d88f62319b..127805e079 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -495,6 +495,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_munmap(arg1, arg2);
         break;
 
+    case TARGET_FREEBSD_NR_mprotect: /* mprotect(2) */
+        ret = do_bsd_mprotect(arg1, arg2, arg3);
+        break;
+
 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
     case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */
         ret = do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5);
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 14/23] bsd-user: Implement msync(2)
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (12 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 13/23] bsd-user: Implement mprotect(2) Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 15/23] bsd-user: Implement mlock(2), munlock(2), mlockall(2), munlockall(2), minherit(2) Karim Taha
                   ` (8 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Kyle Evans, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Co-authored-by: Kyle Evans <kevans@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-mem.h            | 11 +++++++++++
 bsd-user/freebsd/os-syscall.c |  4 ++++
 2 files changed, 15 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 0f9e4a1d4b..5e885823a7 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -88,4 +88,15 @@ static inline abi_long do_bsd_mprotect(abi_long arg1, abi_long arg2,
     return get_errno(target_mprotect(arg1, arg2, arg3));
 }
 
+/* msync(2) */
+static inline abi_long do_bsd_msync(abi_long addr, abi_long len, abi_long flags)
+{
+    if (!guest_range_valid_untagged(addr, len)) {
+        /* It seems odd, but POSIX wants this to be ENOMEM */
+        return -TARGET_ENOMEM;
+    }
+
+    return get_errno(msync(g2h_untagged(addr), len, flags));
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 127805e079..859492dee7 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -499,6 +499,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_mprotect(arg1, arg2, arg3);
         break;
 
+    case TARGET_FREEBSD_NR_msync: /* msync(2) */
+        ret = do_bsd_msync(arg1, arg2, arg3);
+        break;
+
 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
     case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */
         ret = do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5);
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 15/23] bsd-user: Implement mlock(2), munlock(2), mlockall(2), munlockall(2), minherit(2)
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (13 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 14/23] bsd-user: Implement msync(2) Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-09 19:36 ` [PATCH v3 16/23] bsd-user: Implment madvise(2) to match the linux-user implementation Karim Taha
                   ` (7 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-mem.h            | 37 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 20 +++++++++++++++++++
 2 files changed, 57 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 5e885823a7..16c22593bf 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -99,4 +99,41 @@ static inline abi_long do_bsd_msync(abi_long addr, abi_long len, abi_long flags)
     return get_errno(msync(g2h_untagged(addr), len, flags));
 }
 
+/* mlock(2) */
+static inline abi_long do_bsd_mlock(abi_long arg1, abi_long arg2)
+{
+    if (!guest_range_valid_untagged(arg1, arg2)) {
+        return -TARGET_EINVAL;
+    }
+    return get_errno(mlock(g2h_untagged(arg1), arg2));
+}
+
+/* munlock(2) */
+static inline abi_long do_bsd_munlock(abi_long arg1, abi_long arg2)
+{
+    if (!guest_range_valid_untagged(arg1, arg2)) {
+        return -TARGET_EINVAL;
+    }
+    return get_errno(munlock(g2h_untagged(arg1), arg2));
+}
+
+/* mlockall(2) */
+static inline abi_long do_bsd_mlockall(abi_long arg1)
+{
+    return get_errno(mlockall(arg1));
+}
+
+/* munlockall(2) */
+static inline abi_long do_bsd_munlockall(void)
+{
+    return get_errno(munlockall());
+}
+
+/* minherit(2) */
+static inline abi_long do_bsd_minherit(abi_long addr, abi_long len,
+        abi_long inherit)
+{
+    return get_errno(minherit(g2h_untagged(addr), len, inherit));
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 859492dee7..6eaa705cd3 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -503,6 +503,26 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_msync(arg1, arg2, arg3);
         break;
 
+    case TARGET_FREEBSD_NR_mlock: /* mlock(2) */
+        ret = do_bsd_mlock(arg1, arg2);
+        break;
+
+    case TARGET_FREEBSD_NR_munlock: /* munlock(2) */
+        ret = do_bsd_munlock(arg1, arg2);
+        break;
+
+    case TARGET_FREEBSD_NR_mlockall: /* mlockall(2) */
+        ret = do_bsd_mlockall(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_munlockall: /* munlockall(2) */
+        ret = do_bsd_munlockall();
+        break;
+
+    case TARGET_FREEBSD_NR_minherit: /* minherit(2) */
+        ret = do_bsd_minherit(arg1, arg2, arg3);
+        break;
+
 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
     case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */
         ret = do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5);
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 16/23] bsd-user: Implment madvise(2) to match the linux-user implementation.
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (14 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 15/23] bsd-user: Implement mlock(2), munlock(2), mlockall(2), munlockall(2), minherit(2) Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-11 23:56   ` Richard Henderson
  2023-09-09 19:36 ` [PATCH v3 17/23] bsd-user: Implement mincore(2) Karim Taha
                   ` (6 subsequent siblings)
  22 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Karim Taha

Signed-off-by: Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
---
 bsd-user/bsd-mem.h            | 53 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  4 +++
 bsd-user/syscall_defs.h       |  2 ++
 3 files changed, 59 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 16c22593bf..0e16051418 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -129,6 +129,59 @@ static inline abi_long do_bsd_munlockall(void)
     return get_errno(munlockall());
 }
 
+/* madvise(2) */
+static inline abi_long do_bsd_madvise(abi_long arg1, abi_long arg2,
+        abi_long arg3)
+{
+    abi_ulong len;
+    int ret = 0;
+    abi_long start = arg1;
+    abi_long len_in = arg2;
+    abi_long advice = arg3;
+
+    if (start & ~TARGET_PAGE_MASK) {
+        return -TARGET_EINVAL;
+    }
+    if (len_in == 0) {
+        return 0;
+    }
+    len = TARGET_PAGE_ALIGN(len_in);
+    if (len == 0 || !guest_range_valid_untagged(start, len)) {
+        return -TARGET_EINVAL;
+    }
+
+    /*
+     * Most advice values are hints, so ignoring and returning success is ok.
+     *
+     * However, some advice values such as MADV_DONTNEED, are not hints and
+     * need to be emulated.
+     *
+     * A straight passthrough for those may not be safe because qemu sometimes
+     * turns private file-backed mappings into anonymous mappings.
+     * If all guest pages have PAGE_PASSTHROUGH set, mappings have the
+     * same semantics for the host as for the guest.
+     *
+     * MADV_DONTNEED is passed through, if possible.
+     * If passthrough isn't possible, we nevertheless (wrongly!) return
+     * success, which is broken but some userspace programs fail to work
+     * otherwise. Completely implementing such emulation is quite complicated
+     * though.
+     */
+    mmap_lock();
+    switch (advice) {
+    case MADV_DONTNEED:
+        if (page_check_range(start, len, PAGE_PASSTHROUGH)) {
+            ret = get_errno(madvise(g2h_untagged(start), len, advice));
+            if ((advice == MADV_DONTNEED) && (ret == 0)) {
+                page_reset_target_data(start, start + len - 1);
+            }
+        }
+    }
+    mmap_unlock();
+
+    return ret;
+}
+
 /* minherit(2) */
 static inline abi_long do_bsd_minherit(abi_long addr, abi_long len,
         abi_long inherit)
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 6eaa705cd3..f5d60cf902 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -519,6 +519,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_munlockall();
         break;
 
+    case TARGET_FREEBSD_NR_madvise: /* madvise(2) */
+        ret = do_bsd_madvise(arg1, arg2, arg3);
+        break;
+
     case TARGET_FREEBSD_NR_minherit: /* minherit(2) */
         ret = do_bsd_minherit(arg1, arg2, arg3);
         break;
diff --git a/bsd-user/syscall_defs.h b/bsd-user/syscall_defs.h
index 074df7bdd6..76f4856009 100644
--- a/bsd-user/syscall_defs.h
+++ b/bsd-user/syscall_defs.h
@@ -95,6 +95,8 @@ struct bsd_shm_regions {
 /*
  *  sys/mman.h
  */
+#define TARGET_MADV_DONTNEED            4       /* dont need these pages */
+
 #define TARGET_FREEBSD_MAP_RESERVED0080 0x0080  /* previously misimplemented */
                                                 /* MAP_INHERIT */
 #define TARGET_FREEBSD_MAP_RESERVED0100 0x0100  /* previously unimplemented */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 17/23] bsd-user: Implement mincore(2)
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (15 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 16/23] bsd-user: Implment madvise(2) to match the linux-user implementation Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-12  0:03   ` Richard Henderson
  2023-09-09 19:36 ` [PATCH v3 18/23] bsd-user: Implement do_obreak function Karim Taha
                   ` (5 subsequent siblings)
  22 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
---
 bsd-user/bsd-mem.h            | 22 ++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  4 ++++
 2 files changed, 26 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 0e16051418..1dabbe36e6 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -189,4 +189,26 @@ static inline abi_long do_bsd_minherit(abi_long addr, abi_long len,
     return get_errno(minherit(g2h_untagged(addr), len, inherit));
 }
 
+/* mincore(2) */
+static inline abi_long do_bsd_mincore(abi_ulong target_addr, abi_ulong len,
+        abi_ulong target_vec)
+{
+    abi_long ret;
+    void *p;
+    abi_ulong vec_len = DIV_ROUND_UP(len,TARGET_PAGE_SIZE);
+
+    if (!guest_range_valid_untagged(target_addr,len) || !page_check_range(target_addr, len, PAGE_VALID)) {
+        return -TARGET_EFAULT;
+    }
+
+    p = lock_user(VERIFY_WRITE, target_vec, vec_len, 0);
+    if (p == NULL) {
+        return -TARGET_EFAULT;
+    }
+    ret = get_errno(mincore(g2h_untagged(target_addr), len, p));
+    unlock_user(p, target_vec, 0);
+
+    return ret;
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index f5d60cf902..8d1cf3b35c 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -527,6 +527,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_minherit(arg1, arg2, arg3);
         break;
 
+    case TARGET_FREEBSD_NR_mincore: /* mincore(2) */
+        ret = do_bsd_mincore(arg1, arg2, arg3);
+        break;
+
 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
     case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */
         ret = do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5);
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 18/23] bsd-user: Implement do_obreak function
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (16 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 17/23] bsd-user: Implement mincore(2) Karim Taha
@ 2023-09-09 19:36 ` Karim Taha
  2023-09-12  0:05   ` Richard Henderson
  2023-09-09 19:37 ` [PATCH v3 19/23] bsd-user: Implement shm_open(2) Karim Taha
                   ` (4 subsequent siblings)
  22 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:36 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

Match linux-user, by manually applying the following commits, in order:

d28b3c90cfad1a7e211ae2bce36ecb9071086129   linux-user: Make sure initial brk(0) is page-aligned
15ad98536ad9410fb32ddf1ff09389b677643faa   linux-user: Fix qemu brk() to not zero bytes on current page
dfe49864afb06e7e452a4366051697bc4fcfc1a5   linux-user: Prohibit brk() to to shrink below initial heap address
eac78a4b0b7da4de2c0a297f4d528ca9cc6256a3   linux-user: Fix signed math overflow in brk() syscall
c6cc059eca18d9f6e4e26bb8b6d1135ddb35d81a   linux-user: Do not call get_errno() in do_brk()
e69e032d1a8ee8d754ca119009a3c2c997f8bb30   linux-user: Use MAP_FIXED_NOREPLACE for do_brk()
cb9d5d1fda0bc2312fc0c779b4ea1d7bf826f31f   linux-user: Do nothing if too small brk is specified
2aea137a425a87b930a33590177b04368fd7cc12   linux-user: Do not align brk with host page size

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
---
 bsd-user/bsd-mem.h            | 45 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  7 ++++++
 2 files changed, 52 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 1dabbe36e6..563f82996b 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -211,4 +211,49 @@ static inline abi_long do_bsd_mincore(abi_ulong target_addr, abi_ulong len,
     return ret;
 }
 
+/* do_brk() must return target values and target errnos. */
+static inline abi_long do_obreak(abi_ulong brk_val)
+{
+    abi_long mapped_addr;
+    abi_ulong new_brk;
+    abi_ulong old_brk;
+
+    /* brk pointers are always untagged */
+
+    /* do not allow to shrink below initial brk value */
+    if (brk_val < initial_target_brk) {
+         return target_brk;
+    }
+
+    new_brk = TARGET_PAGE_ALIGN(brk_val);
+    old_brk = TARGET_PAGE_ALIGN(target_brk);
+
+    /* new and old target_brk might be on the same page */
+    if (new_brk == old_brk) {
+        target_brk = brk_val;
+        return target_brk;
+    }
+
+    /* Release heap if necesary */
+    if (new_brk < old_brk) {
+        target_munmap(new_brk, old_brk - new_brk);
+
+        target_brk = brk_val;
+        return target_brk;
+    }
+
+    mapped_addr = target_mmap(old_brk, new_brk - old_brk,
+                              PROT_READ | PROT_WRITE,
+                              MAP_FIXED | MAP_EXCL | MAP_ANON | MAP_PRIVATE,
+                              -1, 0);
+
+    if (mapped_addr == old_brk) {
+        target_brk = brk_val;
+        return target_brk;
+    }
+
+    /* For everything else, return the previous break. */
+    return target_brk;
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 8d1cf3b35c..8dd29fddde 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -543,6 +543,13 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         break;
 #endif
 
+        /*
+         * Misc
+         */
+    case TARGET_FREEBSD_NR_break:
+        ret = do_obreak(arg1);
+        break;
+
         /*
          * sys{ctl, arch, call}
          */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 19/23] bsd-user: Implement shm_open(2)
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (17 preceding siblings ...)
  2023-09-09 19:36 ` [PATCH v3 18/23] bsd-user: Implement do_obreak function Karim Taha
@ 2023-09-09 19:37 ` Karim Taha
  2023-09-12  0:06   ` Richard Henderson
  2023-09-09 19:37 ` [PATCH v3 20/23] bsd-user: Implement shm_unlink(2) and shmget(2) Karim Taha
                   ` (3 subsequent siblings)
  22 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Kyle Evans, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

Co-authored-by: Kyle Evans <kevans@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Kyle Evans <kevans@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
---
 bsd-user/bsd-mem.h            | 25 +++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  4 ++++
 2 files changed, 29 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 563f82996b..a48f919ff2 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -256,4 +256,29 @@ static inline abi_long do_obreak(abi_ulong brk_val)
     return target_brk;
 }
 
+/* shm_open(2) */
+static inline abi_long do_bsd_shm_open(abi_ulong arg1, abi_long arg2,
+        abi_long arg3)
+{
+    int ret;
+    void *p;
+
+    if (arg1 == (uintptr_t)SHM_ANON) {
+        p = SHM_ANON;
+    } else {
+        p = lock_user_string(arg1);
+        if (p == NULL) {
+            return -TARGET_EFAULT;
+        }
+    }
+    ret = get_errno(shm_open(p, target_to_host_bitmask(arg2, fcntl_flags_tbl),
+                             arg3));
+
+    if (p != SHM_ANON) {
+        unlock_user(p, arg1, 0);
+    }
+
+    return ret;
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 8dd29fddde..7404b0aa72 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -531,6 +531,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_mincore(arg1, arg2, arg3);
         break;
 
+    case TARGET_FREEBSD_NR_freebsd12_shm_open: /* shm_open(2) */
+        ret = do_bsd_shm_open(arg1, arg2, arg3);
+        break;
+
 #if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
     case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */
         ret = do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5);
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 20/23] bsd-user: Implement shm_unlink(2) and shmget(2)
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (18 preceding siblings ...)
  2023-09-09 19:37 ` [PATCH v3 19/23] bsd-user: Implement shm_open(2) Karim Taha
@ 2023-09-09 19:37 ` Karim Taha
  2023-09-09 19:37 ` [PATCH v3 21/23] bsd-user: Implement shmctl(2) Karim Taha
                   ` (2 subsequent siblings)
  22 siblings, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha, Richard Henderson

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Warner Losh <imp@bsdimp.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-mem.h            | 23 +++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  8 ++++++++
 2 files changed, 31 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index a48f919ff2..27d4e7f079 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -281,4 +281,27 @@ static inline abi_long do_bsd_shm_open(abi_ulong arg1, abi_long arg2,
     return ret;
 }
 
+/* shm_unlink(2) */
+static inline abi_long do_bsd_shm_unlink(abi_ulong arg1)
+{
+    int ret;
+    void *p;
+
+    p = lock_user_string(arg1);
+    if (p == NULL) {
+        return -TARGET_EFAULT;
+    }
+    ret = get_errno(shm_unlink(p)); /* XXX path(p)? */
+    unlock_user(p, arg1, 0);
+
+    return ret;
+}
+
+/* shmget(2) */
+static inline abi_long do_bsd_shmget(abi_long arg1, abi_ulong arg2,
+        abi_long arg3)
+{
+    return get_errno(shmget(arg1, arg2, arg3));
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 7404b0aa72..52cca2300f 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -547,6 +547,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         break;
 #endif
 
+    case TARGET_FREEBSD_NR_shm_unlink: /* shm_unlink(2) */
+        ret = do_bsd_shm_unlink(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_shmget: /* shmget(2) */
+        ret = do_bsd_shmget(arg1, arg2, arg3);
+        break;
+
         /*
          * Misc
          */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 21/23] bsd-user: Implement shmctl(2)
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (19 preceding siblings ...)
  2023-09-09 19:37 ` [PATCH v3 20/23] bsd-user: Implement shm_unlink(2) and shmget(2) Karim Taha
@ 2023-09-09 19:37 ` Karim Taha
  2023-09-13 13:01   ` Karim Taha
  2023-09-13 15:33   ` Richard Henderson
  2023-09-09 19:37 ` [PATCH v3 22/23] bsd-user: Implement shmat(2) and shmdt(2) Karim Taha
  2023-09-09 19:37 ` [PATCH v3 23/23] bsd-user: Add stubs for vadvise(), sbrk() and sstk() Karim Taha
  22 siblings, 2 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>

Reviewed-by: Warner Losh <imp@bsdimp.com>
---
 bsd-user/bsd-mem.h            | 39 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  4 ++++
 2 files changed, 43 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 27d4e7f079..68f34b5d36 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -304,4 +304,43 @@ static inline abi_long do_bsd_shmget(abi_long arg1, abi_ulong arg2,
     return get_errno(shmget(arg1, arg2, arg3));
 }
 
+/* shmctl(2) */
+static inline abi_long do_bsd_shmctl(abi_long shmid, abi_long cmd,
+        abi_ulong buff)
+{
+    struct shmid_ds dsarg;
+    abi_long ret = -TARGET_EINVAL;
+
+    cmd &= 0xff;
+
+    switch (cmd) {
+    case IPC_STAT:
+        if (target_to_host_shmid_ds(&dsarg, buff)) {
+            return -TARGET_EFAULT;
+        }
+        ret = get_errno(shmctl(shmid, cmd, &dsarg));
+        if (host_to_target_shmid_ds(buff, &dsarg)) {
+            return -TARGET_EFAULT;
+        }
+        break;
+
+    case IPC_SET:
+        if (target_to_host_shmid_ds(&dsarg, buff)) {
+            return -TARGET_EFAULT;
+        }
+        ret = get_errno(shmctl(shmid, cmd, &dsarg));
+        break;
+
+    case IPC_RMID:
+        ret = get_errno(shmctl(shmid, cmd, NULL));
+        break;
+
+    default:
+        ret = -TARGET_EINVAL;
+        break;
+    }
+
+    return ret;
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 52cca2300f..35f94f51fc 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -555,6 +555,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_shmget(arg1, arg2, arg3);
         break;
 
+    case TARGET_FREEBSD_NR_shmctl: /* shmctl(2) */
+        ret = do_bsd_shmctl(arg1, arg2, arg3);
+        break;
+
         /*
          * Misc
          */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 22/23] bsd-user: Implement shmat(2) and shmdt(2)
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (20 preceding siblings ...)
  2023-09-09 19:37 ` [PATCH v3 21/23] bsd-user: Implement shmctl(2) Karim Taha
@ 2023-09-09 19:37 ` Karim Taha
  2023-09-12  0:08   ` Richard Henderson
  2023-09-09 19:37 ` [PATCH v3 23/23] bsd-user: Add stubs for vadvise(), sbrk() and sstk() Karim Taha
  22 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Stacey Son, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

Signed-off-by: Stacey Son <sson@FreeBSD.org>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
---
 bsd-user/bsd-mem.h            | 76 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  8 ++++
 2 files changed, 84 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 68f34b5d36..8e5f22da5b 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -343,4 +343,80 @@ static inline abi_long do_bsd_shmctl(abi_long shmid, abi_long cmd,
     return ret;
 }
 
+/* shmat(2) */
+static inline abi_long do_bsd_shmat(int shmid, abi_ulong shmaddr, int shmflg)
+{
+    abi_ulong raddr;
+    abi_long ret;
+    void *host_raddr;
+    struct shmid_ds shm_info;
+    int i;
+
+    /* Find out the length of the shared memory segment. */
+    ret = get_errno(shmctl(shmid, IPC_STAT, &shm_info));
+    if (is_error(ret)) {
+        /* Can't get the length */
+        return ret;
+    }
+
+    if (!guest_range_valid_untagged(shmaddr, shm_info.shm_segsz)) {
+        return -TARGET_EINVAL;
+    }
+
+    mmap_lock();
+
+    if (shmaddr) {
+        host_raddr = shmat(shmid, (void *)g2h_untagged(shmaddr), shmflg);
+    } else {
+        abi_ulong mmap_start;
+
+        mmap_start = mmap_find_vma(0, shm_info.shm_segsz);
+
+        if (mmap_start == -1) {
+            errno = ENOMEM;
+            host_raddr = (void *)-1;
+        } else {
+            host_raddr = shmat(shmid, g2h_untagged(mmap_start),
+                shmflg | SHM_REMAP);
+        }
+    }
+
+    if (host_raddr == (void *)-1) {
+        mmap_unlock();
+        return get_errno((long)host_raddr);
+    }
+    raddr = h2g((unsigned long)host_raddr);
+
+    page_set_flags(raddr, raddr + shm_info.shm_segsz,
+        PAGE_VALID | PAGE_READ | ((shmflg & SHM_RDONLY) ? 0 : PAGE_WRITE));
+
+    for (i = 0; i < N_BSD_SHM_REGIONS; i++) {
+        if (bsd_shm_regions[i].start == 0) {
+            bsd_shm_regions[i].start = raddr;
+            bsd_shm_regions[i].size = shm_info.shm_segsz;
+            break;
+        }
+    }
+
+    mmap_unlock();
+    return raddr;
+}
+
+/* shmdt(2) */
+static inline abi_long do_bsd_shmdt(abi_ulong shmaddr)
+{
+    int i;
+
+    for (i = 0; i < N_BSD_SHM_REGIONS; ++i) {
+        if (bsd_shm_regions[i].start == shmaddr) {
+            bsd_shm_regions[i].start = 0;
+            page_set_flags(shmaddr,
+                shmaddr + bsd_shm_regions[i].size, 0);
+            break;
+        }
+    }
+
+    return get_errno(shmdt(g2h_untagged(shmaddr)));
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 35f94f51fc..fe0968773e 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -559,6 +559,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_shmctl(arg1, arg2, arg3);
         break;
 
+    case TARGET_FREEBSD_NR_shmat: /* shmat(2) */
+        ret = do_bsd_shmat(arg1, arg2, arg3);
+        break;
+
+    case TARGET_FREEBSD_NR_shmdt: /* shmdt(2) */
+        ret = do_bsd_shmdt(arg1);
+        break;
+
         /*
          * Misc
          */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH v3 23/23] bsd-user: Add stubs for vadvise(), sbrk() and sstk()
  2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
                   ` (21 preceding siblings ...)
  2023-09-09 19:37 ` [PATCH v3 22/23] bsd-user: Implement shmat(2) and shmdt(2) Karim Taha
@ 2023-09-09 19:37 ` Karim Taha
  2023-09-12  0:09   ` Richard Henderson
  22 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-09 19:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Karim Taha

From: Warner Losh <imp@bsdimp.com>

The above system calls are not supported by qemu.

Signed-off-by: Warner Losh <imp@bsdimp.com>
Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
---
 bsd-user/bsd-mem.h            | 18 ++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 12 ++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
index 8e5f22da5b..847773fc8e 100644
--- a/bsd-user/bsd-mem.h
+++ b/bsd-user/bsd-mem.h
@@ -419,4 +419,22 @@ static inline abi_long do_bsd_shmdt(abi_ulong shmaddr)
     return get_errno(shmdt(g2h_untagged(shmaddr)));
 }
 
+static inline abi_long do_bsd_vadvise(void)
+{
+    /* See sys_ovadvise() in vm_unix.c */
+    return -TARGET_EINVAL;
+}
+
+static inline abi_long do_bsd_sbrk(void)
+{
+    /* see sys_sbrk() in vm_mmap.c */
+    return -TARGET_EOPNOTSUPP;
+}
+
+static inline abi_long do_bsd_sstk(void)
+{
+    /* see sys_sstk() in vm_mmap.c */
+    return -TARGET_EOPNOTSUPP;
+}
+
 #endif /* BSD_USER_BSD_MEM_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index fe0968773e..9647249e90 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -567,6 +567,18 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_shmdt(arg1);
         break;
 
+    case TARGET_FREEBSD_NR_freebsd11_vadvise:
+        ret = do_bsd_vadvise();
+        break;
+
+    case TARGET_FREEBSD_NR_sbrk:
+        ret = do_bsd_sbrk();
+        break;
+
+    case TARGET_FREEBSD_NR_sstk:
+        ret = do_bsd_sstk();
+        break;
+
         /*
          * Misc
          */
-- 
2.42.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 05/23] bsd-user: Implement shm_open2(2) system call
  2023-09-09 19:36 ` [PATCH v3 05/23] bsd-user: Implement shm_open2(2) system call Karim Taha
@ 2023-09-11 23:51   ` Richard Henderson
  0 siblings, 0 replies; 38+ messages in thread
From: Richard Henderson @ 2023-09-11 23:51 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp, Kyle Evans

On 9/9/23 12:36, Karim Taha wrote:
> From: Kyle Evans<kevans@FreeBSD.org>
> 
> Signed-off-by: Kyle Evans<kevans@FreeBSD.org>
> Signed-off-by: Karim Taha<kariem.taha2.7@gmail.com>
> ---
>   bsd-user/freebsd/os-misc.h    | 42 +++++++++++++++++++++++++++++++++++
>   bsd-user/freebsd/os-syscall.c | 13 +++++++++++
>   2 files changed, 55 insertions(+)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 10/23] bsd-user: Implement shmid_ds conversion between host and target.
  2023-09-09 19:36 ` [PATCH v3 10/23] bsd-user: Implement shmid_ds " Karim Taha
@ 2023-09-11 23:53   ` Richard Henderson
  0 siblings, 0 replies; 38+ messages in thread
From: Richard Henderson @ 2023-09-11 23:53 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp, Stacey Son

On 9/9/23 12:36, Karim Taha wrote:
> From: Stacey Son<sson@FreeBSD.org>
> 
> Signed-off-by: Stacey Son<sson@FreeBSD.org>
> Signed-off-by: Karim Taha<kariem.taha2.7@gmail.com>
> ---
>   bsd-user/bsd-mem.c | 43 +++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 43 insertions(+)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 16/23] bsd-user: Implment madvise(2) to match the linux-user implementation.
  2023-09-09 19:36 ` [PATCH v3 16/23] bsd-user: Implment madvise(2) to match the linux-user implementation Karim Taha
@ 2023-09-11 23:56   ` Richard Henderson
  0 siblings, 0 replies; 38+ messages in thread
From: Richard Henderson @ 2023-09-11 23:56 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp

On 9/9/23 12:36, Karim Taha wrote:
> Signed-off-by: Signed-off-by: Karim Taha<kariem.taha2.7@gmail.com>
> ---
>   bsd-user/bsd-mem.h            | 53 +++++++++++++++++++++++++++++++++++
>   bsd-user/freebsd/os-syscall.c |  4 +++
>   bsd-user/syscall_defs.h       |  2 ++
>   3 files changed, 59 insertions(+)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


> +    switch (advice) {
> +    case MADV_DONTNEED:
> +        if (page_check_range(start, len, PAGE_PASSTHROUGH)) {
> +            ret = get_errno(madvise(g2h_untagged(start), len, advice));
> +            if ((advice == MADV_DONTNEED) && (ret == 0)) {

Duplicate check for MADV_DONTNEED.
Useless parenthesis.


r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 17/23] bsd-user: Implement mincore(2)
  2023-09-09 19:36 ` [PATCH v3 17/23] bsd-user: Implement mincore(2) Karim Taha
@ 2023-09-12  0:03   ` Richard Henderson
  2023-09-13 22:02     ` Karim Taha
  0 siblings, 1 reply; 38+ messages in thread
From: Richard Henderson @ 2023-09-12  0:03 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp, Stacey Son

On 9/9/23 12:36, Karim Taha wrote:
> From: Stacey Son <sson@FreeBSD.org>
> 
> Signed-off-by: Stacey Son <sson@FreeBSD.org>
> Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
> ---
>   bsd-user/bsd-mem.h            | 22 ++++++++++++++++++++++
>   bsd-user/freebsd/os-syscall.c |  4 ++++
>   2 files changed, 26 insertions(+)
> 
> diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
> index 0e16051418..1dabbe36e6 100644
> --- a/bsd-user/bsd-mem.h
> +++ b/bsd-user/bsd-mem.h
> @@ -189,4 +189,26 @@ static inline abi_long do_bsd_minherit(abi_long addr, abi_long len,
>       return get_errno(minherit(g2h_untagged(addr), len, inherit));
>   }
>   
> +/* mincore(2) */
> +static inline abi_long do_bsd_mincore(abi_ulong target_addr, abi_ulong len,
> +        abi_ulong target_vec)
> +{
> +    abi_long ret;
> +    void *p;
> +    abi_ulong vec_len = DIV_ROUND_UP(len,TARGET_PAGE_SIZE);
> +
> +    if (!guest_range_valid_untagged(target_addr,len) || !page_check_range(target_addr, len, PAGE_VALID)) {
> +        return -TARGET_EFAULT;
> +    }
> +
> +    p = lock_user(VERIFY_WRITE, target_vec, vec_len, 0);
> +    if (p == NULL) {
> +        return -TARGET_EFAULT;
> +    }
> +    ret = get_errno(mincore(g2h_untagged(target_addr), len, p));
> +    unlock_user(p, target_vec, 0);

You don't need the lock/unlock_user at all.  It is wrongly checking for WRITE.


r~

> +
> +    return ret;
> +}
> +
>   #endif /* BSD_USER_BSD_MEM_H */
> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index f5d60cf902..8d1cf3b35c 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -527,6 +527,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
>           ret = do_bsd_minherit(arg1, arg2, arg3);
>           break;
>   
> +    case TARGET_FREEBSD_NR_mincore: /* mincore(2) */
> +        ret = do_bsd_mincore(arg1, arg2, arg3);
> +        break;
> +
>   #if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
>       case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */
>           ret = do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5);



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 18/23] bsd-user: Implement do_obreak function
  2023-09-09 19:36 ` [PATCH v3 18/23] bsd-user: Implement do_obreak function Karim Taha
@ 2023-09-12  0:05   ` Richard Henderson
  0 siblings, 0 replies; 38+ messages in thread
From: Richard Henderson @ 2023-09-12  0:05 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp, Stacey Son

On 9/9/23 12:36, Karim Taha wrote:
> From: Stacey Son<sson@FreeBSD.org>
> 
> Match linux-user, by manually applying the following commits, in order:
> 
> d28b3c90cfad1a7e211ae2bce36ecb9071086129   linux-user: Make sure initial brk(0) is page-aligned
> 15ad98536ad9410fb32ddf1ff09389b677643faa   linux-user: Fix qemu brk() to not zero bytes on current page
> dfe49864afb06e7e452a4366051697bc4fcfc1a5   linux-user: Prohibit brk() to to shrink below initial heap address
> eac78a4b0b7da4de2c0a297f4d528ca9cc6256a3   linux-user: Fix signed math overflow in brk() syscall
> c6cc059eca18d9f6e4e26bb8b6d1135ddb35d81a   linux-user: Do not call get_errno() in do_brk()
> e69e032d1a8ee8d754ca119009a3c2c997f8bb30   linux-user: Use MAP_FIXED_NOREPLACE for do_brk()
> cb9d5d1fda0bc2312fc0c779b4ea1d7bf826f31f   linux-user: Do nothing if too small brk is specified
> 2aea137a425a87b930a33590177b04368fd7cc12   linux-user: Do not align brk with host page size
> 
> Signed-off-by: Stacey Son<sson@FreeBSD.org>
> Signed-off-by: Karim Taha<kariem.taha2.7@gmail.com>
> ---
>   bsd-user/bsd-mem.h            | 45 +++++++++++++++++++++++++++++++++++
>   bsd-user/freebsd/os-syscall.c |  7 ++++++
>   2 files changed, 52 insertions(+)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 19/23] bsd-user: Implement shm_open(2)
  2023-09-09 19:37 ` [PATCH v3 19/23] bsd-user: Implement shm_open(2) Karim Taha
@ 2023-09-12  0:06   ` Richard Henderson
  0 siblings, 0 replies; 38+ messages in thread
From: Richard Henderson @ 2023-09-12  0:06 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp, Stacey Son, Kyle Evans

On 9/9/23 12:37, Karim Taha wrote:
> From: Stacey Son<sson@FreeBSD.org>
> 
> Co-authored-by: Kyle Evans<kevans@FreeBSD.org>
> 
> Signed-off-by: Stacey Son<sson@FreeBSD.org>
> Signed-off-by: Kyle Evans<kevans@FreeBSD.org>
> Signed-off-by: Karim Taha<kariem.taha2.7@gmail.com>
> ---
>   bsd-user/bsd-mem.h            | 25 +++++++++++++++++++++++++
>   bsd-user/freebsd/os-syscall.c |  4 ++++
>   2 files changed, 29 insertions(+)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 22/23] bsd-user: Implement shmat(2) and shmdt(2)
  2023-09-09 19:37 ` [PATCH v3 22/23] bsd-user: Implement shmat(2) and shmdt(2) Karim Taha
@ 2023-09-12  0:08   ` Richard Henderson
  2023-09-14 16:55     ` Karim Taha
  0 siblings, 1 reply; 38+ messages in thread
From: Richard Henderson @ 2023-09-12  0:08 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp, Stacey Son

On 9/9/23 12:37, Karim Taha wrote:
> +static inline abi_long do_bsd_shmdt(abi_ulong shmaddr)
> +{
> +    int i;
> +
> +    for (i = 0; i < N_BSD_SHM_REGIONS; ++i) {
> +        if (bsd_shm_regions[i].start == shmaddr) {
> +            bsd_shm_regions[i].start = 0;
> +            page_set_flags(shmaddr,
> +                shmaddr + bsd_shm_regions[i].size, 0);
> +            break;
> +        }
> +    }
> +
> +    return get_errno(shmdt(g2h_untagged(shmaddr)));
> +}

On success, this needs to mmap_reserve the region for reserved_va.


r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 23/23] bsd-user: Add stubs for vadvise(), sbrk() and sstk()
  2023-09-09 19:37 ` [PATCH v3 23/23] bsd-user: Add stubs for vadvise(), sbrk() and sstk() Karim Taha
@ 2023-09-12  0:09   ` Richard Henderson
  0 siblings, 0 replies; 38+ messages in thread
From: Richard Henderson @ 2023-09-12  0:09 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp

On 9/9/23 12:37, Karim Taha wrote:
> From: Warner Losh<imp@bsdimp.com>
> 
> The above system calls are not supported by qemu.
> 
> Signed-off-by: Warner Losh<imp@bsdimp.com>
> Signed-off-by: Karim Taha<kariem.taha2.7@gmail.com>
> ---
>   bsd-user/bsd-mem.h            | 18 ++++++++++++++++++
>   bsd-user/freebsd/os-syscall.c | 12 ++++++++++++
>   2 files changed, 30 insertions(+)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 21/23] bsd-user: Implement shmctl(2)
  2023-09-09 19:37 ` [PATCH v3 21/23] bsd-user: Implement shmctl(2) Karim Taha
@ 2023-09-13 13:01   ` Karim Taha
  2023-09-13 15:33   ` Richard Henderson
  1 sibling, 0 replies; 38+ messages in thread
From: Karim Taha @ 2023-09-13 13:01 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel

Karim Taha <kariem.taha2.7@gmail.com> wrote:

This mistakenly has a `Reviewed-by` line, this is from v2 of the series
when I thought the implementation was correct, before you replied to
me on v1 series thread that IPC_SET does not need the VERIFY_WRITE,
I'm writing this so you know why I will remove it in v4.
> From: Stacey Son <sson@FreeBSD.org>
>
> Signed-off-by: Stacey Son <sson@FreeBSD.org>
> Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
>
> Reviewed-by: Warner Losh <imp@bsdimp.com>
> ---
>  bsd-user/bsd-mem.h            | 39 +++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |  4 ++++
>  2 files changed, 43 insertions(+)
>
> diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
> index 27d4e7f079..68f34b5d36 100644
> --- a/bsd-user/bsd-mem.h
> +++ b/bsd-user/bsd-mem.h
> @@ -304,4 +304,43 @@ static inline abi_long do_bsd_shmget(abi_long arg1, abi_ulong arg2,
>      return get_errno(shmget(arg1, arg2, arg3));
>  }
>  
> +/* shmctl(2) */
> +static inline abi_long do_bsd_shmctl(abi_long shmid, abi_long cmd,
> +        abi_ulong buff)
> +{
> +    struct shmid_ds dsarg;
> +    abi_long ret = -TARGET_EINVAL;
> +
> +    cmd &= 0xff;
> +
> +    switch (cmd) {
> +    case IPC_STAT:
> +        if (target_to_host_shmid_ds(&dsarg, buff)) {
> +            return -TARGET_EFAULT;
> +        }
> +        ret = get_errno(shmctl(shmid, cmd, &dsarg));
> +        if (host_to_target_shmid_ds(buff, &dsarg)) {
> +            return -TARGET_EFAULT;
> +        }
> +        break;
> +
> +    case IPC_SET:
> +        if (target_to_host_shmid_ds(&dsarg, buff)) {
> +            return -TARGET_EFAULT;
> +        }
> +        ret = get_errno(shmctl(shmid, cmd, &dsarg));
> +        break;
> +
> +    case IPC_RMID:
> +        ret = get_errno(shmctl(shmid, cmd, NULL));
> +        break;
> +
> +    default:
> +        ret = -TARGET_EINVAL;
> +        break;
> +    }
> +
> +    return ret;
> +}
> +
>  #endif /* BSD_USER_BSD_MEM_H */
> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index 52cca2300f..35f94f51fc 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -555,6 +555,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
>          ret = do_bsd_shmget(arg1, arg2, arg3);
>          break;
>  
> +    case TARGET_FREEBSD_NR_shmctl: /* shmctl(2) */
> +        ret = do_bsd_shmctl(arg1, arg2, arg3);
> +        break;
> +
>          /*
>           * Misc
>           */
> -- 
> 2.42.0


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 21/23] bsd-user: Implement shmctl(2)
  2023-09-09 19:37 ` [PATCH v3 21/23] bsd-user: Implement shmctl(2) Karim Taha
  2023-09-13 13:01   ` Karim Taha
@ 2023-09-13 15:33   ` Richard Henderson
  1 sibling, 0 replies; 38+ messages in thread
From: Richard Henderson @ 2023-09-13 15:33 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp, Stacey Son

On 9/9/23 12:37, Karim Taha wrote:
> From: Stacey Son<sson@FreeBSD.org>
> 
> Signed-off-by: Stacey Son<sson@FreeBSD.org>
> Signed-off-by: Karim Taha<kariem.taha2.7@gmail.com>
> 
> Reviewed-by: Warner Losh<imp@bsdimp.com>
> ---
>   bsd-user/bsd-mem.h            | 39 +++++++++++++++++++++++++++++++++++
>   bsd-user/freebsd/os-syscall.c |  4 ++++
>   2 files changed, 43 insertions(+)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 17/23] bsd-user: Implement mincore(2)
  2023-09-12  0:03   ` Richard Henderson
@ 2023-09-13 22:02     ` Karim Taha
  2023-09-13 22:24       ` Richard Henderson
  0 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-13 22:02 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel; +Cc: imp

Richard Henderson <richard.henderson@linaro.org> wrote:

> On 9/9/23 12:36, Karim Taha wrote:
>> From: Stacey Son <sson@FreeBSD.org>
>> 
>> Signed-off-by: Stacey Son <sson@FreeBSD.org>
>> Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
>> ---
>>   bsd-user/bsd-mem.h            | 22 ++++++++++++++++++++++
>>   bsd-user/freebsd/os-syscall.c |  4 ++++
>>   2 files changed, 26 insertions(+)
>> 
>> diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
>> index 0e16051418..1dabbe36e6 100644
>> --- a/bsd-user/bsd-mem.h
>> +++ b/bsd-user/bsd-mem.h
>> @@ -189,4 +189,26 @@ static inline abi_long do_bsd_minherit(abi_long addr, abi_long len,
>>       return get_errno(minherit(g2h_untagged(addr), len, inherit));
>>   }
>>   
>> +/* mincore(2) */
>> +static inline abi_long do_bsd_mincore(abi_ulong target_addr, abi_ulong len,
>> +        abi_ulong target_vec)
>> +{
>> +    abi_long ret;
>> +    void *p;
>> +    abi_ulong vec_len = DIV_ROUND_UP(len,TARGET_PAGE_SIZE);
>> +
>> +    if (!guest_range_valid_untagged(target_addr,len) || !page_check_range(target_addr, len, PAGE_VALID)) {
>> +        return -TARGET_EFAULT;
>> +    }
>> +
>> +    p = lock_user(VERIFY_WRITE, target_vec, vec_len, 0);
>> +    if (p == NULL) {
>> +        return -TARGET_EFAULT;
>> +    }
>> +    ret = get_errno(mincore(g2h_untagged(target_addr), len, p));
>> +    unlock_user(p, target_vec, 0);
>
> You don't need the lock/unlock_user at all.  It is wrongly checking for WRITE.
>
>
> r~
>
AFAIU, the host is writing to the target's memory, right?

So this is similar to IPC_STAT case from the shmctl(2) syscall,
where host_to_target_shmid_ds, which has a `lock_user(VERIFY_WRITE,...)`, writes the struct `dsarg` set by
the host syscall `shmctl` at the address `buff` in the target memory.

Is it correct if the host writes to the target without
locking? for example, `mincore(g2h_untagged(target_addr), len, p)` can be done
without locking.

The locking was suggested by you in response to the v1 implementation
which used `lock_user_string`.

>> +
>> +    return ret;
>> +}
>> +
>>   #endif /* BSD_USER_BSD_MEM_H */
>> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
>> index f5d60cf902..8d1cf3b35c 100644
>> --- a/bsd-user/freebsd/os-syscall.c
>> +++ b/bsd-user/freebsd/os-syscall.c
>> @@ -527,6 +527,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
>>           ret = do_bsd_minherit(arg1, arg2, arg3);
>>           break;
>>   
>> +    case TARGET_FREEBSD_NR_mincore: /* mincore(2) */
p>> +        ret = do_bsd_mincore(arg1, arg2, arg3);
>> +        break;
>> +
>>   #if defined(__FreeBSD_version) && __FreeBSD_version >= 1300048
>>       case TARGET_FREEBSD_NR_shm_open2: /* shm_open2(2) */
>>           ret = do_freebsd_shm_open2(arg1, arg2, arg3, arg4, arg5);


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 17/23] bsd-user: Implement mincore(2)
  2023-09-13 22:02     ` Karim Taha
@ 2023-09-13 22:24       ` Richard Henderson
  0 siblings, 0 replies; 38+ messages in thread
From: Richard Henderson @ 2023-09-13 22:24 UTC (permalink / raw)
  To: Karim Taha, qemu-devel; +Cc: imp

On 9/13/23 15:02, Karim Taha wrote:
> Richard Henderson <richard.henderson@linaro.org> wrote:
> 
>> On 9/9/23 12:36, Karim Taha wrote:
>>> From: Stacey Son <sson@FreeBSD.org>
>>>
>>> Signed-off-by: Stacey Son <sson@FreeBSD.org>
>>> Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
>>> ---
>>>    bsd-user/bsd-mem.h            | 22 ++++++++++++++++++++++
>>>    bsd-user/freebsd/os-syscall.c |  4 ++++
>>>    2 files changed, 26 insertions(+)
>>>
>>> diff --git a/bsd-user/bsd-mem.h b/bsd-user/bsd-mem.h
>>> index 0e16051418..1dabbe36e6 100644
>>> --- a/bsd-user/bsd-mem.h
>>> +++ b/bsd-user/bsd-mem.h
>>> @@ -189,4 +189,26 @@ static inline abi_long do_bsd_minherit(abi_long addr, abi_long len,
>>>        return get_errno(minherit(g2h_untagged(addr), len, inherit));
>>>    }
>>>    
>>> +/* mincore(2) */
>>> +static inline abi_long do_bsd_mincore(abi_ulong target_addr, abi_ulong len,
>>> +        abi_ulong target_vec)
>>> +{
>>> +    abi_long ret;
>>> +    void *p;
>>> +    abi_ulong vec_len = DIV_ROUND_UP(len,TARGET_PAGE_SIZE);
>>> +
>>> +    if (!guest_range_valid_untagged(target_addr,len) || !page_check_range(target_addr, len, PAGE_VALID)) {
>>> +        return -TARGET_EFAULT;
>>> +    }
>>> +
>>> +    p = lock_user(VERIFY_WRITE, target_vec, vec_len, 0);
>>> +    if (p == NULL) {
>>> +        return -TARGET_EFAULT;
>>> +    }
>>> +    ret = get_errno(mincore(g2h_untagged(target_addr), len, p));
>>> +    unlock_user(p, target_vec, 0);
>>
>> You don't need the lock/unlock_user at all.  It is wrongly checking for WRITE.
>>
>>
>> r~
>>
> AFAIU, the host is writing to the target's memory, right?

Oops, I misread this.  The lock/unlock is for the output vector,
which means you do need it.

You also need unlock_user(p, target_vec, vec_len).

With that,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 22/23] bsd-user: Implement shmat(2) and shmdt(2)
  2023-09-12  0:08   ` Richard Henderson
@ 2023-09-14 16:55     ` Karim Taha
  2023-09-14 17:52       ` Richard Henderson
  0 siblings, 1 reply; 38+ messages in thread
From: Karim Taha @ 2023-09-14 16:55 UTC (permalink / raw)
  To: Richard Henderson, qemu-devel

Richard Henderson <richard.henderson@linaro.org> writes:

Do I need to enclose `shmdt implmenetation` in a WITH_MMAP_LOCK_GUARD() block?

Mr.Warner forwared me a patch series ,that you sent on Sun 20 Aug,
for the linux-user, which encloses the implementation in such a block.

--
Karim Taha
> On 9/9/23 12:37, Karim Taha wrote:
>> +static inline abi_long do_bsd_shmdt(abi_ulong shmaddr)
>> +{
>> +    int i;
>> +
>> +    for (i = 0; i < N_BSD_SHM_REGIONS; ++i) {
>> +        if (bsd_shm_regions[i].start == shmaddr) {
>> +            bsd_shm_regions[i].start = 0;
>> +            page_set_flags(shmaddr,
>> +                shmaddr + bsd_shm_regions[i].size, 0);
>> +            break;
>> +        }
>> +    }
>> +
>> +    return get_errno(shmdt(g2h_untagged(shmaddr)));
>> +}
>
> On success, this needs to mmap_reserve the region for reserved_va.
>
>
> r~


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH v3 22/23] bsd-user: Implement shmat(2) and shmdt(2)
  2023-09-14 16:55     ` Karim Taha
@ 2023-09-14 17:52       ` Richard Henderson
  0 siblings, 0 replies; 38+ messages in thread
From: Richard Henderson @ 2023-09-14 17:52 UTC (permalink / raw)
  To: Karim Taha, qemu-devel

On 9/14/23 09:55, Karim Taha wrote:
> Richard Henderson <richard.henderson@linaro.org> writes:
> 
> Do I need to enclose `shmdt implmenetation` in a WITH_MMAP_LOCK_GUARD() block?
> 
> Mr.Warner forwared me a patch series ,that you sent on Sun 20 Aug,
> for the linux-user, which encloses the implementation in such a block.

Yes.  All changes to the guest address space must be done with the lock.


r~



^ permalink raw reply	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2023-09-14 17:53 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-09 19:36 [PATCH v3 00/23] bsd-user: Implement mmap related system calls for FreeBSD Karim Taha
2023-09-09 19:36 ` [PATCH v3 01/23] bsd-user: Implement struct target_ipc_perm Karim Taha
2023-09-09 19:36 ` [PATCH v3 02/23] bsd-user: Implement struct target_shmid_ds Karim Taha
2023-09-09 19:36 ` [PATCH v3 03/23] bsd-user: Declarations for ipc_perm and shmid_ds conversion functions Karim Taha
2023-09-09 19:36 ` [PATCH v3 04/23] bsd-user: Introduce freebsd/os-misc.h to the source tree Karim Taha
2023-09-09 19:36 ` [PATCH v3 05/23] bsd-user: Implement shm_open2(2) system call Karim Taha
2023-09-11 23:51   ` Richard Henderson
2023-09-09 19:36 ` [PATCH v3 06/23] bsd-user: Implement shm_rename(2) " Karim Taha
2023-09-09 19:36 ` [PATCH v3 07/23] bsd-user: Add bsd-mem.c to meson.build Karim Taha
2023-09-09 19:36 ` [PATCH v3 08/23] bsd-user: Implement target_set_brk function in bsd-mem.c instead of os-syscall.c Karim Taha
2023-09-09 19:36 ` [PATCH v3 09/23] bsd-user: Implement ipc_perm conversion between host and target Karim Taha
2023-09-09 19:36 ` [PATCH v3 10/23] bsd-user: Implement shmid_ds " Karim Taha
2023-09-11 23:53   ` Richard Henderson
2023-09-09 19:36 ` [PATCH v3 11/23] bsd-user: Introduce bsd-mem.h to the source tree Karim Taha
2023-09-09 19:36 ` [PATCH v3 12/23] bsd-user: Implement mmap(2) and munmap(2) Karim Taha
2023-09-09 19:36 ` [PATCH v3 13/23] bsd-user: Implement mprotect(2) Karim Taha
2023-09-09 19:36 ` [PATCH v3 14/23] bsd-user: Implement msync(2) Karim Taha
2023-09-09 19:36 ` [PATCH v3 15/23] bsd-user: Implement mlock(2), munlock(2), mlockall(2), munlockall(2), minherit(2) Karim Taha
2023-09-09 19:36 ` [PATCH v3 16/23] bsd-user: Implment madvise(2) to match the linux-user implementation Karim Taha
2023-09-11 23:56   ` Richard Henderson
2023-09-09 19:36 ` [PATCH v3 17/23] bsd-user: Implement mincore(2) Karim Taha
2023-09-12  0:03   ` Richard Henderson
2023-09-13 22:02     ` Karim Taha
2023-09-13 22:24       ` Richard Henderson
2023-09-09 19:36 ` [PATCH v3 18/23] bsd-user: Implement do_obreak function Karim Taha
2023-09-12  0:05   ` Richard Henderson
2023-09-09 19:37 ` [PATCH v3 19/23] bsd-user: Implement shm_open(2) Karim Taha
2023-09-12  0:06   ` Richard Henderson
2023-09-09 19:37 ` [PATCH v3 20/23] bsd-user: Implement shm_unlink(2) and shmget(2) Karim Taha
2023-09-09 19:37 ` [PATCH v3 21/23] bsd-user: Implement shmctl(2) Karim Taha
2023-09-13 13:01   ` Karim Taha
2023-09-13 15:33   ` Richard Henderson
2023-09-09 19:37 ` [PATCH v3 22/23] bsd-user: Implement shmat(2) and shmdt(2) Karim Taha
2023-09-12  0:08   ` Richard Henderson
2023-09-14 16:55     ` Karim Taha
2023-09-14 17:52       ` Richard Henderson
2023-09-09 19:37 ` [PATCH v3 23/23] bsd-user: Add stubs for vadvise(), sbrk() and sstk() Karim Taha
2023-09-12  0:09   ` Richard Henderson

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).