diff options
| author | rin <rin@NetBSD.org> | 2019-11-18 10:14:52 +0000 |
|---|---|---|
| committer | rin <rin@NetBSD.org> | 2019-11-18 10:14:52 +0000 |
| commit | d1741eaef8f7be30fba33e97ca8a78d7640b596b (patch) | |
| tree | b51c711ae903baff9aefdfc81a7945f1e0669904 /sys/compat | |
| parent | 8ce83b06da92a6d777d537a4d16fdc62e0dd2482 (diff) | |
Provide _ptrace_state for SIGTRAP with TRAP_EXEC, TRAP_CHLD, or TRAP_LWP.
Pointed out by kamil. Thanks!
XXX
pullup to netbsd-9
Diffstat (limited to 'sys/compat')
| -rw-r--r-- | sys/compat/netbsd32/netbsd32_signal.c | 80 |
1 files changed, 58 insertions, 22 deletions
diff --git a/sys/compat/netbsd32/netbsd32_signal.c b/sys/compat/netbsd32/netbsd32_signal.c index a6476eacb17..346dc6c769c 100644 --- a/sys/compat/netbsd32/netbsd32_signal.c +++ b/sys/compat/netbsd32/netbsd32_signal.c @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_signal.c,v 1.47 2019/11/18 04:58:42 rin Exp $ */ +/* $NetBSD: netbsd32_signal.c,v 1.48 2019/11/18 10:14:52 rin Exp $ */ /* * Copyright (c) 1998, 2001 Matthew R. Green @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.47 2019/11/18 04:58:42 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.48 2019/11/18 10:14:52 rin Exp $"); #if defined(_KERNEL_OPT) #include "opt_ktrace.h" @@ -206,17 +206,35 @@ fill_fault: si->_reason._fault._trap = si32->_reason._fault._trap; break; case SIGTRAP: - if (si32->_code != TRAP_SCE && si32->_code != TRAP_SCX) + switch (si32->_code) { + case TRAP_EXEC: + case TRAP_CHLD: + case TRAP_LWP: + si->_reason._ptrace_state._pe_report_event = + si32->_reason._ptrace_state._pe_report_event; +CTASSERT(sizeof(si->_reason._ptrace_state._option._pe_other_pid) == + sizeof(si->_reason._ptrace_state._option._pe_lwp)); + si->_reason._ptrace_state._option._pe_other_pid = + si32->_reason._ptrace_state._option._pe_other_pid; + break; + case TRAP_SCE: + case TRAP_SCX: + si->_reason._syscall._sysnum = + si32->_reason._syscall._sysnum; + si->_reason._syscall._retval[0] = + si32->_reason._syscall._retval[0]; + si->_reason._syscall._retval[1] = + si32->_reason._syscall._retval[1]; + si->_reason._syscall._error = + si32->_reason._syscall._error; + for (i = 0; + i < __arraycount(si->_reason._syscall._args); i++) + si->_reason._syscall._args[i] = + si32->_reason._syscall._args[i]; + break; + default: goto fill_fault; - si->_reason._syscall._sysnum = si32->_reason._syscall._sysnum; - si->_reason._syscall._retval[0] = - si32->_reason._syscall._retval[0]; - si->_reason._syscall._retval[1] = - si32->_reason._syscall._retval[1]; - si->_reason._syscall._error = si32->_reason._syscall._error; - for (i = 0; i < __arraycount(si->_reason._syscall._args); i++) - si->_reason._syscall._args[i] = - si32->_reason._syscall._args[i]; + } break; case SIGALRM: case SIGVTALRM: @@ -271,17 +289,35 @@ fill_fault: si32->_reason._fault._trap = si->_reason._fault._trap; break; case SIGTRAP: - if (si->_code != TRAP_SCE && si->_code != TRAP_SCX) + switch (si->_code) { + case TRAP_EXEC: + case TRAP_CHLD: + case TRAP_LWP: + si32->_reason._ptrace_state._pe_report_event = + si->_reason._ptrace_state._pe_report_event; +CTASSERT(sizeof(si32->_reason._ptrace_state._option._pe_other_pid) == + sizeof(si32->_reason._ptrace_state._option._pe_lwp)); + si32->_reason._ptrace_state._option._pe_other_pid = + si->_reason._ptrace_state._option._pe_other_pid; + break; + case TRAP_SCE: + case TRAP_SCX: + si32->_reason._syscall._sysnum = + si->_reason._syscall._sysnum; + si32->_reason._syscall._retval[0] = + si->_reason._syscall._retval[0]; + si32->_reason._syscall._retval[1] = + si->_reason._syscall._retval[1]; + si32->_reason._syscall._error = + si->_reason._syscall._error; + for (i = 0; + i < __arraycount(si->_reason._syscall._args); i++) + si32->_reason._syscall._args[i] = + si->_reason._syscall._args[i]; + break; + default: goto fill_fault; - si32->_reason._syscall._sysnum = si->_reason._syscall._sysnum; - si32->_reason._syscall._retval[0] = - si->_reason._syscall._retval[0]; - si32->_reason._syscall._retval[1] = - si->_reason._syscall._retval[1]; - si32->_reason._syscall._error = si->_reason._syscall._error; - for (i = 0; i < __arraycount(si32->_reason._syscall._args); i++) - si32->_reason._syscall._args[i] = - si->_reason._syscall._args[i]; + } break; case SIGALRM: case SIGVTALRM: |
