{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>
This commit is contained in:
Ilya Leoshkevich 2024-03-05 12:09:42 +00:00 committed by Alex Bennée
parent 3d6ed98da8
commit 4edc98fcc8
6 changed files with 14 additions and 10 deletions

View File

@ -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;
} }

View File

@ -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;
/* /*

View File

@ -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"

View File

@ -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) {

View File

@ -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));
} }

View File

@ -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: