1*86d7f5d3SJohn Marino /* $KAME: altq_rmclass_debug.h,v 1.3 2002/11/29 04:36:24 kjc Exp $ */ 2*86d7f5d3SJohn Marino /* $DragonFly: src/sys/net/altq/altq_rmclass_debug.h,v 1.3 2005/06/03 18:20:36 swildner Exp $ */ 3*86d7f5d3SJohn Marino 4*86d7f5d3SJohn Marino /* 5*86d7f5d3SJohn Marino * Copyright (c) Sun Microsystems, Inc. 1998 All rights reserved. 6*86d7f5d3SJohn Marino * 7*86d7f5d3SJohn Marino * Redistribution and use in source and binary forms, with or without 8*86d7f5d3SJohn Marino * modification, are permitted provided that the following conditions 9*86d7f5d3SJohn Marino * are met: 10*86d7f5d3SJohn Marino * 11*86d7f5d3SJohn Marino * 1. Redistributions of source code must retain the above copyright 12*86d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer. 13*86d7f5d3SJohn Marino * 14*86d7f5d3SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 15*86d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer in the 16*86d7f5d3SJohn Marino * documentation and/or other materials provided with the distribution. 17*86d7f5d3SJohn Marino * 18*86d7f5d3SJohn Marino * 3. All advertising materials mentioning features or use of this software 19*86d7f5d3SJohn Marino * must display the following acknowledgement: 20*86d7f5d3SJohn Marino * This product includes software developed by the SMCC Technology 21*86d7f5d3SJohn Marino * Development Group at Sun Microsystems, Inc. 22*86d7f5d3SJohn Marino * 23*86d7f5d3SJohn Marino * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or 24*86d7f5d3SJohn Marino * promote products derived from this software without specific prior 25*86d7f5d3SJohn Marino * written permission. 26*86d7f5d3SJohn Marino * 27*86d7f5d3SJohn Marino * SUN MICROSYSTEMS DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE OR THE 28*86d7f5d3SJohn Marino * SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The software is 29*86d7f5d3SJohn Marino * provided "as is" without express or implied warranty of any kind. 30*86d7f5d3SJohn Marino * 31*86d7f5d3SJohn Marino * These notices must be retained in any copies of any part of this software. 32*86d7f5d3SJohn Marino */ 33*86d7f5d3SJohn Marino 34*86d7f5d3SJohn Marino #ifndef _ALTQ_ALTQ_RMCLASS_DEBUG_H_ 35*86d7f5d3SJohn Marino #define _ALTQ_ALTQ_RMCLASS_DEBUG_H_ 36*86d7f5d3SJohn Marino 37*86d7f5d3SJohn Marino #ifdef _KERNEL 38*86d7f5d3SJohn Marino #include <sys/thread2.h> 39*86d7f5d3SJohn Marino #endif 40*86d7f5d3SJohn Marino 41*86d7f5d3SJohn Marino /* #pragma ident "@(#)rm_class_debug.h 1.7 98/05/04 SMI" */ 42*86d7f5d3SJohn Marino 43*86d7f5d3SJohn Marino /* 44*86d7f5d3SJohn Marino * Cbq debugging macros 45*86d7f5d3SJohn Marino */ 46*86d7f5d3SJohn Marino 47*86d7f5d3SJohn Marino #ifdef CBQ_TRACE 48*86d7f5d3SJohn Marino #ifndef NCBQTRACE 49*86d7f5d3SJohn Marino #define NCBQTRACE (16 * 1024) 50*86d7f5d3SJohn Marino #endif 51*86d7f5d3SJohn Marino 52*86d7f5d3SJohn Marino /* 53*86d7f5d3SJohn Marino * To view the trace output, using adb, type: 54*86d7f5d3SJohn Marino * adb -k /dev/ksyms /dev/mem <cr>, then type 55*86d7f5d3SJohn Marino * cbqtrace_count/D to get the count, then type 56*86d7f5d3SJohn Marino * cbqtrace_buffer,0tcount/Dp4C" "Xn 57*86d7f5d3SJohn Marino * This will dump the trace buffer from 0 to count. 58*86d7f5d3SJohn Marino */ 59*86d7f5d3SJohn Marino /* 60*86d7f5d3SJohn Marino * in ALTQ, "call cbqtrace_dump(N)" from DDB to display 20 events 61*86d7f5d3SJohn Marino * from Nth event in the circular buffer. 62*86d7f5d3SJohn Marino */ 63*86d7f5d3SJohn Marino 64*86d7f5d3SJohn Marino struct cbqtrace { 65*86d7f5d3SJohn Marino int count; 66*86d7f5d3SJohn Marino int function; /* address of function */ 67*86d7f5d3SJohn Marino int trace_action; /* descriptive 4 characters */ 68*86d7f5d3SJohn Marino int object; /* object operated on */ 69*86d7f5d3SJohn Marino }; 70*86d7f5d3SJohn Marino 71*86d7f5d3SJohn Marino #define CBQTRACEINIT() { \ 72*86d7f5d3SJohn Marino if (cbqtrace_ptr == NULL) \ 73*86d7f5d3SJohn Marino cbqtrace_ptr = cbqtrace_buffer; \ 74*86d7f5d3SJohn Marino else { \ 75*86d7f5d3SJohn Marino cbqtrace_ptr = cbqtrace_buffer; \ 76*86d7f5d3SJohn Marino bzero((void *)cbqtrace_ptr, sizeof(cbqtrace_buffer)); \ 77*86d7f5d3SJohn Marino cbqtrace_count = 0; \ 78*86d7f5d3SJohn Marino } \ 79*86d7f5d3SJohn Marino } 80*86d7f5d3SJohn Marino 81*86d7f5d3SJohn Marino #define LOCK_TRACE() crit_enter(); 82*86d7f5d3SJohn Marino #define UNLOCK_TRACE() crit_exit(); 83*86d7f5d3SJohn Marino 84*86d7f5d3SJohn Marino #define CBQTRACE(func, act, obj) { \ 85*86d7f5d3SJohn Marino LOCK_TRACE(); \ 86*86d7f5d3SJohn Marino int *_p = &cbqtrace_ptr->count; \ 87*86d7f5d3SJohn Marino *_p++ = ++cbqtrace_count; \ 88*86d7f5d3SJohn Marino *_p++ = (int)(func); \ 89*86d7f5d3SJohn Marino *_p++ = (int)(act); \ 90*86d7f5d3SJohn Marino *_p++ = (int)(obj); \ 91*86d7f5d3SJohn Marino if ((struct cbqtrace *)(void *)_p >= &cbqtrace_buffer[NCBQTRACE])\ 92*86d7f5d3SJohn Marino cbqtrace_ptr = cbqtrace_buffer; \ 93*86d7f5d3SJohn Marino else \ 94*86d7f5d3SJohn Marino cbqtrace_ptr = (struct cbqtrace *)(void *)_p; \ 95*86d7f5d3SJohn Marino UNLOCK_TRACE(); \ 96*86d7f5d3SJohn Marino } 97*86d7f5d3SJohn Marino #else 98*86d7f5d3SJohn Marino 99*86d7f5d3SJohn Marino /* If no tracing, define no-ops */ 100*86d7f5d3SJohn Marino #define CBQTRACEINIT() 101*86d7f5d3SJohn Marino #define CBQTRACE(a, b, c) 102*86d7f5d3SJohn Marino 103*86d7f5d3SJohn Marino #endif /* !CBQ_TRACE */ 104*86d7f5d3SJohn Marino 105*86d7f5d3SJohn Marino #endif /* _ALTQ_ALTQ_RMCLASS_DEBUG_H_ */ 106