summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_ktrace.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1996-09-19 19:49:13 +0000
committerphk <phk@FreeBSD.org>1996-09-19 19:49:13 +0000
commitbb49c895b91f1c1124b1782797be82879bb6136c (patch)
treedcfcaecc65579d35f813644addb558f6a9c2f1e1 /sys/kern/kern_ktrace.c
parent45c85d421d05f7b96a102826ea41b4f7dc31c017 (diff)
downloadFreeBSD-src-bb49c895b91f1c1124b1782797be82879bb6136c.zip
FreeBSD-src-bb49c895b91f1c1124b1782797be82879bb6136c.tar.gz
Add the utrace(caddr_t addr,size_t len) syscall, that will store the
data pointed at in a ktrace file, if this process is being ktrace'ed. I'm using this to profile malloc usage. The advantage is that there is no context around this call, ie, no open file or socket, so it will work in any process, and you can decide if you want it to collect data or not.
Diffstat (limited to 'sys/kern/kern_ktrace.c')
-rw-r--r--sys/kern/kern_ktrace.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c
index 46b1ca6..595e4ef 100644
--- a/sys/kern/kern_ktrace.c
+++ b/sys/kern/kern_ktrace.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)kern_ktrace.c 8.2 (Berkeley) 9/23/93
- * $Id: kern_ktrace.c,v 1.11 1996/03/11 06:03:23 hsu Exp $
+ * $Id: kern_ktrace.c,v 1.12 1996/08/04 20:13:07 phk Exp $
*/
#include "opt_ktrace.h"
@@ -346,6 +346,45 @@ done:
#endif
}
+/*
+ * utrace system call
+ */
+/* ARGSUSED */
+int
+utrace(curp, uap, retval)
+ struct proc *curp;
+ register struct utrace_args *uap;
+ int *retval;
+{
+#ifdef KTRACE
+ register struct ktr_user *ktp;
+ struct ktr_header *kth;
+ struct proc *p = curproc; /* XXX */
+ register caddr_t cp;
+
+ if (!KTRPOINT(p, KTR_USER))
+ return (0);
+ p->p_traceflag |= KTRFAC_ACTIVE;
+ kth = ktrgetheader(KTR_USER);
+ MALLOC(ktp, struct ktr_user *, sizeof(struct ktr_user) + uap->len,
+ M_KTRACE, M_WAITOK);
+ ktp->len = uap->len;
+ cp = (caddr_t)((char *)ktp + sizeof (struct ktr_user));
+ if (!copyin(uap->addr, cp, uap->len)) {
+ kth->ktr_buf = (caddr_t)ktp;
+ kth->ktr_len = sizeof (struct ktr_user) + uap->len;
+ ktrwrite(p->p_tracep, kth);
+ }
+ FREE(kth, M_KTRACE);
+ FREE(ktp, M_KTRACE);
+ p->p_traceflag &= ~KTRFAC_ACTIVE;
+
+ return (0);
+#else
+ return (ENOSYS);
+#endif
+}
+
#ifdef KTRACE
static int
ktrops(curp, p, ops, facs, vp)
OpenPOWER on IntegriCloud