Module Name: src Committed By: martin Date: Tue Nov 19 13:33:21 UTC 2019
Modified Files: src/sys/compat/netbsd32 [netbsd-9]: netbsd32_signal.c Log Message: Pull up following revision(s) (requested by rin in ticket #456): sys/compat/netbsd32/netbsd32_signal.c: revision 1.46 sys/compat/netbsd32/netbsd32_signal.c: revision 1.47 sys/compat/netbsd32/netbsd32_signal.c: revision 1.48 sys/compat/netbsd32/netbsd32_signal.c: revision 1.49 sys/compat/netbsd32/netbsd32_signal.c: revision 1.50 Belatedly catch up with kern_sig.c rev 1.358: Provide syscall information with SIGTRAP TRAP_SCE/TRAP_SCX so that picotrace/truss, for example, works fine on COMPAT_NETBSD32. With some minor changes: - Centralize netbsd32_si{,32}_si{32,}() into netbsd32_ksi{,32}_ksi{32,}(). - Provide si_status with SIGCHLD. - Remove the remaining of SA. Sort by signal numbers as far as possible, adjust locations of functions. No functional changes intended. XXX pullup to netbsd-9 Provide _ptrace_state for SIGTRAP with TRAP_EXEC, TRAP_CHLD, or TRAP_LWP. Pointed out by kamil. Thanks! XXX pullup to netbsd-9 When converting siginfo, examine si_code at the beginning, as explained in siginfo(2). - If it is SI_NOINFO, there's no additional information. - If it is non-positive, i.e., codes described in siginfo(2), we need to fill in _rt. XXX Description for SA_ASYNCIO in siginfo(2) seems outdated; neither si_fd nor si_band are filled in with that code. XXX pullup to netbsd-9 TRAP_EXEC does not have extra fields to be filled in at the moment. Explicitly ignore fields for now. Pointed out by kamil. Thanks! XXX pullup to netbsd-9 To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.45.8.1 src/sys/compat/netbsd32/netbsd32_signal.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/compat/netbsd32/netbsd32_signal.c diff -u src/sys/compat/netbsd32/netbsd32_signal.c:1.45 src/sys/compat/netbsd32/netbsd32_signal.c:1.45.8.1 --- src/sys/compat/netbsd32/netbsd32_signal.c:1.45 Sun Dec 17 20:59:27 2017 +++ src/sys/compat/netbsd32/netbsd32_signal.c Tue Nov 19 13:33:21 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_signal.c,v 1.45 2017/12/17 20:59:27 christos Exp $ */ +/* $NetBSD: netbsd32_signal.c,v 1.45.8.1 2019/11/19 13:33:21 martin 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.45 2017/12/17 20:59:27 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.45.8.1 2019/11/19 13:33:21 martin Exp $"); #if defined(_KERNEL_OPT) #include "opt_ktrace.h" @@ -188,173 +188,181 @@ netbsd32___sigaction_sigtramp(struct lwp void netbsd32_ksi32_to_ksi(struct _ksiginfo *si, const struct __ksiginfo32 *si32) { + size_t i; + memset(si, 0, sizeof (*si)); si->_signo = si32->_signo; si->_code = si32->_code; si->_errno = si32->_errno; + if (si32->_code == SI_NOINFO) + return; + else if (si32->_code <= 0) /* codes described in siginfo(2) */ + goto fill_rt; + switch (si32->_signo) { case SIGILL: + case SIGFPE: case SIGBUS: case SIGSEGV: - case SIGFPE: - case SIGTRAP: +fill_fault: si->_reason._fault._addr = NETBSD32IPTR64(si32->_reason._fault._addr); si->_reason._fault._trap = si32->_reason._fault._trap; break; + case SIGTRAP: + switch (si32->_code) { + case TRAP_EXEC: + break; + 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; + } + break; case SIGALRM: case SIGVTALRM: case SIGPROF: default: /* see sigqueue() and kill1() */ +fill_rt: si->_reason._rt._pid = si32->_reason._rt._pid; si->_reason._rt._uid = si32->_reason._rt._uid; si->_reason._rt._value.sival_int = si32->_reason._rt._value.sival_int; break; + case SIGURG: + case SIGIO: + si->_reason._poll._band = si32->_reason._poll._band; + si->_reason._poll._fd = si32->_reason._poll._fd; + break; case SIGCHLD: si->_reason._child._pid = si32->_reason._child._pid; si->_reason._child._uid = si32->_reason._child._uid; + si->_reason._child._status = si32->_reason._child._status; si->_reason._child._utime = si32->_reason._child._utime; si->_reason._child._stime = si32->_reason._child._stime; break; - case SIGURG: - case SIGIO: - si->_reason._poll._band = si32->_reason._poll._band; - si->_reason._poll._fd = si32->_reason._poll._fd; - break; } } -#ifdef notyet -#ifdef KTRACE +void +netbsd32_si32_to_si(siginfo_t *si, const siginfo32_t *si32) +{ + + memset(si, 0, sizeof (*si)); + netbsd32_ksi32_to_ksi(&si->_info, &si32->_info); +} + static void netbsd32_ksi_to_ksi32(struct __ksiginfo32 *si32, const struct _ksiginfo *si) { + size_t i; + memset(si32, 0, sizeof (*si32)); si32->_signo = si->_signo; si32->_code = si->_code; si32->_errno = si->_errno; + if (si->_code == SI_NOINFO) + return; + else if (si->_code <= 0) /* codes described in siginfo(2) */ + goto fill_rt; + switch (si->_signo) { case SIGILL: + case SIGFPE: case SIGBUS: case SIGSEGV: - case SIGFPE: - case SIGTRAP: +fill_fault: si32->_reason._fault._addr = NETBSD32PTR32I(si->_reason._fault._addr); si32->_reason._fault._trap = si->_reason._fault._trap; break; + case SIGTRAP: + switch (si->_code) { + case TRAP_EXEC: + break; + 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; + } + break; case SIGALRM: case SIGVTALRM: case SIGPROF: default: /* see sigqueue() and kill1() */ +fill_rt: si32->_reason._rt._pid = si->_reason._rt._pid; si32->_reason._rt._uid = si->_reason._rt._uid; si32->_reason._rt._value.sival_int = si->_reason._rt._value.sival_int; break; + case SIGURG: + case SIGIO: + si32->_reason._poll._band = si->_reason._poll._band; + si32->_reason._poll._fd = si->_reason._poll._fd; + break; case SIGCHLD: si32->_reason._child._pid = si->_reason._child._pid; si32->_reason._child._uid = si->_reason._child._uid; + si32->_reason._child._status = si->_reason._child._status; si32->_reason._child._utime = si->_reason._child._utime; si32->_reason._child._stime = si->_reason._child._stime; break; - case SIGURG: - case SIGIO: - si32->_reason._poll._band = si->_reason._poll._band; - si32->_reason._poll._fd = si->_reason._poll._fd; - break; } } -#endif -#endif void netbsd32_si_to_si32(siginfo32_t *si32, const siginfo_t *si) { - memset(si32, 0, sizeof (*si32)); - si32->si_signo = si->si_signo; - si32->si_code = si->si_code; - si32->si_errno = si->si_errno; - - switch (si32->si_signo) { - case 0: /* SA */ - si32->si_value.sival_int = si->si_value.sival_int; - break; - case SIGILL: - case SIGBUS: - case SIGSEGV: - case SIGFPE: - case SIGTRAP: - si32->si_addr = (uint32_t)(uintptr_t)si->si_addr; - si32->si_trap = si->si_trap; - break; - case SIGALRM: - case SIGVTALRM: - case SIGPROF: - default: - si32->si_pid = si->si_pid; - si32->si_uid = si->si_uid; - si32->si_value.sival_int = si->si_value.sival_int; - break; - case SIGCHLD: - si32->si_pid = si->si_pid; - si32->si_uid = si->si_uid; - si32->si_status = si->si_status; - si32->si_utime = si->si_utime; - si32->si_stime = si->si_stime; - break; - case SIGURG: - case SIGIO: - si32->si_band = si->si_band; - si32->si_fd = si->si_fd; - break; - } -} -void -netbsd32_si32_to_si(siginfo_t *si, const siginfo32_t *si32) -{ - memset(si, 0, sizeof (*si)); - si->si_signo = si32->si_signo; - si->si_code = si32->si_code; - si->si_errno = si32->si_errno; - - switch (si->si_signo) { - case 0: /* SA */ - si->si_value.sival_int = si32->si_value.sival_int; - break; - case SIGILL: - case SIGBUS: - case SIGSEGV: - case SIGFPE: - case SIGTRAP: - si->si_addr = (void *)(uintptr_t)si32->si_addr; - si->si_trap = si32->si_trap; - break; - case SIGALRM: - case SIGVTALRM: - case SIGPROF: - default: - si->si_pid = si32->si_pid; - si->si_uid = si32->si_uid; - si->si_value.sival_int = si32->si_value.sival_int; - break; - case SIGCHLD: - si->si_pid = si32->si_pid; - si->si_uid = si32->si_uid; - si->si_status = si32->si_status; - si->si_utime = si32->si_utime; - si->si_stime = si32->si_stime; - break; - case SIGURG: - case SIGIO: - si->si_band = si32->si_band; - si->si_fd = si32->si_fd; - break; - } + memset(si32, 0, sizeof (*si32)); + netbsd32_ksi_to_ksi32(&si32->_info, &si->_info); } void