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