186d7f5d3SJohn Marino /* $KAME: altq_rmclass_debug.h,v 1.3 2002/11/29 04:36:24 kjc Exp $ */ 286d7f5d3SJohn Marino /* $DragonFly: src/sys/net/altq/altq_rmclass_debug.h,v 1.3 2005/06/03 18:20:36 swildner Exp $ */ 386d7f5d3SJohn Marino 486d7f5d3SJohn Marino /* 586d7f5d3SJohn Marino * Copyright (c) Sun Microsystems, Inc. 1998 All rights reserved. 686d7f5d3SJohn Marino * 786d7f5d3SJohn Marino * Redistribution and use in source and binary forms, with or without 886d7f5d3SJohn Marino * modification, are permitted provided that the following conditions 986d7f5d3SJohn Marino * are met: 1086d7f5d3SJohn Marino * 1186d7f5d3SJohn Marino * 1. Redistributions of source code must retain the above copyright 1286d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer. 1386d7f5d3SJohn Marino * 1486d7f5d3SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright 1586d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer in the 1686d7f5d3SJohn Marino * documentation and/or other materials provided with the distribution. 1786d7f5d3SJohn Marino * 1886d7f5d3SJohn Marino * 3. All advertising materials mentioning features or use of this software 1986d7f5d3SJohn Marino * must display the following acknowledgement: 2086d7f5d3SJohn Marino * This product includes software developed by the SMCC Technology 2186d7f5d3SJohn Marino * Development Group at Sun Microsystems, Inc. 2286d7f5d3SJohn Marino * 2386d7f5d3SJohn Marino * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or 2486d7f5d3SJohn Marino * promote products derived from this software without specific prior 2586d7f5d3SJohn Marino * written permission. 2686d7f5d3SJohn Marino * 2786d7f5d3SJohn Marino * SUN MICROSYSTEMS DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE OR THE 2886d7f5d3SJohn Marino * SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The software is 2986d7f5d3SJohn Marino * provided "as is" without express or implied warranty of any kind. 3086d7f5d3SJohn Marino * 3186d7f5d3SJohn Marino * These notices must be retained in any copies of any part of this software. 3286d7f5d3SJohn Marino */ 3386d7f5d3SJohn Marino 3486d7f5d3SJohn Marino #ifndef _ALTQ_ALTQ_RMCLASS_DEBUG_H_ 3586d7f5d3SJohn Marino #define _ALTQ_ALTQ_RMCLASS_DEBUG_H_ 3686d7f5d3SJohn Marino 3786d7f5d3SJohn Marino #ifdef _KERNEL 3886d7f5d3SJohn Marino #include <sys/thread2.h> 3986d7f5d3SJohn Marino #endif 4086d7f5d3SJohn Marino 4186d7f5d3SJohn Marino /* #pragma ident "@(#)rm_class_debug.h 1.7 98/05/04 SMI" */ 4286d7f5d3SJohn Marino 4386d7f5d3SJohn Marino /* 4486d7f5d3SJohn Marino * Cbq debugging macros 4586d7f5d3SJohn Marino */ 4686d7f5d3SJohn Marino 4786d7f5d3SJohn Marino #ifdef CBQ_TRACE 4886d7f5d3SJohn Marino #ifndef NCBQTRACE 4986d7f5d3SJohn Marino #define NCBQTRACE (16 * 1024) 5086d7f5d3SJohn Marino #endif 5186d7f5d3SJohn Marino 5286d7f5d3SJohn Marino /* 5386d7f5d3SJohn Marino * To view the trace output, using adb, type: 5486d7f5d3SJohn Marino * adb -k /dev/ksyms /dev/mem <cr>, then type 5586d7f5d3SJohn Marino * cbqtrace_count/D to get the count, then type 5686d7f5d3SJohn Marino * cbqtrace_buffer,0tcount/Dp4C" "Xn 5786d7f5d3SJohn Marino * This will dump the trace buffer from 0 to count. 5886d7f5d3SJohn Marino */ 5986d7f5d3SJohn Marino /* 6086d7f5d3SJohn Marino * in ALTQ, "call cbqtrace_dump(N)" from DDB to display 20 events 6186d7f5d3SJohn Marino * from Nth event in the circular buffer. 6286d7f5d3SJohn Marino */ 6386d7f5d3SJohn Marino 6486d7f5d3SJohn Marino struct cbqtrace { 6586d7f5d3SJohn Marino int count; 6686d7f5d3SJohn Marino int function; /* address of function */ 6786d7f5d3SJohn Marino int trace_action; /* descriptive 4 characters */ 6886d7f5d3SJohn Marino int object; /* object operated on */ 6986d7f5d3SJohn Marino }; 7086d7f5d3SJohn Marino 7186d7f5d3SJohn Marino #define CBQTRACEINIT() { \ 7286d7f5d3SJohn Marino if (cbqtrace_ptr == NULL) \ 7386d7f5d3SJohn Marino cbqtrace_ptr = cbqtrace_buffer; \ 7486d7f5d3SJohn Marino else { \ 7586d7f5d3SJohn Marino cbqtrace_ptr = cbqtrace_buffer; \ 7686d7f5d3SJohn Marino bzero((void *)cbqtrace_ptr, sizeof(cbqtrace_buffer)); \ 7786d7f5d3SJohn Marino cbqtrace_count = 0; \ 7886d7f5d3SJohn Marino } \ 7986d7f5d3SJohn Marino } 8086d7f5d3SJohn Marino 8186d7f5d3SJohn Marino #define LOCK_TRACE() crit_enter(); 8286d7f5d3SJohn Marino #define UNLOCK_TRACE() crit_exit(); 8386d7f5d3SJohn Marino 8486d7f5d3SJohn Marino #define CBQTRACE(func, act, obj) { \ 8586d7f5d3SJohn Marino LOCK_TRACE(); \ 8686d7f5d3SJohn Marino int *_p = &cbqtrace_ptr->count; \ 8786d7f5d3SJohn Marino *_p++ = ++cbqtrace_count; \ 8886d7f5d3SJohn Marino *_p++ = (int)(func); \ 8986d7f5d3SJohn Marino *_p++ = (int)(act); \ 9086d7f5d3SJohn Marino *_p++ = (int)(obj); \ 9186d7f5d3SJohn Marino if ((struct cbqtrace *)(void *)_p >= &cbqtrace_buffer[NCBQTRACE])\ 9286d7f5d3SJohn Marino cbqtrace_ptr = cbqtrace_buffer; \ 9386d7f5d3SJohn Marino else \ 9486d7f5d3SJohn Marino cbqtrace_ptr = (struct cbqtrace *)(void *)_p; \ 9586d7f5d3SJohn Marino UNLOCK_TRACE(); \ 9686d7f5d3SJohn Marino } 9786d7f5d3SJohn Marino #else 9886d7f5d3SJohn Marino 9986d7f5d3SJohn Marino /* If no tracing, define no-ops */ 10086d7f5d3SJohn Marino #define CBQTRACEINIT() 10186d7f5d3SJohn Marino #define CBQTRACE(a, b, c) 10286d7f5d3SJohn Marino 10386d7f5d3SJohn Marino #endif /* !CBQ_TRACE */ 10486d7f5d3SJohn Marino 10586d7f5d3SJohn Marino #endif /* _ALTQ_ALTQ_RMCLASS_DEBUG_H_ */ 106