Module Name: src Committed By: kamil Date: Mon May 6 08:05:03 UTC 2019
Modified Files: src/sys/kern: kern_sig.c kern_syscall.c src/sys/sys: ptrace.h siginfo.h Log Message: Ship with syscall information with SIGTRAP TRAP_SCE/TRAP_SCX for tracers Expand siginfo_t (struct size not changed) to new values for SIGTRAP TRAP_SCE/TRAP_SCX events. - si_sysnum -- syscall number (int) - si_retval -- return value (2 x int) - si_error -- error code (int) - si_args -- syscall arguments (8 x uint64_t) TRAP_SCE delivers si_sysnum and si_args. TRAP_SCX delivers si_sysnum, si_retval, si_error and si_args. Users: debuggers (like GDB) and syscall tracers (like strace, truss). This MI interface is similar to the Linux kernel proposal of PTRACE_GET_SYSCALL_INFO by the strace developer team. To generate a diff of this commit: cvs rdiff -u -r1.357 -r1.358 src/sys/kern/kern_sig.c cvs rdiff -u -r1.17 -r1.18 src/sys/kern/kern_syscall.c cvs rdiff -u -r1.63 -r1.64 src/sys/sys/ptrace.h cvs rdiff -u -r1.32 -r1.33 src/sys/sys/siginfo.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/kern_sig.c diff -u src/sys/kern/kern_sig.c:1.357 src/sys/kern/kern_sig.c:1.358 --- src/sys/kern/kern_sig.c:1.357 Fri May 3 22:34:21 2019 +++ src/sys/kern/kern_sig.c Mon May 6 08:05:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_sig.c,v 1.357 2019/05/03 22:34:21 kamil Exp $ */ +/* $NetBSD: kern_sig.c,v 1.358 2019/05/06 08:05:03 kamil Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.357 2019/05/03 22:34:21 kamil Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.358 2019/05/06 08:05:03 kamil Exp $"); #include "opt_ptrace.h" #include "opt_dtrace.h" @@ -2352,7 +2352,8 @@ proc_unstop(struct proc *p) } void -proc_stoptrace(int trapno) +proc_stoptrace(int trapno, int sysnum, const register_t args[], + const register_t *ret, int error) { struct lwp *l = curlwp; struct proc *p = l->l_proc; @@ -2360,14 +2361,36 @@ proc_stoptrace(int trapno) sigset_t *mask; sig_t action; ksiginfo_t ksi; + size_t i, sy_narg; const int signo = SIGTRAP; KASSERT((trapno == TRAP_SCE) || (trapno == TRAP_SCX)); + KASSERT(p->p_pptr != initproc); + KASSERT(ISSET(p->p_slflag, PSL_TRACED)); + KASSERT(ISSET(p->p_slflag, PSL_SYSCALL)); + + sy_narg = p->p_emul->e_sysent[sysnum].sy_narg; KSI_INIT_TRAP(&ksi); ksi.ksi_lid = l->l_lid; - ksi.ksi_info._signo = signo; - ksi.ksi_info._code = trapno; + ksi.ksi_signo = signo; + ksi.ksi_code = trapno; + + ksi.ksi_sysnum = sysnum; + if (trapno == TRAP_SCE) { + ksi.ksi_retval[0] = 0; + ksi.ksi_retval[1] = 0; + ksi.ksi_error = 0; + } else { + ksi.ksi_retval[0] = ret[0]; + ksi.ksi_retval[1] = ret[1]; + ksi.ksi_error = error; + } + + memset(ksi.ksi_args, 0, sizeof(ksi.ksi_args)); + + for (i = 0; i < sy_narg; i++) + ksi.ksi_args[i] = args[i]; mutex_enter(p->p_lock); @@ -2385,12 +2408,6 @@ proc_stoptrace(int trapno) action = SIGACTION_PS(ps, signo).sa_handler; mask = &l->l_sigmask; - /* initproc (PID1) cannot became a debugger */ - KASSERT(p->p_pptr != initproc); - - KASSERT(ISSET(p->p_slflag, PSL_TRACED)); - KASSERT(ISSET(p->p_slflag, PSL_SYSCALL)); - p->p_xsig = signo; p->p_sigctx.ps_lwp = ksi.ksi_lid; p->p_sigctx.ps_info = ksi.ksi_info; Index: src/sys/kern/kern_syscall.c diff -u src/sys/kern/kern_syscall.c:1.17 src/sys/kern/kern_syscall.c:1.18 --- src/sys/kern/kern_syscall.c:1.17 Fri Aug 10 21:44:59 2018 +++ src/sys/kern/kern_syscall.c Mon May 6 08:05:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_syscall.c,v 1.17 2018/08/10 21:44:59 pgoyette Exp $ */ +/* $NetBSD: kern_syscall.c,v 1.18 2019/05/06 08:05:03 kamil Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_syscall.c,v 1.17 2018/08/10 21:44:59 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_syscall.c,v 1.18 2019/05/06 08:05:03 kamil Exp $"); #ifdef _KERNEL_OPT #include "opt_modular.h" @@ -255,7 +255,7 @@ trace_enter(register_t code, const struc #ifdef PTRACE if ((curlwp->l_proc->p_slflag & (PSL_SYSCALL|PSL_TRACED)) == (PSL_SYSCALL|PSL_TRACED)) { - proc_stoptrace(TRAP_SCE); + proc_stoptrace(TRAP_SCE, code, args, NULL, 0); if (curlwp->l_proc->p_slflag & PSL_SYSCALLEMU) { /* tracer will emulate syscall for us */ error = EJUSTRETURN; @@ -296,7 +296,7 @@ trace_exit(register_t code, const struct #ifdef PTRACE if ((p->p_slflag & (PSL_SYSCALL|PSL_TRACED|PSL_SYSCALLEMU)) == (PSL_SYSCALL|PSL_TRACED)) { - proc_stoptrace(TRAP_SCX); + proc_stoptrace(TRAP_SCX, code, args, rval, error); } CLR(p->p_slflag, PSL_SYSCALLEMU); #endif Index: src/sys/sys/ptrace.h diff -u src/sys/sys/ptrace.h:1.63 src/sys/sys/ptrace.h:1.64 --- src/sys/sys/ptrace.h:1.63 Mon Mar 5 11:24:34 2018 +++ src/sys/sys/ptrace.h Mon May 6 08:05:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ptrace.h,v 1.63 2018/03/05 11:24:34 kamil Exp $ */ +/* $NetBSD: ptrace.h,v 1.64 2019/05/06 08:05:03 kamil Exp $ */ /*- * Copyright (c) 1984, 1993 @@ -206,7 +206,7 @@ int process_validdbregs(struct lwp *); int process_domem(struct lwp *, struct lwp *, struct uio *); -void proc_stoptrace(int); +void proc_stoptrace(int, int, const register_t[], const register_t *, int); void proc_reparent(struct proc *, struct proc *); void proc_changeparent(struct proc *, struct proc *); Index: src/sys/sys/siginfo.h diff -u src/sys/sys/siginfo.h:1.32 src/sys/sys/siginfo.h:1.33 --- src/sys/sys/siginfo.h:1.32 Wed Mar 1 00:19:22 2017 +++ src/sys/sys/siginfo.h Mon May 6 08:05:03 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: siginfo.h,v 1.32 2017/03/01 00:19:22 kamil Exp $ */ +/* $NetBSD: siginfo.h,v 1.33 2019/05/06 08:05:03 kamil Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -77,6 +77,13 @@ struct _ksiginfo { long _band; int _fd; } _poll; + + struct { + int _sysnum; + int _retval[2]; + int _error; + uint64_t _args[8]; /* SYS_MAXSYSARGS */ + } _syscall; } _reason; }; @@ -155,6 +162,11 @@ typedef union siginfo { #define si_band _info._reason._poll._band #define si_fd _info._reason._poll._fd +#define si_sysnum _info._reason._syscall._sysnum +#define si_retval _info._reason._syscall._retval +#define si_error _info._reason._syscall._error +#define si_args _info._reason._syscall._args + #ifdef _KERNEL /** Field access macros */ #define ksi_signo ksi_info._signo @@ -175,6 +187,11 @@ typedef union siginfo { #define ksi_band ksi_info._reason._poll._band #define ksi_fd ksi_info._reason._poll._fd + +#define ksi_sysnum ksi_info._reason._syscall._sysnum +#define ksi_retval ksi_info._reason._syscall._retval +#define ksi_error ksi_info._reason._syscall._error +#define ksi_args ksi_info._reason._syscall._args #endif /* _KERNEL */ /** si_code */