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, <, addr, data);
+ error = ptrace_set_siginfo(t, <, 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 *);