diff options
author | phk <phk@FreeBSD.org> | 1996-09-19 19:49:13 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1996-09-19 19:49:13 +0000 |
commit | bb49c895b91f1c1124b1782797be82879bb6136c (patch) | |
tree | dcfcaecc65579d35f813644addb558f6a9c2f1e1 /sys/kern/kern_ktrace.c | |
parent | 45c85d421d05f7b96a102826ea41b4f7dc31c017 (diff) | |
download | FreeBSD-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.c | 41 |
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) |