summaryrefslogtreecommitdiff
path: root/sys/compat/freebsd/freebsd_ptrace.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/compat/freebsd/freebsd_ptrace.c')
-rw-r--r--sys/compat/freebsd/freebsd_ptrace.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/sys/compat/freebsd/freebsd_ptrace.c b/sys/compat/freebsd/freebsd_ptrace.c
new file mode 100644
index 00000000000..424caf59b19
--- /dev/null
+++ b/sys/compat/freebsd/freebsd_ptrace.c
@@ -0,0 +1,158 @@
+/* $NetBSD: freebsd_ptrace.c,v 1.1 1995/10/10 01:19:34 mycroft Exp $ */
+
+/*-
+ * Copyright (c) 1994 Christopher G. Demetriou. All rights reserved.
+ * Copyright (c) 1982, 1986, 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ * (c) UNIX System Laboratories, Inc.
+ * All or some portions of this file are derived from material licensed
+ * to the University of California by American Telephone and Telegraph
+ * Co. or Unix System Laboratories, Inc. and are reproduced herein with
+ * the permission of UNIX System Laboratories, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: @(#)sys_process.c 8.1 (Berkeley) 6/10/93
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/errno.h>
+#include <sys/ptrace.h>
+#include <sys/uio.h>
+#include <sys/user.h>
+#include <sys/mount.h>
+#include <sys/syscallargs.h>
+
+#include <machine/reg.h>
+#include <machine/freebsd_machdep.h>
+
+#include <compat/freebsd/freebsd_syscallargs.h>
+#include <compat/freebsd/freebsd_util.h>
+#include <compat/freebsd/freebsd_ptrace.h>
+
+/*
+ * Process debugging system call.
+ */
+int
+freebsd_sys_ptrace(p, v, retval)
+ struct proc *p;
+ void *v;
+ register_t *retval;
+{
+ struct freebsd_sys_ptrace_args /* {
+ syscallarg(int) req;
+ syscallarg(pid_t) pid;
+ syscallarg(caddr_t) addr;
+ syscallarg(int) data;
+ } */ *uap = v;
+ int error;
+ caddr_t sg;
+ struct {
+ struct reg regs;
+ struct fpreg fpregs;
+ } *nrp;
+ struct sys_ptrace_args npa;
+ struct freebsd_ptrace_reg fr;
+
+ switch (SCARG(uap, req)) {
+#ifdef PT_STEP
+ case FREEBSD_PT_STEP:
+ SCARG(&npa, req) = PT_STEP;
+ SCARG(&npa, pid) = SCARG(uap, pid);
+ SCARG(&npa, addr) = SCARG(uap, addr);
+ SCARG(&npa, data) = SCARG(uap, data);
+ return sys_ptrace(p, &npa, retval);
+#endif
+ case FREEBSD_PT_TRACE_ME:
+ case FREEBSD_PT_READ_I:
+ case FREEBSD_PT_READ_D:
+ case FREEBSD_PT_WRITE_I:
+ case FREEBSD_PT_WRITE_D:
+ case FREEBSD_PT_CONTINUE:
+ case FREEBSD_PT_KILL:
+ /* These requests are compatible with NetBSD */
+ return sys_ptrace(p, uap, retval);
+
+ case FREEBSD_PT_READ_U:
+ case FREEBSD_PT_WRITE_U:
+ sg = stackgap_init(p->p_emul);
+ nrp = stackgap_alloc(&sg, sizeof(*nrp));
+#ifdef PT_GETREGS
+ SCARG(&npa, req) = PT_GETREGS;
+ SCARG(&npa, pid) = SCARG(uap, pid);
+ SCARG(&npa, addr) = (caddr_t)&nrp->regs;
+ if ((error = sys_ptrace(p, &npa, retval)) != 0)
+ return error;
+#endif
+#ifdef PT_GETFPREGS
+ SCARG(&npa, req) = PT_GETFPREGS;
+ SCARG(&npa, pid) = SCARG(uap, pid);
+ SCARG(&npa, addr) = (caddr_t)&nrp->fpregs;
+ if ((error = sys_ptrace(p, &npa, retval)) != 0)
+ return error;
+#endif
+ netbsd_to_freebsd_ptrace_regs(&nrp->regs, &nrp->fpregs, &fr);
+ switch (SCARG(uap, req)) {
+ case FREEBSD_PT_READ_U:
+ return freebsd_ptrace_getregs(&fr, SCARG(uap, addr),
+ retval);
+
+ case FREEBSD_PT_WRITE_U:
+ if (error = freebsd_ptrace_setregs(&fr,
+ SCARG(uap, addr), SCARG(uap, data)))
+ return error;
+ freebsd_to_netbsd_ptrace_regs(&fr,
+ &nrp->regs, &nrp->fpregs);
+#ifdef PT_SETREGS
+ SCARG(&npa, req) = PT_SETREGS;
+ SCARG(&npa, pid) = SCARG(uap, pid);
+ SCARG(&npa, addr) = (caddr_t)&nrp->regs;
+ if ((error = sys_ptrace(p, &npa, retval)) != 0)
+ return error;
+#endif
+#ifdef PT_SETFPREGS
+ SCARG(&npa, req) = PT_SETFPREGS;
+ SCARG(&npa, pid) = SCARG(uap, pid);
+ SCARG(&npa, addr) = (caddr_t)&nrp->fpregs;
+ if ((error = sys_ptrace(p, &npa, retval)) != 0)
+ return error;
+#endif
+ return 0;
+ }
+
+ default: /* It was not a legal request. */
+ return (EINVAL);
+ }
+
+#ifdef DIAGNOSTIC
+ panic("freebsd_ptrace: impossible");
+#endif
+}