Module Name:    src
Committed By:   martin
Date:           Tue Sep 13 07:39:45 UTC 2016

Modified Files:
        src/sys/compat/netbsd32: netbsd32_netbsd.c netbsd32_signal.c
        src/sys/kern: kern_ktrace.c kern_sig.c
        src/sys/sys: ktrace.h proc.h

Log Message:
Allow emulations to override the creation of ktrace records for posting
signals. In compat_netbsd32 use this to write the 32bit version of
the records, so a 32bit userland kdump is happy.


To generate a diff of this commit:
cvs rdiff -u -r1.202 -r1.203 src/sys/compat/netbsd32/netbsd32_netbsd.c
cvs rdiff -u -r1.39 -r1.40 src/sys/compat/netbsd32/netbsd32_signal.c
cvs rdiff -u -r1.168 -r1.169 src/sys/kern/kern_ktrace.c
cvs rdiff -u -r1.329 -r1.330 src/sys/kern/kern_sig.c
cvs rdiff -u -r1.64 -r1.65 src/sys/sys/ktrace.h
cvs rdiff -u -r1.331 -r1.332 src/sys/sys/proc.h

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_netbsd.c
diff -u src/sys/compat/netbsd32/netbsd32_netbsd.c:1.202 src/sys/compat/netbsd32/netbsd32_netbsd.c:1.203
--- src/sys/compat/netbsd32/netbsd32_netbsd.c:1.202	Sat Sep 10 08:21:26 2016
+++ src/sys/compat/netbsd32/netbsd32_netbsd.c	Tue Sep 13 07:39:45 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_netbsd.c,v 1.202 2016/09/10 08:21:26 skrll Exp $	*/
+/*	$NetBSD: netbsd32_netbsd.c,v 1.203 2016/09/13 07:39:45 martin Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001, 2008 Matthew R. Green
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_netbsd.c,v 1.202 2016/09/10 08:21:26 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_netbsd.c,v 1.203 2016/09/13 07:39:45 martin Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ddb.h"
@@ -103,6 +103,8 @@ void netbsd32_syscall_intern(struct proc
 void syscall(void);
 #endif
 
+void netbsd32_ktrpsig(int, sig_t, const sigset_t *, const ksiginfo_t *);
+
 #define LIMITCHECK(a, b) ((a) != RLIM_INFINITY && (a) > (b))
 
 #ifdef COMPAT_16
@@ -162,7 +164,8 @@ struct emul emul_netbsd32 = {
 	.e_vm_default_addr =	netbsd32_vm_default_addr,
 	.e_usertrap =		NULL,
 	.e_ucsize =		sizeof(ucontext32_t),
-	.e_startlwp =		startlwp32
+	.e_startlwp =		startlwp32,
+	.e_ktrpsig =		netbsd32_ktrpsig
 };
 
 /*

Index: src/sys/compat/netbsd32/netbsd32_signal.c
diff -u src/sys/compat/netbsd32/netbsd32_signal.c:1.39 src/sys/compat/netbsd32/netbsd32_signal.c:1.40
--- src/sys/compat/netbsd32/netbsd32_signal.c:1.39	Sat Jun 20 19:58:40 2015
+++ src/sys/compat/netbsd32/netbsd32_signal.c	Tue Sep 13 07:39:45 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_signal.c,v 1.39 2015/06/20 19:58:40 martin Exp $	*/
+/*	$NetBSD: netbsd32_signal.c,v 1.40 2016/09/13 07:39:45 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.39 2015/06/20 19:58:40 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.40 2016/09/13 07:39:45 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -35,6 +35,7 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_sig
 #include <sys/stat.h>
 #include <sys/time.h>
 #include <sys/signalvar.h>
+#include <sys/ktrace.h>
 #include <sys/proc.h>
 #include <sys/wait.h>
 #include <sys/dirent.h>
@@ -51,6 +52,7 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_sig
 #include <compat/sys/ucontext.h>
 #include <compat/common/compat_sigaltstack.h>
 
+void netbsd32_ktrpsig(int, sig_t, const sigset_t *, const ksiginfo_t *);
 
 int
 netbsd32_sigaction(struct lwp *l, const struct netbsd32_sigaction_args *uap, register_t *retval)
@@ -220,6 +222,46 @@ netbsd32_ksi32_to_ksi(struct _ksiginfo *
 	}
 }
 
+static void
+netbsd32_ksi_to_ksi32(struct __ksiginfo32 *si32, const struct _ksiginfo *si)
+{
+	memset(si32, 0, sizeof (*si32));
+	si32->_signo = si->_signo;
+	si32->_code = si->_code;
+	si32->_errno = si->_errno;
+
+	switch (si->_signo) {
+	case SIGILL:
+	case SIGBUS:
+	case SIGSEGV:
+	case SIGFPE:
+	case SIGTRAP:
+		si32->_reason._fault._addr =
+		    NETBSD32PTR32I(si->_reason._fault._addr);
+		si32->_reason._fault._trap = si->_reason._fault._trap;
+		break;
+	case SIGALRM:
+	case SIGVTALRM:
+	case SIGPROF:
+	default:	/* see sigqueue() and kill1() */
+		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 SIGCHLD:
+		si32->_reason._child._pid = si->_reason._child._pid;
+		si32->_reason._child._uid = si->_reason._child._uid;
+		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;
+	}
+}
+
 void
 netbsd32_si_to_si32(siginfo32_t *si32, const siginfo_t *si)
 {
@@ -455,3 +497,47 @@ netbsd32_sigqueueinfo(struct lwp *l,
 
 	return kill1(l, SCARG(uap, pid), &ksi, retval);
 }
+
+struct netbsd32_ktr_psig {
+	int			signo;
+	netbsd32_pointer_t	action;
+	sigset_t		mask;
+	int			code;
+	/* and optional siginfo_t */
+};
+
+void
+netbsd32_ktrpsig(int sig, sig_t action, const sigset_t *mask,
+	 const ksiginfo_t *ksi)
+{
+	struct ktrace_entry *kte;
+	lwp_t *l = curlwp;
+	struct {
+		struct netbsd32_ktr_psig	kp;
+		siginfo32_t			si;
+	} *kbuf;
+
+	if (!KTRPOINT(l->l_proc, KTR_PSIG))
+		return;
+
+	if (ktealloc(&kte, (void *)&kbuf, l, KTR_PSIG, sizeof(*kbuf)))
+		return;
+
+	kbuf->kp.signo = (char)sig;
+	NETBSD32PTR32(kbuf->kp.action, action);
+	kbuf->kp.mask = *mask;
+
+	if (ksi) {
+		kbuf->kp.code = KSI_TRAPCODE(ksi);
+		(void)memset(&kbuf->si, 0, sizeof(kbuf->si));
+		netbsd32_ksi_to_ksi32(&kbuf->si._info, &ksi->ksi_info);
+		ktesethdrlen(kte, sizeof(*kbuf));
+	} else {
+		kbuf->kp.code = 0;
+		ktesethdrlen(kte, sizeof(struct netbsd32_ktr_psig));
+	}
+
+	ktraddentry(l, kte, KTA_WAITOK);
+}
+
+

Index: src/sys/kern/kern_ktrace.c
diff -u src/sys/kern/kern_ktrace.c:1.168 src/sys/kern/kern_ktrace.c:1.169
--- src/sys/kern/kern_ktrace.c:1.168	Tue Sep 13 07:01:08 2016
+++ src/sys/kern/kern_ktrace.c	Tue Sep 13 07:39:45 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_ktrace.c,v 1.168 2016/09/13 07:01:08 martin Exp $	*/
+/*	$NetBSD: kern_ktrace.c,v 1.169 2016/09/13 07:39:45 martin Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.168 2016/09/13 07:01:08 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.169 2016/09/13 07:39:45 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -126,8 +126,6 @@ struct ktr_desc {
 	kcondvar_t ktd_cv;
 };
 
-static int	ktealloc(struct ktrace_entry **, void **, lwp_t *, int,
-			 size_t);
 static void	ktrwrite(struct ktr_desc *, struct ktrace_entry *);
 static int	ktrops(lwp_t *, struct proc *, int, int,
 		    struct ktr_desc *);
@@ -142,11 +140,6 @@ static struct ktr_desc *
 		ktd_lookup(file_t *);
 static void	ktdrel(struct ktr_desc *);
 static void	ktdref(struct ktr_desc *);
-static void	ktraddentry(lwp_t *, struct ktrace_entry *, int);
-/* Flags for ktraddentry (3rd arg) */
-#define	KTA_NOWAIT		0x0000
-#define	KTA_WAITOK		0x0001
-#define	KTA_LARGE		0x0002
 static void	ktefree(struct ktrace_entry *);
 static void	ktd_logerrl(struct ktr_desc *, int);
 static void	ktrace_thread(void *);
@@ -538,6 +531,12 @@ ktealloc(struct ktrace_entry **ktep, voi
 }
 
 void
+ktesethdrlen(struct ktrace_entry *kte, size_t l)
+{	
+	kte->kte_kth.ktr_len = l;
+}
+
+void
 ktr_syscall(register_t code, const register_t args[], int narg)
 {
 	lwp_t *l = curlwp;

Index: src/sys/kern/kern_sig.c
diff -u src/sys/kern/kern_sig.c:1.329 src/sys/kern/kern_sig.c:1.330
--- src/sys/kern/kern_sig.c:1.329	Sun Aug 21 15:24:17 2016
+++ src/sys/kern/kern_sig.c	Tue Sep 13 07:39:45 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_sig.c,v 1.329 2016/08/21 15:24:17 hannken Exp $	*/
+/*	$NetBSD: kern_sig.c,v 1.330 2016/09/13 07:39:45 martin Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.329 2016/08/21 15:24:17 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_sig.c,v 1.330 2016/09/13 07:39:45 martin Exp $");
 
 #include "opt_ptrace.h"
 #include "opt_dtrace.h"
@@ -913,8 +913,14 @@ trapsignal(struct lwp *l, ksiginfo_t *ks
 		kpsendsig(l, ksi, mask);
 		mutex_exit(p->p_lock);
 		if (ktrpoint(KTR_PSIG)) {
-			ktrpsig(signo, SIGACTION_PS(ps, signo).sa_handler,
-			    mask, ksi);
+			if (p->p_emul->e_ktrpsig)
+				p->p_emul->e_ktrpsig(signo,
+				    SIGACTION_PS(ps, signo).sa_handler,
+				    mask, ksi);
+			else
+				ktrpsig(signo, 
+				    SIGACTION_PS(ps, signo).sa_handler,
+				    mask, ksi);
 		}
 	} else {
 		/* XXX for core dump/debugger */
@@ -1860,7 +1866,11 @@ postsig(int signo)
 
 	if (ktrpoint(KTR_PSIG)) {
 		mutex_exit(p->p_lock);
-		ktrpsig(signo, action, returnmask, &ksi);
+		if (p->p_emul->e_ktrpsig)
+			p->p_emul->e_ktrpsig(signo, action,
+			    returnmask, &ksi);
+		else
+			ktrpsig(signo, action, returnmask, &ksi);
 		mutex_enter(p->p_lock);
 	}
 

Index: src/sys/sys/ktrace.h
diff -u src/sys/sys/ktrace.h:1.64 src/sys/sys/ktrace.h:1.65
--- src/sys/sys/ktrace.h:1.64	Tue Sep 13 07:01:08 2016
+++ src/sys/sys/ktrace.h	Tue Sep 13 07:39:45 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ktrace.h,v 1.64 2016/09/13 07:01:08 martin Exp $	*/
+/*	$NetBSD: ktrace.h,v 1.65 2016/09/13 07:39:45 martin Exp $	*/
 
 /*
  * Copyright (c) 1988, 1993
@@ -432,6 +432,15 @@ ktrexecfd(int fd, u_int dtype)
 		ktr_execfd(fd, dtype);
 }
 
+struct ktrace_entry;
+int	ktealloc(struct ktrace_entry **, void **, lwp_t *, int, size_t);
+void	ktesethdrlen(struct ktrace_entry *, size_t);
+void	ktraddentry(lwp_t *, struct ktrace_entry *, int);
+/* Flags for ktraddentry (3rd arg) */
+#define	KTA_NOWAIT		0x0000
+#define	KTA_WAITOK		0x0001
+#define	KTA_LARGE		0x0002
+
 #endif	/* !_KERNEL */
 
 #endif /* _SYS_KTRACE_H_ */

Index: src/sys/sys/proc.h
diff -u src/sys/sys/proc.h:1.331 src/sys/sys/proc.h:1.332
--- src/sys/sys/proc.h:1.331	Fri Jun 10 23:24:33 2016
+++ src/sys/sys/proc.h	Tue Sep 13 07:39:45 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: proc.h,v 1.331 2016/06/10 23:24:33 christos Exp $	*/
+/*	$NetBSD: proc.h,v 1.332 2016/09/13 07:39:45 martin Exp $	*/
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -192,6 +192,10 @@ struct emul {
 	void 		(*e_dtrace_syscall)(uint32_t, register_t,
 			    const struct sysent *, const void *,
 			    const register_t *, int);
+
+	/* Emulation specific support for ktracing signal posts */
+	void		(*e_ktrpsig)(int, sig_t, const sigset_t *,
+			    const struct ksiginfo *);
 };
 
 /*

Reply via email to