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