qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls.
@ 2023-09-17 21:37 Karim Taha
  2023-09-17 21:37 ` [PATCH v2 01/28] bsd-user: define TARGET_RFSPAWN for rfork to use vfork(2) semantics, and fix RLIM_INFINITY Karim Taha
                   ` (27 more replies)
  0 siblings, 28 replies; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, Karim Taha



Karim Taha (3):
  bsd-user: define TARGET_RFSPAWN for rfork to use vfork(2) semantics,
    and fix RLIM_INFINITY
  bsd-user: Implement get_filename_from_fd.
  bsd-user: Implement execve(2) and fexecve(2) system calls.

Kyle Evans (1):
  bsd-user: Get number of cpus.

Stacey Son (24):
  bsd-user: Define procctl(2) related structs
  bsd-user: Implement host_to_target_siginfo.
  bsd-user: Add freebsd_exec_common and do_freebsd_procctl to qemu.h.
  bsd-user: add extern declarations for bsd-proc.c conversion functions
  bsd-user: Implement target_to_host_resource conversion function
  bsd-user: Implement target_to_host_rlim and host_to_target_rlim
    conversion.
  bsd-user: Implement host_to_target_rusage and host_to_target_wrusage.
  bsd-user: Implement host_to_target_waitstatus conversion.
  bsd-user: Implement getgroups(2) and setgroups(2) system calls.
  bsd-user: Implement umask(2), setlogin(2) and getlogin(2)
  bsd-user: Implement getrusage(2).
  bsd-user: Implement getrlimit(2) and setrlimit(2)
  bsd-user: Implement several get/set system calls:
  bsd-user: Implement get/set[resuid/resgid/sid] and issetugid.
  bsd-user: Add stubs for profil(2), ktrace(2), utrace(2) and ptrace(2).
  bsd-user: Implement getpriority(2) and setpriority(2).
  bsd-user: Implement freebsd_exec_common, used in implementing
    execve/fexecve.
  bsd-user: Implement procctl(2) along with necessary conversion
    functions.
  bsd-user: Implement wait4(2) and wait6(2) system calls.
  bsd-user: Implement setloginclass(2) and getloginclass(2) system
    calls.
  bsd-user: Implement pdgetpid(2) and the undocumented setugid.
  bsd-user: Implement fork(2) and vfork(2) system calls.
  bsd-user: Implement rfork(2) system call.
  bsd-user: Implement pdfork(2) system call.

 bsd-user/bsd-proc.c           | 144 ++++++++++
 bsd-user/bsd-proc.h           | 379 +++++++++++++++++++++++++++
 bsd-user/freebsd/meson.build  |   1 +
 bsd-user/freebsd/os-proc.c    | 480 ++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-proc.h    | 286 ++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 206 ++++++++++++++-
 bsd-user/main.c               |   2 +-
 bsd-user/meson.build          |   6 +
 bsd-user/qemu-bsd.h           |  38 +++
 bsd-user/qemu.h               |   7 +
 bsd-user/signal-common.h      |   1 +
 bsd-user/signal.c             |   6 +
 bsd-user/syscall_defs.h       |  50 +++-
 13 files changed, 1600 insertions(+), 6 deletions(-)
 create mode 100644 bsd-user/bsd-proc.c
 create mode 100644 bsd-user/freebsd/os-proc.c
 create mode 100644 bsd-user/freebsd/os-proc.h
 create mode 100644 bsd-user/qemu-bsd.h

-- 
2.42.0



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

* [PATCH v2 01/28] bsd-user: define TARGET_RFSPAWN for rfork to use vfork(2) semantics, and fix RLIM_INFINITY
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:03   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 02/28] bsd-user: Define procctl(2) related structs Karim Taha
                   ` (26 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, Karim Taha, Kyle Evans

RLIM_INFINITY on FreeBSD, OpenBSD and NetBSD has value of ~(1<<63), caculated
one way or another.

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>.
---
 bsd-user/syscall_defs.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/bsd-user/syscall_defs.h b/bsd-user/syscall_defs.h
index 9c90616baa..ddd38c13e0 100644
--- a/bsd-user/syscall_defs.h
+++ b/bsd-user/syscall_defs.h
@@ -130,11 +130,7 @@ struct target_freebsd_timeval {
 /*
  *  sys/resource.h
  */
-#if defined(__FreeBSD__)
 #define TARGET_RLIM_INFINITY    RLIM_INFINITY
-#else
-#define TARGET_RLIM_INFINITY    ((abi_ulong)-1)
-#endif
 
 #define TARGET_RLIMIT_CPU       0
 #define TARGET_RLIMIT_FSIZE     1
@@ -390,6 +386,10 @@ struct target_freebsd_flock {
     int32_t l_sysid;
 } QEMU_PACKED;
 
+/* sys/unistd.h */
+/* user: vfork(2) semantics, clear signals */
+#define TARGET_RFSPAWN (1U << 31)
+
 #define safe_syscall0(type, name) \
 type safe_##name(void) \
 { \
-- 
2.42.0



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

* [PATCH v2 02/28] bsd-user: Define procctl(2) related structs
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
  2023-09-17 21:37 ` [PATCH v2 01/28] bsd-user: define TARGET_RFSPAWN for rfork to use vfork(2) semantics, and fix RLIM_INFINITY Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:03   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 03/28] bsd-user: Implement host_to_target_siginfo Karim Taha
                   ` (25 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, Stacey Son, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

Implement procctl flags and related structs:
struct target_procctl_reaper_status
struct target_procctl_reaper_pidinfo
struct target_procctl_reaper_pids
struct target_procctl_reaper_kill

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/syscall_defs.h | 42 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/bsd-user/syscall_defs.h b/bsd-user/syscall_defs.h
index ddd38c13e0..a3bc738ff8 100644
--- a/bsd-user/syscall_defs.h
+++ b/bsd-user/syscall_defs.h
@@ -390,6 +390,48 @@ struct target_freebsd_flock {
 /* user: vfork(2) semantics, clear signals */
 #define TARGET_RFSPAWN (1U << 31)
 
+/*
+ * from sys/procctl.h
+ */
+#define TARGET_PROC_SPROTECT            1
+#define TARGET_PROC_REAP_ACQUIRE        2
+#define TARGET_PROC_REAP_RELEASE        3
+#define TARGET_PROC_REAP_STATUS         4
+#define TARGET_PROC_REAP_GETPIDS        5
+#define TARGET_PROC_REAP_KILL           6
+
+struct target_procctl_reaper_status {
+    uint32_t rs_flags;
+    uint32_t rs_children;
+    uint32_t rs_descendants;
+    uint32_t rs_reaper;
+    uint32_t rs_pid;
+    uint32_t rs_pad0[15];
+};
+
+struct target_procctl_reaper_pidinfo {
+    uint32_t pi_pid;
+    uint32_t pi_subtree;
+    uint32_t pi_flags;
+    uint32_t pi_pad0[15];
+};
+
+struct target_procctl_reaper_pids {
+    uint32_t rp_count;
+    uint32_t rp_pad0[15];
+    abi_ulong rp_pids;
+};
+
+struct target_procctl_reaper_kill {
+    int32_t  rk_sig;
+    uint32_t rk_flags;
+    uint32_t rk_subtree;
+    uint32_t rk_killed;
+    uint32_t rk_fpid;
+    uint32_t rk_pad0[15];
+};
+
+
 #define safe_syscall0(type, name) \
 type safe_##name(void) \
 { \
-- 
2.42.0



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

* [PATCH v2 03/28] bsd-user: Implement host_to_target_siginfo.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
  2023-09-17 21:37 ` [PATCH v2 01/28] bsd-user: define TARGET_RFSPAWN for rfork to use vfork(2) semantics, and fix RLIM_INFINITY Karim Taha
  2023-09-17 21:37 ` [PATCH v2 02/28] bsd-user: Define procctl(2) related structs Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:04   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 04/28] bsd-user: Add freebsd_exec_common and do_freebsd_procctl to qemu.h Karim Taha
                   ` (24 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, Stacey Son, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

Used in wait6 system call

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/signal-common.h | 1 +
 bsd-user/signal.c        | 6 ++++++
 2 files changed, 7 insertions(+)

diff --git a/bsd-user/signal-common.h b/bsd-user/signal-common.h
index 6f90345bb2..e37e1c3f9c 100644
--- a/bsd-user/signal-common.h
+++ b/bsd-user/signal-common.h
@@ -35,6 +35,7 @@ int do_sigaction(int sig, const struct target_sigaction *act,
 abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp);
 long do_sigreturn(CPUArchState *env, abi_ulong addr);
 void force_sig_fault(int sig, int code, abi_ulong addr);
+void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
 int host_to_target_signal(int sig);
 void host_to_target_sigset(target_sigset_t *d, const sigset_t *s);
 void process_pending_signals(CPUArchState *env);
diff --git a/bsd-user/signal.c b/bsd-user/signal.c
index 4db85a3485..3ee2ceb910 100644
--- a/bsd-user/signal.c
+++ b/bsd-user/signal.c
@@ -311,6 +311,12 @@ static void tswap_siginfo(target_siginfo_t *tinfo, const target_siginfo_t *info)
     }
 }
 
+void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info)
+{
+    host_to_target_siginfo_noswap(tinfo, info);
+    tswap_siginfo(tinfo, tinfo);
+}
+
 int block_signals(void)
 {
     TaskState *ts = (TaskState *)thread_cpu->opaque;
-- 
2.42.0



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

* [PATCH v2 04/28] bsd-user: Add freebsd_exec_common and do_freebsd_procctl to qemu.h.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (2 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 03/28] bsd-user: Implement host_to_target_siginfo Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:04   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 05/28] bsd-user: add extern declarations for bsd-proc.c conversion functions Karim Taha
                   ` (23 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/qemu.h | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index d3158bc2ed..2cf96d9a15 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -249,6 +249,12 @@ abi_long get_errno(abi_long ret);
 bool is_error(abi_long ret);
 int host_to_target_errno(int err);
 
+/* os-proc.c */
+abi_long freebsd_exec_common(abi_ulong path_or_fd, abi_ulong guest_argp,
+        abi_ulong guest_envp, int do_fexec);
+abi_long do_freebsd_procctl(void *cpu_env, int idtype, abi_ulong arg2,
+        abi_ulong arg3, abi_ulong arg4, abi_ulong arg5, abi_ulong arg6);
+
 /* os-sys.c */
 abi_long do_freebsd_sysctl(CPUArchState *env, abi_ulong namep, int32_t namelen,
         abi_ulong oldp, abi_ulong oldlenp, abi_ulong newp, abi_ulong newlen);
-- 
2.42.0



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

* [PATCH v2 05/28] bsd-user: add extern declarations for bsd-proc.c conversion functions
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (3 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 04/28] bsd-user: Add freebsd_exec_common and do_freebsd_procctl to qemu.h Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:05   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 06/28] bsd-user: Implement target_to_host_resource conversion function Karim Taha
                   ` (22 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/qemu-bsd.h | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 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..b93a0b7fd5
--- /dev/null
+++ b/bsd-user/qemu-bsd.h
@@ -0,0 +1,38 @@
+/*
+ *  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/resource.h>
+
+/* bsd-proc.c */
+int target_to_host_resource(int code);
+rlim_t target_to_host_rlim(abi_llong target_rlim);
+abi_llong host_to_target_rlim(rlim_t rlim);
+abi_long host_to_target_rusage(abi_ulong target_addr,
+        const struct rusage *rusage);
+abi_long host_to_target_wrusage(abi_ulong target_addr,
+        const struct __wrusage *wrusage);
+int host_to_target_waitstatus(int status);
+void h2g_rusage(const struct rusage *rusage,
+        struct target_freebsd_rusage *target_rusage);
+
+#endif /* QEMU_BSD_H */
-- 
2.42.0



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

* [PATCH v2 06/28] bsd-user: Implement target_to_host_resource conversion function
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (4 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 05/28] bsd-user: add extern declarations for bsd-proc.c conversion functions Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-17 21:37 ` [PATCH v2 07/28] bsd-user: Implement target_to_host_rlim and host_to_target_rlim conversion Karim Taha
                   ` (21 subsequent siblings)
  27 siblings, 0 replies; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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-proc.c  | 40 ++++++++++++++++++++++++++++++++++++++++
 bsd-user/bsd-proc.h  |  4 ++++
 bsd-user/meson.build |  6 ++++++
 3 files changed, 50 insertions(+)
 create mode 100644 bsd-user/bsd-proc.c

diff --git a/bsd-user/bsd-proc.c b/bsd-user/bsd-proc.c
new file mode 100644
index 0000000000..68410a0aa9
--- /dev/null
+++ b/bsd-user/bsd-proc.c
@@ -0,0 +1,40 @@
+/*
+ *  BSD process related system call helpers
+ *
+ *  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/>.
+ */
+#include "qemu/osdep.h"
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/cpuset.h>
+#include <sys/resource.h>
+#include <sys/wait.h>
+
+#include "qemu.h"
+#include "qemu-bsd.h"
+#include "signal-common.h"
+
+#include "bsd-proc.h"
+
+/*
+ * resource/rusage conversion
+ */
+int target_to_host_resource(int code)
+{
+    return code;
+}
+
diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index a1061bffb8..048773a75d 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -22,6 +22,10 @@
 
 #include <sys/resource.h>
 
+#include "qemu-bsd.h"
+#include "gdbstub/syscalls.h"
+#include "qemu/plugin.h"
+
 /* exit(2) */
 static inline abi_long do_bsd_exit(void *cpu_env, abi_long arg1)
 {
diff --git a/bsd-user/meson.build b/bsd-user/meson.build
index 5243122fc5..b97fce1472 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-proc.c',
   'bsdload.c',
   'elfload.c',
   'main.c',
@@ -16,6 +17,11 @@ bsd_user_ss.add(files(
   'uaccess.c',
 ))
 
+elf = cc.find_library('elf', required: true)
+procstat = cc.find_library('procstat', required: true)
+kvm = cc.find_library('kvm', required: true)
+bsd_user_ss.add(elf, procstat, kvm)
+
 # Pull in the OS-specific build glue, if any
 subdir(targetos)
 
-- 
2.42.0



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

* [PATCH v2 07/28] bsd-user: Implement target_to_host_rlim and host_to_target_rlim conversion.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (5 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 06/28] bsd-user: Implement target_to_host_resource conversion function Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:10   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 08/28] bsd-user: Implement host_to_target_rusage and host_to_target_wrusage Karim Taha
                   ` (20 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-proc.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/bsd-user/bsd-proc.c b/bsd-user/bsd-proc.c
index 68410a0aa9..19e39a2f76 100644
--- a/bsd-user/bsd-proc.c
+++ b/bsd-user/bsd-proc.c
@@ -38,3 +38,13 @@ int target_to_host_resource(int code)
     return code;
 }
 
+rlim_t target_to_host_rlim(abi_llong target_rlim)
+{
+    return tswap64(target_rlim);
+}
+
+abi_llong host_to_target_rlim(rlim_t rlim)
+{
+    return tswap64(rlim);
+}
+
-- 
2.42.0



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

* [PATCH v2 08/28] bsd-user: Implement host_to_target_rusage and host_to_target_wrusage.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (6 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 07/28] bsd-user: Implement target_to_host_rlim and host_to_target_rlim conversion Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:11   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 09/28] bsd-user: Implement host_to_target_waitstatus conversion Karim Taha
                   ` (19 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-proc.c | 54 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/bsd-user/bsd-proc.c b/bsd-user/bsd-proc.c
index 19e39a2f76..aa386ff482 100644
--- a/bsd-user/bsd-proc.c
+++ b/bsd-user/bsd-proc.c
@@ -48,3 +48,57 @@ abi_llong host_to_target_rlim(rlim_t rlim)
     return tswap64(rlim);
 }
 
+void h2g_rusage(const struct rusage *rusage,
+                struct target_freebsd_rusage *target_rusage)
+{
+    __put_user(rusage->ru_utime.tv_sec, &target_rusage->ru_utime.tv_sec);
+    __put_user(rusage->ru_utime.tv_usec, &target_rusage->ru_utime.tv_usec);
+
+    __put_user(rusage->ru_stime.tv_sec, &target_rusage->ru_stime.tv_sec);
+    __put_user(rusage->ru_stime.tv_usec, &target_rusage->ru_stime.tv_usec);
+
+    __put_user(rusage->ru_maxrss, &target_rusage->ru_maxrss);
+    __put_user(rusage->ru_idrss, &target_rusage->ru_idrss);
+    __put_user(rusage->ru_idrss, &target_rusage->ru_idrss);
+    __put_user(rusage->ru_isrss, &target_rusage->ru_isrss);
+    __put_user(rusage->ru_minflt, &target_rusage->ru_minflt);
+    __put_user(rusage->ru_majflt, &target_rusage->ru_majflt);
+    __put_user(rusage->ru_nswap, &target_rusage->ru_nswap);
+    __put_user(rusage->ru_inblock, &target_rusage->ru_inblock);
+    __put_user(rusage->ru_oublock, &target_rusage->ru_oublock);
+    __put_user(rusage->ru_msgsnd, &target_rusage->ru_msgsnd);
+    __put_user(rusage->ru_msgrcv, &target_rusage->ru_msgrcv);
+    __put_user(rusage->ru_nsignals, &target_rusage->ru_nsignals);
+    __put_user(rusage->ru_nvcsw, &target_rusage->ru_nvcsw);
+    __put_user(rusage->ru_nivcsw, &target_rusage->ru_nivcsw);
+}
+
+abi_long host_to_target_rusage(abi_ulong target_addr,
+        const struct rusage *rusage)
+{
+    struct target_freebsd_rusage *target_rusage;
+
+    if (!lock_user_struct(VERIFY_WRITE, target_rusage, target_addr, 0)) {
+        return -TARGET_EFAULT;
+    }
+    h2g_rusage(rusage, target_rusage);
+    unlock_user_struct(target_rusage, target_addr, 1);
+
+    return 0;
+}
+
+abi_long host_to_target_wrusage(abi_ulong target_addr,
+                                const struct __wrusage *wrusage)
+{
+    struct target_freebsd__wrusage *target_wrusage;
+
+    if (!lock_user_struct(VERIFY_WRITE, target_wrusage, target_addr, 0)) {
+        return -TARGET_EFAULT;
+    }
+    h2g_rusage(&wrusage->wru_self, &target_wrusage->wru_self);
+    h2g_rusage(&wrusage->wru_children, &target_wrusage->wru_children);
+    unlock_user_struct(target_wrusage, target_addr, 1);
+
+    return 0;
+}
+
-- 
2.42.0



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

* [PATCH v2 09/28] bsd-user: Implement host_to_target_waitstatus conversion.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (7 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 08/28] bsd-user: Implement host_to_target_rusage and host_to_target_wrusage Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:14   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 10/28] bsd-user: Get number of cpus Karim Taha
                   ` (18 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-proc.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/bsd-user/bsd-proc.c b/bsd-user/bsd-proc.c
index aa386ff482..19f6efe1f7 100644
--- a/bsd-user/bsd-proc.c
+++ b/bsd-user/bsd-proc.c
@@ -102,3 +102,20 @@ abi_long host_to_target_wrusage(abi_ulong target_addr,
     return 0;
 }
 
+/*
+ * wait status conversion.
+ *
+ * Map host to target signal numbers for the wait family of syscalls.
+ * Assume all other status bits are the same.
+ */
+int host_to_target_waitstatus(int status)
+{
+    if (WIFSIGNALED(status)) {
+        return host_to_target_signal(WTERMSIG(status)) | (status & ~0x7f);
+    }
+    if (WIFSTOPPED(status)) {
+        return (host_to_target_signal(WSTOPSIG(status)) << 8) | (status & 0xff);
+    }
+    return status;
+}
+
-- 
2.42.0



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

* [PATCH v2 10/28] bsd-user: Get number of cpus.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (8 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 09/28] bsd-user: Implement host_to_target_waitstatus conversion Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:19   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 11/28] bsd-user: Implement getgroups(2) and setgroups(2) system calls Karim Taha
                   ` (17 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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/bsd-proc.c | 23 +++++++++++++++++++++++
 bsd-user/bsd-proc.h |  2 ++
 2 files changed, 25 insertions(+)

diff --git a/bsd-user/bsd-proc.c b/bsd-user/bsd-proc.c
index 19f6efe1f7..78f5b172d7 100644
--- a/bsd-user/bsd-proc.c
+++ b/bsd-user/bsd-proc.c
@@ -119,3 +119,26 @@ int host_to_target_waitstatus(int status)
     return status;
 }
 
+int bsd_get_ncpu(void)
+{
+    int ncpu = -1;
+    cpuset_t mask;
+
+    CPU_ZERO(&mask);
+
+    if (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, sizeof(mask),
+                           &mask) == 0) {
+        ncpu = CPU_COUNT(&mask);
+    }
+#ifdef _SC_NPROCESSORS_ONLN
+    if (ncpu == -1) {
+        ncpu = sysconf(_SC_NPROCESSORS_ONLN);
+    }
+#endif
+    if (ncpu == -1) {
+        gemu_log("XXX Missing bsd_get_ncpu() implementation\n");
+        ncpu = 1;
+    }
+    return ncpu;
+}
+
diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index 048773a75d..b6225e520e 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -26,6 +26,8 @@
 #include "gdbstub/syscalls.h"
 #include "qemu/plugin.h"
 
+int bsd_get_ncpu(void);
+
 /* exit(2) */
 static inline abi_long do_bsd_exit(void *cpu_env, abi_long arg1)
 {
-- 
2.42.0



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

* [PATCH v2 11/28] bsd-user: Implement getgroups(2) and setgroups(2) system calls.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (9 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 10/28] bsd-user: Get number of cpus Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:22   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 12/28] bsd-user: Implement umask(2), setlogin(2) and getlogin(2) Karim Taha
                   ` (16 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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-proc.h           | 44 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  9 +++++++
 2 files changed, 53 insertions(+)

diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index b6225e520e..7b25aa1982 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -41,4 +41,48 @@ static inline abi_long do_bsd_exit(void *cpu_env, abi_long arg1)
     return 0;
 }
 
+/* getgroups(2) */
+static inline abi_long do_bsd_getgroups(abi_long gidsetsize, abi_long arg2)
+{
+    abi_long ret;
+    uint32_t *target_grouplist;
+    g_autofree gid_t *grouplist;
+    int i;
+
+    grouplist = g_try_new(gid_t, gidsetsize);
+    ret = get_errno(getgroups(gidsetsize, grouplist));
+    if (gidsetsize != 0) {
+        if (!is_error(ret)) {
+            target_grouplist = lock_user(VERIFY_WRITE, arg2, gidsetsize * 2, 0);
+            if (!target_grouplist) {
+                return -TARGET_EFAULT;
+            }
+            for (i = 0; i < ret; i++) {
+                target_grouplist[i] = tswap32(grouplist[i]);
+            }
+            unlock_user(target_grouplist, arg2, gidsetsize * 2);
+        }
+    }
+    return ret;
+}
+
+/* setgroups(2) */
+static inline abi_long do_bsd_setgroups(abi_long gidsetsize, abi_long arg2)
+{
+    uint32_t *target_grouplist;
+    g_autofree gid_t *grouplist;
+    int i;
+
+    grouplist = g_try_new(gid_t, gidsetsize);
+    target_grouplist = lock_user(VERIFY_READ, arg2, gidsetsize * 2, 1);
+    if (!target_grouplist) {
+        return -TARGET_EFAULT;
+    }
+    for (i = 0; i < gidsetsize; i++) {
+        grouplist[i] = tswap32(target_grouplist[i]);
+    }
+    unlock_user(target_grouplist, arg2, 0);
+    return get_errno(setgroups(gidsetsize, grouplist));
+}
+
 #endif /* !BSD_PROC_H_ */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index fa60df529e..535e6287bd 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -223,6 +223,15 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_exit(cpu_env, arg1);
         break;
 
+    case TARGET_FREEBSD_NR_getgroups: /* getgroups(2) */
+        ret = do_bsd_getgroups(arg1, arg2);
+        break;
+
+    case TARGET_FREEBSD_NR_setgroups: /* setgroups(2) */
+        ret = do_bsd_setgroups(arg1, arg2);
+        break;
+
+
         /*
          * File system calls.
          */
-- 
2.42.0



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

* [PATCH v2 12/28] bsd-user: Implement umask(2), setlogin(2) and getlogin(2)
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (10 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 11/28] bsd-user: Implement getgroups(2) and setgroups(2) system calls Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:33   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 13/28] bsd-user: Implement getrusage(2) Karim Taha
                   ` (15 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-proc.h           | 39 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 12 +++++++++++
 2 files changed, 51 insertions(+)

diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index 7b25aa1982..fd05422d9a 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -26,6 +26,7 @@
 #include "gdbstub/syscalls.h"
 #include "qemu/plugin.h"
 
+extern int _getlogin(char*, int);
 int bsd_get_ncpu(void);
 
 /* exit(2) */
@@ -85,4 +86,42 @@ static inline abi_long do_bsd_setgroups(abi_long gidsetsize, abi_long arg2)
     return get_errno(setgroups(gidsetsize, grouplist));
 }
 
+/* umask(2) */
+static inline abi_long do_bsd_umask(abi_long arg1)
+{
+    return get_errno(umask(arg1));
+}
+
+/* setlogin(2) */
+static inline abi_long do_bsd_setlogin(abi_long arg1)
+{
+    abi_long ret;
+    void *p;
+
+    p = lock_user_string(arg1);
+    if (p == NULL) {
+        return -TARGET_EFAULT;
+    }
+    ret = get_errno(setlogin(p));
+    unlock_user(p, arg1, 0);
+
+    return ret;
+}
+
+/* getlogin(2) */
+static inline abi_long do_bsd_getlogin(abi_long arg1, abi_long arg2)
+{
+    abi_long ret;
+    void *p;
+
+    p = lock_user_string(arg1);
+    if (p == NULL) {
+        return -TARGET_EFAULT;
+    }
+    ret = get_errno(_getlogin(p, arg2));
+    unlock_user(p, arg1, 0);
+
+    return ret;
+}
+
 #endif /* !BSD_PROC_H_ */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 535e6287bd..44cbf52f08 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -231,6 +231,18 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_setgroups(arg1, arg2);
         break;
 
+    case TARGET_FREEBSD_NR_umask: /* umask(2) */
+        ret = do_bsd_umask(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_setlogin: /* setlogin(2) */
+        ret = do_bsd_setlogin(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_getlogin: /* getlogin(2) */
+        ret = do_bsd_getlogin(arg1, arg2);
+        break;
+
 
         /*
          * File system calls.
-- 
2.42.0



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

* [PATCH v2 13/28] bsd-user: Implement getrusage(2).
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (11 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 12/28] bsd-user: Implement umask(2), setlogin(2) and getlogin(2) Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:37   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 14/28] bsd-user: Implement getrlimit(2) and setrlimit(2) Karim Taha
                   ` (14 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-proc.h           | 13 +++++++++++++
 bsd-user/freebsd/os-syscall.c |  4 ++++
 2 files changed, 17 insertions(+)

diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index fd05422d9a..57fea173c2 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -124,4 +124,17 @@ static inline abi_long do_bsd_getlogin(abi_long arg1, abi_long arg2)
     return ret;
 }
 
+/* getrusage(2) */
+static inline abi_long do_bsd_getrusage(abi_long who, abi_ulong target_addr)
+{
+    abi_long ret;
+    struct rusage rusage;
+
+    ret = get_errno(getrusage(who, &rusage));
+    if (!is_error(ret)) {
+        host_to_target_rusage(target_addr, &rusage);
+    }
+    return ret;
+}
+
 #endif /* !BSD_PROC_H_ */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 44cbf52f08..5d8693ed55 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -243,6 +243,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_getlogin(arg1, arg2);
         break;
 
+    case TARGET_FREEBSD_NR_getrusage: /* getrusage(2) */
+        ret = do_bsd_getrusage(arg1, arg2);
+        break;
+
 
         /*
          * File system calls.
-- 
2.42.0



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

* [PATCH v2 14/28] bsd-user: Implement getrlimit(2) and setrlimit(2)
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (12 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 13/28] bsd-user: Implement getrusage(2) Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:42   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 15/28] bsd-user: Implement several get/set system calls: Karim Taha
                   ` (13 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-proc.h           | 59 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  8 +++++
 2 files changed, 67 insertions(+)

diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index 57fea173c2..06b5b9e03c 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -137,4 +137,63 @@ static inline abi_long do_bsd_getrusage(abi_long who, abi_ulong target_addr)
     return ret;
 }
 
+/* getrlimit(2) */
+static inline abi_long do_bsd_getrlimit(abi_long arg1, abi_ulong arg2)
+{
+    abi_long ret;
+    int resource = target_to_host_resource(arg1);
+    struct target_rlimit *target_rlim;
+    struct rlimit rlim;
+
+    switch (resource) {
+    case RLIMIT_STACK:
+        rlim.rlim_cur = target_dflssiz;
+        rlim.rlim_max = target_maxssiz;
+        ret = 0;
+        break;
+
+    case RLIMIT_DATA:
+        rlim.rlim_cur = target_dfldsiz;
+        rlim.rlim_max = target_maxdsiz;
+        ret = 0;
+        break;
+
+    default:
+        ret = get_errno(getrlimit(resource, &rlim));
+        break;
+    }
+    if (!is_error(ret)) {
+        if (!lock_user_struct(VERIFY_WRITE, target_rlim, arg2, 0)) {
+            return -TARGET_EFAULT;
+        }
+        target_rlim->rlim_cur = host_to_target_rlim(rlim.rlim_cur);
+        target_rlim->rlim_max = host_to_target_rlim(rlim.rlim_max);
+        unlock_user_struct(target_rlim, arg2, 1);
+    }
+    return ret;
+}
+
+/* setrlimit(2) */
+static inline abi_long do_bsd_setrlimit(abi_long arg1, abi_ulong arg2)
+{
+    abi_long ret;
+    int resource = target_to_host_resource(arg1);
+    struct target_rlimit *target_rlim;
+    struct rlimit rlim;
+
+    if (RLIMIT_STACK == resource) {
+        /* XXX We should, maybe, allow the stack size to shrink */
+        ret = -TARGET_EPERM;
+    } else {
+        if (!lock_user_struct(VERIFY_READ, target_rlim, arg2, 1)) {
+            return -TARGET_EFAULT;
+        }
+        rlim.rlim_cur = target_to_host_rlim(target_rlim->rlim_cur);
+        rlim.rlim_max = target_to_host_rlim(target_rlim->rlim_max);
+        unlock_user_struct(target_rlim, arg2, 0);
+        ret = get_errno(setrlimit(resource, &rlim));
+    }
+    return ret;
+}
+
 #endif /* !BSD_PROC_H_ */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 5d8693ed55..5cb6086230 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -247,6 +247,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_getrusage(arg1, arg2);
         break;
 
+    case TARGET_FREEBSD_NR_getrlimit: /* getrlimit(2) */
+        ret = do_bsd_getrlimit(arg1, arg2);
+        break;
+
+    case TARGET_FREEBSD_NR_setrlimit: /* setrlimit(2) */
+        ret = do_bsd_setrlimit(arg1, arg2);
+        break;
+
 
         /*
          * File system calls.
-- 
2.42.0



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

* [PATCH v2 15/28] bsd-user: Implement several get/set system calls:
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (13 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 14/28] bsd-user: Implement getrlimit(2) and setrlimit(2) Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:44   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 16/28] bsd-user: Implement get/set[resuid/resgid/sid] and issetugid Karim Taha
                   ` (12 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, Stacey Son, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

getpid(2), getppid(2), getpgrp(2)
setreuid(2), setregid(2)
getuid(2), geteuid(2), getgid(2), getegid(2), getpgid(2)
setuid(2), seteuid(2), setgid(2), setegid(2), setpgid(2)

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-proc.h           | 90 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 60 +++++++++++++++++++++++
 2 files changed, 150 insertions(+)

diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index 06b5b9e03c..9709939337 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -196,4 +196,94 @@ static inline abi_long do_bsd_setrlimit(abi_long arg1, abi_ulong arg2)
     return ret;
 }
 
+/* getpid(2) */
+static inline abi_long do_bsd_getpid(void)
+{
+    return get_errno(getpid());
+}
+
+/* getppid(2) */
+static inline abi_long do_bsd_getppid(void)
+{
+    return get_errno(getppid());
+}
+
+/* getuid(2) */
+static inline abi_long do_bsd_getuid(void)
+{
+    return get_errno(getuid());
+}
+
+/* geteuid(2) */
+static inline abi_long do_bsd_geteuid(void)
+{
+    return get_errno(geteuid());
+}
+
+/* getgid(2) */
+static inline abi_long do_bsd_getgid(void)
+{
+    return get_errno(getgid());
+}
+
+/* getegid(2) */
+static inline abi_long do_bsd_getegid(void)
+{
+    return get_errno(getegid());
+}
+
+/* setuid(2) */
+static inline abi_long do_bsd_setuid(abi_long arg1)
+{
+    return get_errno(setuid(arg1));
+}
+
+/* seteuid(2) */
+static inline abi_long do_bsd_seteuid(abi_long arg1)
+{
+    return get_errno(seteuid(arg1));
+}
+
+/* setgid(2) */
+static inline abi_long do_bsd_setgid(abi_long arg1)
+{
+    return get_errno(setgid(arg1));
+}
+
+/* setegid(2) */
+static inline abi_long do_bsd_setegid(abi_long arg1)
+{
+    return get_errno(setegid(arg1));
+}
+
+/* getpgid(2) */
+static inline abi_long do_bsd_getpgid(pid_t pid)
+{
+    return get_errno(getpgid(pid));
+}
+
+/* setpgid(2) */
+static inline abi_long do_bsd_setpgid(int pid, int pgrp)
+{
+    return get_errno(setpgid(pid, pgrp));
+}
+
+/* getpgrp(2) */
+static inline abi_long do_bsd_getpgrp(void)
+{
+    return get_errno(getpgrp());
+}
+
+/* setreuid(2) */
+static inline abi_long do_bsd_setreuid(abi_long arg1, abi_long arg2)
+{
+    return get_errno(setreuid(arg1, arg2));
+}
+
+/* setregid(2) */
+static inline abi_long do_bsd_setregid(abi_long arg1, abi_long arg2)
+{
+    return get_errno(setregid(arg1, arg2));
+}
+
 #endif /* !BSD_PROC_H_ */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 5cb6086230..7565e69e76 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -255,6 +255,66 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_setrlimit(arg1, arg2);
         break;
 
+    case TARGET_FREEBSD_NR_getpid: /* getpid(2) */
+        ret = do_bsd_getpid();
+        break;
+
+    case TARGET_FREEBSD_NR_getppid: /* getppid(2) */
+        ret = do_bsd_getppid();
+        break;
+
+    case TARGET_FREEBSD_NR_getuid: /* getuid(2) */
+        ret = do_bsd_getuid();
+        break;
+
+    case TARGET_FREEBSD_NR_geteuid: /* geteuid(2) */
+        ret = do_bsd_geteuid();
+        break;
+
+    case TARGET_FREEBSD_NR_getgid: /* getgid(2) */
+        ret = do_bsd_getgid();
+        break;
+
+    case TARGET_FREEBSD_NR_getegid: /* getegid(2) */
+        ret = do_bsd_getegid();
+        break;
+
+    case TARGET_FREEBSD_NR_setuid: /* setuid(2) */
+        ret = do_bsd_setuid(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_seteuid: /* seteuid(2) */
+        ret = do_bsd_seteuid(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_setgid: /* setgid(2) */
+        ret = do_bsd_setgid(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_setegid: /* setegid(2) */
+        ret = do_bsd_setegid(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_getpgrp: /* getpgrp(2) */
+        ret = do_bsd_getpgrp();
+        break;
+
+    case TARGET_FREEBSD_NR_getpgid: /* getpgid(2) */
+         ret = do_bsd_getpgid(arg1);
+         break;
+
+    case TARGET_FREEBSD_NR_setpgid: /* setpgid(2) */
+         ret = do_bsd_setpgid(arg1, arg2);
+         break;
+
+    case TARGET_FREEBSD_NR_setreuid: /* setreuid(2) */
+        ret = do_bsd_setreuid(arg1, arg2);
+        break;
+
+    case TARGET_FREEBSD_NR_setregid: /* setregid(2) */
+        ret = do_bsd_setregid(arg1, arg2);
+        break;
+
 
         /*
          * File system calls.
-- 
2.42.0



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

* [PATCH v2 16/28] bsd-user: Implement get/set[resuid/resgid/sid] and issetugid.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (14 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 15/28] bsd-user: Implement several get/set system calls: Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:45   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 17/28] bsd-user: Add stubs for profil(2), ktrace(2), utrace(2) and ptrace(2) Karim Taha
                   ` (11 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-proc.h           | 76 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 28 +++++++++++++
 2 files changed, 104 insertions(+)

diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index 9709939337..edbd408995 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -286,4 +286,80 @@ static inline abi_long do_bsd_setregid(abi_long arg1, abi_long arg2)
     return get_errno(setregid(arg1, arg2));
 }
 
+/* setresgid(2) */
+static inline abi_long do_bsd_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
+{
+    return get_errno(setresgid(rgid, egid, sgid));
+}
+
+/* setresuid(2) */
+static inline abi_long do_bsd_setresuid(uid_t ruid, uid_t euid, uid_t suid)
+{
+    return get_errno(setresuid(ruid, euid, suid));
+}
+
+/* getresuid(2) */
+static inline abi_long do_bsd_getresuid(abi_ulong arg1, abi_ulong arg2,
+        abi_ulong arg3)
+{
+    abi_long ret;
+    uid_t ruid, euid, suid;
+
+    ret = get_errno(getresuid(&ruid, &euid, &suid));
+    if (is_error(ret)) {
+            return ret;
+    }
+    if (put_user_s32(ruid, arg1)) {
+        return -TARGET_EFAULT;
+    }
+    if (put_user_s32(euid, arg2)) {
+        return -TARGET_EFAULT;
+    }
+    if (put_user_s32(suid, arg3)) {
+        return -TARGET_EFAULT;
+    }
+    return ret;
+}
+
+/* getresgid(2) */
+static inline abi_long do_bsd_getresgid(abi_ulong arg1, abi_ulong arg2,
+                                        abi_ulong arg3)
+{
+    abi_long ret;
+    uid_t ruid, euid, suid;
+
+    ret = get_errno(getresgid(&ruid, &euid, &suid));
+    if (is_error(ret)) {
+            return ret;
+    }
+    if (put_user_s32(ruid, arg1)) {
+        return -TARGET_EFAULT;
+    }
+    if (put_user_s32(euid, arg2)) {
+        return -TARGET_EFAULT;
+    }
+    if (put_user_s32(suid, arg3)) {
+        return -TARGET_EFAULT;
+    }
+    return ret;
+}
+
+/* getsid(2) */
+static inline abi_long do_bsd_getsid(abi_long arg1)
+{
+    return get_errno(getsid(arg1));
+}
+
+/* setsid(2) */
+static inline abi_long do_bsd_setsid(void)
+{
+    return get_errno(setsid());
+}
+
+/* issetugid(2) */
+static inline abi_long do_bsd_issetugid(void)
+{
+    return get_errno(issetugid());
+}
+
 #endif /* !BSD_PROC_H_ */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 7565e69e76..7b51f4f16e 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -315,6 +315,34 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_setregid(arg1, arg2);
         break;
 
+    case TARGET_FREEBSD_NR_getresuid: /* getresuid(2) */
+        ret = do_bsd_getresuid(arg1, arg2, arg3);
+        break;
+
+    case TARGET_FREEBSD_NR_getresgid: /* getresgid(2) */
+        ret = do_bsd_getresgid(arg1, arg2, arg3);
+        break;
+
+    case TARGET_FREEBSD_NR_setresuid: /* setresuid(2) */
+        ret = do_bsd_setresuid(arg1, arg2, arg3);
+        break;
+
+    case TARGET_FREEBSD_NR_setresgid: /* setresgid(2) */
+        ret = do_bsd_setresgid(arg1, arg2, arg3);
+        break;
+
+    case TARGET_FREEBSD_NR_getsid: /* getsid(2) */
+        ret = do_bsd_getsid(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_setsid: /* setsid(2) */
+        ret = do_bsd_setsid();
+        break;
+
+    case TARGET_FREEBSD_NR_issetugid: /* issetugid(2) */
+        ret = do_bsd_issetugid();
+        break;
+
 
         /*
          * File system calls.
-- 
2.42.0



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

* [PATCH v2 17/28] bsd-user: Add stubs for profil(2), ktrace(2), utrace(2) and ptrace(2).
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (15 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 16/28] bsd-user: Implement get/set[resuid/resgid/sid] and issetugid Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:47   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 18/28] bsd-user: Implement getpriority(2) and setpriority(2) Karim Taha
                   ` (10 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/bsd-proc.h           | 28 ++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 16 ++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index edbd408995..fff1d4cded 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -362,4 +362,32 @@ static inline abi_long do_bsd_issetugid(void)
     return get_errno(issetugid());
 }
 
+/* profil(2) */
+static inline abi_long do_bsd_profil(abi_long arg1, abi_long arg2,
+                                     abi_long arg3, abi_long arg4)
+{
+    return -TARGET_ENOSYS;
+}
+
+/* ktrace(2) */
+static inline abi_long do_bsd_ktrace(abi_long arg1, abi_long arg2,
+                                     abi_long arg3, abi_long arg4)
+{
+    return -TARGET_ENOSYS;
+}
+
+/* utrace(2) */
+static inline abi_long do_bsd_utrace(abi_long arg1, abi_long arg2)
+{
+    return -TARGET_ENOSYS;
+}
+
+
+/* ptrace(2) */
+static inline abi_long do_bsd_ptrace(abi_long arg1, abi_long arg2,
+        abi_long arg3, abi_long arg4)
+{
+    return -TARGET_ENOSYS;
+}
+
 #endif /* !BSD_PROC_H_ */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 7b51f4f16e..1a760b1380 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -343,6 +343,22 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_issetugid();
         break;
 
+    case TARGET_FREEBSD_NR_profil: /* profil(2) */
+        ret = do_bsd_profil(arg1, arg2, arg3, arg4);
+        break;
+
+    case TARGET_FREEBSD_NR_ktrace: /* ktrace(2) */
+        ret = do_bsd_ktrace(arg1, arg2, arg3, arg4);
+        break;
+
+    case TARGET_FREEBSD_NR_utrace: /* utrace(2) */
+        ret = do_bsd_utrace(arg1, arg2);
+        break;
+
+    case TARGET_FREEBSD_NR_ptrace: /* ptrace(2) */
+        ret = do_bsd_ptrace(arg1, arg2, arg3, arg4);
+        break;
+
 
         /*
          * File system calls.
-- 
2.42.0



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

* [PATCH v2 18/28] bsd-user: Implement getpriority(2) and setpriority(2).
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (16 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 17/28] bsd-user: Add stubs for profil(2), ktrace(2), utrace(2) and ptrace(2) Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:48   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 19/28] bsd-user: Implement get_filename_from_fd Karim Taha
                   ` (9 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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-proc.h           | 24 ++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  8 ++++++++
 2 files changed, 32 insertions(+)

diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
index fff1d4cded..89792d26c6 100644
--- a/bsd-user/bsd-proc.h
+++ b/bsd-user/bsd-proc.h
@@ -390,4 +390,28 @@ static inline abi_long do_bsd_ptrace(abi_long arg1, abi_long arg2,
     return -TARGET_ENOSYS;
 }
 
+/* getpriority(2) */
+static inline abi_long do_bsd_getpriority(abi_long which, abi_long who)
+{
+    abi_long ret;
+    /*
+     * Note that negative values are valid for getpriority, so we must
+     * differentiate based on errno settings.
+     */
+    errno = 0;
+    ret = getpriority(which, who);
+    if (ret == -1 && errno != 0) {
+        return -host_to_target_errno(errno);
+    }
+
+    return ret;
+}
+
+/* setpriority(2) */
+static inline abi_long do_bsd_setpriority(abi_long which, abi_long who,
+                                          abi_long prio)
+{
+    return get_errno(setpriority(which, who, prio));
+}
+
 #endif /* !BSD_PROC_H_ */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 1a760b1380..71a2657dd0 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -359,6 +359,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_ptrace(arg1, arg2, arg3, arg4);
         break;
 
+    case TARGET_FREEBSD_NR_getpriority: /* getpriority(2) */
+        ret = do_bsd_getpriority(arg1, arg2);
+        break;
+
+    case TARGET_FREEBSD_NR_setpriority: /* setpriority(2) */
+        ret = do_bsd_setpriority(arg1, arg2, arg3);
+        break;
+
 
         /*
          * File system calls.
-- 
2.42.0



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

* [PATCH v2 19/28] bsd-user: Implement get_filename_from_fd.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (17 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 18/28] bsd-user: Implement getpriority(2) and setpriority(2) Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:49   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 20/28] bsd-user: Implement freebsd_exec_common, used in implementing execve/fexecve Karim Taha
                   ` (8 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, Karim Taha, Stacey Son

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/freebsd/meson.build |  1 +
 bsd-user/freebsd/os-proc.c   | 80 ++++++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+)
 create mode 100644 bsd-user/freebsd/os-proc.c

diff --git a/bsd-user/freebsd/meson.build b/bsd-user/freebsd/meson.build
index f2f047cca3..8fd6c7cfb8 100644
--- a/bsd-user/freebsd/meson.build
+++ b/bsd-user/freebsd/meson.build
@@ -1,5 +1,6 @@
 bsd_user_ss.add(files(
   'os-stat.c',
+  'os-proc.c',
   'os-sys.c',
   'os-syscall.c',
 ))
diff --git a/bsd-user/freebsd/os-proc.c b/bsd-user/freebsd/os-proc.c
new file mode 100644
index 0000000000..cb35f29f10
--- /dev/null
+++ b/bsd-user/freebsd/os-proc.c
@@ -0,0 +1,80 @@
+/*
+ *  FreeBSD process related emulation code
+ *
+ *  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/>.
+ */
+#include "qemu/osdep.h"
+
+#include <sys/param.h>
+#include <sys/queue.h>
+#include <sys/sysctl.h>
+struct kinfo_proc;
+#include <libprocstat.h>
+
+#include "qemu.h"
+
+/*
+ * Get the filename for the given file descriptor.
+ * Note that this may return NULL (fail) if no longer cached in the kernel.
+ */
+static char *
+get_filename_from_fd(pid_t pid, int fd, char *filename, size_t len)
+{
+    char *ret = NULL;
+    unsigned int cnt;
+    struct procstat *procstat = NULL;
+    struct kinfo_proc *kp = NULL;
+    struct filestat_list *head = NULL;
+    struct filestat *fst;
+
+    procstat = procstat_open_sysctl();
+    if (procstat == NULL) {
+        goto out;
+    }
+
+    kp = procstat_getprocs(procstat, KERN_PROC_PID, pid, &cnt);
+    if (kp == NULL) {
+        goto out;
+    }
+
+    head = procstat_getfiles(procstat, kp, 0);
+    if (head == NULL) {
+        goto out;
+    }
+
+    STAILQ_FOREACH(fst, head, next) {
+        if (fd == fst->fs_fd) {
+            if (fst->fs_path != NULL) {
+                (void)strlcpy(filename, fst->fs_path, len);
+                ret = filename;
+            }
+            break;
+        }
+    }
+
+out:
+    if (head != NULL) {
+        procstat_freefiles(procstat, head);
+    }
+    if (kp != NULL) {
+        procstat_freeprocs(procstat, kp);
+    }
+    if (procstat != NULL) {
+        procstat_close(procstat);
+    }
+    return ret;
+}
+
-- 
2.42.0



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

* [PATCH v2 20/28] bsd-user: Implement freebsd_exec_common, used in implementing execve/fexecve.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (18 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 19/28] bsd-user: Implement get_filename_from_fd Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 18:57   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 21/28] bsd-user: Implement procctl(2) along with necessary conversion functions Karim Taha
                   ` (7 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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/freebsd/os-proc.c | 177 +++++++++++++++++++++++++++++++++++++
 bsd-user/main.c            |   2 +-
 bsd-user/qemu.h            |   1 +
 3 files changed, 179 insertions(+), 1 deletion(-)

diff --git a/bsd-user/freebsd/os-proc.c b/bsd-user/freebsd/os-proc.c
index cb35f29f10..12d78b7fc9 100644
--- a/bsd-user/freebsd/os-proc.c
+++ b/bsd-user/freebsd/os-proc.c
@@ -78,3 +78,180 @@ out:
     return ret;
 }
 
+/*
+ * execve/fexecve
+ */
+abi_long freebsd_exec_common(abi_ulong path_or_fd, abi_ulong guest_argp,
+        abi_ulong guest_envp, int do_fexec)
+{
+    char **argp, **envp, **qargp, **qarg1, **qarg0, **qargend;
+    int argc, envc;
+    abi_ulong gp;
+    abi_ulong addr;
+    char **q;
+    int total_size = 0;
+    void *p;
+    abi_long ret;
+
+    argc = 0;
+    for (gp = guest_argp; gp; gp += sizeof(abi_ulong)) {
+        if (get_user_ual(addr, gp)) {
+            return -TARGET_EFAULT;
+        }
+        if (!addr) {
+            break;
+        }
+        argc++;
+    }
+    envc = 0;
+    for (gp = guest_envp; gp; gp += sizeof(abi_ulong)) {
+        if (get_user_ual(addr, gp)) {
+            return -TARGET_EFAULT;
+        }
+        if (!addr) {
+            break;
+        }
+        envc++;
+    }
+
+    qarg0 = argp = g_new0(char *, argc + 9);
+    /* save the first agrument for the emulator */
+    *argp++ = (char *)getprogname();
+    qargp = argp;
+    *argp++ = (char *)getprogname();
+    qarg1 = argp;
+    envp = g_new0(char *, envc + 1);
+    for (gp = guest_argp, q = argp; gp; gp += sizeof(abi_ulong), q++) {
+        if (get_user_ual(addr, gp)) {
+            ret = -TARGET_EFAULT;
+            goto execve_end;
+        }
+        if (!addr) {
+            break;
+        }
+        *q = lock_user_string(addr);
+        if (*q == NULL) {
+            ret = -TARGET_EFAULT;
+            goto execve_end;
+        }
+        total_size += strlen(*q) + 1;
+    }
+    *q++ = NULL;
+    qargend = q;
+
+    for (gp = guest_envp, q = envp; gp; gp += sizeof(abi_ulong), q++) {
+        if (get_user_ual(addr, gp)) {
+            ret = -TARGET_EFAULT;
+            goto execve_end;
+        }
+        if (!addr) {
+            break;
+        }
+        *q = lock_user_string(addr);
+        if (*q == NULL) {
+            ret = -TARGET_EFAULT;
+            goto execve_end;
+        }
+        total_size += strlen(*q) + 1;
+    }
+    *q = NULL;
+
+    /*
+     * This case will not be caught by the host's execve() if its
+     * page size is bigger than the target's.
+     */
+    if (total_size > MAX_ARG_PAGES * TARGET_PAGE_SIZE) {
+        ret = -TARGET_E2BIG;
+        goto execve_end;
+    }
+
+    if (do_fexec) {
+        if (((int)path_or_fd > 0 &&
+            is_target_elf_binary((int)path_or_fd)) == 1) {
+            char execpath[PATH_MAX];
+
+            /*
+             * The executable is an elf binary for the target
+             * arch.  execve() it using the emulator if we can
+             * determine the filename path from the fd.
+             */
+            if (get_filename_from_fd(getpid(), (int)path_or_fd, execpath,
+                        sizeof(execpath)) != NULL) {
+                memmove(qarg1 + 2, qarg1, (qargend - qarg1) * sizeof(*qarg1));
+                qarg1[1] = qarg1[0];
+                qarg1[0] = (char *)"-0";
+                qarg1 += 2;
+                qargend += 2;
+                *qarg1 = execpath;
+#ifndef DONT_INHERIT_INTERP_PREFIX
+                memmove(qarg1 + 2, qarg1, (qargend - qarg1) * sizeof(*qarg1));
+                *qarg1++ = (char *)"-L";
+                *qarg1++ = (char *)interp_prefix;
+#endif
+                ret = get_errno(execve(qemu_proc_pathname, qargp, envp));
+            } else {
+                /* Getting the filename path failed. */
+                ret = -TARGET_EBADF;
+                goto execve_end;
+            }
+        } else {
+            ret = get_errno(fexecve((int)path_or_fd, argp, envp));
+        }
+    } else {
+        int fd;
+
+        p = lock_user_string(path_or_fd);
+        if (p == NULL) {
+            ret = -TARGET_EFAULT;
+            goto execve_end;
+        }
+
+        /*
+         * Check the header and see if it a target elf binary.  If so
+         * then execute using qemu user mode emulator.
+         */
+        fd = open(p, O_RDONLY | O_CLOEXEC);
+        if (fd > 0 && is_target_elf_binary(fd) == 1) {
+            close(fd);
+            /* execve() as a target binary using emulator. */
+            memmove(qarg1 + 2, qarg1, (qargend - qarg1) * sizeof(*qarg1));
+            qarg1[1] = qarg1[0];
+            qarg1[0] = (char *)"-0";
+            qarg1 += 2;
+            qargend += 2;
+            *qarg1 = (char *)p;
+#ifndef DONT_INHERIT_INTERP_PREFIX
+            memmove(qarg1 + 2, qarg1, (qargend - qarg1) * sizeof(*qarg1));
+            *qarg1++ = (char *)"-L";
+            *qarg1++ = (char *)interp_prefix;
+#endif
+            ret = get_errno(execve(qemu_proc_pathname, qargp, envp));
+        } else {
+            close(fd);
+            /* Execve() as a host native binary. */
+            ret = get_errno(execve(p, argp, envp));
+        }
+        unlock_user(p, path_or_fd, 0);
+    }
+
+execve_end:
+    for (gp = guest_argp, q = argp; *q; gp += sizeof(abi_ulong), q++) {
+        if (get_user_ual(addr, gp) || !addr) {
+            break;
+        }
+        unlock_user(*q, addr, 0);
+    }
+
+    for (gp = guest_envp, q = envp; *q; gp += sizeof(abi_ulong), q++) {
+        if (get_user_ual(addr, gp) || !addr) {
+            break;
+        }
+        unlock_user(*q, addr, 0);
+    }
+
+    g_free(qarg0);
+    g_free(envp);
+
+    return ret;
+}
+
diff --git a/bsd-user/main.c b/bsd-user/main.c
index f913cb55a7..a12b4be80f 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -88,7 +88,7 @@ unsigned long reserved_va = MAX_RESERVED_VA;
 unsigned long reserved_va;
 #endif
 
-static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
+const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
 const char *qemu_uname_release;
 char qemu_proc_pathname[PATH_MAX];  /* full path to exeutable */
 
diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
index 2cf96d9a15..1ed6024b5d 100644
--- a/bsd-user/qemu.h
+++ b/bsd-user/qemu.h
@@ -111,6 +111,7 @@ typedef struct TaskState {
 } __attribute__((aligned(16))) TaskState;
 
 void stop_all_tasks(void);
+extern const char *interp_prefix;
 extern const char *qemu_uname_release;
 
 /*
-- 
2.42.0



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

* [PATCH v2 21/28] bsd-user: Implement procctl(2) along with necessary conversion functions.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (19 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 20/28] bsd-user: Implement freebsd_exec_common, used in implementing execve/fexecve Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 19:02   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 22/28] bsd-user: Implement execve(2) and fexecve(2) system calls Karim Taha
                   ` (6 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, Stacey Son, Karim Taha

From: Stacey Son <sson@FreeBSD.org>

Implement t2h_procctl_cmd, h2t_reaper_status, h2t_reaper_pidinfo and h2t/t2h reaper_kill conversion functions.

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

diff --git a/bsd-user/freebsd/os-proc.c b/bsd-user/freebsd/os-proc.c
index 12d78b7fc9..6b8753f8e5 100644
--- a/bsd-user/freebsd/os-proc.c
+++ b/bsd-user/freebsd/os-proc.c
@@ -255,3 +255,226 @@ execve_end:
     return ret;
 }
 
+#include <sys/procctl.h>
+
+static abi_long
+t2h_procctl_cmd(int target_cmd, int *host_cmd)
+{
+    switch (target_cmd) {
+    case TARGET_PROC_SPROTECT:
+        *host_cmd = PROC_SPROTECT;
+        break;
+
+    case TARGET_PROC_REAP_ACQUIRE:
+        *host_cmd = PROC_REAP_ACQUIRE;
+        break;
+
+    case TARGET_PROC_REAP_RELEASE:
+        *host_cmd = PROC_REAP_RELEASE;
+        break;
+
+    case TARGET_PROC_REAP_STATUS:
+        *host_cmd = PROC_REAP_STATUS;
+        break;
+
+    case TARGET_PROC_REAP_KILL:
+        *host_cmd = PROC_REAP_KILL;
+        break;
+
+    default:
+        return -TARGET_EINVAL;
+    }
+
+    return 0;
+}
+
+static abi_long
+h2t_reaper_status(struct procctl_reaper_status *host_rs,
+        abi_ulong target_rs_addr)
+{
+    struct target_procctl_reaper_status *target_rs;
+
+    if (!lock_user_struct(VERIFY_WRITE, target_rs, target_rs_addr, 0)) {
+        return -TARGET_EFAULT;
+    }
+    __put_user(host_rs->rs_flags, &target_rs->rs_flags);
+    __put_user(host_rs->rs_children, &target_rs->rs_children);
+    __put_user(host_rs->rs_descendants, &target_rs->rs_descendants);
+    __put_user(host_rs->rs_reaper, &target_rs->rs_reaper);
+    __put_user(host_rs->rs_pid, &target_rs->rs_pid);
+    unlock_user_struct(target_rs, target_rs_addr, 1);
+
+    return 0;
+}
+
+static abi_long
+t2h_reaper_kill(abi_ulong target_rk_addr, struct procctl_reaper_kill *host_rk)
+{
+    struct target_procctl_reaper_kill *target_rk;
+
+    if (!lock_user_struct(VERIFY_READ, target_rk, target_rk_addr, 1)) {
+        return -TARGET_EFAULT;
+    }
+    __get_user(host_rk->rk_sig, &target_rk->rk_sig);
+    __get_user(host_rk->rk_flags, &target_rk->rk_flags);
+    __get_user(host_rk->rk_subtree, &target_rk->rk_subtree);
+    __get_user(host_rk->rk_killed, &target_rk->rk_killed);
+    __get_user(host_rk->rk_fpid, &target_rk->rk_fpid);
+    unlock_user_struct(target_rk, target_rk_addr, 0);
+
+    return 0;
+}
+
+static abi_long
+h2t_reaper_kill(struct procctl_reaper_kill *host_rk, abi_ulong target_rk_addr)
+{
+    struct target_procctl_reaper_kill *target_rk;
+
+    if (!lock_user_struct(VERIFY_WRITE, target_rk, target_rk_addr, 0)) {
+        return -TARGET_EFAULT;
+    }
+    __put_user(host_rk->rk_sig, &target_rk->rk_sig);
+    __put_user(host_rk->rk_flags, &target_rk->rk_flags);
+    __put_user(host_rk->rk_subtree, &target_rk->rk_subtree);
+    __put_user(host_rk->rk_killed, &target_rk->rk_killed);
+    __put_user(host_rk->rk_fpid, &target_rk->rk_fpid);
+    unlock_user_struct(target_rk, target_rk_addr, 1);
+
+    return 0;
+}
+
+static abi_long
+h2t_procctl_reaper_pidinfo(struct procctl_reaper_pidinfo *host_pi,
+        abi_ulong target_pi_addr)
+{
+    struct target_procctl_reaper_pidinfo *target_pi;
+
+    if (!lock_user_struct(VERIFY_WRITE, target_pi, target_pi_addr, 0)) {
+        return -TARGET_EFAULT;
+    }
+    __put_user(host_pi->pi_pid, &target_pi->pi_pid);
+    __put_user(host_pi->pi_subtree, &target_pi->pi_subtree);
+    __put_user(host_pi->pi_flags, &target_pi->pi_flags);
+    unlock_user_struct(target_pi, target_pi_addr, 1);
+
+    return 0;
+}
+
+abi_long
+do_freebsd_procctl(void *cpu_env, int idtype, abi_ulong arg2, abi_ulong arg3,
+       abi_ulong arg4, abi_ulong arg5, abi_ulong arg6)
+{
+    abi_long error = 0, target_rp_pids;
+    void *data;
+    int host_cmd, flags;
+    uint32_t u, target_rp_count;
+    union {
+        struct procctl_reaper_status rs;
+        struct procctl_reaper_pids rp;
+        struct procctl_reaper_kill rk;
+    } host;
+    struct target_procctl_reaper_pids *target_rp;
+    id_t id; /* 64-bit */
+    int target_cmd;
+    abi_ulong target_arg;
+
+#if TARGET_ABI_BITS == 32
+    /* See if we need to align the register pairs. */
+    if (regpairs_aligned(cpu_env)) {
+        id = (id_t)target_arg64(arg3, arg4);
+        target_cmd = (int)arg5;
+        target_arg = arg6;
+    } else {
+        id = (id_t)target_arg64(arg2, arg3);
+        target_cmd = (int)arg4;
+        target_arg = arg5;
+    }
+#else
+    id = (id_t)arg2;
+    target_cmd = (int)arg3;
+    target_arg = arg4;
+#endif
+
+    error = t2h_procctl_cmd(target_cmd, &host_cmd);
+    if (error) {
+        return error;
+    }
+    switch (host_cmd) {
+    case PROC_SPROTECT:
+        data = &flags;
+        break;
+
+    case PROC_REAP_ACQUIRE:
+    case PROC_REAP_RELEASE:
+        if (target_arg == 0) {
+            data = NULL;
+        } else {
+            error = -TARGET_EINVAL;
+        }
+        break;
+
+    case PROC_REAP_STATUS:
+        data = &host.rs;
+        break;
+
+    case PROC_REAP_GETPIDS:
+        if (!lock_user_struct(VERIFY_READ, target_rp, target_arg, 1)) {
+            return -TARGET_EFAULT;
+        }
+        __get_user(target_rp_count, &target_rp->rp_count);
+        __get_user(target_rp_pids, &target_rp->rp_pids);
+        unlock_user_struct(target_rp, target_arg, 0);
+        host.rp.rp_count = target_rp_count;
+        /* XXX we should check target_rc_count to see if it is reasonable. */
+        host.rp.rp_pids = alloca(target_rp_count *
+                sizeof(struct procctl_reaper_pidinfo));
+        if (host.rp.rp_pids == NULL) {
+            error = -TARGET_ENOMEM;
+        } else {
+            data = &host.rp;
+        }
+        break;
+
+    case PROC_REAP_KILL:
+        error = t2h_reaper_kill(target_arg, &host.rk);
+        break;
+    }
+
+    if (error) {
+        return error;
+    }
+    error = get_errno(procctl(idtype, id, host_cmd, data));
+
+    if (error) {
+        return error;
+    }
+    switch (host_cmd) {
+    case PROC_SPROTECT:
+        if (put_user_s32(flags, target_arg)) {
+            return -TARGET_EFAULT;
+        }
+        break;
+
+    case PROC_REAP_STATUS:
+        error = h2t_reaper_status(&host.rs, target_arg);
+        break;
+
+    case PROC_REAP_GETPIDS:
+        /* copyout reaper pidinfo */
+        for (u = 0; u < target_rp_count; u++) {
+            error = h2t_procctl_reaper_pidinfo(&host.rp.rp_pids[u],
+                    target_rp_pids +
+                    (u * sizeof(struct target_procctl_reaper_pidinfo)));
+            if (error) {
+                break;
+            }
+        }
+        break;
+
+    case PROC_REAP_KILL:
+        error = h2t_reaper_kill(&host.rk, target_arg);
+        break;
+    }
+
+    return error;
+}
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 71a2657dd0..b7bd0b92a6 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -367,6 +367,9 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_setpriority(arg1, arg2, arg3);
         break;
 
+    case TARGET_FREEBSD_NR_procctl: /* procctl(2) */
+        ret = do_freebsd_procctl(cpu_env, arg1, arg2, arg3, arg4, arg5, arg6);
+        break;
 
         /*
          * File system calls.
-- 
2.42.0



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

* [PATCH v2 22/28] bsd-user: Implement execve(2) and fexecve(2) system calls.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (20 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 21/28] bsd-user: Implement procctl(2) along with necessary conversion functions Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 19:05   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 23/28] bsd-user: Implement wait4(2) and wait6(2) " Karim Taha
                   ` (5 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, Karim Taha, Stacey Son

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/freebsd/os-proc.h    | 49 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 11 +++++++-
 2 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 bsd-user/freebsd/os-proc.h

diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
new file mode 100644
index 0000000000..75ed39f8dd
--- /dev/null
+++ b/bsd-user/freebsd/os-proc.h
@@ -0,0 +1,49 @@
+/*
+ *  process related system call shims and definitions
+ *
+ *  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 BSD_USER_FREEBSD_OS_PROC_H
+#define BSD_USER_FREEBSD_OS_PROC_H
+
+#include <sys/param.h>
+#include <sys/procctl.h>
+#include <sys/signal.h>
+#include <sys/types.h>
+#include <sys/procdesc.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#include "target_arch_cpu.h"
+
+/* execve(2) */
+static inline abi_long do_freebsd_execve(abi_ulong path_or_fd, abi_ulong argp,
+        abi_ulong envp)
+{
+
+    return freebsd_exec_common(path_or_fd, argp, envp, 0);
+}
+
+/* fexecve(2) */
+static inline abi_long do_freebsd_fexecve(abi_ulong path_or_fd, abi_ulong argp,
+        abi_ulong envp)
+{
+
+    return freebsd_exec_common(path_or_fd, argp, envp, 1);
+}
+
+#endif /* BSD_USER_FREEBSD_OS_PROC_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index b7bd0b92a6..515eaaf31f 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -36,8 +36,9 @@
 #include "bsd-file.h"
 #include "bsd-proc.h"
 
-/* *BSD dependent syscall shims */
+/* BSD dependent syscall shims */
 #include "os-stat.h"
+#include "os-proc.h"
 
 /* I/O */
 safe_syscall3(int, open, const char *, path, int, flags, mode_t, mode);
@@ -219,6 +220,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         /*
          * process system calls
          */
+    case TARGET_FREEBSD_NR_execve: /* execve(2) */
+        ret = do_freebsd_execve(arg1, arg2, arg3);
+        break;
+
+    case TARGET_FREEBSD_NR_fexecve: /* fexecve(2) */
+        ret = do_freebsd_fexecve(arg1, arg2, arg3);
+        break;
+
     case TARGET_FREEBSD_NR_exit: /* exit(2) */
         ret = do_bsd_exit(cpu_env, arg1);
         break;
-- 
2.42.0



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

* [PATCH v2 23/28] bsd-user: Implement wait4(2) and wait6(2) system calls.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (21 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 22/28] bsd-user: Implement execve(2) and fexecve(2) system calls Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 19:10   ` Warner Losh
  2023-09-17 21:37 ` [PATCH v2 24/28] bsd-user: Implement setloginclass(2) and getloginclass(2) " Karim Taha
                   ` (4 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/freebsd/os-proc.h    | 77 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c | 15 +++++++
 2 files changed, 92 insertions(+)

diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
index 75ed39f8dd..8a0b6e25bb 100644
--- a/bsd-user/freebsd/os-proc.h
+++ b/bsd-user/freebsd/os-proc.h
@@ -30,6 +30,10 @@
 
 #include "target_arch_cpu.h"
 
+pid_t safe_wait4(pid_t wpid, int *status, int options, struct rusage *rusage);
+pid_t safe_wait6(idtype_t idtype, id_t id, int *status, int options,
+    struct __wrusage *wrusage, siginfo_t *infop);
+
 /* execve(2) */
 static inline abi_long do_freebsd_execve(abi_ulong path_or_fd, abi_ulong argp,
         abi_ulong envp)
@@ -46,4 +50,77 @@ static inline abi_long do_freebsd_fexecve(abi_ulong path_or_fd, abi_ulong argp,
     return freebsd_exec_common(path_or_fd, argp, envp, 1);
 }
 
+/* wait4(2) */
+static inline abi_long do_freebsd_wait4(abi_long arg1, abi_ulong target_status,
+        abi_long arg3, abi_ulong target_rusage)
+{
+    abi_long ret;
+    int status;
+    struct rusage rusage, *rusage_ptr = NULL;
+
+    if (target_rusage) {
+        rusage_ptr = &rusage;
+    }
+    ret = get_errno(safe_wait4(arg1, &status, arg3, rusage_ptr));
+    if (target_status != 0) {
+        status = host_to_target_waitstatus(status);
+        if (put_user_s32(status, target_status) != 0) {
+            return -TARGET_EFAULT;
+        }
+    }
+    if (target_rusage != 0) {
+        host_to_target_rusage(target_rusage, &rusage);
+    }
+    return ret;
+}
+
+/* wait6(2) */
+static inline abi_long do_freebsd_wait6(void *cpu_env, abi_long idtype,
+    abi_long id1, abi_long id2,
+    abi_ulong target_status, abi_long options, abi_ulong target_wrusage,
+    abi_ulong target_infop, abi_ulong pad1)
+{
+    abi_long ret;
+    int status;
+    struct __wrusage wrusage, *wrusage_ptr = NULL;
+    siginfo_t info;
+    void *p;
+
+    if (regpairs_aligned(cpu_env) != 0) {
+        /* printf("shifting args\n"); */
+        /* 64-bit id is aligned, so shift all the arguments over by one */
+        id1 = id2;
+        id2 = target_status;
+        target_status = options;
+        options = target_wrusage;
+        target_wrusage = target_infop;
+        target_infop = pad1;
+    }
+
+    if (target_wrusage) {
+        wrusage_ptr = &wrusage;
+    }
+    ret = safe_wait6(idtype, target_arg64(id1, id2),
+                     &status, options, wrusage_ptr, &info);
+    ret = get_errno(ret);
+    if (target_status != 0) {
+        status = host_to_target_waitstatus(status);
+        if (put_user_s32(status, target_status) != 0) {
+            return -TARGET_EFAULT;
+        }
+    }
+    if (target_wrusage != 0) {
+        host_to_target_wrusage(target_wrusage, &wrusage);
+    }
+    if (target_infop != 0) {
+        p = lock_user(VERIFY_WRITE, target_infop, sizeof(target_siginfo_t), 0);
+        if (p == NULL) {
+            return -TARGET_EFAULT;
+        }
+        host_to_target_siginfo(p, &info);
+        unlock_user(p, target_infop, sizeof(target_siginfo_t));
+    }
+    return ret;
+}
+
 #endif /* BSD_USER_FREEBSD_OS_PROC_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 515eaaf31f..55e68e4815 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -40,6 +40,12 @@
 #include "os-stat.h"
 #include "os-proc.h"
 
+/* used in os-proc */
+safe_syscall4(pid_t, wait4, pid_t, wpid, int *, status, int, options,
+    struct rusage *, rusage);
+safe_syscall6(pid_t, wait6, idtype_t, idtype, id_t, id, int *, status, int,
+    options, struct __wrusage *, wrusage, siginfo_t *, infop);
+
 /* 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,
@@ -228,6 +234,15 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_freebsd_fexecve(arg1, arg2, arg3);
         break;
 
+    case TARGET_FREEBSD_NR_wait4: /* wait4(2) */
+        ret = do_freebsd_wait4(arg1, arg2, arg3, arg4);
+        break;
+
+    case TARGET_FREEBSD_NR_wait6: /* wait6(2) */
+        ret = do_freebsd_wait6(cpu_env, arg1, arg2, arg3,
+                               arg4, arg5, arg6, arg7, arg8);
+        break;
+
     case TARGET_FREEBSD_NR_exit: /* exit(2) */
         ret = do_bsd_exit(cpu_env, arg1);
         break;
-- 
2.42.0



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

* [PATCH v2 24/28] bsd-user: Implement setloginclass(2) and getloginclass(2) system calls.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (22 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 23/28] bsd-user: Implement wait4(2) and wait6(2) " Karim Taha
@ 2023-09-17 21:37 ` Karim Taha
  2023-09-20 19:11   ` Warner Losh
  2023-09-17 21:38 ` [PATCH v2 25/28] bsd-user: Implement pdgetpid(2) and the undocumented setugid Karim Taha
                   ` (3 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:37 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/freebsd/os-proc.h    | 32 ++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  8 ++++++++
 2 files changed, 40 insertions(+)

diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
index 8a0b6e25bb..1866f0b2d6 100644
--- a/bsd-user/freebsd/os-proc.h
+++ b/bsd-user/freebsd/os-proc.h
@@ -123,4 +123,36 @@ static inline abi_long do_freebsd_wait6(void *cpu_env, abi_long idtype,
     return ret;
 }
 
+/* setloginclass(2) */
+static inline abi_long do_freebsd_setloginclass(abi_ulong arg1)
+{
+    abi_long ret;
+    void *p;
+
+    p = lock_user_string(arg1);
+    if (p == NULL) {
+        return -TARGET_EFAULT;
+    }
+    ret = get_errno(setloginclass(p));
+    unlock_user(p, arg1, 0);
+
+    return ret;
+}
+
+/* getloginclass(2) */
+static inline abi_long do_freebsd_getloginclass(abi_ulong arg1, abi_ulong arg2)
+{
+    abi_long ret;
+    void *p;
+
+    p = lock_user_string(arg1);
+    if (p == NULL) {
+        return -TARGET_EFAULT;
+    }
+    ret = get_errno(getloginclass(p, arg2));
+    unlock_user(p, arg1, 0);
+
+    return ret;
+}
+
 #endif /* BSD_USER_FREEBSD_OS_PROC_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 55e68e4815..d614409e69 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -375,6 +375,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_bsd_ktrace(arg1, arg2, arg3, arg4);
         break;
 
+    case TARGET_FREEBSD_NR_setloginclass: /* setloginclass(2) */
+        ret = do_freebsd_setloginclass(arg1);
+        break;
+
+    case TARGET_FREEBSD_NR_getloginclass: /* getloginclass(2) */
+        ret = do_freebsd_getloginclass(arg1, arg2);
+        break;
+
     case TARGET_FREEBSD_NR_utrace: /* utrace(2) */
         ret = do_bsd_utrace(arg1, arg2);
         break;
-- 
2.42.0



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

* [PATCH v2 25/28] bsd-user: Implement pdgetpid(2) and the undocumented setugid.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (23 preceding siblings ...)
  2023-09-17 21:37 ` [PATCH v2 24/28] bsd-user: Implement setloginclass(2) and getloginclass(2) " Karim Taha
@ 2023-09-17 21:38 ` Karim Taha
  2023-09-20 19:16   ` Warner Losh
  2023-09-17 21:38 ` [PATCH v2 26/28] bsd-user: Implement fork(2) and vfork(2) system calls Karim Taha
                   ` (2 subsequent siblings)
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:38 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/freebsd/os-proc.h    | 23 +++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  8 ++++++++
 2 files changed, 31 insertions(+)

diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
index 1866f0b2d6..47bcdcf8a3 100644
--- a/bsd-user/freebsd/os-proc.h
+++ b/bsd-user/freebsd/os-proc.h
@@ -34,6 +34,8 @@ pid_t safe_wait4(pid_t wpid, int *status, int options, struct rusage *rusage);
 pid_t safe_wait6(idtype_t idtype, id_t id, int *status, int options,
     struct __wrusage *wrusage, siginfo_t *infop);
 
+extern int __setugid(int flag);
+
 /* execve(2) */
 static inline abi_long do_freebsd_execve(abi_ulong path_or_fd, abi_ulong argp,
         abi_ulong envp)
@@ -155,4 +157,25 @@ static inline abi_long do_freebsd_getloginclass(abi_ulong arg1, abi_ulong arg2)
     return ret;
 }
 
+/* pdgetpid(2) */
+static inline abi_long do_freebsd_pdgetpid(abi_long fd, abi_ulong target_pidp)
+{
+    abi_long ret;
+    pid_t pid;
+
+    ret = get_errno(pdgetpid(fd, &pid));
+    if (!is_error(ret)) {
+        if (put_user_u32(pid, target_pidp)) {
+            return -TARGET_EFAULT;
+        }
+    }
+    return ret;
+}
+
+/* undocumented __setugid */
+static inline abi_long do_freebsd___setugid(abi_long arg1)
+{
+    return get_errno(__setugid(arg1));
+}
+
 #endif /* BSD_USER_FREEBSD_OS_PROC_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index d614409e69..99af0f6b15 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -383,6 +383,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_freebsd_getloginclass(arg1, arg2);
         break;
 
+    case TARGET_FREEBSD_NR_pdgetpid: /* pdgetpid(2) */
+        ret = do_freebsd_pdgetpid(arg1, arg2);
+        break;
+
+    case TARGET_FREEBSD_NR___setugid: /* undocumented */
+        ret = do_freebsd___setugid(arg1);
+        break;
+
     case TARGET_FREEBSD_NR_utrace: /* utrace(2) */
         ret = do_bsd_utrace(arg1, arg2);
         break;
-- 
2.42.0



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

* [PATCH v2 26/28] bsd-user: Implement fork(2) and vfork(2) system calls.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (24 preceding siblings ...)
  2023-09-17 21:38 ` [PATCH v2 25/28] bsd-user: Implement pdgetpid(2) and the undocumented setugid Karim Taha
@ 2023-09-17 21:38 ` Karim Taha
  2023-09-20 19:19   ` Warner Losh
  2023-09-17 21:38 ` [PATCH v2 27/28] bsd-user: Implement rfork(2) system call Karim Taha
  2023-09-17 21:38 ` [PATCH v2 28/28] bsd-user: Implement pdfork(2) " Karim Taha
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:38 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/freebsd/os-proc.h    | 34 ++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  8 ++++++++
 2 files changed, 42 insertions(+)

diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
index 47bcdcf8a3..14478d4bb5 100644
--- a/bsd-user/freebsd/os-proc.h
+++ b/bsd-user/freebsd/os-proc.h
@@ -178,4 +178,38 @@ static inline abi_long do_freebsd___setugid(abi_long arg1)
     return get_errno(__setugid(arg1));
 }
 
+/* fork(2) */
+static inline abi_long do_freebsd_fork(void *cpu_env)
+{
+    abi_long ret;
+    abi_ulong child_flag;
+
+    fork_start();
+    ret = fork();
+    if (ret == 0) {
+        /* child */
+        child_flag = 1;
+        target_cpu_clone_regs(cpu_env, 0);
+    } else {
+        /* parent */
+        child_flag = 0;
+    }
+
+    /*
+     * The fork system call sets a child flag in the second return
+     * value: 0 for parent process, 1 for child process.
+     */
+    set_second_rval(cpu_env, child_flag);
+
+    fork_end(child_flag);
+
+    return ret;
+}
+
+/* vfork(2) */
+static inline abi_long do_freebsd_vfork(void *cpu_env)
+{
+    return do_freebsd_fork(cpu_env);
+}
+
 #endif /* BSD_USER_FREEBSD_OS_PROC_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 99af0f6b15..cb9425c9ba 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -226,6 +226,14 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         /*
          * process system calls
          */
+    case TARGET_FREEBSD_NR_fork: /* fork(2) */
+        ret = do_freebsd_fork(cpu_env);
+        break;
+
+    case TARGET_FREEBSD_NR_vfork: /* vfork(2) */
+        ret = do_freebsd_vfork(cpu_env);
+        break;
+
     case TARGET_FREEBSD_NR_execve: /* execve(2) */
         ret = do_freebsd_execve(arg1, arg2, arg3);
         break;
-- 
2.42.0



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

* [PATCH v2 27/28] bsd-user: Implement rfork(2) system call.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (25 preceding siblings ...)
  2023-09-17 21:38 ` [PATCH v2 26/28] bsd-user: Implement fork(2) and vfork(2) system calls Karim Taha
@ 2023-09-17 21:38 ` Karim Taha
  2023-09-20 19:21   ` Warner Losh
  2023-09-17 21:38 ` [PATCH v2 28/28] bsd-user: Implement pdfork(2) " Karim Taha
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:38 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/freebsd/os-proc.h    | 39 +++++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  4 ++++
 2 files changed, 43 insertions(+)

diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
index 14478d4bb5..a406ef7db8 100644
--- a/bsd-user/freebsd/os-proc.h
+++ b/bsd-user/freebsd/os-proc.h
@@ -212,4 +212,43 @@ static inline abi_long do_freebsd_vfork(void *cpu_env)
     return do_freebsd_fork(cpu_env);
 }
 
+/* rfork(2) */
+static inline abi_long do_freebsd_rfork(void *cpu_env, abi_long flags)
+{
+    abi_long ret;
+    abi_ulong child_flag;
+
+    /*
+     * XXX We need to handle RFMEM here, as well.  Neither are safe to execute
+     * as-is on x86 hosts because they'll split memory but not the stack,
+     * wreaking havoc on host architectures that use the stack to store the
+     * return address as both threads try to pop it off.  Rejecting RFSPAWN
+     * entirely for now is ok, the only consumer at the moment is posix_spawn
+     * and it will fall back to classic vfork(2) if we return EINVAL.
+     */
+    if ((flags & TARGET_RFSPAWN) != 0) {
+        return -TARGET_EINVAL;
+    }
+    fork_start();
+    ret = rfork(flags);
+    if (ret == 0) {
+        /* child */
+        child_flag = 1;
+        target_cpu_clone_regs(cpu_env, 0);
+    } else {
+        /* parent */
+        child_flag = 0;
+    }
+
+    /*
+     * The fork system call sets a child flag in the second return
+     * value: 0 for parent process, 1 for child process.
+     */
+    set_second_rval(cpu_env, child_flag);
+    fork_end(child_flag);
+
+    return ret;
+
+}
+
 #endif /* BSD_USER_FREEBSD_OS_PROC_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index cb9425c9ba..4c4e773d1d 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -234,6 +234,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_freebsd_vfork(cpu_env);
         break;
 
+    case TARGET_FREEBSD_NR_rfork: /* rfork(2) */
+        ret = do_freebsd_rfork(cpu_env, arg1);
+        break;
+
     case TARGET_FREEBSD_NR_execve: /* execve(2) */
         ret = do_freebsd_execve(arg1, arg2, arg3);
         break;
-- 
2.42.0



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

* [PATCH v2 28/28] bsd-user: Implement pdfork(2) system call.
  2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
                   ` (26 preceding siblings ...)
  2023-09-17 21:38 ` [PATCH v2 27/28] bsd-user: Implement rfork(2) system call Karim Taha
@ 2023-09-17 21:38 ` Karim Taha
  2023-09-20 19:23   ` Warner Losh
  27 siblings, 1 reply; 56+ messages in thread
From: Karim Taha @ 2023-09-17 21:38 UTC (permalink / raw)
  To: qemu-devel; +Cc: imp, Richard Henderson, 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>
Acked-by: Richard Henderson <richard.henderson@linaro.org>
---
 bsd-user/freebsd/os-proc.h    | 32 ++++++++++++++++++++++++++++++++
 bsd-user/freebsd/os-syscall.c |  4 ++++
 2 files changed, 36 insertions(+)

diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
index a406ef7db8..563bac8818 100644
--- a/bsd-user/freebsd/os-proc.h
+++ b/bsd-user/freebsd/os-proc.h
@@ -251,4 +251,36 @@ static inline abi_long do_freebsd_rfork(void *cpu_env, abi_long flags)
 
 }
 
+/* pdfork(2) */
+static inline abi_long do_freebsd_pdfork(void *cpu_env, abi_ulong target_fdp,
+        abi_long flags)
+{
+    abi_long ret;
+    abi_ulong child_flag;
+    int fd;
+
+    fork_start();
+    ret = pdfork(&fd, flags);
+    if (ret == 0) {
+        /* child */
+        child_flag = 1;
+        target_cpu_clone_regs(cpu_env, 0);
+    } else {
+        /* parent */
+        child_flag = 0;
+        if (put_user_s32(fd, target_fdp)) {
+            return -TARGET_EFAULT;
+        }
+    }
+
+    /*
+     * The fork system call sets a child flag in the second return
+     * value: 0 for parent process, 1 for child process.
+     */
+    set_second_rval(cpu_env, child_flag);
+    fork_end(child_flag);
+
+    return ret;
+}
+
 #endif /* BSD_USER_FREEBSD_OS_PROC_H */
diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
index 4c4e773d1d..d04712f0a7 100644
--- a/bsd-user/freebsd/os-syscall.c
+++ b/bsd-user/freebsd/os-syscall.c
@@ -238,6 +238,10 @@ static abi_long freebsd_syscall(void *cpu_env, int num, abi_long arg1,
         ret = do_freebsd_rfork(cpu_env, arg1);
         break;
 
+    case TARGET_FREEBSD_NR_pdfork: /* pdfork(2) */
+        ret = do_freebsd_pdfork(cpu_env, arg1, arg2);
+        break;
+
     case TARGET_FREEBSD_NR_execve: /* execve(2) */
         ret = do_freebsd_execve(arg1, arg2, arg3);
         break;
-- 
2.42.0



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

* Re: [PATCH v2 01/28] bsd-user: define TARGET_RFSPAWN for rfork to use vfork(2) semantics, and fix RLIM_INFINITY
  2023-09-17 21:37 ` [PATCH v2 01/28] bsd-user: define TARGET_RFSPAWN for rfork to use vfork(2) semantics, and fix RLIM_INFINITY Karim Taha
@ 2023-09-20 18:03   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:03 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Kyle Evans

[-- Attachment #1: Type: text/plain, Size: 517 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
wrote:

> RLIM_INFINITY on FreeBSD, OpenBSD and NetBSD has value of ~(1<<63),
> caculated
> one way or another.
>
> 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>.
> ---
>  bsd-user/syscall_defs.h | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1059 bytes --]

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

* Re: [PATCH v2 02/28] bsd-user: Define procctl(2) related structs
  2023-09-17 21:37 ` [PATCH v2 02/28] bsd-user: Define procctl(2) related structs Karim Taha
@ 2023-09-20 18:03   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:03 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 669 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
wrote:

> From: Stacey Son <sson@FreeBSD.org>
>
> Implement procctl flags and related structs:
> struct target_procctl_reaper_status
> struct target_procctl_reaper_pidinfo
> struct target_procctl_reaper_pids
> struct target_procctl_reaper_kill
>
> 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/syscall_defs.h | 42 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 42 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1227 bytes --]

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

* Re: [PATCH v2 03/28] bsd-user: Implement host_to_target_siginfo.
  2023-09-17 21:37 ` [PATCH v2 03/28] bsd-user: Implement host_to_target_siginfo Karim Taha
@ 2023-09-20 18:04   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:04 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 497 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
wrote:

> From: Stacey Son <sson@FreeBSD.org>
>
> Used in wait6 system call
>
> 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/signal-common.h | 1 +
>  bsd-user/signal.c        | 6 ++++++
>  2 files changed, 7 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1054 bytes --]

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

* Re: [PATCH v2 04/28] bsd-user: Add freebsd_exec_common and do_freebsd_procctl to qemu.h.
  2023-09-17 21:37 ` [PATCH v2 04/28] bsd-user: Add freebsd_exec_common and do_freebsd_procctl to qemu.h Karim Taha
@ 2023-09-20 18:04   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:04 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 417 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/qemu.h | 6 ++++++
>  1 file changed, 6 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 959 bytes --]

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

* Re: [PATCH v2 05/28] bsd-user: add extern declarations for bsd-proc.c conversion functions
  2023-09-17 21:37 ` [PATCH v2 05/28] bsd-user: add extern declarations for bsd-proc.c conversion functions Karim Taha
@ 2023-09-20 18:05   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:05 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 501 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/qemu-bsd.h | 38 ++++++++++++++++++++++++++++++++++++++
>  1 file changed, 38 insertions(+)
>  create mode 100644 bsd-user/qemu-bsd.h
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1049 bytes --]

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

* Re: [PATCH v2 07/28] bsd-user: Implement target_to_host_rlim and host_to_target_rlim conversion.
  2023-09-17 21:37 ` [PATCH v2 07/28] bsd-user: Implement target_to_host_rlim and host_to_target_rlim conversion Karim Taha
@ 2023-09-20 18:10   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:10 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 900 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/bsd-proc.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>


> diff --git a/bsd-user/bsd-proc.c b/bsd-user/bsd-proc.c
> index 68410a0aa9..19e39a2f76 100644
> --- a/bsd-user/bsd-proc.c
> +++ b/bsd-user/bsd-proc.c
> @@ -38,3 +38,13 @@ int target_to_host_resource(int code)
>      return code;
>  }
>
> +rlim_t target_to_host_rlim(abi_llong target_rlim)
> +{
> +    return tswap64(target_rlim);
> +}
> +
> +abi_llong host_to_target_rlim(rlim_t rlim)
> +{
> +    return tswap64(rlim);
> +}
> +
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 1635 bytes --]

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

* Re: [PATCH v2 08/28] bsd-user: Implement host_to_target_rusage and host_to_target_wrusage.
  2023-09-17 21:37 ` [PATCH v2 08/28] bsd-user: Implement host_to_target_rusage and host_to_target_wrusage Karim Taha
@ 2023-09-20 18:11   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:11 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 465 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/bsd-proc.c | 54 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 54 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1025 bytes --]

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

* Re: [PATCH v2 09/28] bsd-user: Implement host_to_target_waitstatus conversion.
  2023-09-17 21:37 ` [PATCH v2 09/28] bsd-user: Implement host_to_target_waitstatus conversion Karim Taha
@ 2023-09-20 18:14   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:14 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 437 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/bsd-proc.c | 17 +++++++++++++++++
>  1 file changed, 17 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 980 bytes --]

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

* Re: [PATCH v2 10/28] bsd-user: Get number of cpus.
  2023-09-17 21:37 ` [PATCH v2 10/28] bsd-user: Get number of cpus Karim Taha
@ 2023-09-20 18:19   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:19 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Kyle Evans

[-- Attachment #1: Type: text/plain, Size: 1374 bytes --]

This one is almost right... one tweak is needed I think...

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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/bsd-proc.c | 23 +++++++++++++++++++++++
>  bsd-user/bsd-proc.h |  2 ++
>  2 files changed, 25 insertions(+)
>
> diff --git a/bsd-user/bsd-proc.c b/bsd-user/bsd-proc.c
> index 19f6efe1f7..78f5b172d7 100644
> --- a/bsd-user/bsd-proc.c
> +++ b/bsd-user/bsd-proc.c
> @@ -119,3 +119,26 @@ int host_to_target_waitstatus(int status)
>      return status;
>  }
>
> +int bsd_get_ncpu(void)
> +{
> +    int ncpu = -1;
> +    cpuset_t mask;
> +
> +    CPU_ZERO(&mask);
> +
> +    if (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1,
> sizeof(mask),
> +                           &mask) == 0) {
> +        ncpu = CPU_COUNT(&mask);
> +    }
> +#ifdef _SC_NPROCESSORS_ONLN
> +    if (ncpu == -1) {
> +        ncpu = sysconf(_SC_NPROCESSORS_ONLN);
> +    }
> +#endif
>

I think that the #ifdef and #endif lines can be removed. These are defined
on all version of FreeBSD, NetBSD and OpenBSD (I think also DragonFly)
in the unlikely event that it gets bsd-user support.

With that fixed,

Reviewed by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1999 bytes --]

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

* Re: [PATCH v2 11/28] bsd-user: Implement getgroups(2) and setgroups(2) system calls.
  2023-09-17 21:37 ` [PATCH v2 11/28] bsd-user: Implement getgroups(2) and setgroups(2) system calls Karim Taha
@ 2023-09-20 18:22   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:22 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 445 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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-proc.h           | 44 +++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |  9 +++++++
>  2 files changed, 53 insertions(+)
>

Reviewed by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 919 bytes --]

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

* Re: [PATCH v2 12/28] bsd-user: Implement umask(2), setlogin(2) and getlogin(2)
  2023-09-17 21:37 ` [PATCH v2 12/28] bsd-user: Implement umask(2), setlogin(2) and getlogin(2) Karim Taha
@ 2023-09-20 18:33   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:33 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 2092 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/bsd-proc.h           | 39 +++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c | 12 +++++++++++
>  2 files changed, 51 insertions(+)
>
> diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
> index 7b25aa1982..fd05422d9a 100644
> --- a/bsd-user/bsd-proc.h
> +++ b/bsd-user/bsd-proc.h
> @@ -26,6 +26,7 @@
>  #include "gdbstub/syscalls.h"
>  #include "qemu/plugin.h"
>
> +extern int _getlogin(char*, int);
>  int bsd_get_ncpu(void);
>
>  /* exit(2) */
> @@ -85,4 +86,42 @@ static inline abi_long do_bsd_setgroups(abi_long
> gidsetsize, abi_long arg2)
>      return get_errno(setgroups(gidsetsize, grouplist));
>  }
>
> +/* umask(2) */
> +static inline abi_long do_bsd_umask(abi_long arg1)
> +{
> +    return get_errno(umask(arg1));
> +}
> +
> +/* setlogin(2) */
> +static inline abi_long do_bsd_setlogin(abi_long arg1)
> +{
> +    abi_long ret;
> +    void *p;
> +
> +    p = lock_user_string(arg1);
> +    if (p == NULL) {
> +        return -TARGET_EFAULT;
> +    }
> +    ret = get_errno(setlogin(p));
> +    unlock_user(p, arg1, 0);
> +
> +    return ret;
> +}
> +
> +/* getlogin(2) */
> +static inline abi_long do_bsd_getlogin(abi_long arg1, abi_long arg2)
> +{
> +    abi_long ret;
> +    void *p;
> +
> +    p = lock_user_string(arg1);
> +    if (p == NULL) {
> +        return -TARGET_EFAULT;
> +    }
>

This looks backwards. We're calling the kernel to get this string, so the
target_strlen() tht lock_user_string() does is on the receiving buffer, not
the length of the string that we'd like to write.

 I think we want
    p = lock_user(VERIFY_READ, arg1, arg2, 0);

for this. sys_getlogin in sys/kern/kern_prot.c does a copyout. This is
clearly
broken in the 'blitz' branch.

Warner

[-- Attachment #2: Type: text/html, Size: 2884 bytes --]

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

* Re: [PATCH v2 13/28] bsd-user: Implement getrusage(2).
  2023-09-17 21:37 ` [PATCH v2 13/28] bsd-user: Implement getrusage(2) Karim Taha
@ 2023-09-20 18:37   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:37 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 485 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/bsd-proc.h           | 13 +++++++++++++
>  bsd-user/freebsd/os-syscall.c |  4 ++++
>  2 files changed, 17 insertions(+)
>

Reviewed by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1033 bytes --]

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

* Re: [PATCH v2 14/28] bsd-user: Implement getrlimit(2) and setrlimit(2)
  2023-09-17 21:37 ` [PATCH v2 14/28] bsd-user: Implement getrlimit(2) and setrlimit(2) Karim Taha
@ 2023-09-20 18:42   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:42 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 508 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/bsd-proc.h           | 59 +++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |  8 +++++
>  2 files changed, 67 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1056 bytes --]

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

* Re: [PATCH v2 15/28] bsd-user: Implement several get/set system calls:
  2023-09-17 21:37 ` [PATCH v2 15/28] bsd-user: Implement several get/set system calls: Karim Taha
@ 2023-09-20 18:44   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:44 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 715 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
wrote:

> From: Stacey Son <sson@FreeBSD.org>
>
> getpid(2), getppid(2), getpgrp(2)
> setreuid(2), setregid(2)
> getuid(2), geteuid(2), getgid(2), getegid(2), getpgid(2)
> setuid(2), seteuid(2), setgid(2), setegid(2), setpgid(2)
>
> 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-proc.h           | 90 +++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c | 60 +++++++++++++++++++++++
>  2 files changed, 150 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1292 bytes --]

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

* Re: [PATCH v2 16/28] bsd-user: Implement get/set[resuid/resgid/sid] and issetugid.
  2023-09-17 21:37 ` [PATCH v2 16/28] bsd-user: Implement get/set[resuid/resgid/sid] and issetugid Karim Taha
@ 2023-09-20 18:45   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:45 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 517 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/bsd-proc.h           | 76 +++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c | 28 +++++++++++++
>  2 files changed, 104 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1066 bytes --]

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

* Re: [PATCH v2 17/28] bsd-user: Add stubs for profil(2), ktrace(2), utrace(2) and ptrace(2).
  2023-09-17 21:37 ` [PATCH v2 17/28] bsd-user: Add stubs for profil(2), ktrace(2), utrace(2) and ptrace(2) Karim Taha
@ 2023-09-20 18:47   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:47 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 512 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/bsd-proc.h           | 28 ++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c | 16 ++++++++++++++++
>  2 files changed, 44 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1061 bytes --]

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

* Re: [PATCH v2 18/28] bsd-user: Implement getpriority(2) and setpriority(2).
  2023-09-17 21:37 ` [PATCH v2 18/28] bsd-user: Implement getpriority(2) and setpriority(2) Karim Taha
@ 2023-09-20 18:48   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:48 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 2261 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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-proc.h           | 24 ++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |  8 ++++++++
>  2 files changed, 32 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

Looks right to my eye.  Let's see if Richard catches anything.



> diff --git a/bsd-user/bsd-proc.h b/bsd-user/bsd-proc.h
> index fff1d4cded..89792d26c6 100644
> --- a/bsd-user/bsd-proc.h
> +++ b/bsd-user/bsd-proc.h
> @@ -390,4 +390,28 @@ static inline abi_long do_bsd_ptrace(abi_long arg1,
> abi_long arg2,
>      return -TARGET_ENOSYS;
>  }
>
> +/* getpriority(2) */
> +static inline abi_long do_bsd_getpriority(abi_long which, abi_long who)
> +{
> +    abi_long ret;
> +    /*
> +     * Note that negative values are valid for getpriority, so we must
> +     * differentiate based on errno settings.
> +     */
> +    errno = 0;
> +    ret = getpriority(which, who);
> +    if (ret == -1 && errno != 0) {
> +        return -host_to_target_errno(errno);
> +    }
> +
> +    return ret;
> +}
> +
> +/* setpriority(2) */
> +static inline abi_long do_bsd_setpriority(abi_long which, abi_long who,
> +                                          abi_long prio)
> +{
> +    return get_errno(setpriority(which, who, prio));
> +}
> +
>  #endif /* !BSD_PROC_H_ */
> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index 1a760b1380..71a2657dd0 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -359,6 +359,14 @@ static abi_long freebsd_syscall(void *cpu_env, int
> num, abi_long arg1,
>          ret = do_bsd_ptrace(arg1, arg2, arg3, arg4);
>          break;
>
> +    case TARGET_FREEBSD_NR_getpriority: /* getpriority(2) */
> +        ret = do_bsd_getpriority(arg1, arg2);
> +        break;
> +
> +    case TARGET_FREEBSD_NR_setpriority: /* setpriority(2) */
> +        ret = do_bsd_setpriority(arg1, arg2, arg3);
> +        break;
> +
>
>          /*
>           * File system calls.
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 3129 bytes --]

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

* Re: [PATCH v2 19/28] bsd-user: Implement get_filename_from_fd.
  2023-09-17 21:37 ` [PATCH v2 19/28] bsd-user: Implement get_filename_from_fd Karim Taha
@ 2023-09-20 18:49   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:49 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 511 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
wrote:

> 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/freebsd/meson.build |  1 +
>  bsd-user/freebsd/os-proc.c   | 80 ++++++++++++++++++++++++++++++++++++
>  2 files changed, 81 insertions(+)
>  create mode 100644 bsd-user/freebsd/os-proc.c
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

[-- Attachment #2: Type: text/html, Size: 1047 bytes --]

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

* Re: [PATCH v2 20/28] bsd-user: Implement freebsd_exec_common, used in implementing execve/fexecve.
  2023-09-17 21:37 ` [PATCH v2 20/28] bsd-user: Implement freebsd_exec_common, used in implementing execve/fexecve Karim Taha
@ 2023-09-20 18:57   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 18:57 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 8082 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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/freebsd/os-proc.c | 177 +++++++++++++++++++++++++++++++++++++
>  bsd-user/main.c            |   2 +-
>  bsd-user/qemu.h            |   1 +
>  3 files changed, 179 insertions(+), 1 deletion(-)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

But see comment below.


> diff --git a/bsd-user/freebsd/os-proc.c b/bsd-user/freebsd/os-proc.c
> index cb35f29f10..12d78b7fc9 100644
> --- a/bsd-user/freebsd/os-proc.c
> +++ b/bsd-user/freebsd/os-proc.c
> @@ -78,3 +78,180 @@ out:
>      return ret;
>  }
>
> +/*
> + * execve/fexecve
> + */
> +abi_long freebsd_exec_common(abi_ulong path_or_fd, abi_ulong guest_argp,
> +        abi_ulong guest_envp, int do_fexec)
> +{
> +    char **argp, **envp, **qargp, **qarg1, **qarg0, **qargend;
> +    int argc, envc;
> +    abi_ulong gp;
> +    abi_ulong addr;
> +    char **q;
> +    int total_size = 0;
> +    void *p;
> +    abi_long ret;
> +
> +    argc = 0;
> +    for (gp = guest_argp; gp; gp += sizeof(abi_ulong)) {
> +        if (get_user_ual(addr, gp)) {
> +            return -TARGET_EFAULT;
> +        }
> +        if (!addr) {
> +            break;
> +        }
> +        argc++;
> +    }
> +    envc = 0;
> +    for (gp = guest_envp; gp; gp += sizeof(abi_ulong)) {
> +        if (get_user_ual(addr, gp)) {
> +            return -TARGET_EFAULT;
> +        }
> +        if (!addr) {
> +            break;
> +        }
> +        envc++;
> +    }
> +
> +    qarg0 = argp = g_new0(char *, argc + 9);
> +    /* save the first agrument for the emulator */
> +    *argp++ = (char *)getprogname();
> +    qargp = argp;
> +    *argp++ = (char *)getprogname();
> +    qarg1 = argp;
> +    envp = g_new0(char *, envc + 1);
> +    for (gp = guest_argp, q = argp; gp; gp += sizeof(abi_ulong), q++) {
> +        if (get_user_ual(addr, gp)) {
> +            ret = -TARGET_EFAULT;
> +            goto execve_end;
> +        }
> +        if (!addr) {
> +            break;
> +        }
> +        *q = lock_user_string(addr);
> +        if (*q == NULL) {
> +            ret = -TARGET_EFAULT;
> +            goto execve_end;
> +        }
> +        total_size += strlen(*q) + 1;
> +    }
> +    *q++ = NULL;
> +    qargend = q;
> +
> +    for (gp = guest_envp, q = envp; gp; gp += sizeof(abi_ulong), q++) {
> +        if (get_user_ual(addr, gp)) {
> +            ret = -TARGET_EFAULT;
> +            goto execve_end;
> +        }
> +        if (!addr) {
> +            break;
> +        }
> +        *q = lock_user_string(addr);
> +        if (*q == NULL) {
> +            ret = -TARGET_EFAULT;
> +            goto execve_end;
> +        }
> +        total_size += strlen(*q) + 1;
> +    }
> +    *q = NULL;
> +
> +    /*
> +     * This case will not be caught by the host's execve() if its
> +     * page size is bigger than the target's.
> +     */
> +    if (total_size > MAX_ARG_PAGES * TARGET_PAGE_SIZE) {
> +        ret = -TARGET_E2BIG;
> +        goto execve_end;
> +    }
> +
> +    if (do_fexec) {
> +        if (((int)path_or_fd > 0 &&
> +            is_target_elf_binary((int)path_or_fd)) == 1) {
> +            char execpath[PATH_MAX];
> +
> +            /*
> +             * The executable is an elf binary for the target
> +             * arch.  execve() it using the emulator if we can
> +             * determine the filename path from the fd.
> +             */
>

So we do this fd dance so we can make things like 'qemu-arm-static
/armv7/bin/sh' work.
Doug Rabson has some changes that means we can ditch this, I think, since
the
kernel will just track it and it will default to 'what is doing the current
process'
rather than the system default for the same binfmt entry.


> +            if (get_filename_from_fd(getpid(), (int)path_or_fd, execpath,
> +                        sizeof(execpath)) != NULL) {
> +                memmove(qarg1 + 2, qarg1, (qargend - qarg1) *
> sizeof(*qarg1));
> +                qarg1[1] = qarg1[0];
> +                qarg1[0] = (char *)"-0";
> +                qarg1 += 2;
> +                qargend += 2;
> +                *qarg1 = execpath;
> +#ifndef DONT_INHERIT_INTERP_PREFIX
> +                memmove(qarg1 + 2, qarg1, (qargend - qarg1) *
> sizeof(*qarg1));
> +                *qarg1++ = (char *)"-L";
> +                *qarg1++ = (char *)interp_prefix;
> +#endif
>

And we do this inheritance so we can pass in a non-standard library path,
maybe for testing, and have the above example also work.

Warner


> +                ret = get_errno(execve(qemu_proc_pathname, qargp, envp));
> +            } else {
> +                /* Getting the filename path failed. */
> +                ret = -TARGET_EBADF;
> +                goto execve_end;
> +            }
> +        } else {
> +            ret = get_errno(fexecve((int)path_or_fd, argp, envp));
> +        }
> +    } else {
> +        int fd;
> +
> +        p = lock_user_string(path_or_fd);
> +        if (p == NULL) {
> +            ret = -TARGET_EFAULT;
> +            goto execve_end;
> +        }
> +
> +        /*
> +         * Check the header and see if it a target elf binary.  If so
> +         * then execute using qemu user mode emulator.
> +         */
> +        fd = open(p, O_RDONLY | O_CLOEXEC);
> +        if (fd > 0 && is_target_elf_binary(fd) == 1) {
> +            close(fd);
> +            /* execve() as a target binary using emulator. */
> +            memmove(qarg1 + 2, qarg1, (qargend - qarg1) * sizeof(*qarg1));
> +            qarg1[1] = qarg1[0];
> +            qarg1[0] = (char *)"-0";
> +            qarg1 += 2;
> +            qargend += 2;
> +            *qarg1 = (char *)p;
> +#ifndef DONT_INHERIT_INTERP_PREFIX
> +            memmove(qarg1 + 2, qarg1, (qargend - qarg1) * sizeof(*qarg1));
> +            *qarg1++ = (char *)"-L";
> +            *qarg1++ = (char *)interp_prefix;
> +#endif
> +            ret = get_errno(execve(qemu_proc_pathname, qargp, envp));
> +        } else {
> +            close(fd);
> +            /* Execve() as a host native binary. */
> +            ret = get_errno(execve(p, argp, envp));
> +        }
> +        unlock_user(p, path_or_fd, 0);
> +    }


It might be nice to unify these two if statements, but I'm thinking
we don't want to do it now since Doug's work will obsolete it if I
understand it correctly.

Warner


>
>
+execve_end:
> +    for (gp = guest_argp, q = argp; *q; gp += sizeof(abi_ulong), q++) {
> +        if (get_user_ual(addr, gp) || !addr) {
> +            break;
> +        }
> +        unlock_user(*q, addr, 0);
> +    }
> +
> +    for (gp = guest_envp, q = envp; *q; gp += sizeof(abi_ulong), q++) {
> +        if (get_user_ual(addr, gp) || !addr) {
> +            break;
> +        }
> +        unlock_user(*q, addr, 0);
> +    }
> +
> +    g_free(qarg0);
> +    g_free(envp);
> +
> +    return ret;
> +}
> +
> diff --git a/bsd-user/main.c b/bsd-user/main.c
> index f913cb55a7..a12b4be80f 100644
> --- a/bsd-user/main.c
> +++ b/bsd-user/main.c
> @@ -88,7 +88,7 @@ unsigned long reserved_va = MAX_RESERVED_VA;
>  unsigned long reserved_va;
>  #endif
>
> -static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
> +const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
>  const char *qemu_uname_release;
>  char qemu_proc_pathname[PATH_MAX];  /* full path to exeutable */
>
> diff --git a/bsd-user/qemu.h b/bsd-user/qemu.h
> index 2cf96d9a15..1ed6024b5d 100644
> --- a/bsd-user/qemu.h
> +++ b/bsd-user/qemu.h
> @@ -111,6 +111,7 @@ typedef struct TaskState {
>  } __attribute__((aligned(16))) TaskState;
>
>  void stop_all_tasks(void);
> +extern const char *interp_prefix;
>  extern const char *qemu_uname_release;
>
>  /*
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 10671 bytes --]

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

* Re: [PATCH v2 21/28] bsd-user: Implement procctl(2) along with necessary conversion functions.
  2023-09-17 21:37 ` [PATCH v2 21/28] bsd-user: Implement procctl(2) along with necessary conversion functions Karim Taha
@ 2023-09-20 19:02   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 19:02 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 8696 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
wrote:

> From: Stacey Son <sson@FreeBSD.org>
>
> Implement t2h_procctl_cmd, h2t_reaper_status, h2t_reaper_pidinfo and
> h2t/t2h reaper_kill conversion functions.
>
> Signed-off-by: Stacey Son <sson@FreeBSD.org>
> Signed-off-by: Karim Taha <kariem.taha2.7@gmail.com>
> ---
>  bsd-user/freebsd/os-proc.c    | 223 ++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |   3 +
>  2 files changed, 226 insertions(+)
>
> diff --git a/bsd-user/freebsd/os-proc.c b/bsd-user/freebsd/os-proc.c
> index 12d78b7fc9..6b8753f8e5 100644
> --- a/bsd-user/freebsd/os-proc.c
> +++ b/bsd-user/freebsd/os-proc.c
> @@ -255,3 +255,226 @@ execve_end:
>      return ret;
>  }
>
> +#include <sys/procctl.h>
> +
> +static abi_long
> +t2h_procctl_cmd(int target_cmd, int *host_cmd)
> +{
> +    switch (target_cmd) {
> +    case TARGET_PROC_SPROTECT:
> +        *host_cmd = PROC_SPROTECT;
> +        break;
> +
> +    case TARGET_PROC_REAP_ACQUIRE:
> +        *host_cmd = PROC_REAP_ACQUIRE;
> +        break;
> +
> +    case TARGET_PROC_REAP_RELEASE:
> +        *host_cmd = PROC_REAP_RELEASE;
> +        break;
> +
> +    case TARGET_PROC_REAP_STATUS:
> +        *host_cmd = PROC_REAP_STATUS;
> +        break;
> +
> +    case TARGET_PROC_REAP_KILL:
> +        *host_cmd = PROC_REAP_KILL;
> +        break;
> +
> +    default:
> +        return -TARGET_EINVAL;
> +    }
> +
> +    return 0;
> +}
> +
> +static abi_long
> +h2t_reaper_status(struct procctl_reaper_status *host_rs,
> +        abi_ulong target_rs_addr)
> +{
> +    struct target_procctl_reaper_status *target_rs;
> +
> +    if (!lock_user_struct(VERIFY_WRITE, target_rs, target_rs_addr, 0)) {
> +        return -TARGET_EFAULT;
> +    }
> +    __put_user(host_rs->rs_flags, &target_rs->rs_flags);
> +    __put_user(host_rs->rs_children, &target_rs->rs_children);
> +    __put_user(host_rs->rs_descendants, &target_rs->rs_descendants);
> +    __put_user(host_rs->rs_reaper, &target_rs->rs_reaper);
> +    __put_user(host_rs->rs_pid, &target_rs->rs_pid);
> +    unlock_user_struct(target_rs, target_rs_addr, 1);
> +
> +    return 0;
> +}
> +
> +static abi_long
> +t2h_reaper_kill(abi_ulong target_rk_addr, struct procctl_reaper_kill
> *host_rk)
> +{
> +    struct target_procctl_reaper_kill *target_rk;
> +
> +    if (!lock_user_struct(VERIFY_READ, target_rk, target_rk_addr, 1)) {
> +        return -TARGET_EFAULT;
> +    }
> +    __get_user(host_rk->rk_sig, &target_rk->rk_sig);
> +    __get_user(host_rk->rk_flags, &target_rk->rk_flags);
> +    __get_user(host_rk->rk_subtree, &target_rk->rk_subtree);
> +    __get_user(host_rk->rk_killed, &target_rk->rk_killed);
> +    __get_user(host_rk->rk_fpid, &target_rk->rk_fpid);
> +    unlock_user_struct(target_rk, target_rk_addr, 0);
> +
> +    return 0;
> +}
> +
> +static abi_long
> +h2t_reaper_kill(struct procctl_reaper_kill *host_rk, abi_ulong
> target_rk_addr)
> +{
> +    struct target_procctl_reaper_kill *target_rk;
> +
> +    if (!lock_user_struct(VERIFY_WRITE, target_rk, target_rk_addr, 0)) {
> +        return -TARGET_EFAULT;
> +    }
> +    __put_user(host_rk->rk_sig, &target_rk->rk_sig);
> +    __put_user(host_rk->rk_flags, &target_rk->rk_flags);
> +    __put_user(host_rk->rk_subtree, &target_rk->rk_subtree);
> +    __put_user(host_rk->rk_killed, &target_rk->rk_killed);
> +    __put_user(host_rk->rk_fpid, &target_rk->rk_fpid);
> +    unlock_user_struct(target_rk, target_rk_addr, 1);
> +
> +    return 0;
> +}
> +
> +static abi_long
> +h2t_procctl_reaper_pidinfo(struct procctl_reaper_pidinfo *host_pi,
> +        abi_ulong target_pi_addr)
> +{
> +    struct target_procctl_reaper_pidinfo *target_pi;
> +
> +    if (!lock_user_struct(VERIFY_WRITE, target_pi, target_pi_addr, 0)) {
> +        return -TARGET_EFAULT;
> +    }
> +    __put_user(host_pi->pi_pid, &target_pi->pi_pid);
> +    __put_user(host_pi->pi_subtree, &target_pi->pi_subtree);
> +    __put_user(host_pi->pi_flags, &target_pi->pi_flags);
> +    unlock_user_struct(target_pi, target_pi_addr, 1);
> +
> +    return 0;
> +}
> +
> +abi_long
> +do_freebsd_procctl(void *cpu_env, int idtype, abi_ulong arg2, abi_ulong
> arg3,
> +       abi_ulong arg4, abi_ulong arg5, abi_ulong arg6)
> +{
> +    abi_long error = 0, target_rp_pids;
> +    void *data;
> +    int host_cmd, flags;
> +    uint32_t u, target_rp_count;
> +    union {
> +        struct procctl_reaper_status rs;
> +        struct procctl_reaper_pids rp;
> +        struct procctl_reaper_kill rk;
> +    } host;
> +    struct target_procctl_reaper_pids *target_rp;
> +    id_t id; /* 64-bit */
> +    int target_cmd;
> +    abi_ulong target_arg;
> +
> +#if TARGET_ABI_BITS == 32
> +    /* See if we need to align the register pairs. */
> +    if (regpairs_aligned(cpu_env)) {
> +        id = (id_t)target_arg64(arg3, arg4);
> +        target_cmd = (int)arg5;
> +        target_arg = arg6;
> +    } else {
> +        id = (id_t)target_arg64(arg2, arg3);
> +        target_cmd = (int)arg4;
> +        target_arg = arg5;
> +    }
> +#else
> +    id = (id_t)arg2;
> +    target_cmd = (int)arg3;
> +    target_arg = arg4;
> +#endif
> +
> +    error = t2h_procctl_cmd(target_cmd, &host_cmd);
> +    if (error) {
> +        return error;
> +    }
> +    switch (host_cmd) {
> +    case PROC_SPROTECT:
> +        data = &flags;
> +        break;
> +
> +    case PROC_REAP_ACQUIRE:
> +    case PROC_REAP_RELEASE:
> +        if (target_arg == 0) {
> +            data = NULL;
> +        } else {
> +            error = -TARGET_EINVAL;
> +        }
> +        break;
> +
> +    case PROC_REAP_STATUS:
> +        data = &host.rs;
> +        break;
> +
> +    case PROC_REAP_GETPIDS:
> +        if (!lock_user_struct(VERIFY_READ, target_rp, target_arg, 1)) {
> +            return -TARGET_EFAULT;
> +        }
> +        __get_user(target_rp_count, &target_rp->rp_count);
> +        __get_user(target_rp_pids, &target_rp->rp_pids);
> +        unlock_user_struct(target_rp, target_arg, 0);
> +        host.rp.rp_count = target_rp_count;
> +        /* XXX we should check target_rc_count to see if it is
> reasonable. */
> +        host.rp.rp_pids = alloca(target_rp_count *
> +                sizeof(struct procctl_reaper_pidinfo));
>

I think that there's been a general move to using the 'smart pointer'
version of
this that you've done for other patches. I think that target_rc_count
likely is going to be small enough, but that doing the conversion will
ensure that
it is (so we can eliminate the comment too).

Warner


> +        if (host.rp.rp_pids == NULL) {
> +            error = -TARGET_ENOMEM;
> +        } else {
> +            data = &host.rp;
> +        }
> +        break;
> +
> +    case PROC_REAP_KILL:
> +        error = t2h_reaper_kill(target_arg, &host.rk);
> +        break;
> +    }
> +
> +    if (error) {
> +        return error;
> +    }
> +    error = get_errno(procctl(idtype, id, host_cmd, data));
> +
> +    if (error) {
> +        return error;
> +    }
> +    switch (host_cmd) {
> +    case PROC_SPROTECT:
> +        if (put_user_s32(flags, target_arg)) {
> +            return -TARGET_EFAULT;
> +        }
> +        break;
> +
> +    case PROC_REAP_STATUS:
> +        error = h2t_reaper_status(&host.rs, target_arg);
> +        break;
> +
> +    case PROC_REAP_GETPIDS:
> +        /* copyout reaper pidinfo */
> +        for (u = 0; u < target_rp_count; u++) {
> +            error = h2t_procctl_reaper_pidinfo(&host.rp.rp_pids[u],
> +                    target_rp_pids +
> +                    (u * sizeof(struct target_procctl_reaper_pidinfo)));
> +            if (error) {
> +                break;
> +            }
> +        }
> +        break;
> +
> +    case PROC_REAP_KILL:
> +        error = h2t_reaper_kill(&host.rk, target_arg);
> +        break;
> +    }
> +
> +    return error;
> +}
> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index 71a2657dd0..b7bd0b92a6 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -367,6 +367,9 @@ static abi_long freebsd_syscall(void *cpu_env, int
> num, abi_long arg1,
>          ret = do_bsd_setpriority(arg1, arg2, arg3);
>          break;
>
> +    case TARGET_FREEBSD_NR_procctl: /* procctl(2) */
> +        ret = do_freebsd_procctl(cpu_env, arg1, arg2, arg3, arg4, arg5,
> arg6);
> +        break;
>
>          /*
>           * File system calls.
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 10727 bytes --]

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

* Re: [PATCH v2 22/28] bsd-user: Implement execve(2) and fexecve(2) system calls.
  2023-09-17 21:37 ` [PATCH v2 22/28] bsd-user: Implement execve(2) and fexecve(2) system calls Karim Taha
@ 2023-09-20 19:05   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 19:05 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 3548 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
wrote:

> 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/freebsd/os-proc.h    | 49 +++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c | 11 +++++++-
>  2 files changed, 59 insertions(+), 1 deletion(-)
>  create mode 100644 bsd-user/freebsd/os-proc.h
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

But make sure that the guard variable name is correct, I think with scripts/
clean-header-guards.pl


> diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
> new file mode 100644
> index 0000000000..75ed39f8dd
> --- /dev/null
> +++ b/bsd-user/freebsd/os-proc.h
> @@ -0,0 +1,49 @@
> +/*
> + *  process related system call shims and definitions
> + *
> + *  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 BSD_USER_FREEBSD_OS_PROC_H
> +#define BSD_USER_FREEBSD_OS_PROC_H
> +
> +#include <sys/param.h>
> +#include <sys/procctl.h>
> +#include <sys/signal.h>
> +#include <sys/types.h>
> +#include <sys/procdesc.h>
> +#include <sys/wait.h>
> +#include <unistd.h>
> +
> +#include "target_arch_cpu.h"
> +
> +/* execve(2) */
> +static inline abi_long do_freebsd_execve(abi_ulong path_or_fd, abi_ulong
> argp,
> +        abi_ulong envp)
> +{
> +
> +    return freebsd_exec_common(path_or_fd, argp, envp, 0);
> +}
> +
> +/* fexecve(2) */
> +static inline abi_long do_freebsd_fexecve(abi_ulong path_or_fd, abi_ulong
> argp,
> +        abi_ulong envp)
> +{
> +
> +    return freebsd_exec_common(path_or_fd, argp, envp, 1);
> +}
> +
> +#endif /* BSD_USER_FREEBSD_OS_PROC_H */
> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index b7bd0b92a6..515eaaf31f 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -36,8 +36,9 @@
>  #include "bsd-file.h"
>  #include "bsd-proc.h"
>
> -/* *BSD dependent syscall shims */
> +/* BSD dependent syscall shims */
>  #include "os-stat.h"
> +#include "os-proc.h"
>
>  /* I/O */
>  safe_syscall3(int, open, const char *, path, int, flags, mode_t, mode);
> @@ -219,6 +220,14 @@ static abi_long freebsd_syscall(void *cpu_env, int
> num, abi_long arg1,
>          /*
>           * process system calls
>           */
> +    case TARGET_FREEBSD_NR_execve: /* execve(2) */
> +        ret = do_freebsd_execve(arg1, arg2, arg3);
> +        break;
> +
> +    case TARGET_FREEBSD_NR_fexecve: /* fexecve(2) */
> +        ret = do_freebsd_fexecve(arg1, arg2, arg3);
> +        break;
> +
>      case TARGET_FREEBSD_NR_exit: /* exit(2) */
>          ret = do_bsd_exit(cpu_env, arg1);
>          break;
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 4716 bytes --]

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

* Re: [PATCH v2 23/28] bsd-user: Implement wait4(2) and wait6(2) system calls.
  2023-09-17 21:37 ` [PATCH v2 23/28] bsd-user: Implement wait4(2) and wait6(2) " Karim Taha
@ 2023-09-20 19:10   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 19:10 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 5371 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/freebsd/os-proc.h    | 77 +++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c | 15 +++++++
>  2 files changed, 92 insertions(+)
>
> diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
> index 75ed39f8dd..8a0b6e25bb 100644
> --- a/bsd-user/freebsd/os-proc.h
> +++ b/bsd-user/freebsd/os-proc.h
> @@ -30,6 +30,10 @@
>
>  #include "target_arch_cpu.h"
>
> +pid_t safe_wait4(pid_t wpid, int *status, int options, struct rusage
> *rusage);
> +pid_t safe_wait6(idtype_t idtype, id_t id, int *status, int options,
> +    struct __wrusage *wrusage, siginfo_t *infop);
> +
>  /* execve(2) */
>  static inline abi_long do_freebsd_execve(abi_ulong path_or_fd, abi_ulong
> argp,
>          abi_ulong envp)
> @@ -46,4 +50,77 @@ static inline abi_long do_freebsd_fexecve(abi_ulong
> path_or_fd, abi_ulong argp,
>      return freebsd_exec_common(path_or_fd, argp, envp, 1);
>  }
>
> +/* wait4(2) */
> +static inline abi_long do_freebsd_wait4(abi_long arg1, abi_ulong
> target_status,
> +        abi_long arg3, abi_ulong target_rusage)
> +{
> +    abi_long ret;
> +    int status;
> +    struct rusage rusage, *rusage_ptr = NULL;
> +
> +    if (target_rusage) {
> +        rusage_ptr = &rusage;
> +    }
> +    ret = get_errno(safe_wait4(arg1, &status, arg3, rusage_ptr));
> +    if (target_status != 0) {
> +        status = host_to_target_waitstatus(status);
> +        if (put_user_s32(status, target_status) != 0) {
> +            return -TARGET_EFAULT;
> +        }
> +    }
> +    if (target_rusage != 0) {
> +        host_to_target_rusage(target_rusage, &rusage);
> +    }
> +    return ret;
>

I think that both of these 'if' statements should only be done if ret == 0.
Otherwise
it's an error return which doesn't usually write any arguments (unless the
error
is because of a fault on trying to write a return value).

Warner


> +}
> +
> +/* wait6(2) */
> +static inline abi_long do_freebsd_wait6(void *cpu_env, abi_long idtype,
> +    abi_long id1, abi_long id2,
> +    abi_ulong target_status, abi_long options, abi_ulong target_wrusage,
> +    abi_ulong target_infop, abi_ulong pad1)
> +{
> +    abi_long ret;
> +    int status;
> +    struct __wrusage wrusage, *wrusage_ptr = NULL;
> +    siginfo_t info;
> +    void *p;
> +
> +    if (regpairs_aligned(cpu_env) != 0) {
> +        /* printf("shifting args\n"); */
> +        /* 64-bit id is aligned, so shift all the arguments over by one */
> +        id1 = id2;
> +        id2 = target_status;
> +        target_status = options;
> +        options = target_wrusage;
> +        target_wrusage = target_infop;
> +        target_infop = pad1;
> +    }
> +
> +    if (target_wrusage) {
> +        wrusage_ptr = &wrusage;
> +    }
> +    ret = safe_wait6(idtype, target_arg64(id1, id2),
> +                     &status, options, wrusage_ptr, &info);
> +    ret = get_errno(ret);
> +    if (target_status != 0) {
> +        status = host_to_target_waitstatus(status);
> +        if (put_user_s32(status, target_status) != 0) {
> +            return -TARGET_EFAULT;
> +        }
> +    }
> +    if (target_wrusage != 0) {
> +        host_to_target_wrusage(target_wrusage, &wrusage);
> +    }
> +    if (target_infop != 0) {
> +        p = lock_user(VERIFY_WRITE, target_infop,
> sizeof(target_siginfo_t), 0);
> +        if (p == NULL) {
> +            return -TARGET_EFAULT;
> +        }
> +        host_to_target_siginfo(p, &info);
> +        unlock_user(p, target_infop, sizeof(target_siginfo_t));
> +    }
> +    return ret;
> +}
> +
>  #endif /* BSD_USER_FREEBSD_OS_PROC_H */
> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index 515eaaf31f..55e68e4815 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -40,6 +40,12 @@
>  #include "os-stat.h"
>  #include "os-proc.h"
>
> +/* used in os-proc */
> +safe_syscall4(pid_t, wait4, pid_t, wpid, int *, status, int, options,
> +    struct rusage *, rusage);
> +safe_syscall6(pid_t, wait6, idtype_t, idtype, id_t, id, int *, status,
> int,
> +    options, struct __wrusage *, wrusage, siginfo_t *, infop);
> +
>  /* 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,
> @@ -228,6 +234,15 @@ static abi_long freebsd_syscall(void *cpu_env, int
> num, abi_long arg1,
>          ret = do_freebsd_fexecve(arg1, arg2, arg3);
>          break;
>
> +    case TARGET_FREEBSD_NR_wait4: /* wait4(2) */
> +        ret = do_freebsd_wait4(arg1, arg2, arg3, arg4);
> +        break;
> +
> +    case TARGET_FREEBSD_NR_wait6: /* wait6(2) */
> +        ret = do_freebsd_wait6(cpu_env, arg1, arg2, arg3,
> +                               arg4, arg5, arg6, arg7, arg8);
> +        break;
> +
>      case TARGET_FREEBSD_NR_exit: /* exit(2) */
>          ret = do_bsd_exit(cpu_env, arg1);
>          break;
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 6656 bytes --]

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

* Re: [PATCH v2 24/28] bsd-user: Implement setloginclass(2) and getloginclass(2) system calls.
  2023-09-17 21:37 ` [PATCH v2 24/28] bsd-user: Implement setloginclass(2) and getloginclass(2) " Karim Taha
@ 2023-09-20 19:11   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 19:11 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 2543 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/freebsd/os-proc.h    | 32 ++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |  8 ++++++++
>  2 files changed, 40 insertions(+)
>
> diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
> index 8a0b6e25bb..1866f0b2d6 100644
> --- a/bsd-user/freebsd/os-proc.h
> +++ b/bsd-user/freebsd/os-proc.h
> @@ -123,4 +123,36 @@ static inline abi_long do_freebsd_wait6(void
> *cpu_env, abi_long idtype,
>      return ret;
>  }
>
> +/* setloginclass(2) */
> +static inline abi_long do_freebsd_setloginclass(abi_ulong arg1)
> +{
> +    abi_long ret;
> +    void *p;
> +
> +    p = lock_user_string(arg1);
> +    if (p == NULL) {
> +        return -TARGET_EFAULT;
> +    }
> +    ret = get_errno(setloginclass(p));
> +    unlock_user(p, arg1, 0);
> +
> +    return ret;
> +}
> +
> +/* getloginclass(2) */
> +static inline abi_long do_freebsd_getloginclass(abi_ulong arg1, abi_ulong
> arg2)
> +{
> +    abi_long ret;
> +    void *p;
> +
> +    p = lock_user_string(arg1);
>

This has the same problem that I highlighted in _getlogin() has. The kernel
returns a string, so we have to lock the buffer for it, not the string.

Warner


> +    if (p == NULL) {
> +        return -TARGET_EFAULT;
> +    }
> +    ret = get_errno(getloginclass(p, arg2));
> +    unlock_user(p, arg1, 0);
> +
> +    return ret;
> +}
> +
>  #endif /* BSD_USER_FREEBSD_OS_PROC_H */
> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index 55e68e4815..d614409e69 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -375,6 +375,14 @@ static abi_long freebsd_syscall(void *cpu_env, int
> num, abi_long arg1,
>          ret = do_bsd_ktrace(arg1, arg2, arg3, arg4);
>          break;
>
> +    case TARGET_FREEBSD_NR_setloginclass: /* setloginclass(2) */
> +        ret = do_freebsd_setloginclass(arg1);
> +        break;
> +
> +    case TARGET_FREEBSD_NR_getloginclass: /* getloginclass(2) */
> +        ret = do_freebsd_getloginclass(arg1, arg2);
> +        break;
> +
>      case TARGET_FREEBSD_NR_utrace: /* utrace(2) */
>          ret = do_bsd_utrace(arg1, arg2);
>          break;
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 3430 bytes --]

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

* Re: [PATCH v2 25/28] bsd-user: Implement pdgetpid(2) and the undocumented setugid.
  2023-09-17 21:38 ` [PATCH v2 25/28] bsd-user: Implement pdgetpid(2) and the undocumented setugid Karim Taha
@ 2023-09-20 19:16   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 19:16 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 2798 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/freebsd/os-proc.h    | 23 +++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |  8 ++++++++
>  2 files changed, 31 insertions(+)
>
> diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
> index 1866f0b2d6..47bcdcf8a3 100644
> --- a/bsd-user/freebsd/os-proc.h
> +++ b/bsd-user/freebsd/os-proc.h
> @@ -34,6 +34,8 @@ pid_t safe_wait4(pid_t wpid, int *status, int options,
> struct rusage *rusage);
>  pid_t safe_wait6(idtype_t idtype, id_t id, int *status, int options,
>      struct __wrusage *wrusage, siginfo_t *infop);
>
> +extern int __setugid(int flag);
> +
>  /* execve(2) */
>  static inline abi_long do_freebsd_execve(abi_ulong path_or_fd, abi_ulong
> argp,
>          abi_ulong envp)
> @@ -155,4 +157,25 @@ static inline abi_long
> do_freebsd_getloginclass(abi_ulong arg1, abi_ulong arg2)
>      return ret;
>  }
>
> +/* pdgetpid(2) */
> +static inline abi_long do_freebsd_pdgetpid(abi_long fd, abi_ulong
> target_pidp)
> +{
> +    abi_long ret;
> +    pid_t pid;
> +
> +    ret = get_errno(pdgetpid(fd, &pid));
> +    if (!is_error(ret)) {
> +        if (put_user_u32(pid, target_pidp)) {
> +            return -TARGET_EFAULT;
> +        }
> +    }
> +    return ret;
> +}
> +
> +/* undocumented __setugid */
> +static inline abi_long do_freebsd___setugid(abi_long arg1)
> +{
> +    return get_errno(__setugid(arg1));
>

This should be return -TARGET_ENOSYS since the kernel doesn't implement
it for anything except a regression test....  And what it does is quite
dangerous,
so we don't want someone to think it's a good idea to implement it in the
future.

Warner


> +}
> +
>  #endif /* BSD_USER_FREEBSD_OS_PROC_H */
> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index d614409e69..99af0f6b15 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -383,6 +383,14 @@ static abi_long freebsd_syscall(void *cpu_env, int
> num, abi_long arg1,
>          ret = do_freebsd_getloginclass(arg1, arg2);
>          break;
>
> +    case TARGET_FREEBSD_NR_pdgetpid: /* pdgetpid(2) */
> +        ret = do_freebsd_pdgetpid(arg1, arg2);
> +        break;
> +
> +    case TARGET_FREEBSD_NR___setugid: /* undocumented */
> +        ret = do_freebsd___setugid(arg1);
> +        break;
> +
>      case TARGET_FREEBSD_NR_utrace: /* utrace(2) */
>          ret = do_bsd_utrace(arg1, arg2);
>          break;
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 3699 bytes --]

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

* Re: [PATCH v2 26/28] bsd-user: Implement fork(2) and vfork(2) system calls.
  2023-09-17 21:38 ` [PATCH v2 26/28] bsd-user: Implement fork(2) and vfork(2) system calls Karim Taha
@ 2023-09-20 19:19   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 19:19 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 778 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/freebsd/os-proc.h    | 34 ++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |  8 ++++++++
>  2 files changed, 42 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

Though i have minor qualms about vfork == fork, for bsd-user it's fine
since I
don't think the performance difference will be that large for the typical
case
where vfork + exec exists for older (now kinda really old) programs that
used
to use this.

Warner

[-- Attachment #2: Type: text/html, Size: 1399 bytes --]

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

* Re: [PATCH v2 27/28] bsd-user: Implement rfork(2) system call.
  2023-09-17 21:38 ` [PATCH v2 27/28] bsd-user: Implement rfork(2) system call Karim Taha
@ 2023-09-20 19:21   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 19:21 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 2795 bytes --]

On Sun, Sep 17, 2023 at 10:39 PM Karim Taha <kariem.taha2.7@gmail.com>
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: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/freebsd/os-proc.h    | 39 +++++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |  4 ++++
>  2 files changed, 43 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>


> diff --git a/bsd-user/freebsd/os-proc.h b/bsd-user/freebsd/os-proc.h
> index 14478d4bb5..a406ef7db8 100644
> --- a/bsd-user/freebsd/os-proc.h
> +++ b/bsd-user/freebsd/os-proc.h
> @@ -212,4 +212,43 @@ static inline abi_long do_freebsd_vfork(void *cpu_env)
>      return do_freebsd_fork(cpu_env);
>  }
>
> +/* rfork(2) */
> +static inline abi_long do_freebsd_rfork(void *cpu_env, abi_long flags)
> +{
> +    abi_long ret;
> +    abi_ulong child_flag;
> +
> +    /*
> +     * XXX We need to handle RFMEM here, as well.  Neither are safe to
> execute
> +     * as-is on x86 hosts because they'll split memory but not the stack,
> +     * wreaking havoc on host architectures that use the stack to store
> the
> +     * return address as both threads try to pop it off.  Rejecting
> RFSPAWN
> +     * entirely for now is ok, the only consumer at the moment is
> posix_spawn
> +     * and it will fall back to classic vfork(2) if we return EINVAL.
> +     */
> +    if ((flags & TARGET_RFSPAWN) != 0) {
> +        return -TARGET_EINVAL;
> +    }
> +    fork_start();
> +    ret = rfork(flags);
> +    if (ret == 0) {
> +        /* child */
> +        child_flag = 1;
> +        target_cpu_clone_regs(cpu_env, 0);
> +    } else {
> +        /* parent */
> +        child_flag = 0;
> +    }
> +
> +    /*
> +     * The fork system call sets a child flag in the second return
> +     * value: 0 for parent process, 1 for child process.
> +     */
> +    set_second_rval(cpu_env, child_flag);
> +    fork_end(child_flag);
> +
> +    return ret;
> +
> +}
> +
>  #endif /* BSD_USER_FREEBSD_OS_PROC_H */
> diff --git a/bsd-user/freebsd/os-syscall.c b/bsd-user/freebsd/os-syscall.c
> index cb9425c9ba..4c4e773d1d 100644
> --- a/bsd-user/freebsd/os-syscall.c
> +++ b/bsd-user/freebsd/os-syscall.c
> @@ -234,6 +234,10 @@ static abi_long freebsd_syscall(void *cpu_env, int
> num, abi_long arg1,
>          ret = do_freebsd_vfork(cpu_env);
>          break;
>
> +    case TARGET_FREEBSD_NR_rfork: /* rfork(2) */
> +        ret = do_freebsd_rfork(cpu_env, arg1);
> +        break;
> +
>      case TARGET_FREEBSD_NR_execve: /* execve(2) */
>          ret = do_freebsd_execve(arg1, arg2, arg3);
>          break;
> --
> 2.42.0
>
>

[-- Attachment #2: Type: text/html, Size: 3732 bytes --]

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

* Re: [PATCH v2 28/28] bsd-user: Implement pdfork(2) system call.
  2023-09-17 21:38 ` [PATCH v2 28/28] bsd-user: Implement pdfork(2) " Karim Taha
@ 2023-09-20 19:23   ` Warner Losh
  0 siblings, 0 replies; 56+ messages in thread
From: Warner Losh @ 2023-09-20 19:23 UTC (permalink / raw)
  To: Karim Taha; +Cc: qemu-devel, Richard Henderson, Stacey Son

[-- Attachment #1: Type: text/plain, Size: 598 bytes --]

On Sun, Sep 17, 2023 at 10:40 PM Karim Taha <kariem.taha2.7@gmail.com>
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>
> Acked-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  bsd-user/freebsd/os-proc.h    | 32 ++++++++++++++++++++++++++++++++
>  bsd-user/freebsd/os-syscall.c |  4 ++++
>  2 files changed, 36 insertions(+)
>

Reviewed-by: Warner Losh <imp@bsdimp.com>

I chased down pdfork recently for other reasons, and I'm pretty sure this
is good.

Warner

[-- Attachment #2: Type: text/html, Size: 1202 bytes --]

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

end of thread, other threads:[~2023-09-20 19:23 UTC | newest]

Thread overview: 56+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-17 21:37 [PATCH v2 00/28] bsd-user: Implement freebsd process related system calls Karim Taha
2023-09-17 21:37 ` [PATCH v2 01/28] bsd-user: define TARGET_RFSPAWN for rfork to use vfork(2) semantics, and fix RLIM_INFINITY Karim Taha
2023-09-20 18:03   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 02/28] bsd-user: Define procctl(2) related structs Karim Taha
2023-09-20 18:03   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 03/28] bsd-user: Implement host_to_target_siginfo Karim Taha
2023-09-20 18:04   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 04/28] bsd-user: Add freebsd_exec_common and do_freebsd_procctl to qemu.h Karim Taha
2023-09-20 18:04   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 05/28] bsd-user: add extern declarations for bsd-proc.c conversion functions Karim Taha
2023-09-20 18:05   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 06/28] bsd-user: Implement target_to_host_resource conversion function Karim Taha
2023-09-17 21:37 ` [PATCH v2 07/28] bsd-user: Implement target_to_host_rlim and host_to_target_rlim conversion Karim Taha
2023-09-20 18:10   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 08/28] bsd-user: Implement host_to_target_rusage and host_to_target_wrusage Karim Taha
2023-09-20 18:11   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 09/28] bsd-user: Implement host_to_target_waitstatus conversion Karim Taha
2023-09-20 18:14   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 10/28] bsd-user: Get number of cpus Karim Taha
2023-09-20 18:19   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 11/28] bsd-user: Implement getgroups(2) and setgroups(2) system calls Karim Taha
2023-09-20 18:22   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 12/28] bsd-user: Implement umask(2), setlogin(2) and getlogin(2) Karim Taha
2023-09-20 18:33   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 13/28] bsd-user: Implement getrusage(2) Karim Taha
2023-09-20 18:37   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 14/28] bsd-user: Implement getrlimit(2) and setrlimit(2) Karim Taha
2023-09-20 18:42   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 15/28] bsd-user: Implement several get/set system calls: Karim Taha
2023-09-20 18:44   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 16/28] bsd-user: Implement get/set[resuid/resgid/sid] and issetugid Karim Taha
2023-09-20 18:45   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 17/28] bsd-user: Add stubs for profil(2), ktrace(2), utrace(2) and ptrace(2) Karim Taha
2023-09-20 18:47   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 18/28] bsd-user: Implement getpriority(2) and setpriority(2) Karim Taha
2023-09-20 18:48   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 19/28] bsd-user: Implement get_filename_from_fd Karim Taha
2023-09-20 18:49   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 20/28] bsd-user: Implement freebsd_exec_common, used in implementing execve/fexecve Karim Taha
2023-09-20 18:57   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 21/28] bsd-user: Implement procctl(2) along with necessary conversion functions Karim Taha
2023-09-20 19:02   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 22/28] bsd-user: Implement execve(2) and fexecve(2) system calls Karim Taha
2023-09-20 19:05   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 23/28] bsd-user: Implement wait4(2) and wait6(2) " Karim Taha
2023-09-20 19:10   ` Warner Losh
2023-09-17 21:37 ` [PATCH v2 24/28] bsd-user: Implement setloginclass(2) and getloginclass(2) " Karim Taha
2023-09-20 19:11   ` Warner Losh
2023-09-17 21:38 ` [PATCH v2 25/28] bsd-user: Implement pdgetpid(2) and the undocumented setugid Karim Taha
2023-09-20 19:16   ` Warner Losh
2023-09-17 21:38 ` [PATCH v2 26/28] bsd-user: Implement fork(2) and vfork(2) system calls Karim Taha
2023-09-20 19:19   ` Warner Losh
2023-09-17 21:38 ` [PATCH v2 27/28] bsd-user: Implement rfork(2) system call Karim Taha
2023-09-20 19:21   ` Warner Losh
2023-09-17 21:38 ` [PATCH v2 28/28] bsd-user: Implement pdfork(2) " Karim Taha
2023-09-20 19:23   ` Warner Losh

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