1/* 2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28/* 29 * @OSF_COPYRIGHT@ 30 */ 31/* 32 * HISTORY 33 * 34 * Revision 1.1.1.1 1998/09/22 21:05:48 wsanchez 35 * Import of Mac OS X kernel (~semeria) 36 * 37 * Revision 1.1.1.1 1998/03/07 02:26:09 wsanchez 38 * Import of OSF Mach kernel (~mburg) 39 * 40 * Revision 1.1.11.1 1997/03/27 18:47:01 barbou 41 * Merge smp_shared merges into mainline. 42 * [1996/09/19 13:55:17 addis] 43 * Make tr_indent NCPU safe. 44 * [95/10/09 rwd] 45 * Added TR_INIT() macro. 46 * Change from NMK16.1 [93/09/22 paire] 47 * [94/02/04 paire] 48 * [97/02/25 barbou] 49 * 50 * Revision 1.1.6.1 1995/02/23 16:34:23 alanl 51 * Taken from DIPC2_SHARED. Change to !FREE Copyright. 52 * [95/01/05 rwd] 53 * 54 * Revision 1.1.4.4 1994/08/18 01:07:26 alanl 55 * + Allow tracing strictly based on MACH_TR; 56 * don't also require MACH_ASSERT (alanl). 57 * + ANSI-fication: cast tr arguments (alanl). 58 * + Added tr_indent and macros to use it (sjs). 59 * [1994/08/18 01:06:09 alanl] 60 * 61 * Revision 1.1.4.3 1994/08/08 17:59:35 rwd 62 * Include mach_tr.h 63 * [94/08/08 rwd] 64 * 65 * Revision 1.1.4.2 1994/08/05 19:36:08 mmp 66 * Added prototype for db_show_tr. 67 * 68 * Conditionalize on MACH_TR 69 * [94/07/20 rwd] 70 * 71 * Revision 1.1.4.1 1994/08/04 01:43:04 mmp 72 * DIPC: moved from norma/ to ddb/. Updated includes. 73 * [1994/08/03 13:37:46 mmp] 74 * 75 * Revision 1.1.9.1 1994/03/07 16:55:24 paire 76 * Added ANSI prototypes. 77 * [94/02/15 paire] 78 * 79 * Added TR_INIT() macro. 80 * Change from NMK16.1 [93/09/22 paire] 81 * [94/02/04 paire] 82 * 83 * Revision 1.1.2.2 1993/06/02 23:57:10 jeffc 84 * Added to OSF/1 R1.3 from NMK15.0. 85 * [1993/06/02 21:22:08 jeffc] 86 * 87 * Revision 1.1 1992/09/30 02:34:09 robert 88 * Initial revision 89 * 90 * $EndLog$ 91 */ 92 93/* 94 * File: ddb/tr.h 95 * Author: Alan Langerman, Jeffrey Heller 96 * Date: 1992 97 * 98 * Internal trace routines. Like old-style XPRs but 99 * less formatting. 100 */ 101 102#include <mach_assert.h> 103#include <mach_tr.h> 104 105#include <kern/cpu_number.h> 106 107/* 108 * Originally, we only wanted tracing when 109 * MACH_TR and MACH_ASSERT were turned on 110 * together. Now, there's no reason why 111 * MACH_TR and MACH_ASSERT can't be completely 112 * orthogonal. 113 */ 114#define TRACE_BUFFER (MACH_TR) 115 116/* 117 * Log events in a circular trace buffer for future debugging. 118 * Events are unsigned integers. Each event has a descriptive 119 * message. 120 * 121 * TR_DECL must be used at the beginning of a routine using 122 * one of the tr calls. The macro should be passed the name 123 * of the function surrounded by quotation marks, e.g., 124 * TR_DECL("netipc_recv_intr"); 125 * and should be terminated with a semi-colon. The TR_DECL 126 * must be the *last* declaration in the variable declaration 127 * list, or syntax errors will be introduced when TRACE_BUFFER 128 * is turned off. 129 */ 130#ifndef _DDB_TR_H_ 131#define _DDB_TR_H_ 132 133#if TRACE_BUFFER 134 135#include <machine/db_machdep.h> 136 137#define __ui__ (unsigned int) 138#define TR_INIT() tr_init() 139#define TR_SHOW(a,b,c) show_tr((a),(b),(c)) 140#define TR_DECL(funcname) char *__ntr_func_name__ = funcname 141#define tr1(msg) \ 142 tr(__ntr_func_name__, __FILE__, __LINE__, (msg), \ 143 0,0,0,0) 144#define tr2(msg,tag1) \ 145 tr(__ntr_func_name__, __FILE__, __LINE__, (msg), \ 146 __ui__(tag1),0,0,0) 147#define tr3(msg,tag1,tag2) \ 148 tr(__ntr_func_name__, __FILE__, __LINE__, (msg), \ 149 __ui__(tag1),__ui__(tag2),0,0) 150#define tr4(msg,tag1,tag2,tag3) \ 151 tr(__ntr_func_name__, __FILE__, __LINE__, (msg), \ 152 __ui__(tag1),__ui__(tag2),__ui__(tag3),0) 153#define tr5(msg,tag1,tag2,tag3,tag4) \ 154 tr(__ntr_func_name__, __FILE__, __LINE__, (msg), \ 155 __ui__(tag1),__ui__(tag2),__ui__(tag3),__ui__(tag4)) 156 157/* 158 * Adjust tr log indentation based on function 159 * call graph. 160 */ 161#if NCPUS == 1 162extern int tr_indent; 163#define tr_start() tr_indent++ 164#define tr_stop() tr_indent-- 165#else /* NCPUS == 1 */ 166extern int tr_indent[NCPUS]; 167#define tr_start() tr_indent[cpu_number()]++ 168#define tr_stop() (--tr_indent[cpu_number()]<0?tr_indent[cpu_number()]=0:0); 169#endif /* NCPUS == 1 */ 170 171extern void tr_init(void); 172extern void tr( 173 char *funcname, 174 char *file, 175 unsigned int lineno, 176 char *fmt, 177 unsigned int tag1, 178 unsigned int tag2, 179 unsigned int tag3, 180 unsigned int tag4); 181 182extern void db_show_tr( 183 db_expr_t addr, 184 boolean_t have_addr, 185 db_expr_t count, 186 char * modif); 187 188#else /* TRACE_BUFFER */ 189 190#define TR_INIT() 191#define TR_SHOW(a,b,c) 192#define TR_DECL(funcname) 193#define tr1(msg) 194#define tr2(msg, tag1) 195#define tr3(msg, tag1, tag2) 196#define tr4(msg, tag1, tag2, tag3) 197#define tr5(msg, tag1, tag2, tag3, tag4) 198#define tr_start() 199#define tr_stop() 200 201#endif /* TRACE_BUFFER */ 202 203#endif /* _DDB_TR_H_ */ 204