Module Name:    src
Committed By:   chs
Date:           Sun Dec  2 01:05:17 UTC 2012

Modified Files:
        src/external/cddl/osnet/dev/cyclic: cyclic.c
        src/external/cddl/osnet/dev/cyclic/i386: cyclic_machdep.c
        src/external/cddl/osnet/sys/sys: cyclic_impl.h
        src/sys/kern: kern_clock.c
        src/sys/modules: Makefile
        src/sys/modules/dtrace: Makefile
        src/sys/sys: dtrace_bsd.h
Added Files:
        src/sys/modules/cyclic: Makefile
        src/sys/modules/dtrace/profile: Makefile

Log Message:
adapt the cyclic module and profile dtrace provider to netbsd.
for now, just hook the cyclic callback into hardclock().


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/external/cddl/osnet/dev/cyclic/cyclic.c
cvs rdiff -u -r1.3 -r1.4 \
    src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c
cvs rdiff -u -r1.3 -r1.4 src/external/cddl/osnet/sys/sys/cyclic_impl.h
cvs rdiff -u -r1.130 -r1.131 src/sys/kern/kern_clock.c
cvs rdiff -u -r1.115 -r1.116 src/sys/modules/Makefile
cvs rdiff -u -r0 -r1.1 src/sys/modules/cyclic/Makefile
cvs rdiff -u -r1.3 -r1.4 src/sys/modules/dtrace/Makefile
cvs rdiff -u -r0 -r1.1 src/sys/modules/dtrace/profile/Makefile
cvs rdiff -u -r1.6 -r1.7 src/sys/sys/dtrace_bsd.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/cddl/osnet/dev/cyclic/cyclic.c
diff -u src/external/cddl/osnet/dev/cyclic/cyclic.c:1.3 src/external/cddl/osnet/dev/cyclic/cyclic.c:1.4
--- src/external/cddl/osnet/dev/cyclic/cyclic.c:1.3	Sun Dec  2 00:05:38 2012
+++ src/external/cddl/osnet/dev/cyclic/cyclic.c	Sun Dec  2 01:05:16 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cyclic.c,v 1.3 2012/12/02 00:05:38 chs Exp $	*/
+/*	$NetBSD: cyclic.c,v 1.4 2012/12/02 01:05:16 chs Exp $	*/
 
 /*
  * CDDL HEADER START
@@ -326,8 +326,10 @@
 #include <sys/param.h>
 #include <sys/conf.h>
 #include <sys/kernel.h>
+#ifdef __FreeBSD___
 #include <sys/lock.h>
 #include <sys/sx.h>
+#endif
 #include <sys/cyclic_impl.h>
 #include <sys/module.h>
 #include <sys/systm.h>
@@ -335,7 +337,32 @@
 #include <sys/kmem.h>
 #include <sys/cmn_err.h>
 #include <sys/dtrace_bsd.h>
+#ifdef __FreeBSD__
 #include <machine/cpu.h>
+#endif
+
+#ifdef __NetBSD__
+#include <sys/cpu.h>
+#include <sys/malloc.h>
+#include <sys/xcall.h>
+
+#undef mutex_init
+#define mtx_init(m, d, p, f) mutex_init(m, MUTEX_DEFAULT, IPL_CLOCK)
+#define mtx_lock_spin(x) mutex_spin_enter(x)
+#define mtx_unlock_spin(x) mutex_spin_exit(x)
+#define mtx_destroy(x) mutex_destroy(x)
+
+#define ASSERT(x) KASSERT(x)
+#define SYSINIT(a1, a2, a3, a4, a5)
+#define SYSUNINIT(a1, a2, a3, a4, a5)
+#define CPU_FOREACH(var) \
+	CPU_INFO_ITERATOR cii; \
+	struct cpu_info *ci; \
+	for (CPU_INFO_FOREACH(cii, ci))
+#define MAXCPU MAXCPUS
+#define TRAPF_USERMODE(x) CLKF_USERMODE(x)
+#define TRAPF_PC(x) CLKF_PC(x)
+#endif
 
 static kmem_cache_t *cyclic_id_cache;
 static cyc_id_t *cyclic_id_head;
@@ -873,7 +900,7 @@ cyclic_configure(cpu_t *c)
 	ASSERT(MUTEX_HELD(&cpu_lock));
 
 	if (cyclic_id_cache == NULL)
-		cyclic_id_cache = kmem_cache_create("cyclic_id_cache",
+		cyclic_id_cache = kmem_cache_create(__UNCONST("cyclic_id_cache"),
 		    sizeof (cyc_id_t), 0, NULL, NULL, NULL, NULL, NULL, 0);
 
 	cpu->cyp_cpu = c;
@@ -1110,7 +1137,7 @@ cyclic_id_t
 cyclic_add(cyc_handler_t *hdlr, cyc_time_t *when)
 {
 	cyc_id_t *idp = cyclic_new_id();
-	solaris_cpu_t *c = &solaris_cpu[curcpu];
+	solaris_cpu_t *c = &solaris_cpu[cpu_number()];
 
 	ASSERT(MUTEX_HELD(&cpu_lock));
 	ASSERT(when->cyt_when >= 0 && when->cyt_interval > 0);
@@ -1217,6 +1244,7 @@ cyclic_add_omni(cyc_omni_handler_t *omni
 	idp->cyi_omni_hdlr = *omni;
 
 	CPU_FOREACH(i) {
+		i = cpu_index(ci);
 		c = &solaris_cpu[i];
 		if ((cpu = c->cpu_cyclic) == NULL)
 			continue;
@@ -1305,7 +1333,7 @@ cyclic_init(cyc_backend_t *be)
 	 */
 	bcopy(be, &cyclic_backend, sizeof (cyc_backend_t));
 
-	cyclic_configure(&solaris_cpu[curcpu]);
+	cyclic_configure(&solaris_cpu[cpu_number()]);
 }
 
 /*
@@ -1320,15 +1348,20 @@ cyclic_mp_init(void)
 	cpu_t *c;
 	int i;
 
+#ifndef __NetBSD__
 	mutex_enter(&cpu_lock);
+#endif
 
 	CPU_FOREACH(i) {
+		i = cpu_index(ci);
 		c = &solaris_cpu[i];
 		if (c->cpu_cyclic == NULL)
 			cyclic_configure(c);
 	}
 
+#ifndef __NetBSD__
 	mutex_exit(&cpu_lock);
+#endif
 }
 
 static void
@@ -1338,6 +1371,7 @@ cyclic_uninit(void)
 	int id;
 
 	CPU_FOREACH(id) {
+		id = cpu_index(ci);
 		c = &solaris_cpu[id];
 		if (c->cpu_cyclic == NULL)
 			continue;
@@ -1379,6 +1413,7 @@ cyclic_unload(void)
 
 SYSUNINIT(cyclic_unregister, SI_SUB_CYCLIC, SI_ORDER_SECOND, cyclic_unload, NULL);
 
+#ifdef __FreeBSD__
 /* ARGSUSED */
 static int
 cyclic_modevent(module_t mod __unused, int type, void *data __unused)
@@ -1406,3 +1441,24 @@ cyclic_modevent(module_t mod __unused, i
 DEV_MODULE(cyclic, cyclic_modevent, NULL);
 MODULE_VERSION(cyclic, 1);
 MODULE_DEPEND(cyclic, opensolaris, 1, 1, 1);
+#endif
+
+#ifdef __NetBSD__
+static int
+cyclic_modcmd(modcmd_t cmd, void *data)
+{
+	switch (cmd) {
+	case MODULE_CMD_INIT:
+		cyclic_load(NULL);
+		return 0;
+
+	case MODULE_CMD_FINI:
+		cyclic_unload();
+		return 0;
+	default:
+		return ENOTTY;
+	}
+}
+
+MODULE(MODULE_CLASS_MISC, cyclic, "dtrace");
+#endif

Index: src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c
diff -u src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c:1.3 src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c:1.4
--- src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c:1.3	Sun Dec  2 00:05:38 2012
+++ src/external/cddl/osnet/dev/cyclic/i386/cyclic_machdep.c	Sun Dec  2 01:05:16 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cyclic_machdep.c,v 1.3 2012/12/02 00:05:38 chs Exp $	*/
+/*	$NetBSD: cyclic_machdep.c,v 1.4 2012/12/02 01:05:16 chs Exp $	*/
 
 /*-
  * Copyright 2006-2008 John Birrell <j...@freebsd.org>
@@ -60,6 +60,9 @@ cyclic_machdep_init(void)
 {
 	/* Register the cyclic backend. */
 	cyclic_init(&be);
+#ifdef __NetBSD__
+	cyclic_ap_start(NULL);
+#endif
 }
 
 static void
@@ -82,11 +85,11 @@ static hrtime_t exp_due[MAXCPU];
  * initialiser as the callback for high speed timer events.
  */
 static void
-cyclic_clock(struct trapframe *frame)
+cyclic_clock(struct clockframe *frame)
 {
-	cpu_t *c = &solaris_cpu[curcpu];
+	cpu_t *c = &solaris_cpu[cpu_number()];
 
-	if (c->cpu_cyclic != NULL && gethrtime() >= exp_due[curcpu]) {
+	if (c->cpu_cyclic != NULL && gethrtime() >= exp_due[cpu_number()]) {
 		if (TRAPF_USERMODE(frame)) {
 			c->cpu_profile_pc = 0;
 			c->cpu_profile_upc = TRAPF_PC(frame);
@@ -107,23 +110,39 @@ cyclic_clock(struct trapframe *frame)
 static void enable(cyb_arg_t arg)
 {
 	/* Register the cyclic clock callback function. */
-	cyclic_clock_func[curcpu] = cyclic_clock;
+	cyclic_clock_func[cpu_number()] = cyclic_clock;
 }
 
 static void disable(cyb_arg_t arg)
 {
 	/* Reset the cyclic clock callback function. */
-	cyclic_clock_func[curcpu] = NULL;
+	cyclic_clock_func[cpu_number()] = NULL;
 }
 
 static void reprogram(cyb_arg_t arg, hrtime_t exp)
 {
-	exp_due[curcpu] = exp;
+	exp_due[cpu_number()] = exp;
 }
 
+#ifdef __NetBSD__
+static void xcall_func(void *arg0, void *arg1)
+{
+	cyc_func_t func;
+
+	func = arg0;
+	(*func)(arg1);
+}
+#endif
+
 static void xcall(cyb_arg_t arg, cpu_t *c, cyc_func_t func, void *param)
 {
+#ifdef __NetBSD__
+	uint64_t xc;
 
+	xc = xc_unicast(XC_HIGHPRI, xcall_func, func, param, cpu_lookup(c->cpuid));
+	xc_wait(xc);
+#else
 	smp_rendezvous_cpus((cpumask_t) (1 << c->cpuid),
 	    smp_no_rendevous_barrier, func, smp_no_rendevous_barrier, param);
+#endif
 }

Index: src/external/cddl/osnet/sys/sys/cyclic_impl.h
diff -u src/external/cddl/osnet/sys/sys/cyclic_impl.h:1.3 src/external/cddl/osnet/sys/sys/cyclic_impl.h:1.4
--- src/external/cddl/osnet/sys/sys/cyclic_impl.h:1.3	Sun Dec  2 00:05:39 2012
+++ src/external/cddl/osnet/sys/sys/cyclic_impl.h	Sun Dec  2 01:05:16 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cyclic_impl.h,v 1.3 2012/12/02 00:05:39 chs Exp $	*/
+/*	$NetBSD: cyclic_impl.h,v 1.4 2012/12/02 01:05:16 chs Exp $	*/
 
 /*
  * CDDL HEADER START
@@ -269,7 +269,7 @@ typedef struct cyc_cpu {
 	cyc_index_t cyp_nelems;
 	cyc_index_t cyp_size;
 	cyc_backend_t *cyp_backend;
-	struct mtx cyp_mtx;
+	kmutex_t cyp_mtx;
 } cyc_cpu_t;
 
 typedef struct cyc_omni_cpu {

Index: src/sys/kern/kern_clock.c
diff -u src/sys/kern/kern_clock.c:1.130 src/sys/kern/kern_clock.c:1.131
--- src/sys/kern/kern_clock.c:1.130	Sun Oct 30 01:57:40 2011
+++ src/sys/kern/kern_clock.c	Sun Dec  2 01:05:16 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_clock.c,v 1.130 2011/10/30 01:57:40 christos Exp $	*/
+/*	$NetBSD: kern_clock.c,v 1.131 2012/12/02 01:05:16 chs Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2004, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -69,8 +69,9 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_clock.c,v 1.130 2011/10/30 01:57:40 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_clock.c,v 1.131 2012/12/02 01:05:16 chs Exp $");
 
+#include "opt_dtrace.h"
 #include "opt_ntp.h"
 #include "opt_perfctrs.h"
 
@@ -93,6 +94,13 @@ __KERNEL_RCSID(0, "$NetBSD: kern_clock.c
 #include <sys/gmon.h>
 #endif
 
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+#include <sys/cpu.h>
+
+cyclic_clock_func_t	cyclic_clock_func[MAXCPUS];
+#endif
+
 /*
  * Clock handling routines.
  *
@@ -225,6 +233,13 @@ hardclock(struct clockframe *frame)
 	 * Update real-time timeout queue.
 	 */
 	callout_hardclock();
+
+#ifdef KDTRACE_HOOKS
+	cyclic_clock_func_t func = cyclic_clock_func[cpu_index(ci)];
+	if (func) {
+		(*func)((struct clockframe *)frame);
+	}
+#endif
 }
 
 /*

Index: src/sys/modules/Makefile
diff -u src/sys/modules/Makefile:1.115 src/sys/modules/Makefile:1.116
--- src/sys/modules/Makefile:1.115	Tue Nov  6 07:59:09 2012
+++ src/sys/modules/Makefile	Sun Dec  2 01:05:16 2012
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.115 2012/11/06 07:59:09 alnsn Exp $
+#	$NetBSD: Makefile,v 1.116 2012/12/02 01:05:16 chs Exp $
 
 .include <bsd.own.mk>
 
@@ -241,6 +241,7 @@ SUBDIR+= 	dm
 .endif
 
 .if (${MKDTRACE} != "no")
+SUBDIR+=	cyclic
 SUBDIR+=	dtrace
 .endif
 

Index: src/sys/modules/dtrace/Makefile
diff -u src/sys/modules/dtrace/Makefile:1.3 src/sys/modules/dtrace/Makefile:1.4
--- src/sys/modules/dtrace/Makefile:1.3	Fri Mar 12 21:53:16 2010
+++ src/sys/modules/dtrace/Makefile	Sun Dec  2 01:05:17 2012
@@ -1,8 +1,8 @@
-#	$NetBSD: Makefile,v 1.3 2010/03/12 21:53:16 darran Exp $
+#	$NetBSD: Makefile,v 1.4 2012/12/02 01:05:17 chs Exp $
 # $FreeBSD: src/sys/modules/dtrace/Makefile,v 1.6.2.1 2009/08/03 08:13:06 kensmith Exp $
 
 .include <bsd.own.mk>
 
-SUBDIR=		dtrace sdt fbt
+SUBDIR=		dtrace sdt fbt profile
 
 .include <bsd.subdir.mk>

Index: src/sys/sys/dtrace_bsd.h
diff -u src/sys/sys/dtrace_bsd.h:1.6 src/sys/sys/dtrace_bsd.h:1.7
--- src/sys/sys/dtrace_bsd.h:1.6	Sun Dec  2 00:05:38 2012
+++ src/sys/sys/dtrace_bsd.h	Sun Dec  2 01:05:16 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: dtrace_bsd.h,v 1.6 2012/12/02 00:05:38 chs Exp $	*/
+/*	$NetBSD: dtrace_bsd.h,v 1.7 2012/12/02 01:05:16 chs Exp $	*/
 
 /*-
  * Copyright (c) 2007-2008 John Birrell (j...@freebsd.org)
@@ -55,15 +55,8 @@ struct ucred;
  * Cyclic clock function type definition used to hook the cyclic
  * subsystem into the appropriate timer interrupt.
  */
-typedef	void (*cyclic_clock_func_t)(struct trapframe *);
-
-/*
- * These external variables are actually machine-dependent, so
- * they might not actually exist.
- *
- * Defining them here avoids a proliferation of header files.
- */
-extern cyclic_clock_func_t     cyclic_clock_func[];
+typedef	void (*cyclic_clock_func_t)(struct clockframe *);
+extern cyclic_clock_func_t	cyclic_clock_func[];
 
 /*
  * The dtrace module handles traps that occur during a DTrace probe.

Added files:

Index: src/sys/modules/cyclic/Makefile
diff -u /dev/null src/sys/modules/cyclic/Makefile:1.1
--- /dev/null	Sun Dec  2 01:05:17 2012
+++ src/sys/modules/cyclic/Makefile	Sun Dec  2 01:05:16 2012
@@ -0,0 +1,16 @@
+# $FreeBSD: src/sys/modules/dtrace/sdt/Makefile,v 1.1.4.1 2009/08/03 08:13:06 kensmith Exp $
+
+.include "../../Makefile.inc"
+
+.PATH: ${NETBSDSRCDIR}/external/cddl/osnet/dev/cyclic
+
+KMOD=		cyclic
+SRCS=		cyclic.c
+
+CPPFLAGS+=	-I${NETBSDSRCDIR}/external/cddl/osnet/sys \
+		-I${NETBSDSRCDIR}/external/cddl/osnet/dev/cyclic/${MACHINE:S/amd64/i386/} \
+		-I${NETBSDSRCDIR}/external/cddl/osnet/dist/uts/common
+
+CPPFLAGS+=	-Wno-unknown-pragmas -Wno-cast-qual
+
+.include <bsd.kmodule.mk>

Index: src/sys/modules/dtrace/profile/Makefile
diff -u /dev/null src/sys/modules/dtrace/profile/Makefile:1.1
--- /dev/null	Sun Dec  2 01:05:17 2012
+++ src/sys/modules/dtrace/profile/Makefile	Sun Dec  2 01:05:17 2012
@@ -0,0 +1,16 @@
+# $NetBSD: Makefile,v 1.1 2012/12/02 01:05:17 chs Exp $
+
+.include "../../Makefile.inc"
+
+.PATH: ${NETBSDSRCDIR}/external/cddl/osnet/dev/profile
+
+KMOD=		profile
+SRCS=		profile.c
+
+CPPFLAGS+=	-I${NETBSDSRCDIR}/external/cddl/osnet/sys \
+		-I${NETBSDSRCDIR}/external/cddl/osnet/dev/profile \
+		-I${NETBSDSRCDIR}/external/cddl/osnet/dist/uts/common
+
+CPPFLAGS+=	-Wno-unknown-pragmas -Wno-cast-qual
+
+.include <bsd.kmodule.mk>

Reply via email to