summaryrefslogtreecommitdiffstats
path: root/sys/kern
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
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')
-rw-r--r--sys/kern/init_sysent.c2
-rw-r--r--sys/kern/kern_ktrace.c41
-rw-r--r--sys/kern/syscalls.c2
-rw-r--r--sys/kern/syscalls.master4
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
OpenPOWER on IntegriCloud