summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authormanu <manu@NetBSD.org>2006-09-23 22:11:59 +0000
committermanu <manu@NetBSD.org>2006-09-23 22:11:59 +0000
commit63ac93df54cd459cfecfc28db459efb55f78bb02 (patch)
tree44f6dd4751a21004633a7f90aac7f59b4b53c5ee /sys
parentf5b68de4eb5c9449947b5e81ca1c6a2347fe9b55 (diff)
Add sysctl tracing to emulations.
While we are there, fix a bug in FreeBSD sysctl emulation: use copyin for moving data to the kernel
Diffstat (limited to 'sys')
-rw-r--r--sys/compat/darwin/darwin_sysctl.c21
-rw-r--r--sys/compat/freebsd/freebsd_sysctl.c44
-rw-r--r--sys/compat/linux/common/linux_sysctl.c13
-rw-r--r--sys/compat/linux32/common/linux32_sysctl.c25
-rw-r--r--sys/compat/netbsd32/netbsd32_sysctl.c13
5 files changed, 83 insertions, 33 deletions
diff --git a/sys/compat/darwin/darwin_sysctl.c b/sys/compat/darwin/darwin_sysctl.c
index fde98a6c74c..a35c799e36a 100644
--- a/sys/compat/darwin/darwin_sysctl.c
+++ b/sys/compat/darwin/darwin_sysctl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: darwin_sysctl.c,v 1.43 2006/08/29 23:57:49 christos Exp $ */
+/* $NetBSD: darwin_sysctl.c,v 1.44 2006/09/23 22:11:59 manu Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -37,7 +37,9 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: darwin_sysctl.c,v 1.43 2006/08/29 23:57:49 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: darwin_sysctl.c,v 1.44 2006/09/23 22:11:59 manu Exp $");
+
+#include "opt_ktrace.h"
#include <sys/types.h>
#include <sys/param.h>
@@ -49,6 +51,9 @@ __KERNEL_RCSID(0, "$NetBSD: darwin_sysctl.c,v 1.43 2006/08/29 23:57:49 christos
#include <sys/proc.h>
#include <sys/malloc.h>
#include <sys/sysctl.h>
+#ifdef KTRACE
+#include <sys/ktrace.h>
+#endif
#include <sys/sa.h>
#include <sys/tty.h>
#include <sys/kauth.h>
@@ -314,15 +319,9 @@ darwin_sys___sysctl(struct lwp *l, void *v, register_t *retval)
if (error)
return (error);
-#ifdef DEBUG_DARWIN
- if (1) {
- int i;
-
- printf("darwin_sys___sysctl: ");
- for (i = 0; i < SCARG(uap, namelen); i++)
- printf("%d ", name[i]);
- printf("\n");
- }
+#ifdef KTRACE
+ if (KTRPOINT(l->l_proc, KTR_MIB))
+ ktrmib(l, name, SCARG(uap, namelen));
#endif
/*
diff --git a/sys/compat/freebsd/freebsd_sysctl.c b/sys/compat/freebsd/freebsd_sysctl.c
index 17655cf4e22..088b0567ebc 100644
--- a/sys/compat/freebsd/freebsd_sysctl.c
+++ b/sys/compat/freebsd/freebsd_sysctl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: freebsd_sysctl.c,v 1.4 2005/12/11 12:20:02 christos Exp $ */
+/* $NetBSD: freebsd_sysctl.c,v 1.5 2006/09/23 22:11:59 manu Exp $ */
/*-
* Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -41,7 +41,9 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: freebsd_sysctl.c,v 1.4 2005/12/11 12:20:02 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: freebsd_sysctl.c,v 1.5 2006/09/23 22:11:59 manu Exp $");
+
+#include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -52,6 +54,9 @@ __KERNEL_RCSID(0, "$NetBSD: freebsd_sysctl.c,v 1.4 2005/12/11 12:20:02 christos
#include <sys/malloc.h>
#include <sys/mman.h>
#include <sys/sysctl.h>
+#ifdef KTRACE
+#include <sys/ktrace.h>
+#endif
#include <sys/sa.h>
#include <sys/syscallargs.h>
@@ -95,16 +100,29 @@ freebsd_sys_sysctl(l, v, retval)
syscallarg(void *) new;
syscallarg(size_t) newlen;
} */ *uap = v;
- int error, *name;
+ int error;
+ int name[CTL_MAXNAME];
size_t newlen, *oldlenp;
u_int namelen;
void *new, *old;
- name = SCARG(uap, name);
namelen = SCARG(uap, namelen);
+
+ if ((namelen > CTL_MAXNAME) || (namelen < 1))
+ return EINVAL;
+
+ if ((error = copyin(SCARG(uap, name), name,
+ namelen * sizeof(*name))) != 0)
+ return error;
+
if (namelen > 0 && name[0] != 0)
return(sys___sysctl(l, v, retval));
+#ifdef KTRACE
+ if (KTRPOINT(l->l_proc, KTR_MIB))
+ ktrmib(l, name, namelen);
+#endif
+
/*
* FreeBSD sysctl uses an undocumented set of special OIDs in it's
* sysctl MIB whose tree is rooted at oid 0. These OIDs are
@@ -150,6 +168,15 @@ freebsd_sys_sysctl(l, v, retval)
free(locnew, M_TEMP);
return(error);
}
+#ifdef KTRACE
+ if (!error && KTRPOINT(l->l_proc, KTR_MIB)) {
+ struct iovec iov;
+
+ iov.iov_base = new;
+ iov.iov_len = newlen + 1;
+ ktrgenio(l, -1, UIO_WRITE, &iov, newlen + 1, 0);
+ }
+#endif
error = freebsd_sysctl_name2oid(locnew, oid, &oidlen);
sysctl_unlock(l);
@@ -162,6 +189,15 @@ freebsd_sys_sysctl(l, v, retval)
MIN(oidlen, *SCARG(uap, oldlenp)));
if (error)
return(error);
+#ifdef KTRACE
+ if (KTRPOINT(l->l_proc, KTR_MIB)) {
+ struct iovec iov;
+
+ iov.iov_base = SCARG(uap, old);
+ iov.iov_len = MIN(oidlen, *SCARG(uap, oldlenp));
+ ktrgenio(l, -1, UIO_READ, &iov, iov.iov_len, 0);
+ }
+#endif
error = copyout(&oidlen, SCARG(uap, oldlenp), sizeof(u_int));
return(error);
diff --git a/sys/compat/linux/common/linux_sysctl.c b/sys/compat/linux/common/linux_sysctl.c
index 5a8b7a20bce..ad26747c5cd 100644
--- a/sys/compat/linux/common/linux_sysctl.c
+++ b/sys/compat/linux/common/linux_sysctl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux_sysctl.c,v 1.19 2006/03/08 03:55:31 jonathan Exp $ */
+/* $NetBSD: linux_sysctl.c,v 1.20 2006/09/23 22:12:00 manu Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -41,7 +41,9 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_sysctl.c,v 1.19 2006/03/08 03:55:31 jonathan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_sysctl.c,v 1.20 2006/09/23 22:12:00 manu Exp $");
+
+#include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -51,6 +53,9 @@ __KERNEL_RCSID(0, "$NetBSD: linux_sysctl.c,v 1.19 2006/03/08 03:55:31 jonathan E
#include <sys/sysctl.h>
#include <sys/sa.h>
#include <sys/syscallargs.h>
+#ifdef KTRACE
+#include <sys/ktrace.h>
+#endif
#include <compat/linux/common/linux_types.h>
#include <compat/linux/common/linux_signal.h>
@@ -149,6 +154,10 @@ linux_sys___sysctl(struct lwp *l, void *v, register_t *retval)
if (error)
return (error);
+#ifdef KTRACE
+ if (KTRPOINT(l->l_proc, KTR_MIB))
+ ktrmib(l, name, ls.nlen);
+#endif
/*
* wire old so that copyout() is less likely to fail?
*/
diff --git a/sys/compat/linux32/common/linux32_sysctl.c b/sys/compat/linux32/common/linux32_sysctl.c
index 3c0d77cce94..d93f69841d7 100644
--- a/sys/compat/linux32/common/linux32_sysctl.c
+++ b/sys/compat/linux32/common/linux32_sysctl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: linux32_sysctl.c,v 1.2 2006/09/05 17:12:19 manu Exp $ */
+/* $NetBSD: linux32_sysctl.c,v 1.3 2006/09/23 22:12:00 manu Exp $ */
/*-
* Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -31,7 +31,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux32_sysctl.c,v 1.2 2006/09/05 17:12:19 manu Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_sysctl.c,v 1.3 2006/09/23 22:12:00 manu Exp $");
+
+#include "opt_ktrace.h"
#include <sys/param.h>
#include <sys/systm.h>
@@ -41,6 +43,9 @@ __KERNEL_RCSID(0, "$NetBSD: linux32_sysctl.c,v 1.2 2006/09/05 17:12:19 manu Exp
#include <sys/sysctl.h>
#include <sys/sa.h>
#include <sys/syscallargs.h>
+#ifdef KTRACE
+#include <sys/ktrace.h>
+#endif
#include <compat/netbsd32/netbsd32.h>
@@ -194,19 +199,11 @@ linux32_sys___sysctl(l, v, retval)
ls32.nlen * sizeof(int))) != 0)
return error;
-#ifdef DEBUG_LINUX
- {
- int i = 0;
-
- printf("linux32_sysctl(%p, %d, %p, %p, %p, %d) [",
- NETBSD32PTR64(ls32.name), ls32.nlen,
- NETBSD32PTR64(ls32.oldval), NETBSD32PTR64(ls32.oldlenp),
- NETBSD32PTR64(ls32.newval), ls32.newlen);
- for (i = 0; i < ls32.nlen; i++)
- printf("%d ", name[i]);
- printf("]\n");
- }
+#ifdef KTRACE
+ if (KTRPOINT(l->l_proc, KTR_MIB))
+ ktrmib(l, name, ls32.nlen);
#endif
+
if ((error = sysctl_lock(l,
NETBSD32PTR64(ls32.oldval), savelen)) != 0)
return error;
diff --git a/sys/compat/netbsd32/netbsd32_sysctl.c b/sys/compat/netbsd32/netbsd32_sysctl.c
index 93a1dfbeafa..322f29b7ede 100644
--- a/sys/compat/netbsd32/netbsd32_sysctl.c
+++ b/sys/compat/netbsd32/netbsd32_sysctl.c
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_sysctl.c,v 1.21 2005/12/11 12:20:22 christos Exp $ */
+/* $NetBSD: netbsd32_sysctl.c,v 1.22 2006/09/23 22:12:00 manu Exp $ */
/*
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -32,10 +32,11 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_sysctl.c,v 1.21 2005/12/11 12:20:22 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_sysctl.c,v 1.22 2006/09/23 22:12:00 manu Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ddb.h"
+#include "opt_ktrace.h"
#endif
#include <sys/param.h>
@@ -51,6 +52,9 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_sysctl.c,v 1.21 2005/12/11 12:20:22 christo
#include <sys/proc.h>
#include <sys/sysctl.h>
#include <sys/dirent.h>
+#ifdef KTRACE
+#include <sys/ktrace.h>
+#endif
#include <uvm/uvm_extern.h>
@@ -198,6 +202,11 @@ netbsd32___sysctl(l, v, retval)
if (error)
return (error);
+#ifdef KTRACE
+ if (KTRPOINT(l->l_proc, KTR_MIB))
+ ktrmib(l, name, SCARG(uap, namelen));
+#endif
+
/*
* wire old so that copyout() is less likely to fail?
*/