Module Name: src Committed By: rin Date: Mon Nov 18 04:09:53 UTC 2019
Modified Files: src/sys/compat/netbsd32: netbsd32.h netbsd32_conv.h netbsd32_ioctl.c netbsd32_ioctl.h netbsd32_signal.c Log Message: Belatedly catch up with kern_sig.c rev 1.358: http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/kern/kern_sig.c#rev1.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. XXX pullup to netbsd-9 To generate a diff of this commit: cvs rdiff -u -r1.128 -r1.129 src/sys/compat/netbsd32/netbsd32.h cvs rdiff -u -r1.40 -r1.41 src/sys/compat/netbsd32/netbsd32_conv.h cvs rdiff -u -r1.104 -r1.105 src/sys/compat/netbsd32/netbsd32_ioctl.c cvs rdiff -u -r1.68 -r1.69 src/sys/compat/netbsd32/netbsd32_ioctl.h cvs rdiff -u -r1.45 -r1.46 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.h diff -u src/sys/compat/netbsd32/netbsd32.h:1.128 src/sys/compat/netbsd32/netbsd32.h:1.129 --- src/sys/compat/netbsd32/netbsd32.h:1.128 Thu Nov 7 15:21:55 2019 +++ src/sys/compat/netbsd32/netbsd32.h Mon Nov 18 04:09:53 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32.h,v 1.128 2019/11/07 15:21:55 rin Exp $ */ +/* $NetBSD: netbsd32.h,v 1.129 2019/11/18 04:09:53 rin Exp $ */ /* * Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green @@ -37,6 +37,7 @@ */ #include <sys/param.h> /* precautionary upon removal from ucred.h */ +#include <sys/types.h> #include <sys/systm.h> #include <sys/mount.h> #include <sys/stat.h> @@ -72,7 +73,11 @@ typedef int32_t netbsd32_key_t; typedef int32_t netbsd32_intptr_t; typedef uint32_t netbsd32_uintptr_t; -/* netbsd32_[u]int64 are machine dependent and defined below */ +/* + * netbsd32_[u]int64 are machine dependent and defined in <sys/types.h>: + * 64 bit integers only have 4-byte alignment on some 32 bit ports, + * but always have 8-byte alignment on 64 bit systems. + */ /* * machine dependant section; must define: @@ -154,15 +159,6 @@ netbsd32_ptr32_incr(netbsd32_pointer_t * #undef NETBSD32_POINTER_TYPE /* - * 64 bit integers only have 4-byte alignment on some 32 bit ports, - * but always have 8-byte alignment on 64 bit systems. - * NETBSD32_INT64_ALIGN may be __attribute__((__aligned__(4))) - */ -typedef int64_t netbsd32_int64 NETBSD32_INT64_ALIGN; -typedef uint64_t netbsd32_uint64 NETBSD32_INT64_ALIGN; -#undef NETBSD32_INT64_ALIGN - -/* * all pointers are netbsd32_pointer_t (defined in <machine/netbsd32_machdep.h>) */ @@ -212,14 +208,13 @@ struct netbsd32_iovec { /* from <sys/time.h> */ typedef int32_t netbsd32_timer_t; -typedef int32_t netbsd32_time50_t; typedef netbsd32_int64 netbsd32_time_t; typedef netbsd32_pointer_t netbsd32_timerp_t; typedef netbsd32_pointer_t netbsd32_clockidp_t; typedef netbsd32_pointer_t netbsd32_timespec50p_t; struct netbsd32_timespec50 { - netbsd32_time50_t tv_sec; /* seconds */ + int32_t tv_sec; /* seconds */ netbsd32_long tv_nsec; /* and nanoseconds */ }; @@ -231,7 +226,7 @@ struct netbsd32_timespec { typedef netbsd32_pointer_t netbsd32_timeval50p_t; struct netbsd32_timeval50 { - netbsd32_time50_t tv_sec; /* seconds */ + netbsd32_long tv_sec; /* seconds */ netbsd32_long tv_usec; /* and microseconds */ }; Index: src/sys/compat/netbsd32/netbsd32_conv.h diff -u src/sys/compat/netbsd32/netbsd32_conv.h:1.40 src/sys/compat/netbsd32/netbsd32_conv.h:1.41 --- src/sys/compat/netbsd32/netbsd32_conv.h:1.40 Thu Oct 3 22:16:53 2019 +++ src/sys/compat/netbsd32/netbsd32_conv.h Mon Nov 18 04:09:53 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_conv.h,v 1.40 2019/10/03 22:16:53 kamil Exp $ */ +/* $NetBSD: netbsd32_conv.h,v 1.41 2019/11/18 04:09:53 rin Exp $ */ /* * Copyright (c) 1998, 2001 Matthew R. Green @@ -58,7 +58,7 @@ netbsd32_from_timeval50(const struct tim struct netbsd32_timeval50 *tv32) { - tv32->tv_sec = (netbsd32_time50_t)tv->tv_sec; + tv32->tv_sec = (netbsd32_long)tv->tv_sec; tv32->tv_usec = (netbsd32_long)tv->tv_usec; } @@ -152,7 +152,7 @@ netbsd32_from_timespec50(const struct ti struct netbsd32_timespec50 *s32p) { - s32p->tv_sec = (netbsd32_time50_t)p->tv_sec; + s32p->tv_sec = (int32_t)p->tv_sec; s32p->tv_nsec = (netbsd32_long)p->tv_nsec; } Index: src/sys/compat/netbsd32/netbsd32_ioctl.c diff -u src/sys/compat/netbsd32/netbsd32_ioctl.c:1.104 src/sys/compat/netbsd32/netbsd32_ioctl.c:1.105 --- src/sys/compat/netbsd32/netbsd32_ioctl.c:1.104 Tue Aug 20 09:32:21 2019 +++ src/sys/compat/netbsd32/netbsd32_ioctl.c Mon Nov 18 04:09:53 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_ioctl.c,v 1.104 2019/08/20 09:32:21 christos Exp $ */ +/* $NetBSD: netbsd32_ioctl.c,v 1.105 2019/11/18 04:09:53 rin Exp $ */ /* * Copyright (c) 1998, 2001 Matthew R. Green @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: netbsd32_ioctl.c,v 1.104 2019/08/20 09:32:21 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_ioctl.c,v 1.105 2019/11/18 04:09:53 rin Exp $"); #if defined(_KERNEL_OPT) #include "opt_ntp.h" @@ -1066,6 +1066,30 @@ netbsd32_do_clockctl_ntp_adjtime(struct } #endif +#ifdef COMPAT_50 +static void +netbsd32_ioctl_to_timeval50( + const struct netbsd32_timeval50 *s32p, + struct timeval50 *p, + u_long cmd) +{ + + p->tv_sec = s32p->tv_sec; + p->tv_usec = s32p->tv_usec; +} + +static void +netbsd32_ioctl_from_timeval50( + const struct timeval50 *p, + struct netbsd32_timeval50 *s32p, + u_long cmd) +{ + + s32p->tv_sec = (netbsd32_long)p->tv_sec; + s32p->tv_usec = (netbsd32_long)p->tv_usec; +} +#endif + /* * main ioctl syscall. * @@ -1403,16 +1427,28 @@ netbsd32_ioctl(struct lwp *l, case BIOCSETF32: IOCTL_STRUCT_CONV_TO(BIOCSETF, bpf_program); +#ifdef COMPAT_50 +#define netbsd32_to_timeval50 netbsd32_ioctl_to_timeval50 +#define netbsd32_from_timeval50 netbsd32_ioctl_from_timeval50 + case BIOCSORTIMEOUT32: + IOCTL_STRUCT_CONV_TO(BIOCSORTIMEOUT, timeval50); + case BIOCGORTIMEOUT32: + IOCTL_STRUCT_CONV_TO(BIOCGORTIMEOUT, timeval50); +#undef netbsd32_to_timeval50 +#undef netbsd32_from_timeval50 +#endif case BIOCSTCPF32: IOCTL_STRUCT_CONV_TO(BIOCSTCPF, bpf_program); case BIOCSUDPF32: IOCTL_STRUCT_CONV_TO(BIOCSUDPF, bpf_program); case BIOCGDLTLIST32: IOCTL_STRUCT_CONV_TO(BIOCGDLTLIST, bpf_dltlist); - case BIOCSRTIMEOUT32: #define netbsd32_to_timeval(s32p, p, cmd) netbsd32_to_timeval(s32p, p) #define netbsd32_from_timeval(p, s32p, cmd) netbsd32_from_timeval(p, s32p) + case BIOCSRTIMEOUT32: IOCTL_STRUCT_CONV_TO(BIOCSRTIMEOUT, timeval); + case BIOCGRTIMEOUT32: + IOCTL_STRUCT_CONV_TO(BIOCGRTIMEOUT, timeval); #undef netbsd32_to_timeval #undef netbsd32_from_timeval Index: src/sys/compat/netbsd32/netbsd32_ioctl.h diff -u src/sys/compat/netbsd32/netbsd32_ioctl.h:1.68 src/sys/compat/netbsd32/netbsd32_ioctl.h:1.69 --- src/sys/compat/netbsd32/netbsd32_ioctl.h:1.68 Tue Aug 20 09:32:21 2019 +++ src/sys/compat/netbsd32/netbsd32_ioctl.h Mon Nov 18 04:09:53 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: netbsd32_ioctl.h,v 1.68 2019/08/20 09:32:21 christos Exp $ */ +/* $NetBSD: netbsd32_ioctl.h,v 1.69 2019/11/18 04:09:53 rin Exp $ */ /* * Copyright (c) 1998, 2001 Matthew R. Green @@ -116,10 +116,15 @@ struct netbsd32_bpf_dltlist { }; #define BIOCSETF32 _IOW('B',103, struct netbsd32_bpf_program) +#ifdef COMPAT_50 +#define BIOCSORTIMEOUT32 _IOW('B',109, struct netbsd32_timeval50) +#define BIOCGORTIMEOUT32 _IOR('B',110, struct netbsd32_timeval50) +#endif #define BIOCSTCPF32 _IOW('B',114, struct netbsd32_bpf_program) #define BIOCSUDPF32 _IOW('B',115, struct netbsd32_bpf_program) #define BIOCGDLTLIST32 _IOWR('B',119, struct netbsd32_bpf_dltlist) #define BIOCSRTIMEOUT32 _IOW('B',122, struct netbsd32_timeval) +#define BIOCGRTIMEOUT32 _IOR('B',123, struct netbsd32_timeval) struct netbsd32_wsdisplay_addscreendata { 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.46 --- src/sys/compat/netbsd32/netbsd32_signal.c:1.45 Sun Dec 17 20:59:27 2017 +++ src/sys/compat/netbsd32/netbsd32_signal.c Mon Nov 18 04:09:53 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.46 2019/11/18 04:09:53 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.45 2017/12/17 20:59:27 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.46 2019/11/18 04:09:53 rin Exp $"); #if defined(_KERNEL_OPT) #include "opt_ktrace.h" @@ -188,6 +188,8 @@ 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; @@ -198,11 +200,24 @@ netbsd32_ksi32_to_ksi(struct _ksiginfo * 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: + if (si32->_code != TRAP_SCE && si32->_code != TRAP_SCX) + 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: case SIGPROF: @@ -215,6 +230,7 @@ netbsd32_ksi32_to_ksi(struct _ksiginfo * 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; @@ -226,11 +242,11 @@ netbsd32_ksi32_to_ksi(struct _ksiginfo * } } -#ifdef notyet -#ifdef KTRACE 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; @@ -241,11 +257,24 @@ netbsd32_ksi_to_ksi32(struct __ksiginfo3 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: + if (si->_code != TRAP_SCE && si->_code != TRAP_SCX) + 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: case SIGPROF: @@ -258,6 +287,7 @@ netbsd32_ksi_to_ksi32(struct __ksiginfo3 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; @@ -268,93 +298,21 @@ netbsd32_ksi_to_ksi32(struct __ksiginfo3 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; - } + netbsd32_ksi_to_ksi32(&si32->_info, &si->_info); } 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; - } + netbsd32_ksi32_to_ksi(&si->_info, &si32->_info); } void