kern_dtrace.c revision 179090
1179090Sjb/*- 2179090Sjb * Copyright (c) 2007-2008 John Birrell <jb@FreeBSD.org> 3179090Sjb * All rights reserved. 4179090Sjb * 5179090Sjb * Redistribution and use in source and binary forms, with or without 6179090Sjb * modification, are permitted provided that the following conditions 7179090Sjb * are met: 8179090Sjb * 1. Redistributions of source code must retain the above copyright 9179090Sjb * notice, this list of conditions and the following disclaimer. 10179090Sjb * 2. Redistributions in binary form must reproduce the above copyright 11179090Sjb * notice, this list of conditions and the following disclaimer in the 12179090Sjb * documentation and/or other materials provided with the distribution. 13179090Sjb * 14179090Sjb * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15179090Sjb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16179090Sjb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17179090Sjb * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18179090Sjb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19179090Sjb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20179090Sjb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21179090Sjb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22179090Sjb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23179090Sjb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24179090Sjb * SUCH DAMAGE. 25179090Sjb */ 26179090Sjb 27179090Sjb#include <sys/cdefs.h> 28179090Sjb__FBSDID("$FreeBSD: head/sys/kern/kern_dtrace.c 179090 2008-05-18 19:43:52Z jb $"); 29179090Sjb 30179090Sjb#include "opt_kdb.h" 31179090Sjb 32179090Sjb#include <sys/param.h> 33179090Sjb#include <sys/systm.h> 34179090Sjb#include <sys/eventhandler.h> 35179090Sjb#include <sys/kdb.h> 36179090Sjb#include <sys/kernel.h> 37179090Sjb#include <sys/malloc.h> 38179090Sjb#include <sys/proc.h> 39179090Sjb#include <sys/dtrace_bsd.h> 40179090Sjb 41179090Sjb#define KDTRACE_PROC_SIZE 64 42179090Sjb#define KDTRACE_PROC_ZERO 8 43179090Sjb#define KDTRACE_THREAD_SIZE 256 44179090Sjb#define KDTRACE_THREAD_ZERO 64 45179090Sjb 46179090SjbMALLOC_DEFINE(M_KDTRACE, "kdtrace", "DTrace hooks"); 47179090Sjb 48179090Sjb/* Return the DTrace process data size compiled in the kernel hooks. */ 49179090Sjbsize_t 50179090Sjbkdtrace_proc_size() 51179090Sjb{ 52179090Sjb return(KDTRACE_PROC_SIZE); 53179090Sjb} 54179090Sjb 55179090Sjbstatic void 56179090Sjbkdtrace_proc_ctor(void *arg __unused, struct proc *p) 57179090Sjb{ 58179090Sjb p->p_dtrace = malloc(KDTRACE_PROC_SIZE, M_KDTRACE, M_WAITOK); 59179090Sjb 60179090Sjb bzero(p->p_dtrace, KDTRACE_PROC_ZERO); 61179090Sjb} 62179090Sjb 63179090Sjbstatic void 64179090Sjbkdtrace_proc_dtor(void *arg __unused, struct proc *p) 65179090Sjb{ 66179090Sjb if (p->p_dtrace != NULL) { 67179090Sjb free(p->p_dtrace, M_KDTRACE); 68179090Sjb p->p_dtrace = NULL; 69179090Sjb } 70179090Sjb} 71179090Sjb 72179090Sjb/* Return the DTrace thread data size compiled in the kernel hooks. */ 73179090Sjbsize_t 74179090Sjbkdtrace_thread_size() 75179090Sjb{ 76179090Sjb return(KDTRACE_THREAD_SIZE); 77179090Sjb} 78179090Sjb 79179090Sjbstatic void 80179090Sjbkdtrace_thread_ctor(void *arg __unused, struct thread *td) 81179090Sjb{ 82179090Sjb td->td_dtrace = malloc(KDTRACE_THREAD_SIZE, M_KDTRACE, M_WAITOK); 83179090Sjb 84179090Sjb bzero(td->td_dtrace, KDTRACE_THREAD_ZERO); 85179090Sjb} 86179090Sjb 87179090Sjbstatic void 88179090Sjbkdtrace_thread_dtor(void *arg __unused, struct thread *td) 89179090Sjb{ 90179090Sjb if (td->td_dtrace != NULL) { 91179090Sjb free(td->td_dtrace, M_KDTRACE); 92179090Sjb td->td_dtrace = NULL; 93179090Sjb } 94179090Sjb} 95179090Sjb 96179090Sjb/* 97179090Sjb * Initialise the kernel DTrace hooks. 98179090Sjb */ 99179090Sjbstatic void 100179090Sjbinit_dtrace(void *dummy __unused) 101179090Sjb{ 102179090Sjb EVENTHANDLER_REGISTER(process_ctor, kdtrace_proc_ctor, NULL, EVENTHANDLER_PRI_ANY); 103179090Sjb EVENTHANDLER_REGISTER(process_dtor, kdtrace_proc_dtor, NULL, EVENTHANDLER_PRI_ANY); 104179090Sjb EVENTHANDLER_REGISTER(thread_ctor, kdtrace_thread_ctor, NULL, EVENTHANDLER_PRI_ANY); 105179090Sjb EVENTHANDLER_REGISTER(thread_dtor, kdtrace_thread_dtor, NULL, EVENTHANDLER_PRI_ANY); 106179090Sjb} 107179090Sjb 108179090SjbSYSINIT(kdtrace, SI_SUB_KDTRACE, SI_ORDER_FIRST, init_dtrace, NULL); 109179090Sjb 110179090Sjb#ifndef KDB 111179090Sjb/* 112179090Sjb * This is a stub for the kernel debugger for the DTrace actions to call 113179090Sjb * when the kernel has been built without KDB. 114179090Sjb */ 115179090Sjbvoid 116179090Sjbkdb_enter(const char *why, const char *msg) 117179090Sjb{ 118179090Sjb printf("Cannot enter kernel debugger - No KDB in kernel.\n%s - %s\n", why, msg); 119179090Sjb} 120179090Sjb#endif 121