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

Reply via email to