Browse Source

{linux,bsd}-user: Pass pid to fork_end()

The upcoming follow-fork-mode child support requires knowing the child
pid. Pass it down.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Message-Id: <20240219141628.246823-6-iii@linux.ibm.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20240305121005.3528075-7-alex.bennee@linaro.org>
Ilya Leoshkevich 1 year ago
parent
commit
4edc98fcc8
6 changed files with 14 additions and 10 deletions
  1. 3 3
      bsd-user/freebsd/os-proc.h
  2. 3 1
      bsd-user/main.c
  3. 1 1
      bsd-user/qemu.h
  4. 3 1
      linux-user/main.c
  5. 3 3
      linux-user/syscall.c
  6. 1 1
      linux-user/user-internals.h

+ 3 - 3
bsd-user/freebsd/os-proc.h

@@ -208,7 +208,7 @@ static inline abi_long do_freebsd_fork(void *cpu_env)
      */
      */
     set_second_rval(cpu_env, child_flag);
     set_second_rval(cpu_env, child_flag);
 
 
-    fork_end(child_flag);
+    fork_end(ret);
 
 
     return ret;
     return ret;
 }
 }
@@ -252,7 +252,7 @@ static inline abi_long do_freebsd_rfork(void *cpu_env, abi_long flags)
      * value: 0 for parent process, 1 for child process.
      * value: 0 for parent process, 1 for child process.
      */
      */
     set_second_rval(cpu_env, child_flag);
     set_second_rval(cpu_env, child_flag);
-    fork_end(child_flag);
+    fork_end(ret);
 
 
     return ret;
     return ret;
 
 
@@ -285,7 +285,7 @@ static inline abi_long do_freebsd_pdfork(void *cpu_env, abi_ulong target_fdp,
      * value: 0 for parent process, 1 for child process.
      * value: 0 for parent process, 1 for child process.
      */
      */
     set_second_rval(cpu_env, child_flag);
     set_second_rval(cpu_env, child_flag);
-    fork_end(child_flag);
+    fork_end(ret);
 
 
     return ret;
     return ret;
 }
 }

+ 3 - 1
bsd-user/main.c

@@ -116,8 +116,10 @@ void fork_start(void)
     gdbserver_fork_start();
     gdbserver_fork_start();
 }
 }
 
 
-void fork_end(int child)
+void fork_end(pid_t pid)
 {
 {
+    bool child = pid == 0;
+
     if (child) {
     if (child) {
         CPUState *cpu, *next_cpu;
         CPUState *cpu, *next_cpu;
         /*
         /*

+ 1 - 1
bsd-user/qemu.h

@@ -192,7 +192,7 @@ void cpu_loop(CPUArchState *env);
 char *target_strerror(int err);
 char *target_strerror(int err);
 int get_osversion(void);
 int get_osversion(void);
 void fork_start(void);
 void fork_start(void);
-void fork_end(int child);
+void fork_end(pid_t pid);
 
 
 #include "qemu/log.h"
 #include "qemu/log.h"
 
 

+ 3 - 1
linux-user/main.c

@@ -148,8 +148,10 @@ void fork_start(void)
     gdbserver_fork_start();
     gdbserver_fork_start();
 }
 }
 
 
-void fork_end(int child)
+void fork_end(pid_t pid)
 {
 {
+    bool child = pid == 0;
+
     qemu_plugin_user_postfork(child);
     qemu_plugin_user_postfork(child);
     mmap_fork_end(child);
     mmap_fork_end(child);
     if (child) {
     if (child) {

+ 3 - 3
linux-user/syscall.c

@@ -6669,7 +6669,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
         if (ret == 0) {
         if (ret == 0) {
             /* Child Process.  */
             /* Child Process.  */
             cpu_clone_regs_child(env, newsp, flags);
             cpu_clone_regs_child(env, newsp, flags);
-            fork_end(1);
+            fork_end(ret);
             /* There is a race condition here.  The parent process could
             /* There is a race condition here.  The parent process could
                theoretically read the TID in the child process before the child
                theoretically read the TID in the child process before the child
                tid is set.  This would require using either ptrace
                tid is set.  This would require using either ptrace
@@ -6700,8 +6700,8 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
                 }
                 }
 #endif
 #endif
                 put_user_u32(pid_fd, parent_tidptr);
                 put_user_u32(pid_fd, parent_tidptr);
-                }
-            fork_end(0);
+            }
+            fork_end(ret);
         }
         }
         g_assert(!cpu_in_exclusive_context(cpu));
         g_assert(!cpu_in_exclusive_context(cpu));
     }
     }

+ 1 - 1
linux-user/user-internals.h

@@ -71,7 +71,7 @@ const char *target_strerror(int err);
 int get_osversion(void);
 int get_osversion(void);
 void init_qemu_uname_release(void);
 void init_qemu_uname_release(void);
 void fork_start(void);
 void fork_start(void);
-void fork_end(int child);
+void fork_end(pid_t pid);
 
 
 /**
 /**
  * probe_guest_base:
  * probe_guest_base: