diff --git a/sys/kern/init_sysent.c b/sys/kern/init_sysent.c index 59a3e5e3e8f..0bd62906ae9 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 46b1ca6b48d..595e4efb840 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 ded3c53701b..fd06481974b 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 ad5ba53e1c4..c0c5f0fdbb5 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 diff --git a/sys/sys/ktrace.h b/sys/sys/ktrace.h index 6ae1af3dfba..15b155a6d5a 100644 --- a/sys/sys/ktrace.h +++ b/sys/sys/ktrace.h @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)ktrace.h 8.1 (Berkeley) 6/2/93 - * $Id: ktrace.h,v 1.7 1995/03/16 18:16:19 bde Exp $ + * $Id: ktrace.h,v 1.8 1995/12/14 08:32:31 phk Exp $ */ #ifndef _SYS_KTRACE_H_ @@ -132,6 +132,17 @@ struct ktr_csw { int user; /* 1 if usermode (ivcsw), 0 if kernel (vcsw) */ }; +/* + * KTR_USER - data comming from userland + */ +#define KTR_USER 7 +struct ktr_user { + int len; /* number of bytes */ + /* + * followed by data provided by user + */ +}; + /* * kernel trace points (in p_traceflag) */ @@ -142,6 +153,7 @@ struct ktr_csw { #define KTRFAC_GENIO (1<