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>