opensuse 7.1 #18
@@ -1080,11 +1080,16 @@ UNUSED static struct flags mmap_flags[] = {
|
||||
FLAG_END,
|
||||
};
|
||||
|
||||
#ifndef CLONE_PIDFD
|
||||
# define CLONE_PIDFD 0x00001000
|
||||
#endif
|
||||
|
||||
UNUSED static struct flags clone_flags[] = {
|
||||
FLAG_GENERIC(CLONE_VM),
|
||||
FLAG_GENERIC(CLONE_FS),
|
||||
FLAG_GENERIC(CLONE_FILES),
|
||||
FLAG_GENERIC(CLONE_SIGHAND),
|
||||
FLAG_GENERIC(CLONE_PIDFD),
|
||||
FLAG_GENERIC(CLONE_PTRACE),
|
||||
FLAG_GENERIC(CLONE_VFORK),
|
||||
FLAG_GENERIC(CLONE_PARENT),
|
||||
|
||||
@@ -210,9 +210,13 @@ struct file_clone_range {
|
||||
#define CLONE_IGNORED_FLAGS \
|
||||
(CLONE_DETACHED | CLONE_IO)
|
||||
|
||||
#ifndef CLONE_PIDFD
|
||||
# define CLONE_PIDFD 0x00001000
|
||||
#endif
|
||||
|
||||
/* Flags for fork which we can implement within QEMU itself */
|
||||
#define CLONE_OPTIONAL_FORK_FLAGS \
|
||||
(CLONE_SETTLS | CLONE_PARENT_SETTID | \
|
||||
(CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_PIDFD | \
|
||||
CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID)
|
||||
|
||||
/* Flags for thread creation which we can implement within QEMU itself */
|
||||
@@ -6713,6 +6717,17 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
|
||||
return -TARGET_EINVAL;
|
||||
}
|
||||
|
||||
#if !defined(__NR_pidfd_open) || !defined(TARGET_NR_pidfd_open)
|
||||
if (flags & CLONE_PIDFD) {
|
||||
return -TARGET_EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Can not allow CLONE_PIDFD with CLONE_PARENT_SETTID */
|
||||
if ((flags & CLONE_PIDFD) && (flags & CLONE_PARENT_SETTID)) {
|
||||
return -TARGET_EINVAL;
|
||||
}
|
||||
|
||||
if (block_signals()) {
|
||||
return -QEMU_ERESTARTSYS;
|
||||
}
|
||||
@@ -6740,6 +6755,20 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
|
||||
ts->child_tidptr = child_tidptr;
|
||||
} else {
|
||||
cpu_clone_regs_parent(env, flags);
|
||||
if (flags & CLONE_PIDFD) {
|
||||
int pid_fd = 0;
|
||||
#if defined(__NR_pidfd_open) && defined(TARGET_NR_pidfd_open)
|
||||
int pid_child = ret;
|
||||
pid_fd = pidfd_open(pid_child, 0);
|
||||
if (pid_fd >= 0) {
|
||||
fcntl(pid_fd, F_SETFD, fcntl(pid_fd, F_GETFL)
|
||||
| FD_CLOEXEC);
|
||||
} else {
|
||||
pid_fd = 0;
|
||||
}
|
||||
#endif
|
||||
put_user_u32(pid_fd, parent_tidptr);
|
||||
}
|
||||
fork_end(0);
|
||||
}
|
||||
}
|
||||
@@ -8095,6 +8124,9 @@ static int open_self_stat(CPUArchState *cpu_env, int fd)
|
||||
gchar *bin = g_strrstr(ts->bprm->argv[0], "/");
|
||||
bin = bin ? bin + 1 : ts->bprm->argv[0];
|
||||
g_string_printf(buf, "(%.15s) ", bin);
|
||||
} else if (i == 2) {
|
||||
/* task state */
|
||||
g_string_assign(buf, "R "); /* we are running right now */
|
||||
} else if (i == 3) {
|
||||
/* ppid */
|
||||
g_string_printf(buf, FMT_pid " ", getppid());
|
||||
|
||||
Reference in New Issue
Block a user