Module Name: src
Committed By: christos
Date: Fri Aug 18 19:41:20 UTC 2023
Modified Files:
src/sys/compat/common: compat_mod.h files.common
src/sys/compat/linux/arch/aarch64: syscalls.master
src/sys/compat/linux/arch/alpha: syscalls.master
src/sys/compat/linux/arch/amd64: syscalls.master
src/sys/compat/linux/arch/arm: syscalls.master
src/sys/compat/linux/arch/i386: syscalls.master
src/sys/compat/linux/arch/mips: syscalls.master
src/sys/compat/linux/arch/powerpc: syscalls.master
src/sys/compat/linux/common: linux_misc.c linux_misc.h linux_signal.c
src/sys/compat/linux32/common: linux32_wait.c
Log Message:
Add linux waitid(2) from GSoC 2023 (Theodore Preduta)
To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/compat/common/compat_mod.h
cvs rdiff -u -r1.9 -r1.10 src/sys/compat/common/files.common
cvs rdiff -u -r1.9 -r1.10 src/sys/compat/linux/arch/aarch64/syscalls.master
cvs rdiff -u -r1.104 -r1.105 src/sys/compat/linux/arch/alpha/syscalls.master
cvs rdiff -u -r1.70 -r1.71 src/sys/compat/linux/arch/amd64/syscalls.master
cvs rdiff -u -r1.77 -r1.78 src/sys/compat/linux/arch/arm/syscalls.master
cvs rdiff -u -r1.132 -r1.133 src/sys/compat/linux/arch/i386/syscalls.master
cvs rdiff -u -r1.77 -r1.78 src/sys/compat/linux/arch/mips/syscalls.master
cvs rdiff -u -r1.82 -r1.83 src/sys/compat/linux/arch/powerpc/syscalls.master
cvs rdiff -u -r1.261 -r1.262 src/sys/compat/linux/common/linux_misc.c
cvs rdiff -u -r1.28 -r1.29 src/sys/compat/linux/common/linux_misc.h
cvs rdiff -u -r1.88 -r1.89 src/sys/compat/linux/common/linux_signal.c
cvs rdiff -u -r1.12 -r1.13 src/sys/compat/linux32/common/linux32_wait.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/compat/common/compat_mod.h
diff -u src/sys/compat/common/compat_mod.h:1.8 src/sys/compat/common/compat_mod.h:1.9
--- src/sys/compat/common/compat_mod.h:1.8 Fri Jul 28 14:19:00 2023
+++ src/sys/compat/common/compat_mod.h Fri Aug 18 15:41:18 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_mod.h,v 1.8 2023/07/28 18:19:00 christos Exp $ */
+/* $NetBSD: compat_mod.h,v 1.9 2023/08/18 19:41:18 christos Exp $ */
/*-
* Copyright (c) 2013, 2019 The NetBSD Foundation, Inc.
@@ -37,6 +37,8 @@ int compat_100_init(void);
int compat_100_fini(void);
int kern_event_100_init(void);
int kern_event_100_fini(void);
+void usb_100_init(void);
+void usb_100_fini(void);
#endif
#ifdef COMPAT_90
Index: src/sys/compat/common/files.common
diff -u src/sys/compat/common/files.common:1.9 src/sys/compat/common/files.common:1.10
--- src/sys/compat/common/files.common:1.9 Fri Jul 28 14:19:00 2023
+++ src/sys/compat/common/files.common Fri Aug 18 15:41:18 2023
@@ -1,4 +1,4 @@
-# $NetBSD: files.common,v 1.9 2023/07/28 18:19:00 christos Exp $
+# $NetBSD: files.common,v 1.10 2023/08/18 19:41:18 christos Exp $
#
# Generic utility files, used by various compat options.
@@ -113,6 +113,7 @@ file compat/common/vfs_syscalls_90.c co
# Compatibility code for NetBSD 10.0
file compat/common/compat_100_mod.c compat_100
file compat/common/kern_event_100.c compat_100
+#file compat/common/usb_subr_100.c compat_100
#
# Sources for sysv ipc compatibility across the versions.
Index: src/sys/compat/linux/arch/aarch64/syscalls.master
diff -u src/sys/compat/linux/arch/aarch64/syscalls.master:1.9 src/sys/compat/linux/arch/aarch64/syscalls.master:1.10
--- src/sys/compat/linux/arch/aarch64/syscalls.master:1.9 Sat Jul 29 11:04:28 2023
+++ src/sys/compat/linux/arch/aarch64/syscalls.master Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.9 2023/07/29 15:04:28 christos Exp $
+ $NetBSD: syscalls.master,v 1.10 2023/08/18 19:41:19 christos Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@@ -216,7 +216,9 @@
92 STD { int|linux_sys||personality(unsigned long per); }
93 STD { int|linux_sys||exit(int rval); }
94 STD { int|linux_sys||exit_group(int error_code); }
-95 UNIMPL waitid
+95 STD { int|linux_sys||waitid(int idtype, id_t id, \
+ linux_siginfo_t *infop, int options, \
+ struct rusage50 *rusage); }
96 STD { int|linux_sys||set_tid_address(int *tid); }
97 UNIMPL unshare
98 STD { int|linux_sys||futex(int *uaddr, int op, int val, \
Index: src/sys/compat/linux/arch/alpha/syscalls.master
diff -u src/sys/compat/linux/arch/alpha/syscalls.master:1.104 src/sys/compat/linux/arch/alpha/syscalls.master:1.105
--- src/sys/compat/linux/arch/alpha/syscalls.master:1.104 Sat Jul 29 11:04:28 2023
+++ src/sys/compat/linux/arch/alpha/syscalls.master Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.104 2023/07/29 15:04:28 christos Exp $
+ $NetBSD: syscalls.master,v 1.105 2023/08/18 19:41:19 christos Exp $
;
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@@ -703,7 +703,9 @@
435 UNIMPL mq_timedreceive
436 UNIMPL mq_notify
437 UNIMPL mq_getsetattr
-438 UNIMPL waitid
+438 STD { int|linux_sys||waitid(int idtype, id_t id, \
+ linux_siginfo_t *infop, int options, \
+ struct rusage50 *rusage); }
439 UNIMPL add_key
440 UNIMPL request_key
441 UNIMPL keyctl
Index: src/sys/compat/linux/arch/amd64/syscalls.master
diff -u src/sys/compat/linux/arch/amd64/syscalls.master:1.70 src/sys/compat/linux/arch/amd64/syscalls.master:1.71
--- src/sys/compat/linux/arch/amd64/syscalls.master:1.70 Sat Jul 29 11:04:28 2023
+++ src/sys/compat/linux/arch/amd64/syscalls.master Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.70 2023/07/29 15:04:28 christos Exp $
+ $NetBSD: syscalls.master,v 1.71 2023/08/18 19:41:19 christos Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@@ -463,7 +463,9 @@
244 UNIMPL mq_notify
245 UNIMPL mq_getsetattr
246 UNIMPL kexec_load
-247 UNIMPL waitid
+247 STD { int|linux_sys||waitid(int idtype, id_t id, \
+ linux_siginfo_t *infop, int options, \
+ struct rusage50 *rusage); }
248 UNIMPL add_key
249 UNIMPL request_key
250 UNIMPL keyctl
Index: src/sys/compat/linux/arch/arm/syscalls.master
diff -u src/sys/compat/linux/arch/arm/syscalls.master:1.77 src/sys/compat/linux/arch/arm/syscalls.master:1.78
--- src/sys/compat/linux/arch/arm/syscalls.master:1.77 Sat Jul 29 11:04:28 2023
+++ src/sys/compat/linux/arch/arm/syscalls.master Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.77 2023/07/29 15:04:28 christos Exp $
+ $NetBSD: syscalls.master,v 1.78 2023/08/18 19:41:19 christos Exp $
; Derived from sys/compat/linux/arch/*/syscalls.master
; and from Linux 2.4.12 arch/arm/kernel/calls.S
@@ -471,7 +471,9 @@
277 UNIMPL mq_timedreceive
278 UNIMPL mq_notify
279 UNIMPL mq_getsetattr
-280 UNIMPL waitid
+280 STD { int|linux_sys||waitid(int idtype, id_t id, \
+ linux_siginfo_t *infop, int options, \
+ struct rusage50 *rusage); }
281 UNIMPL socket
282 UNIMPL bind
283 UNIMPL connect
Index: src/sys/compat/linux/arch/i386/syscalls.master
diff -u src/sys/compat/linux/arch/i386/syscalls.master:1.132 src/sys/compat/linux/arch/i386/syscalls.master:1.133
--- src/sys/compat/linux/arch/i386/syscalls.master:1.132 Sat Jul 29 11:04:28 2023
+++ src/sys/compat/linux/arch/i386/syscalls.master Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.132 2023/07/29 15:04:28 christos Exp $
+ $NetBSD: syscalls.master,v 1.133 2023/08/18 19:41:19 christos Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@@ -475,7 +475,9 @@
281 UNIMPL mq_notify
282 UNIMPL mq_getsetattr
283 UNIMPL sys_kexec_load
-284 UNIMPL waitid
+284 STD { int|linux_sys||waitid(int idtype, id_t id, \
+ linux_siginfo_t *infop, int options, \
+ struct rusage50 *rusage); }
285 UNIMPL /* unused */
286 UNIMPL add_key
287 UNIMPL request_key
Index: src/sys/compat/linux/arch/mips/syscalls.master
diff -u src/sys/compat/linux/arch/mips/syscalls.master:1.77 src/sys/compat/linux/arch/mips/syscalls.master:1.78
--- src/sys/compat/linux/arch/mips/syscalls.master:1.77 Sat Jul 29 11:05:31 2023
+++ src/sys/compat/linux/arch/mips/syscalls.master Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.77 2023/07/29 15:05:31 christos Exp $
+ $NetBSD: syscalls.master,v 1.78 2023/08/18 19:41:19 christos Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@@ -474,7 +474,9 @@
275 UNIMPL mq_notify
276 UNIMPL mq_getsetattr
277 UNIMPL vserve
-278 UNIMPL waitid
+278 STD { int|linux_sys||waitid(int idtype, id_t id, \
+ linux_siginfo_t *infop, int options, \
+ struct rusage50 *rusage); }
279 UNIMPL setaltroot
280 UNIMPL add_key
281 UNIMPL request_key
Index: src/sys/compat/linux/arch/powerpc/syscalls.master
diff -u src/sys/compat/linux/arch/powerpc/syscalls.master:1.82 src/sys/compat/linux/arch/powerpc/syscalls.master:1.83
--- src/sys/compat/linux/arch/powerpc/syscalls.master:1.82 Sat Jul 29 11:04:29 2023
+++ src/sys/compat/linux/arch/powerpc/syscalls.master Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
- $NetBSD: syscalls.master,v 1.82 2023/07/29 15:04:29 christos Exp $
+ $NetBSD: syscalls.master,v 1.83 2023/08/18 19:41:19 christos Exp $
; @(#)syscalls.master 8.1 (Berkeley) 7/19/93
@@ -478,7 +478,9 @@
269 UNIMPL add_key
270 UNIMPL request_key
271 UNIMPL keyctl
-272 UNIMPL waitid
+272 STD { int|linux_sys||waitid(int idtype, id_t id, \
+ linux_siginfo_t *infop, int options, \
+ struct rusage50 *rusage); }
273 UNIMPL ioprio_set
274 UNIMPL ioprio_get
275 UNIMPL inotify_init
Index: src/sys/compat/linux/common/linux_misc.c
diff -u src/sys/compat/linux/common/linux_misc.c:1.261 src/sys/compat/linux/common/linux_misc.c:1.262
--- src/sys/compat/linux/common/linux_misc.c:1.261 Sun Jul 30 14:31:13 2023
+++ src/sys/compat/linux/common/linux_misc.c Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_misc.c,v 1.261 2023/07/30 18:31:13 christos Exp $ */
+/* $NetBSD: linux_misc.c,v 1.262 2023/08/18 19:41:19 christos Exp $ */
/*-
* Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.261 2023/07/30 18:31:13 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.262 2023/08/18 19:41:19 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -180,7 +180,7 @@ static void linux_to_bsd_mmap_args(struc
const struct linux_sys_mmap_args *);
static int linux_mmap(struct lwp *, const struct linux_sys_mmap_args *,
register_t *, off_t);
-
+static int linux_to_native_wait_options(int);
/*
* The information on a terminated (or stopped) process needs
@@ -229,19 +229,9 @@ linux_sys_wait4(struct lwp *l, const str
if (linux_options & ~(LINUX_WAIT4_KNOWNFLAGS))
return (EINVAL);
- options = 0;
- if (linux_options & LINUX_WAIT4_WNOHANG)
- options |= WNOHANG;
- if (linux_options & LINUX_WAIT4_WUNTRACED)
- options |= WUNTRACED;
- if (linux_options & LINUX_WAIT4_WCONTINUED)
- options |= WCONTINUED;
- if (linux_options & LINUX_WAIT4_WALL)
- options |= WALLSIG;
- if (linux_options & LINUX_WAIT4_WCLONE)
- options |= WALTSIG;
+ options = linux_to_native_wait_options(linux_options);
# ifdef DIAGNOSTIC
- if (linux_options & LINUX_WAIT4_WNOTHREAD)
+ if (linux_options & LINUX_WNOTHREAD)
printf("WARNING: %s: linux process %d.%d called "
"waitpid with __WNOTHREAD set!\n",
__FILE__, l->l_proc->p_pid, l->l_lid);
@@ -274,6 +264,100 @@ linux_sys_wait4(struct lwp *l, const str
}
/*
+ * waitid(2). Converting arguments to the NetBSD equivalent and
+ * calling it.
+ */
+int
+linux_sys_waitid(struct lwp *l, const struct linux_sys_waitid_args *uap, register_t *retval)
+{
+ /* {
+ syscallarg(int) idtype;
+ syscallarg(id_t) id;
+ syscallarg(linux_siginfo_t *) infop;
+ syscallarg(int) options;
+ syscallarg(struct rusage50 *) rusage;
+ } */
+ int error, linux_options, options, linux_idtype, status;
+ pid_t pid;
+ idtype_t idtype;
+ id_t id;
+ siginfo_t info;
+ linux_siginfo_t linux_info;
+ struct wrusage wru;
+ struct rusage50 ru50;
+
+ linux_idtype = SCARG(uap, idtype);
+ switch (linux_idtype) {
+ case LINUX_P_ALL:
+ idtype = P_ALL;
+ break;
+ case LINUX_P_PID:
+ idtype = P_PID;
+ break;
+ case LINUX_P_PGID:
+ idtype = P_PGID;
+ break;
+ case LINUX_P_PIDFD:
+ return EOPNOTSUPP;
+ default:
+ return EINVAL;
+ }
+
+ linux_options = SCARG(uap, options);
+ if (linux_options & ~(LINUX_WAITID_KNOWNFLAGS))
+ return EINVAL;
+
+ options = linux_to_native_wait_options(linux_options);
+ id = SCARG(uap, id);
+
+ error = do_sys_waitid(idtype, id, &pid, &status, options, &wru, &info);
+ if (pid == 0 && options & WNOHANG) {
+ info.si_signo = 0;
+ info.si_pid = 0;
+ }
+
+ if (error == 0 && SCARG(uap, infop) != NULL) {
+ /* POSIX says that this NULL check is a bug, but Linux does this. */
+ native_to_linux_siginfo(&linux_info, &info._info);
+ error = copyout(&linux_info, SCARG(uap, infop), sizeof(linux_info));
+ }
+
+ if (error == 0 && SCARG(uap, rusage) != NULL) {
+ rusage_to_rusage50(&wru.wru_children, &ru50);
+ error = copyout(&ru50, SCARG(uap, rusage), sizeof(ru50));
+ }
+
+ return error;
+}
+
+/*
+ * Convert the opttions argument for wait4(2) and waitid(2) from what
+ * Linux wants to what NetBSD wants.
+ */
+static int
+linux_to_native_wait_options(int linux_options)
+{
+ int options = 0;
+
+ if (linux_options & LINUX_WNOHANG)
+ options |= WNOHANG;
+ if (linux_options & LINUX_WUNTRACED)
+ options |= WUNTRACED;
+ if (linux_options & LINUX_WEXITED)
+ options |= WEXITED;
+ if (linux_options & LINUX_WCONTINUED)
+ options |= WCONTINUED;
+ if (linux_options & LINUX_WNOWAIT)
+ options |= WNOWAIT;
+ if (linux_options & LINUX_WALL)
+ options |= WALLSIG;
+ if (linux_options & LINUX_WCLONE)
+ options |= WALTSIG;
+
+ return options;
+}
+
+/*
* Linux brk(2). Like native, but always return the new break value.
*/
int
Index: src/sys/compat/linux/common/linux_misc.h
diff -u src/sys/compat/linux/common/linux_misc.h:1.28 src/sys/compat/linux/common/linux_misc.h:1.29
--- src/sys/compat/linux/common/linux_misc.h:1.28 Sat Jul 29 08:58:51 2023
+++ src/sys/compat/linux/common/linux_misc.h Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_misc.h,v 1.28 2023/07/29 12:58:51 rin Exp $ */
+/* $NetBSD: linux_misc.h,v 1.29 2023/08/18 19:41:19 christos Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -33,21 +33,37 @@
#define _LINUX_MISC_H
/*
- * Options passed to the Linux wait4() system call.
+ * Options passed to the Linux wait4() and waitid() system calls.
*/
-#define LINUX_WAIT4_WNOHANG 0x00000001
-#define LINUX_WAIT4_WUNTRACED 0x00000002
-#define LINUX_WAIT4_WCONTINUED 0x00000008
-#define LINUX_WAIT4_WNOTHREAD 0x20000000
-#define LINUX_WAIT4_WALL 0x40000000
-#define LINUX_WAIT4_WCLONE 0x80000000
-
-#define LINUX_WAIT4_KNOWNFLAGS (LINUX_WAIT4_WNOHANG | \
- LINUX_WAIT4_WUNTRACED | \
- LINUX_WAIT4_WCONTINUED | \
- LINUX_WAIT4_WNOTHREAD | \
- LINUX_WAIT4_WALL | \
- LINUX_WAIT4_WCLONE)
+#define LINUX_WNOHANG 0x00000001
+#define LINUX_WUNTRACED 0x00000002
+#define LINUX_WEXITED 0x00000004
+#define LINUX_WCONTINUED 0x00000008
+#define LINUX_WNOWAIT 0x01000000
+#define LINUX_WNOTHREAD 0x20000000
+#define LINUX_WALL 0x40000000
+#define LINUX_WCLONE 0x80000000
+
+#define LINUX_WAIT4_KNOWNFLAGS (LINUX_WNOHANG | \
+ LINUX_WUNTRACED | \
+ LINUX_WCONTINUED | \
+ LINUX_WNOTHREAD | \
+ LINUX_WALL | \
+ LINUX_WCLONE)
+
+#define LINUX_WAITID_KNOWNFLAGS (LINUX_WNOHANG | \
+ LINUX_WEXITED | \
+ LINUX_WUNTRACED | \
+ LINUX_WCONTINUED | \
+ LINUX_WNOWAIT)
+
+/*
+ * Passed as the first argument of waitid(2).
+ */
+#define LINUX_P_ALL 0
+#define LINUX_P_PID 1
+#define LINUX_P_PGID 2
+#define LINUX_P_PIDFD 3
/* This looks very unportable to me, but this is how Linux defines it. */
struct linux_sysinfo {
Index: src/sys/compat/linux/common/linux_signal.c
diff -u src/sys/compat/linux/common/linux_signal.c:1.88 src/sys/compat/linux/common/linux_signal.c:1.89
--- src/sys/compat/linux/common/linux_signal.c:1.88 Mon Nov 1 01:07:16 2021
+++ src/sys/compat/linux/common/linux_signal.c Fri Aug 18 15:41:19 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_signal.c,v 1.88 2021/11/01 05:07:16 thorpej Exp $ */
+/* $NetBSD: linux_signal.c,v 1.89 2023/08/18 19:41:19 christos Exp $ */
/*-
* Copyright (c) 1995, 1998 The NetBSD Foundation, Inc.
@@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.88 2021/11/01 05:07:16 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_signal.c,v 1.89 2023/08/18 19:41:19 christos Exp $");
#define COMPAT_LINUX 1
@@ -845,7 +845,7 @@ native_to_linux_si_status(int code, int
sts = LINUX_SIGCONT;
break;
case CLD_EXITED:
- sts = WEXITSTATUS(status);
+ sts = status;
break;
case CLD_STOPPED:
case CLD_TRAPPED:
Index: src/sys/compat/linux32/common/linux32_wait.c
diff -u src/sys/compat/linux32/common/linux32_wait.c:1.12 src/sys/compat/linux32/common/linux32_wait.c:1.13
--- src/sys/compat/linux32/common/linux32_wait.c:1.12 Thu Nov 10 12:00:51 2016
+++ src/sys/compat/linux32/common/linux32_wait.c Fri Aug 18 15:41:20 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_wait.c,v 1.12 2016/11/10 17:00:51 christos Exp $ */
+/* $NetBSD: linux32_wait.c,v 1.13 2023/08/18 19:41:20 christos Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -33,7 +33,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_wait.c,v 1.12 2016/11/10 17:00:51 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_wait.c,v 1.13 2023/08/18 19:41:20 christos Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -109,13 +109,13 @@ linux32_sys_wait4(struct lwp *l, const s
return EINVAL;
options = 0;
- if (linux_options & LINUX_WAIT4_WNOHANG)
+ if (linux_options & LINUX_WNOHANG)
options |= WNOHANG;
- if (linux_options & LINUX_WAIT4_WUNTRACED)
+ if (linux_options & LINUX_WUNTRACED)
options |= WUNTRACED;
- if (linux_options & LINUX_WAIT4_WALL)
+ if (linux_options & LINUX_WALL)
options |= WALLSIG;
- if (linux_options & LINUX_WAIT4_WCLONE)
+ if (linux_options & LINUX_WCLONE)
options |= WALTSIG;
pid = SCARG(uap, pid);