Skip to content

Commit

Permalink
{linux,bsd}-user: Pass pid to fork_end()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
iii-i authored and stsquad committed Mar 6, 2024
1 parent 3d6ed98 commit 4edc98f
Show file tree
Hide file tree
Showing 6 changed files with 14 additions and 10 deletions.
6 changes: 3 additions & 3 deletions bsd-user/freebsd/os-proc.h
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ static inline abi_long do_freebsd_fork(void *cpu_env)
*/
set_second_rval(cpu_env, child_flag);

fork_end(child_flag);
fork_end(ret);

return ret;
}
Expand Down Expand Up @@ -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.
*/
set_second_rval(cpu_env, child_flag);
fork_end(child_flag);
fork_end(ret);

return ret;

Expand Down Expand Up @@ -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.
*/
set_second_rval(cpu_env, child_flag);
fork_end(child_flag);
fork_end(ret);

return ret;
}
Expand Down
4 changes: 3 additions & 1 deletion bsd-user/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,10 @@ void fork_start(void)
gdbserver_fork_start();
}

void fork_end(int child)
void fork_end(pid_t pid)
{
bool child = pid == 0;

if (child) {
CPUState *cpu, *next_cpu;
/*
Expand Down
2 changes: 1 addition & 1 deletion bsd-user/qemu.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ void cpu_loop(CPUArchState *env);
char *target_strerror(int err);
int get_osversion(void);
void fork_start(void);
void fork_end(int child);
void fork_end(pid_t pid);

#include "qemu/log.h"

Expand Down
4 changes: 3 additions & 1 deletion linux-user/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,10 @@ void fork_start(void)
gdbserver_fork_start();
}

void fork_end(int child)
void fork_end(pid_t pid)
{
bool child = pid == 0;

qemu_plugin_user_postfork(child);
mmap_fork_end(child);
if (child) {
Expand Down
6 changes: 3 additions & 3 deletions linux-user/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -6669,7 +6669,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
if (ret == 0) {
/* Child Process. */
cpu_clone_regs_child(env, newsp, flags);
fork_end(1);
fork_end(ret);
/* There is a race condition here. The parent process could
theoretically read the TID in the child process before the child
tid is set. This would require using either ptrace
Expand Down Expand Up @@ -6700,8 +6700,8 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
}
#endif
put_user_u32(pid_fd, parent_tidptr);
}
fork_end(0);
}
fork_end(ret);
}
g_assert(!cpu_in_exclusive_context(cpu));
}
Expand Down
2 changes: 1 addition & 1 deletion linux-user/user-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ const char *target_strerror(int err);
int get_osversion(void);
void init_qemu_uname_release(void);
void fork_start(void);
void fork_end(int child);
void fork_end(pid_t pid);

/**
* probe_guest_base:
Expand Down

0 comments on commit 4edc98f

Please sign in to comment.