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 | |
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')
-rw-r--r-- | sys/kern/init_sysent.c | 2 | ||||
-rw-r--r-- | sys/kern/kern_ktrace.c | 41 | ||||
-rw-r--r-- | sys/kern/syscalls.c | 2 | ||||
-rw-r--r-- | sys/kern/syscalls.master | 4 |
4 files changed, 44 insertions, 5 deletions
diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index 59a3e5e..0bd6290 100644 --- a/sys/kern/init_sysent.c +++ b/sys/kern/init_sysent.c @@ -239,7 +239,7 @@ struct sysent sysent[] = { { 6, (sy_call_t *)__sysctl }, /* 202 = __sysctl */ { 2, (sy_call_t *)mlock }, /* 203 = mlock */ { 2, (sy_call_t *)munlock }, /* 204 = munlock */ - { 0, (sy_call_t *)nosys }, /* 205 = nosys */ + { 2, (sy_call_t *)utrace }, /* 205 = utrace */ { 0, (sy_call_t *)nosys }, /* 206 = nosys */ { 0, (sy_call_t *)nosys }, /* 207 = nosys */ { 0, (sy_call_t *)nosys }, /* 208 = nosys */ 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) diff --git a/sys/kern/syscalls.c b/sys/kern/syscalls.c index ded3c53..fd06481 100644 --- a/sys/kern/syscalls.c +++ b/sys/kern/syscalls.c @@ -226,7 +226,7 @@ char *syscallnames[] = { "__sysctl", /* 202 = __sysctl */ "mlock", /* 203 = mlock */ "munlock", /* 204 = munlock */ - "#205", /* 205 = nosys */ + "utrace", /* 205 = utrace */ "#206", /* 206 = nosys */ "#207", /* 207 = nosys */ "#208", /* 208 = nosys */ diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master index ad5ba53..c0c5f0f 100644 --- a/sys/kern/syscalls.master +++ b/sys/kern/syscalls.master @@ -1,4 +1,4 @@ - $Id: syscalls.master,v 1.27 1996/03/02 16:51:25 peter Exp $ + $Id: syscalls.master,v 1.28 1996/08/20 07:17:49 smpatel Exp $ ; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94 ; ; System call name/number master file. @@ -322,7 +322,7 @@ ; here allows to avoid one in libc/sys/Makefile.inc. 203 STD BSD { int mlock(caddr_t addr, size_t len); } 204 STD BSD { int munlock(caddr_t addr, size_t len); } -205 UNIMPL NOHIDE nosys +205 STD BSD { int utrace(caddr_t addr, size_t len); } 206 UNIMPL NOHIDE nosys 207 UNIMPL NOHIDE nosys 208 UNIMPL NOHIDE nosys |