Date: Sat, 7 Dec 1996 20:33:11 -0800 From: Sean Eric Fagan <sef@Kithrup.COM> To: avalon@coombs.anu.edu.au Cc: freebsd-hackers@freebsd.org, joerg_wunsch@uriah.heep.sax.de Subject: Re: truss, trace ?? Message-ID: <199612080433.UAA11953@kithrup.com>
next in thread | raw e-mail | index | archive | help
Here, by the way, are my old diffs. I haven't touched them in a while, but
they did work, to a degree anyway ;).
I'm not completely happy with the interface, which is why I hadn't released
them before.
I recently posted the main part of my EP truss program to the net, to show
what it would look like.
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/i386/i386/procfs_machdep.c ./i386/i386/procfs_machdep.c
--- /usr/src/sys/i386/i386/procfs_machdep.c Thu Mar 16 10:11:29 1995
+++ ./i386/i386/procfs_machdep.c Mon Jul 17 17:46:30 1995
@@ -78,7 +78,7 @@
#include <machine/reg.h>
#include <machine/frame.h>
#include <machine/md_var.h>
-#include <miscfs/procfs/procfs.h>
+#include <miscfs/procfs/procfsvar.h>
int
procfs_read_regs(p, regs)
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/i386/i386/trap.c ./i386/i386/trap.c
--- /usr/src/sys/i386/i386/trap.c Sun Jun 4 17:22:04 1995
+++ ./i386/i386/trap.c Fri May 26 10:54:41 1995
@@ -825,6 +825,8 @@
rval[0] = 0;
rval[1] = frame.tf_edx;
+ STOPEVENT (p, S_SCE, callp->sy_narg);
+
error = (*callp->sy_call)(p, args, rval);
switch (error) {
@@ -860,6 +862,8 @@
}
userret(p, &frame, sticks);
+
+ STOPEVENT (p, S_SCX, error);
#ifdef KTRACE
if (KTRPOINT(p, KTR_SYSRET))
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/kern/kern_exec.c ./kern/kern_exec.c
--- /usr/src/sys/kern/kern_exec.c Tue May 30 01:05:24 1995
+++ ./kern/kern_exec.c Fri May 26 10:54:42 1995
@@ -286,6 +286,8 @@
* If tracing the process, trap to debugger so breakpoints
* can be set before the program executes.
*/
+ STOPEVENT(p, S_EXEC, 0);
+
if (p->p_flag & P_TRACED)
psignal(p, SIGTRAP);
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/kern/kern_exit.c ./kern/kern_exit.c
--- /usr/src/sys/kern/kern_exit.c Tue May 30 01:05:25 1995
+++ ./kern/kern_exit.c Thu Jul 20 15:18:57 1995
@@ -191,6 +191,9 @@
if (p->p_tracep)
vrele(p->p_tracep);
#endif
+
+ STOPEVENT(p, S_EXIT, rv);
+
/*
* Remove proc from allproc queue and pidhash chain.
* Place onto zombproc. Unlink from parent's child list.
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/kern/kern_fork.c ./kern/kern_fork.c
--- /usr/src/sys/kern/kern_fork.c Tue May 30 01:05:27 1995
+++ ./kern/kern_fork.c Mon Jul 17 16:48:56 1995
@@ -205,6 +205,8 @@
bcopy(&p1->p_startcopy, &p2->p_startcopy,
(unsigned) ((caddr_t)&p2->p_endcopy - (caddr_t)&p2->p_startcopy));
+ p2->p_stops = p2->p_step = 0; /* By default, no stops */
+
/*
* Duplicate sub-structures as needed.
* Increase reference counts on shared objects.
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/kern/sys_generic.c ./kern/sys_generic.c
--- /usr/src/sys/kern/sys_generic.c Tue May 30 01:05:56 1995
+++ ./kern/sys_generic.c Wed Jul 19 19:33:58 1995
@@ -405,8 +405,10 @@
* copied to/from the user's address space.
*/
size = IOCPARM_LEN(com);
- if (size > IOCPARM_MAX)
+ if (size > IOCPARM_MAX) {
+printf ("%s(%d): size = %d, IOCPARM_MAX = %d\n", __FILE__, __LINE__, size, IOCPARM_MAX);
return (ENOTTY);
+ }
memp = NULL;
#ifdef COMPAT_IBCS2
if (size + IBCS2_RETVAL_SIZE > sizeof (stkbuf)) {
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/kern/sys_process.c ./kern/sys_process.c
--- /usr/src/sys/kern/sys_process.c Tue May 30 01:05:58 1995
+++ ./kern/sys_process.c Thu Jul 20 10:13:54 1995
@@ -356,3 +356,20 @@
{
return 1;
}
+
+void
+stopevent(p, event, val)
+ struct proc *p;
+ int event;
+ int val;
+{
+
+ p->p_step = 1;
+ do {
+ p->p_xstat = val;
+ p->p_stype = event; /* Why we stopped */
+ p->p_stat = SSTOP;
+ wakeup(&p->p_stat);
+ mi_switch();
+ } while ((p->p_stops & event) && p->p_step);
+}
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/kern/vfs_vnops.c ./kern/vfs_vnops.c
--- /usr/src/sys/kern/vfs_vnops.c Tue May 30 01:06:35 1995
+++ ./kern/vfs_vnops.c Wed Jul 19 20:05:37 1995
@@ -445,7 +445,9 @@
/* fall into ... */
default:
+#if 0
return (ENOTTY);
+#endif
case VFIFO:
case VCHR:
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs.h ./miscfs/procfs/procfs.h
--- /usr/src/sys/miscfs/procfs/procfs.h Wed May 24 18:35:22 1995
+++ ./miscfs/procfs/procfs.h Wed Dec 31 16:00:00 1969
@@ -1,188 +0,0 @@
-/*
- * Copyright (c) 1993 Jan-Simon Pendry
- * Copyright (c) 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Jan-Simon Pendry.
- *
- * 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.
- *
- * @(#)procfs.h 8.6 (Berkeley) 2/3/94
- *
- * procfs.h,v 1.5 1995/05/25 01:35:22 davidg Exp
- */
-
-/*
- * The different types of node in a procfs filesystem
- */
-typedef enum {
- Proot, /* the filesystem root */
- Pproc, /* a process-specific sub-directory */
- Pfile, /* the executable file */
- Pmem, /* the process's memory image */
- Pregs, /* the process's register set */
- Pfpregs, /* the process's FP register set */
- Pctl, /* process control */
- Pstatus, /* process status */
- Pnote, /* process notifier */
- Pnotepg /* process group notifier */
-} pfstype;
-
-/*
- * control data for the proc file system.
- */
-struct pfsnode {
- struct pfsnode *pfs_next; /* next on list */
- struct vnode *pfs_vnode; /* vnode associated with this pfsnode */
- pfstype pfs_type; /* type of procfs node */
- pid_t pfs_pid; /* associated process */
- u_short pfs_mode; /* mode bits for stat() */
- u_long pfs_flags; /* open flags */
- u_long pfs_fileno; /* unique file id */
-};
-
-#define PROCFS_NOTELEN 64 /* max length of a note (/proc/$pid/note) */
-#define PROCFS_CTLLEN 8 /* max length of a ctl msg (/proc/$pid/ctl */
-
-/*
- * Kernel stuff follows
- */
-#ifdef KERNEL
-#define CNEQ(cnp, s, len) \
- ((cnp)->cn_namelen == (len) && \
- (bcmp((s), (cnp)->cn_nameptr, (len)) == 0))
-
-#define KMEM_GROUP 2
-/*
- * Format of a directory entry in /proc, ...
- * This must map onto struct dirent (see <dirent.h>)
- */
-#define PROCFS_NAMELEN 8
-struct pfsdent {
- u_long d_fileno;
- u_short d_reclen;
- u_char d_type;
- u_char d_namlen;
- char d_name[PROCFS_NAMELEN];
-};
-#define UIO_MX sizeof(struct pfsdent)
-#define PROCFS_FILENO(pid, type) \
- (((type) == Proot) ? \
- 2 : \
- ((((pid)+1) << 3) + ((int) (type))))
-
-/*
- * Convert between pfsnode vnode
- */
-#define VTOPFS(vp) ((struct pfsnode *)(vp)->v_data)
-#define PFSTOV(pfs) ((pfs)->pfs_vnode)
-
-typedef struct vfs_namemap vfs_namemap_t;
-struct vfs_namemap {
- const char *nm_name;
- int nm_val;
-};
-
-extern int vfs_getuserstr __P((struct uio *, char *, int *));
-extern vfs_namemap_t *vfs_findname __P((vfs_namemap_t *, char *, int));
-
-/* <machine/reg.h> */
-struct reg;
-struct fpreg;
-
-#define PFIND(pid) ((pid) ? pfind(pid) : &proc0)
-extern int procfs_freevp __P((struct vnode *));
-extern int procfs_allocvp __P((struct mount *, struct vnode **, long, pfstype));
-extern struct vnode *procfs_findtextvp __P((struct proc *));
-extern int procfs_sstep __P((struct proc *));
-extern void procfs_fix_sstep __P((struct proc *));
-extern int procfs_read_regs __P((struct proc *, struct reg *));
-extern int procfs_write_regs __P((struct proc *, struct reg *));
-extern int procfs_read_fpregs __P((struct proc *, struct fpreg *));
-extern int procfs_write_fpregs __P((struct proc *, struct fpreg *));
-extern int procfs_donote __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
-extern int procfs_doregs __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
-extern int procfs_dofpregs __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
-extern int procfs_domem __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
-extern int procfs_doctl __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
-extern int procfs_dostatus __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
-
-#define PROCFS_LOCKED 0x01
-#define PROCFS_WANT 0x02
-
-extern int (**procfs_vnodeop_p)();
-extern struct vfsops procfs_vfsops;
-
-int procfs_root __P((struct mount *, struct vnode **));
-
-/*
- * Prototypes for procfs vnode ops
- */
-int procfs_badop(); /* varargs */
-int procfs_rw __P((struct vop_read_args *));
-int procfs_lookup __P((struct vop_lookup_args *));
-#define procfs_create ((int (*) __P((struct vop_create_args *))) procfs_badop)
-#define procfs_mknod ((int (*) __P((struct vop_mknod_args *))) procfs_badop)
-int procfs_open __P((struct vop_open_args *));
-int procfs_close __P((struct vop_close_args *));
-int procfs_access __P((struct vop_access_args *));
-int procfs_getattr __P((struct vop_getattr_args *));
-int procfs_setattr __P((struct vop_setattr_args *));
-#define procfs_read procfs_rw
-#define procfs_write procfs_rw
-int procfs_ioctl __P((struct vop_ioctl_args *));
-#define procfs_select ((int (*) __P((struct vop_select_args *))) procfs_badop)
-#define procfs_mmap ((int (*) __P((struct vop_mmap_args *))) procfs_badop)
-#define procfs_fsync ((int (*) __P((struct vop_fsync_args *))) procfs_badop)
-#define procfs_seek ((int (*) __P((struct vop_seek_args *))) procfs_badop)
-#define procfs_remove ((int (*) __P((struct vop_remove_args *))) procfs_badop)
-#define procfs_link ((int (*) __P((struct vop_link_args *))) procfs_badop)
-#define procfs_rename ((int (*) __P((struct vop_rename_args *))) procfs_badop)
-#define procfs_mkdir ((int (*) __P((struct vop_mkdir_args *))) procfs_badop)
-#define procfs_rmdir ((int (*) __P((struct vop_rmdir_args *))) procfs_badop)
-#define procfs_symlink ((int (*) __P((struct vop_symlink_args *))) procfs_badop)
-int procfs_readdir __P((struct vop_readdir_args *));
-#define procfs_readlink ((int (*) __P((struct vop_readlink_args *))) procfs_badop)
-int procfs_abortop __P((struct vop_abortop_args *));
-int procfs_inactive __P((struct vop_inactive_args *));
-int procfs_reclaim __P((struct vop_reclaim_args *));
-#define procfs_lock ((int (*) __P((struct vop_lock_args *))) nullop)
-#define procfs_unlock ((int (*) __P((struct vop_unlock_args *))) nullop)
-#define procfs_bmap ((int (*) __P((struct vop_bmap_args *))) procfs_badop)
-#define procfs_strategy ((int (*) __P((struct vop_strategy_args *))) procfs_badop)
-int procfs_print __P((struct vop_print_args *));
-#define procfs_islocked ((int (*) __P((struct vop_islocked_args *))) nullop)
-#define procfs_advlock ((int (*) __P((struct vop_advlock_args *))) procfs_badop)
-#define procfs_blkatoff ((int (*) __P((struct vop_blkatoff_args *))) procfs_badop)
-#define procfs_valloc ((int (*) __P((struct vop_valloc_args *))) procfs_badop)
-#define procfs_vfree ((int (*) __P((struct vop_vfree_args *))) nullop)
-#define procfs_truncate ((int (*) __P((struct vop_truncate_args *))) procfs_badop)
-#define procfs_update ((int (*) __P((struct vop_update_args *))) nullop)
-#endif /* KERNEL */
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs_ctl.c ./miscfs/procfs/procfs_ctl.c
--- /usr/src/sys/miscfs/procfs/procfs_ctl.c Thu Mar 16 10:13:46 1995
+++ ./miscfs/procfs/procfs_ctl.c Mon Jul 17 17:17:00 1995
@@ -55,7 +55,7 @@
#include <vm/vm.h>
-#include <miscfs/procfs/procfs.h>
+#include <miscfs/procfs/procfsvar.h>
/*
* True iff process (p) is in trace wait state
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs_fpregs.c ./miscfs/procfs/procfs_fpregs.c
--- /usr/src/sys/miscfs/procfs/procfs_fpregs.c Tue Aug 2 00:45:12 1994
+++ ./miscfs/procfs/procfs_fpregs.c Mon Jul 17 17:16:56 1995
@@ -46,7 +46,7 @@
#include <sys/proc.h>
#include <sys/vnode.h>
#include <machine/reg.h>
-#include <miscfs/procfs/procfs.h>
+#include <miscfs/procfs/procfsvar.h>
int
procfs_dofpregs(curp, p, pfs, uio)
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs_mem.c ./miscfs/procfs/procfs_mem.c
--- /usr/src/sys/miscfs/procfs/procfs_mem.c Tue May 30 01:07:09 1995
+++ ./miscfs/procfs/procfs_mem.c Mon Jul 17 17:16:52 1995
@@ -51,7 +51,7 @@
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/vnode.h>
-#include <miscfs/procfs/procfs.h>
+#include <miscfs/procfs/procfsvar.h>
#include <vm/vm.h>
#include <vm/vm_kern.h>
#include <vm/vm_page.h>
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs_note.c ./miscfs/procfs/procfs_note.c
--- /usr/src/sys/miscfs/procfs/procfs_note.c Tue Aug 2 00:45:16 1994
+++ ./miscfs/procfs/procfs_note.c Mon Jul 17 17:16:49 1995
@@ -46,7 +46,7 @@
#include <sys/proc.h>
#include <sys/vnode.h>
#include <sys/signal.h>
-#include <miscfs/procfs/procfs.h>
+#include <miscfs/procfs/procfsvar.h>
int
procfs_donote(curp, p, pfs, uio)
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs_regs.c ./miscfs/procfs/procfs_regs.c
--- /usr/src/sys/miscfs/procfs/procfs_regs.c Tue Aug 2 00:45:18 1994
+++ ./miscfs/procfs/procfs_regs.c Mon Jul 17 17:16:45 1995
@@ -46,7 +46,7 @@
#include <sys/proc.h>
#include <sys/vnode.h>
#include <machine/reg.h>
-#include <miscfs/procfs/procfs.h>
+#include <miscfs/procfs/procfsvar.h>
int
procfs_doregs(curp, p, pfs, uio)
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs_status.c ./miscfs/procfs/procfs_status.c
--- /usr/src/sys/miscfs/procfs/procfs_status.c Tue May 30 01:07:10 1995
+++ ./miscfs/procfs/procfs_status.c Mon Jul 17 17:16:41 1995
@@ -49,7 +49,7 @@
#include <sys/tty.h>
#include <sys/resource.h>
#include <sys/resourcevar.h>
-#include <miscfs/procfs/procfs.h>
+#include <miscfs/procfs/procfsvar.h>
int
procfs_dostatus(curp, p, pfs, uio)
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs_subr.c ./miscfs/procfs/procfs_subr.c
--- /usr/src/sys/miscfs/procfs/procfs_subr.c Tue May 30 01:07:11 1995
+++ ./miscfs/procfs/procfs_subr.c Mon Jul 17 17:16:34 1995
@@ -46,7 +46,7 @@
#include <sys/proc.h>
#include <sys/vnode.h>
#include <sys/malloc.h>
-#include <miscfs/procfs/procfs.h>
+#include <miscfs/procfs/procfsvar.h>
static struct pfsnode *pfshead;
static int pfsvplock;
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs_vfsops.c ./miscfs/procfs/procfs_vfsops.c
--- /usr/src/sys/miscfs/procfs/procfs_vfsops.c Wed May 24 18:35:23 1995
+++ ./miscfs/procfs/procfs_vfsops.c Wed Jul 19 18:17:29 1995
@@ -53,7 +53,7 @@
#include <sys/mount.h>
#include <sys/signalvar.h>
#include <sys/vnode.h>
-#include <miscfs/procfs/procfs.h>
+#include <miscfs/procfs/procfsvar.h>
#include <vm/vm.h> /* for PAGE_SIZE */
int procfs_statfs __P((struct mount *, struct statfs *, struct proc *));
@@ -73,6 +73,8 @@
struct proc *p;
{
u_int size;
+
+printf ("%s(%d): procfs_mount()\n", __FILE__, __LINE__);
if (UIO_MX & (UIO_MX-1)) {
log(LOG_ERR, "procfs: invalid directory entry size\n");
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfs_vnops.c ./miscfs/procfs/procfs_vnops.c
--- /usr/src/sys/miscfs/procfs/procfs_vnops.c Tue May 30 01:07:13 1995
+++ ./miscfs/procfs/procfs_vnops.c Thu Jul 20 16:59:14 1995
@@ -54,7 +54,8 @@
#include <sys/malloc.h>
#include <sys/dirent.h>
#include <sys/resourcevar.h>
-#include <miscfs/procfs/procfs.h>
+#include <sys/procfs.h> /* procfs ioctl's */
+#include <miscfs/procfs/procfsvar.h>
#include <vm/vm.h> /* for PAGE_SIZE */
/*
@@ -109,6 +110,8 @@
{
struct pfsnode *pfs = VTOPFS(ap->a_vp);
+/*printf ("%s(%d)\n", __FILE__, __LINE__); */
+
switch (pfs->pfs_type) {
case Pmem:
if (PFIND(pfs->pfs_pid) == 0)
@@ -164,8 +167,52 @@
procfs_ioctl(ap)
struct vop_ioctl_args *ap;
{
+ struct pfsnode *pfs = VTOPFS(ap->a_vp);
+ struct proc *procp;
+ int error;
+ int signo;
+ struct procfs_status *psp;
+
+ procp = pfind (pfs->pfs_pid);
+ if (procp == NULL) {
+ return ENOTTY;
+ }
+ switch (ap->a_command) {
+ case PIOCEVBIS:
+ procp->p_stops |= *(unsigned int*)ap->a_data;
+ break;
+ case PIOCEVBIC:
+ procp->p_stops &= *(unsigned int*)ap->a_data;
+ break;
+ case PIOCGEVFLAG:
+ *(int*)ap->a_data = procp->p_stops;
+ break;
+ case PIOCWAIT:
+ psp = (struct procfs_status *)ap->a_data;
+ while (procp->p_stat != SSTOP) {
+ error = tsleep(&procp->p_stat, PZERO + 1, "stopwait", 0);
+ if (error)
+ return error;
+ }
+ psp->state = 1; /* stopped */
+ psp->why = procp->p_stype; /* why it stopped */
+ psp->val = procp->p_xstat; /* any extra information */
+ break;
+ case PIOCCONT:
+ signo = *(int *)ap->a_data;
+ if (procp->p_stat == SSTOP) {
+ procp->p_step = 0;
+ if (signo)
+ procp->p_xstat = signo;
+ setrunnable(procp);
+ } else
+ return EINVAL;
+ break;
+ default:
+ return EINVAL;
+ }
+ return 0;
- return (ENOTTY);
}
/*
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/miscfs/procfs/procfsvar.h ./miscfs/procfs/procfsvar.h
--- /usr/src/sys/miscfs/procfs/procfsvar.h Wed Dec 31 16:00:00 1969
+++ ./miscfs/procfs/procfsvar.h Fri May 26 10:48:13 1995
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 1993 Jan-Simon Pendry
+ * Copyright (c) 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Jan-Simon Pendry.
+ *
+ * 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.
+ *
+ * @(#)procfs.h 8.6 (Berkeley) 2/3/94
+ *
+ * procfs.h,v 1.5 1995/05/25 01:35:22 davidg Exp
+ */
+
+/*
+ * The different types of node in a procfs filesystem
+ */
+typedef enum {
+ Proot, /* the filesystem root */
+ Pproc, /* a process-specific sub-directory */
+ Pfile, /* the executable file */
+ Pmem, /* the process's memory image */
+ Pregs, /* the process's register set */
+ Pfpregs, /* the process's FP register set */
+ Pctl, /* process control */
+ Pstatus, /* process status */
+ Pnote, /* process notifier */
+ Pnotepg /* process group notifier */
+} pfstype;
+
+/*
+ * control data for the proc file system.
+ */
+struct pfsnode {
+ struct pfsnode *pfs_next; /* next on list */
+ struct vnode *pfs_vnode; /* vnode associated with this pfsnode */
+ pfstype pfs_type; /* type of procfs node */
+ pid_t pfs_pid; /* associated process */
+ u_short pfs_mode; /* mode bits for stat() */
+ u_long pfs_flags; /* open flags */
+ u_long pfs_fileno; /* unique file id */
+};
+
+#define PROCFS_NOTELEN 64 /* max length of a note (/proc/$pid/note) */
+#define PROCFS_CTLLEN 8 /* max length of a ctl msg (/proc/$pid/ctl */
+
+/*
+ * Kernel stuff follows
+ */
+#ifdef KERNEL
+#define CNEQ(cnp, s, len) \
+ ((cnp)->cn_namelen == (len) && \
+ (bcmp((s), (cnp)->cn_nameptr, (len)) == 0))
+
+#define KMEM_GROUP 2
+/*
+ * Format of a directory entry in /proc, ...
+ * This must map onto struct dirent (see <dirent.h>)
+ */
+#define PROCFS_NAMELEN 8
+struct pfsdent {
+ u_long d_fileno;
+ u_short d_reclen;
+ u_char d_type;
+ u_char d_namlen;
+ char d_name[PROCFS_NAMELEN];
+};
+#define UIO_MX sizeof(struct pfsdent)
+#define PROCFS_FILENO(pid, type) \
+ (((type) == Proot) ? \
+ 2 : \
+ ((((pid)+1) << 3) + ((int) (type))))
+
+/*
+ * Convert between pfsnode vnode
+ */
+#define VTOPFS(vp) ((struct pfsnode *)(vp)->v_data)
+#define PFSTOV(pfs) ((pfs)->pfs_vnode)
+
+typedef struct vfs_namemap vfs_namemap_t;
+struct vfs_namemap {
+ const char *nm_name;
+ int nm_val;
+};
+
+extern int vfs_getuserstr __P((struct uio *, char *, int *));
+extern vfs_namemap_t *vfs_findname __P((vfs_namemap_t *, char *, int));
+
+/* <machine/reg.h> */
+struct reg;
+struct fpreg;
+
+#define PFIND(pid) ((pid) ? pfind(pid) : &proc0)
+extern int procfs_freevp __P((struct vnode *));
+extern int procfs_allocvp __P((struct mount *, struct vnode **, long, pfstype));
+extern struct vnode *procfs_findtextvp __P((struct proc *));
+extern int procfs_sstep __P((struct proc *));
+extern void procfs_fix_sstep __P((struct proc *));
+extern int procfs_read_regs __P((struct proc *, struct reg *));
+extern int procfs_write_regs __P((struct proc *, struct reg *));
+extern int procfs_read_fpregs __P((struct proc *, struct fpreg *));
+extern int procfs_write_fpregs __P((struct proc *, struct fpreg *));
+extern int procfs_donote __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
+extern int procfs_doregs __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
+extern int procfs_dofpregs __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
+extern int procfs_domem __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
+extern int procfs_doctl __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
+extern int procfs_dostatus __P((struct proc *, struct proc *, struct pfsnode *pfsp, struct uio *uio));
+
+#define PROCFS_LOCKED 0x01
+#define PROCFS_WANT 0x02
+
+extern int (**procfs_vnodeop_p)();
+extern struct vfsops procfs_vfsops;
+
+int procfs_root __P((struct mount *, struct vnode **));
+
+/*
+ * Prototypes for procfs vnode ops
+ */
+int procfs_badop(); /* varargs */
+int procfs_rw __P((struct vop_read_args *));
+int procfs_lookup __P((struct vop_lookup_args *));
+#define procfs_create ((int (*) __P((struct vop_create_args *))) procfs_badop)
+#define procfs_mknod ((int (*) __P((struct vop_mknod_args *))) procfs_badop)
+int procfs_open __P((struct vop_open_args *));
+int procfs_close __P((struct vop_close_args *));
+int procfs_access __P((struct vop_access_args *));
+int procfs_getattr __P((struct vop_getattr_args *));
+int procfs_setattr __P((struct vop_setattr_args *));
+#define procfs_read procfs_rw
+#define procfs_write procfs_rw
+int procfs_ioctl __P((struct vop_ioctl_args *));
+#define procfs_select ((int (*) __P((struct vop_select_args *))) procfs_badop)
+#define procfs_mmap ((int (*) __P((struct vop_mmap_args *))) procfs_badop)
+#define procfs_fsync ((int (*) __P((struct vop_fsync_args *))) procfs_badop)
+#define procfs_seek ((int (*) __P((struct vop_seek_args *))) procfs_badop)
+#define procfs_remove ((int (*) __P((struct vop_remove_args *))) procfs_badop)
+#define procfs_link ((int (*) __P((struct vop_link_args *))) procfs_badop)
+#define procfs_rename ((int (*) __P((struct vop_rename_args *))) procfs_badop)
+#define procfs_mkdir ((int (*) __P((struct vop_mkdir_args *))) procfs_badop)
+#define procfs_rmdir ((int (*) __P((struct vop_rmdir_args *))) procfs_badop)
+#define procfs_symlink ((int (*) __P((struct vop_symlink_args *))) procfs_badop)
+int procfs_readdir __P((struct vop_readdir_args *));
+#define procfs_readlink ((int (*) __P((struct vop_readlink_args *))) procfs_badop)
+int procfs_abortop __P((struct vop_abortop_args *));
+int procfs_inactive __P((struct vop_inactive_args *));
+int procfs_reclaim __P((struct vop_reclaim_args *));
+#define procfs_lock ((int (*) __P((struct vop_lock_args *))) nullop)
+#define procfs_unlock ((int (*) __P((struct vop_unlock_args *))) nullop)
+#define procfs_bmap ((int (*) __P((struct vop_bmap_args *))) procfs_badop)
+#define procfs_strategy ((int (*) __P((struct vop_strategy_args *))) procfs_badop)
+int procfs_print __P((struct vop_print_args *));
+#define procfs_islocked ((int (*) __P((struct vop_islocked_args *))) nullop)
+#define procfs_advlock ((int (*) __P((struct vop_advlock_args *))) procfs_badop)
+#define procfs_blkatoff ((int (*) __P((struct vop_blkatoff_args *))) procfs_badop)
+#define procfs_valloc ((int (*) __P((struct vop_valloc_args *))) procfs_badop)
+#define procfs_vfree ((int (*) __P((struct vop_vfree_args *))) nullop)
+#define procfs_truncate ((int (*) __P((struct vop_truncate_args *))) procfs_badop)
+#define procfs_update ((int (*) __P((struct vop_update_args *))) nullop)
+#endif /* KERNEL */
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/sys/proc.h ./sys/proc.h
--- /usr/src/sys/sys/proc.h Thu Mar 16 10:16:22 1995
+++ ./sys/proc.h Wed Jul 19 20:45:24 1995
@@ -137,8 +137,8 @@
struct vnode *p_textvp; /* Vnode of executable. */
char p_lock; /* Process lock count. */
- char p_pad2[3]; /* alignment */
- long p_spare[2]; /* Pad to 256, avoid shifting eproc. XXX */
+ char p_pad2[1]; /* alignment XXX */
+/* long p_spare[2]; /* Pad to 256, avoid shifting eproc. XXX */
/* End area that is zeroed on creation. */
#define p_endzero p_startcopy
@@ -169,6 +169,9 @@
u_short p_xstat; /* Exit status for wait; also stop signal. */
u_short p_acflag; /* Accounting flags. */
struct rusage *p_ru; /* Exit information. XXX */
+ unsigned int p_stops; /* procfs event bitmask */
+ unsigned int p_stype; /* procfs stop event type */
+ char p_step; /* procfs stop *once* flag */
};
#define p_session p_pgrp->pg_session
@@ -237,6 +240,21 @@
if (--(s)->s_count == 0) \
FREE(s, M_SESSION); \
}
+
+#define S_EXEC 0x0001 /* stop-on-exec */
+#define S_SIG 0x0002 /* stop-on-signal */
+#define S_SCE 0x0004 /* stop-on-syscall-entry */
+#define S_SCX 0x0008 /* stop-on-syscall-exit */
+#define S_CORE 0x0010 /* stop-on-core-dump */
+#define S_EXIT 0x0020 /* stop-on-exit */
+
+#ifdef PROCFS
+extern void stopevent();
+# define STOPEVENT(p,e,v) do { \
+ if ((p)->p_stops & (e)) stopevent(p,e,v); } while (0)
+#else
+# define STOPEVENT(p,e,v) do { ; } while (0)
+#endif
extern struct proc *pidhash[]; /* In param.c. */
extern struct pgrp *pgrphash[]; /* In param.c. */
diff -r -u -N --exclude=GARTH --exclude=*.~* --exclude=*.orig /usr/src/sys/sys/procfs.h ./sys/procfs.h
--- /usr/src/sys/sys/procfs.h Wed Dec 31 16:00:00 1969
+++ ./sys/procfs.h Thu Jul 20 16:59:15 1995
@@ -0,0 +1,13 @@
+#include <sys/ioctl.h>
+
+struct procfs_status {
+ int state; /* 0 for running, 1 for stopped */
+ int why; /* what event, if any, process is stopped on */
+ unsigned int val; /* Value event wishes "debugger" to know */
+};
+
+#define PIOCEVBIS _IOW('p', 1, unsigned int) /* set event flag mask */
+#define PIOCEVBIC _IOW('p', 2, unsigned int) /* clear event flag mask */
+#define PIOCGEVFLAG _IOR('p', 3, unsigned int) /* get event flag mask */
+#define PIOCWAIT _IOR('p', 4, struct procfs_status) /* wait */
+#define PIOCCONT _IOW('p', 5, int) /* Continue */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199612080433.UAA11953>
