Module Name: src
Committed By: kamil
Date: Tue May 1 13:48:38 UTC 2018
Modified Files:
src/sys/kern: kern_sig.c
Log Message:
Improve the proc_stoptrace() function
proc_stoptrace() is dedicated for emitting a syscall trap for a debugger,
either on entry or exit of the system function routine.
Changes:
- Change an if() branch of an invalid condition of being traced by
initproc (PID1) to KASSERT(9).
- Assert that the current process has set appropriate flags (PSL_TRACED
and PSL_SYSCALL).
- Use ktrpoint(KTR_PSIG) and ktrpsig()/e_ktrpsig() in order to register
the emitted signal for the ktrace(1) event debugging.
Example of the new output from kdump(1) for the syscall debugger traps,
containing SIGTRAP notification with TRAP_SCE and TRAP_SCX (around
the getpid(2) call).
$ kdump /tmp/1.dat.qemu |grep 663
588 1 t_ptrace_waitpid RET fork 663/0x297
663 1 t_ptrace_waitpid EMUL "netbsd"
663 1 t_ptrace_waitpid RET fork 0
663 1 t_ptrace_waitpid CALL ptrace(PT_TRACE_ME,0,0,0)
663 1 t_ptrace_waitpid RET ptrace 0
663 1 t_ptrace_waitpid CALL _lwp_self
663 1 t_ptrace_waitpid RET _lwp_self 1
663 1 t_ptrace_waitpid CALL _lwp_kill(1,0x11)
663 1 t_ptrace_waitpid RET _lwp_kill 0
588 1 t_ptrace_waitpid RET __wait450 663/0x297
663 1 t_ptrace_waitpid CALL getpid
588 1 t_ptrace_waitpid RET __wait450 663/0x297
663 1 t_ptrace_waitpid PSIG SIGTRAP SIG_DFL: code=TRAP_SCE, addr=0x0,
trap=0)
663 1 t_ptrace_waitpid RET getpid 663/0x297, 588/0x24c
588 1 t_ptrace_waitpid RET __wait450 663/0x297
663 1 t_ptrace_waitpid PSIG SIGTRAP SIG_DFL: code=TRAP_SCX, addr=0x0,
trap=0)
663 1 t_ptrace_waitpid CALL exit(5)
588 1 t_ptrace_waitpid RET __wait450 663/0x297
Sponsored by <The NetBSD Foundation>
To generate a diff of this commit:
cvs rdiff -u -r1.340 -r1.341 src/sys/kern/kern_sig.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/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.340 src/sys/kern/kern_sig.c:1.341
--- src/sys/kern/kern_sig.c:1.340 Tue Apr 24 18:34:46 2018
+++ src/sys/kern/kern_sig.c Tue May 1 13:48:38 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_sig.c,v 1.340 2018/04/24 18:34:46 kamil Exp $ */
+/* $NetBSD: kern_sig.c,v 1.341 2018/05/01 13:48:38 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.340 2018/04/24 18:34:46 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.341 2018/05/01 13:48:38 kamil Exp $");
#include "opt_ptrace.h"
#include "opt_dtrace.h"
@@ -2268,21 +2268,45 @@ void
proc_stoptrace(int trapno)
{
struct lwp *l = curlwp;
- struct proc *p = l->l_proc, *pp;
+ struct proc *p = l->l_proc;
+ struct sigacts *ps;
+ sigset_t *mask;
+ sig_t action;
+ ksiginfo_t ksi;
+ const int signo = SIGTRAP;
+
+ KASSERT((trapno == TRAP_SCE) || (trapno == TRAP_SCX));
+
+ KSI_INIT_TRAP(&ksi);
+ ksi.ksi_lid = l->l_lid;
+ ksi.ksi_info._signo = signo;
+ ksi.ksi_info._code = trapno;
mutex_enter(p->p_lock);
- pp = p->p_pptr;
- if (pp->p_pid == 1) {
- CLR(p->p_slflag, PSL_SYSCALL); /* XXXSMP */
- mutex_exit(p->p_lock);
- return;
- }
- p->p_xsig = SIGTRAP;
- p->p_sigctx.ps_info._signo = p->p_xsig;
- p->p_sigctx.ps_info._code = trapno;
- sigswitch(0, p->p_xsig);
+ /* Needed for ktrace */
+ ps = p->p_sigacts;
+ 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;
+ sigswitch(0, signo);
mutex_exit(p->p_lock);
+
+ if (ktrpoint(KTR_PSIG)) {
+ if (p->p_emul->e_ktrpsig)
+ p->p_emul->e_ktrpsig(signo, action, mask, &ksi);
+ else
+ ktrpsig(signo, action, mask, &ksi);
+ }
}
static int