Module Name:    src
Committed By:   christos
Date:           Sun Dec 17 20:59:28 UTC 2017

Modified Files:
        src/sys/compat/netbsd32: netbsd32.h netbsd32_ptrace.c netbsd32_signal.c
        src/sys/kern: sys_ptrace.c sys_ptrace_common.c
        src/sys/sys: ptrace.h

Log Message:
handle siginfo requests for ptrace32


To generate a diff of this commit:
cvs rdiff -u -r1.114 -r1.115 src/sys/compat/netbsd32/netbsd32.h
cvs rdiff -u -r1.4 -r1.5 src/sys/compat/netbsd32/netbsd32_ptrace.c
cvs rdiff -u -r1.44 -r1.45 src/sys/compat/netbsd32/netbsd32_signal.c
cvs rdiff -u -r1.4 -r1.5 src/sys/kern/sys_ptrace.c
cvs rdiff -u -r1.28 -r1.29 src/sys/kern/sys_ptrace_common.c
cvs rdiff -u -r1.61 -r1.62 src/sys/sys/ptrace.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.h
diff -u src/sys/compat/netbsd32/netbsd32.h:1.114 src/sys/compat/netbsd32/netbsd32.h:1.115
--- src/sys/compat/netbsd32/netbsd32.h:1.114	Sun Nov 13 08:52:41 2016
+++ src/sys/compat/netbsd32/netbsd32.h	Sun Dec 17 15:59:27 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32.h,v 1.114 2016/11/13 13:52:41 rin Exp $	*/
+/*	$NetBSD: netbsd32.h,v 1.115 2017/12/17 20:59:27 christos Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001, 2008, 2015 Matthew R. Green
@@ -292,6 +292,13 @@ struct netbsd32_ptrace_io_desc {
 					   actual count (out) */
 };
 
+struct netbsd32_ptrace_siginfo {
+	siginfo32_t	psi_siginfo;	/* signal information structure */
+	lwpid_t		psi_lwpid;	/* destination LWP of the signal
+					 * value 0 means the whole process
+					 * (route signal to all LWPs) */
+};
+
 /* from <sys/quotactl.h> */
 typedef netbsd32_pointer_t netbsd32_quotactlargsp_t;
 struct netbsd32_quotactlargs {
@@ -1121,6 +1128,8 @@ vaddr_t netbsd32_vm_default_addr(struct 
 void netbsd32_adjust_limits(struct proc *);
 
 void	netbsd32_si_to_si32(siginfo32_t *, const siginfo_t *);
+void	netbsd32_si32_to_si(siginfo_t *, const siginfo32_t *);
+
 void	netbsd32_ksi32_to_ksi(struct _ksiginfo *si, const struct __ksiginfo32 *si32);
 
 #ifdef KTRACE

Index: src/sys/compat/netbsd32/netbsd32_ptrace.c
diff -u src/sys/compat/netbsd32/netbsd32_ptrace.c:1.4 src/sys/compat/netbsd32/netbsd32_ptrace.c:1.5
--- src/sys/compat/netbsd32/netbsd32_ptrace.c:1.4	Wed Feb 22 22:34:22 2017
+++ src/sys/compat/netbsd32/netbsd32_ptrace.c	Sun Dec 17 15:59:27 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_ptrace.c,v 1.4 2017/02/23 03:34:22 kamil Exp $	*/
+/*	$NetBSD: netbsd32_ptrace.c,v 1.5 2017/12/17 20:59:27 christos Exp $	*/
 
 /*
  * Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_ptrace.c,v 1.4 2017/02/23 03:34:22 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_ptrace.c,v 1.5 2017/12/17 20:59:27 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ptrace.h"
@@ -54,18 +54,14 @@ extern struct emul emul_netbsd32;
  * PTRACE methods
  */
 
-static int netbsd32_copyinpiod(struct ptrace_io_desc *, const void *);
-static void netbsd32_copyoutpiod(const struct ptrace_io_desc *, void *);
-static int netbsd32_doregs(struct lwp *, struct lwp *, struct uio *);
-static int netbsd32_dofpregs(struct lwp *, struct lwp *, struct uio *);
-static int netbsd32_dodbregs(struct lwp *, struct lwp *, struct uio *);
-
-
 static int
-netbsd32_copyinpiod(struct ptrace_io_desc *piod, const void *addr)
+netbsd32_copyin_piod(struct ptrace_io_desc *piod, const void *addr, size_t len)
 {
 	struct netbsd32_ptrace_io_desc piod32;
 
+	if (len != 0 && sizeof(piod32) != len)
+		return EINVAL;
+
 	int error = copyin(addr, &piod32, sizeof(piod32));
 	if (error)
 		return error;
@@ -77,18 +73,49 @@ netbsd32_copyinpiod(struct ptrace_io_des
 	return 0;
 }
 
-static void
-netbsd32_copyoutpiod(const struct ptrace_io_desc *piod, void *addr)
+static int
+netbsd32_copyout_piod(const struct ptrace_io_desc *piod, void *addr, size_t len)
 {
 	struct netbsd32_ptrace_io_desc piod32;
 
+	if (len != 0 && sizeof(piod32) != len)
+		return EINVAL;
+
 	piod32.piod_op = piod->piod_op;
 	NETBSD32PTR32(piod32.piod_offs, piod->piod_offs);
 	NETBSD32PTR32(piod32.piod_addr, piod->piod_addr);
 	piod32.piod_len = (netbsd32_size_t)piod->piod_len;
-	(void) copyout(&piod32, addr, sizeof(piod32));
+	return copyout(&piod32, addr, sizeof(piod32));
 }
 
+static int
+netbsd32_copyin_siginfo(struct ptrace_siginfo *psi, const void *addr, size_t len)
+{
+	struct netbsd32_ptrace_siginfo psi32;
+
+	if (sizeof(psi32) != len)
+		return EINVAL;
+
+	int error = copyin(addr, &psi32, sizeof(psi32));
+	if (error)
+		return error;
+	psi->psi_lwpid = psi32.psi_lwpid;
+	netbsd32_si32_to_si(&psi->psi_siginfo, &psi32.psi_siginfo);
+	return 0;
+}
+
+static int
+netbsd32_copyout_siginfo(const struct ptrace_siginfo *psi, void *addr, size_t len)
+{
+	struct netbsd32_ptrace_siginfo psi32;
+
+	if (sizeof(psi32) != len)
+		return EINVAL;
+
+	psi32.psi_lwpid = psi->psi_lwpid;
+	netbsd32_si_to_si32(&psi32.psi_siginfo, &psi->psi_siginfo);
+	return copyout(&psi32, addr, sizeof(psi32));
+}
 
 static int
 netbsd32_doregs(struct lwp *curl /*tracer*/,
@@ -205,8 +232,10 @@ netbsd32_dodbregs(struct lwp *curl /*tra
 }
 
 static struct ptrace_methods netbsd32_ptm = {
-	.ptm_copyinpiod = netbsd32_copyinpiod,
-	.ptm_copyoutpiod = netbsd32_copyoutpiod,
+	.ptm_copyin_piod = netbsd32_copyin_piod,
+	.ptm_copyout_piod = netbsd32_copyout_piod,
+	.ptm_copyin_siginfo = netbsd32_copyin_siginfo,
+	.ptm_copyout_siginfo = netbsd32_copyout_siginfo,
 	.ptm_doregs = netbsd32_doregs,
 	.ptm_dofpregs = netbsd32_dofpregs,
 	.ptm_dodbregs = netbsd32_dodbregs

Index: src/sys/compat/netbsd32/netbsd32_signal.c
diff -u src/sys/compat/netbsd32/netbsd32_signal.c:1.44 src/sys/compat/netbsd32/netbsd32_signal.c:1.45
--- src/sys/compat/netbsd32/netbsd32_signal.c:1.44	Wed Dec  6 14:15:27 2017
+++ src/sys/compat/netbsd32/netbsd32_signal.c	Sun Dec 17 15:59:27 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_signal.c,v 1.44 2017/12/06 19:15:27 christos Exp $	*/
+/*	$NetBSD: netbsd32_signal.c,v 1.45 2017/12/17 20:59:27 christos 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.44 2017/12/06 19:15:27 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_signal.c,v 1.45 2017/12/17 20:59:27 christos Exp $");
 
 #if defined(_KERNEL_OPT) 
 #include "opt_ktrace.h"
@@ -315,6 +315,49 @@ netbsd32_si_to_si32(siginfo32_t *si32, c
 }
 
 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;
+	}
+}
+
+void
 getucontext32(struct lwp *l, ucontext32_t *ucp)
 {
 	struct proc *p = l->l_proc;

Index: src/sys/kern/sys_ptrace.c
diff -u src/sys/kern/sys_ptrace.c:1.4 src/sys/kern/sys_ptrace.c:1.5
--- src/sys/kern/sys_ptrace.c:1.4	Wed Feb 22 22:34:22 2017
+++ src/sys/kern/sys_ptrace.c	Sun Dec 17 15:59:27 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_ptrace.c,v 1.4 2017/02/23 03:34:22 kamil Exp $	*/
+/*	$NetBSD: sys_ptrace.c,v 1.5 2017/12/17 20:59:27 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -118,7 +118,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_ptrace.c,v 1.4 2017/02/23 03:34:22 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_ptrace.c,v 1.5 2017/12/17 20:59:27 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ptrace.h"
@@ -149,24 +149,47 @@ __KERNEL_RCSID(0, "$NetBSD: sys_ptrace.c
  * PTRACE methods
  */
 
-static int ptrace_copyinpiod(struct ptrace_io_desc *, const void *);
-static void ptrace_copyoutpiod(const struct ptrace_io_desc *, void *);
-
 static int
-ptrace_copyinpiod(struct ptrace_io_desc *piod, const void *addr)
+ptrace_copyin_piod(struct ptrace_io_desc *piod, const void *addr, size_t len)
 {
+	if (len != 0 && sizeof(*piod) != len)
+		return EINVAL;
+
 	return copyin(addr, piod, sizeof(*piod));
 }
 
-static void
-ptrace_copyoutpiod(const struct ptrace_io_desc *piod, void *addr)
+static int
+ptrace_copyout_piod(const struct ptrace_io_desc *piod, void *addr, size_t len)
+{
+	if (len != 0 && sizeof(*piod) != len)
+		return EINVAL;
+
+	return copyout(piod, addr, sizeof(*piod));
+}
+
+static int
+ptrace_copyin_siginfo(struct ptrace_siginfo *psi, const void *addr, size_t len)
 {
-	(void) copyout(piod, addr, sizeof(*piod));
+	if (sizeof(*psi) != len)
+		return EINVAL;
+
+	return copyin(addr, psi, sizeof(*psi));
+}
+
+static int
+ptrace_copyout_siginfo(const struct ptrace_siginfo *psi, void *addr, size_t len)
+{
+	if (sizeof(*psi) != len)
+		return EINVAL;
+
+	return copyout(psi, addr, sizeof(*psi));
 }
 
 static struct ptrace_methods native_ptm = {
-	.ptm_copyinpiod = ptrace_copyinpiod,
-	.ptm_copyoutpiod = ptrace_copyoutpiod,
+	.ptm_copyin_piod = ptrace_copyin_piod,
+	.ptm_copyout_piod = ptrace_copyout_piod,
+	.ptm_copyin_siginfo = ptrace_copyin_siginfo,
+	.ptm_copyout_siginfo = ptrace_copyout_siginfo,
 	.ptm_doregs = process_doregs,
 	.ptm_dofpregs = process_dofpregs,
 	.ptm_dodbregs = process_dodbregs,

Index: src/sys/kern/sys_ptrace_common.c
diff -u src/sys/kern/sys_ptrace_common.c:1.28 src/sys/kern/sys_ptrace_common.c:1.29
--- src/sys/kern/sys_ptrace_common.c:1.28	Sun Dec 17 10:43:27 2017
+++ src/sys/kern/sys_ptrace_common.c	Sun Dec 17 15:59:27 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_ptrace_common.c,v 1.28 2017/12/17 15:43:27 christos Exp $	*/
+/*	$NetBSD: sys_ptrace_common.c,v 1.29 2017/12/17 20:59:27 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -118,7 +118,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.28 2017/12/17 15:43:27 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_ptrace_common.c,v 1.29 2017/12/17 20:59:27 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ptrace.h"
@@ -531,31 +531,24 @@ ptrace_update_lwp(struct proc *t, struct
 }
 
 static int
-ptrace_get_siginfo(struct proc *t, void *addr, size_t data)
+ptrace_get_siginfo(struct proc *t, struct ptrace_methods *ptm, void *addr,
+    size_t data)
 {
 	struct ptrace_siginfo psi;
 
-	if (data != sizeof(psi)) {
-		DPRINTF(("%s: %zu != %zu\n", __func__, data, sizeof(psi)));
-		return EINVAL;
-	}
 	psi.psi_siginfo._info = t->p_sigctx.ps_info;
 	psi.psi_lwpid = t->p_sigctx.ps_lwp;
 
-	return copyout(&psi, addr, sizeof(psi));
+	return ptm->ptm_copyout_siginfo(&psi, addr, data);
 }
 
 static int
-ptrace_set_siginfo(struct proc *t, struct lwp **lt, void *addr, size_t data)
+ptrace_set_siginfo(struct proc *t, struct lwp **lt, struct ptrace_methods *ptm,
+    void *addr, size_t data)
 {
 	struct ptrace_siginfo psi;
 
-	if (data != sizeof(psi)) {
-		DPRINTF(("%s: %zu != %zu\n", __func__, data, sizeof(psi)));
-		return EINVAL;
-	}
-
-	int error = copyin(addr, &psi, sizeof(psi));
+	int error = ptm->ptm_copyin_siginfo(&psi, addr, data);
 	if (error)
 		return error;
 
@@ -1056,11 +1049,11 @@ do_ptrace(struct ptrace_methods *ptm, st
 		break;
 
 	case PT_IO:
-		if ((error = ptm->ptm_copyinpiod(&piod, addr)) != 0)
+		if ((error = ptm->ptm_copyin_piod(&piod, addr, data)) != 0)
 			break;
 		if ((error = ptrace_doio(l, t, lt, &piod, addr, &vm)) != 0)
 			break;
-		(void) ptm->ptm_copyoutpiod(&piod, addr);
+		(void) ptm->ptm_copyout_piod(&piod, addr, data);
 		uvmspace_free(vm);
 		break;
 
@@ -1289,11 +1282,11 @@ do_ptrace(struct ptrace_methods *ptm, st
 		break;
 
 	case PT_SET_SIGINFO:
-		error = ptrace_set_siginfo(t, &lt, addr, data);
+		error = ptrace_set_siginfo(t, &lt, ptm, addr, data);
 		break;
 
 	case PT_GET_SIGINFO:
-		error = ptrace_get_siginfo(t, addr, data);
+		error = ptrace_get_siginfo(t, ptm, addr, data);
 		break;
 
 	case PT_SET_SIGMASK:

Index: src/sys/sys/ptrace.h
diff -u src/sys/sys/ptrace.h:1.61 src/sys/sys/ptrace.h:1.62
--- src/sys/sys/ptrace.h:1.61	Sun Dec 10 05:56:50 2017
+++ src/sys/sys/ptrace.h	Sun Dec 17 15:59:28 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: ptrace.h,v 1.61 2017/12/10 10:56:50 martin Exp $	*/
+/*	$NetBSD: ptrace.h,v 1.62 2017/12/17 20:59:28 christos Exp $	*/
 
 /*-
  * Copyright (c) 1984, 1993
@@ -186,8 +186,10 @@ struct dbreg;
 #endif
 
 struct ptrace_methods {
-	int (*ptm_copyinpiod)(struct ptrace_io_desc *, const void *);
-	void (*ptm_copyoutpiod)(const struct ptrace_io_desc *, void *);
+	int (*ptm_copyin_piod)(struct ptrace_io_desc *, const void *, size_t);
+	int (*ptm_copyout_piod)(const struct ptrace_io_desc *, void *, size_t);
+	int (*ptm_copyin_siginfo)(struct ptrace_siginfo *, const void *, size_t);
+	int (*ptm_copyout_siginfo)(const struct ptrace_siginfo *, void *, size_t);
 	int (*ptm_doregs)(struct lwp *, struct lwp *, struct uio *);
 	int (*ptm_dofpregs)(struct lwp *, struct lwp *, struct uio *);
 	int (*ptm_dodbregs)(struct lwp *, struct lwp *, struct uio *);

Reply via email to