Index: kern/core_elf32.c =================================================================== RCS file: /cvsroot/src/sys/kern/core_elf32.c,v retrieving revision 1.49 diff -u -r1.49 core_elf32.c --- kern/core_elf32.c 29 Sep 2016 20:40:53 -0000 1.49 +++ kern/core_elf32.c 27 Dec 2016 06:34:29 -0000 @@ -357,8 +357,8 @@ /* First, write an elfcore_procinfo. */ cpi.cpi_version = NETBSD_ELFCORE_PROCINFO_VERSION; cpi.cpi_cpisize = sizeof(cpi); - cpi.cpi_signo = p->p_sigctx.ps_signo; - cpi.cpi_sigcode = p->p_sigctx.ps_code; + cpi.cpi_signo = p->p_sigctx.ps_info._signo; + cpi.cpi_sigcode = p->p_sigctx.ps_info._code; cpi.cpi_siglwp = p->p_sigctx.ps_lwp; /* Index: kern/core_netbsd.c =================================================================== RCS file: /cvsroot/src/sys/kern/core_netbsd.c,v retrieving revision 1.22 diff -u -r1.22 core_netbsd.c --- kern/core_netbsd.c 7 Jan 2014 07:59:03 -0000 1.22 +++ kern/core_netbsd.c 27 Dec 2016 06:34:29 -0000 @@ -88,8 +88,8 @@ cs.core.c_midmag = 0; strncpy(cs.core.c_name, p->p_comm, MAXCOMLEN); cs.core.c_nseg = 0; - cs.core.c_signo = p->p_sigctx.ps_signo; - cs.core.c_ucode = p->p_sigctx.ps_code; + cs.core.c_signo = p->p_sigctx.ps_info._signo; + cs.core.c_ucode = p->p_sigctx.ps_info._code; cs.core.c_cpusize = 0; cs.core.c_tsize = (u_long)ctob(vm->vm_tsize); cs.core.c_dsize = (u_long)ctob(vm->vm_dsize); Index: kern/kern_sig.c =================================================================== RCS file: /cvsroot/src/sys/kern/kern_sig.c,v retrieving revision 1.331 diff -u -r1.331 kern_sig.c --- kern/kern_sig.c 4 Dec 2016 16:40:43 -0000 1.331 +++ kern/kern_sig.c 27 Dec 2016 06:34:29 -0000 @@ -1240,8 +1240,7 @@ /* XXX for core dump/debugger */ p->p_sigctx.ps_lwp = ksi->ksi_lid; - p->p_sigctx.ps_signo = ksi->ksi_signo; - p->p_sigctx.ps_code = ksi->ksi_trap; + p->p_sigctx.ps_info = ksi->ksi_info; /* * Notify any interested parties of the signal. @@ -1947,8 +1946,7 @@ KASSERT(mutex_owned(p->p_lock)); p->p_sigctx.ps_lwp = 0; - p->p_sigctx.ps_code = 0; - p->p_sigctx.ps_signo = 0; + memset(&p->p_sigctx.ps_info, 0, sizeof(p->p_sigctx.ps_info)); mutex_enter(&ps->sa_mutex); sigplusset(&SIGACTION_PS(ps, signo).sa_mask, &l->l_sigmask); @@ -1989,6 +1987,7 @@ int exitsig, error, docore; struct proc *p; struct lwp *t; + ksiginfo_t ksi; p = l->l_proc; @@ -2053,7 +2052,9 @@ exitsig = signo; p->p_acflag |= AXSIG; - p->p_sigctx.ps_signo = signo; + if (!siggetinfo(&l->l_sigpend, &ksi, signo)) + (void)siggetinfo(&p->p_sigpend, &ksi, signo); + p->p_sigctx.ps_info = ksi.ksi_info; if (docore) { mutex_exit(p->p_lock); Index: kern/sys_ptrace_common.c =================================================================== RCS file: /cvsroot/src/sys/kern/sys_ptrace_common.c,v retrieving revision 1.7 diff -u -r1.7 sys_ptrace_common.c --- kern/sys_ptrace_common.c 15 Dec 2016 12:04:18 -0000 1.7 +++ kern/sys_ptrace_common.c 27 Dec 2016 06:34:29 -0000 @@ -901,6 +901,7 @@ lt = LIST_NEXT(lt, l_sibling); pl.pl_lwpid = 0; pl.pl_event = 0; + memset(&pl.pl_siginfo, 0, sizeof(pl.pl_siginfo)); if (lt) { lwp_addref(lt); pl.pl_lwpid = lt->l_lid; @@ -911,8 +912,10 @@ * check ps_signo too. */ if (lt->l_lid == t->p_sigctx.ps_lwp - || (t->p_sigctx.ps_lwp == 0 && t->p_sigctx.ps_signo)) + || (t->p_sigctx.ps_lwp == 0 && t->p_sigctx.ps_info._signo)) { pl.pl_event = PL_EVENT_SIGNAL; + pl.pl_siginfo._info = t->p_sigctx.ps_info; + } } mutex_exit(t->p_lock); Index: sys/ptrace.h =================================================================== RCS file: /cvsroot/src/sys/sys/ptrace.h,v retrieving revision 1.51 diff -u -r1.51 ptrace.h --- sys/ptrace.h 15 Dec 2016 20:04:36 -0000 1.51 +++ sys/ptrace.h 27 Dec 2016 06:34:29 -0000 @@ -110,8 +110,9 @@ * Argument structure for PT_LWPINFO. */ struct ptrace_lwpinfo { - lwpid_t pl_lwpid; /* LWP described */ - int pl_event; /* Event that stopped the LWP */ + lwpid_t pl_lwpid; /* LWP described */ + int pl_event; /* Event that stopped the LWP */ + siginfo_t pl_siginfo; /* siginfo for signal event */ /* Add fields at the end */ }; Index: sys/signalvar.h =================================================================== RCS file: /cvsroot/src/sys/sys/signalvar.h,v retrieving revision 1.87 diff -u -r1.87 signalvar.h --- sys/signalvar.h 4 Aug 2016 06:43:43 -0000 1.87 +++ sys/signalvar.h 27 Dec 2016 06:34:29 -0000 @@ -74,12 +74,11 @@ * Process signal state. */ struct sigctx { - int ps_signo; /* for core dump/debugger XXX */ - int ps_code; /* for core dump/debugger XXX */ - int ps_lwp; /* for core dump/debugger XXX */ + struct _ksiginfo ps_info; /* for core dump/debugger XXX */ + int ps_lwp; /* for core dump/debugger XXX */ void *ps_sigcode; /* address of signal trampoline */ - sigset_t ps_sigignore; /* Signals being ignored. */ - sigset_t ps_sigcatch; /* Signals being caught by user. */ + sigset_t ps_sigignore; /* Signals being ignored. */ + sigset_t ps_sigcatch; /* Signals being caught by user. */ }; /* additional signal action values, used only temporarily/internally */