xref: /freebsd/contrib/ofed/opensm/include/complib/cl_debug.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
3*d6b92ffaSHans Petter Selasky  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4*d6b92ffaSHans Petter Selasky  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5*d6b92ffaSHans Petter Selasky  *
6*d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
7*d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
8*d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
9*d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
10*d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
11*d6b92ffaSHans Petter Selasky  *
12*d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
13*d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
14*d6b92ffaSHans Petter Selasky  *     conditions are met:
15*d6b92ffaSHans Petter Selasky  *
16*d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
17*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
18*d6b92ffaSHans Petter Selasky  *        disclaimer.
19*d6b92ffaSHans Petter Selasky  *
20*d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
21*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
22*d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
23*d6b92ffaSHans Petter Selasky  *        provided with the distribution.
24*d6b92ffaSHans Petter Selasky  *
25*d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26*d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27*d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28*d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29*d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30*d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31*d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32*d6b92ffaSHans Petter Selasky  * SOFTWARE.
33*d6b92ffaSHans Petter Selasky  *
34*d6b92ffaSHans Petter Selasky  */
35*d6b92ffaSHans Petter Selasky 
36*d6b92ffaSHans Petter Selasky /*
37*d6b92ffaSHans Petter Selasky  * Abstract:
38*d6b92ffaSHans Petter Selasky  *	Declaration of functions for reporting debug output.
39*d6b92ffaSHans Petter Selasky  */
40*d6b92ffaSHans Petter Selasky 
41*d6b92ffaSHans Petter Selasky #ifndef _CL_DEBUG_H_
42*d6b92ffaSHans Petter Selasky #define _CL_DEBUG_H_
43*d6b92ffaSHans Petter Selasky 
44*d6b92ffaSHans Petter Selasky #include <complib/cl_debug_osd.h>
45*d6b92ffaSHans Petter Selasky 
46*d6b92ffaSHans Petter Selasky #ifdef __cplusplus
47*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS extern "C" {
48*d6b92ffaSHans Petter Selasky #  define END_C_DECLS   }
49*d6b92ffaSHans Petter Selasky #else				/* !__cplusplus */
50*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS
51*d6b92ffaSHans Petter Selasky #  define END_C_DECLS
52*d6b92ffaSHans Petter Selasky #endif				/* __cplusplus */
53*d6b92ffaSHans Petter Selasky 
54*d6b92ffaSHans Petter Selasky BEGIN_C_DECLS
55*d6b92ffaSHans Petter Selasky /****h* Component Library/Debug Output
56*d6b92ffaSHans Petter Selasky * NAME
57*d6b92ffaSHans Petter Selasky *	Debug Output
58*d6b92ffaSHans Petter Selasky *
59*d6b92ffaSHans Petter Selasky * DESCRIPTION
60*d6b92ffaSHans Petter Selasky *	The debug output functions and macros send debug messages to the current
61*d6b92ffaSHans Petter Selasky *	debug target.
62*d6b92ffaSHans Petter Selasky *********/
63*d6b92ffaSHans Petter Selasky /****f* Component Library: Debug Output/cl_break
64*d6b92ffaSHans Petter Selasky * NAME
65*d6b92ffaSHans Petter Selasky *	cl_break
66*d6b92ffaSHans Petter Selasky *
67*d6b92ffaSHans Petter Selasky * DESCRIPTION
68*d6b92ffaSHans Petter Selasky *	The cl_break function halts execution.
69*d6b92ffaSHans Petter Selasky *
70*d6b92ffaSHans Petter Selasky * SYNOPSIS
71*d6b92ffaSHans Petter Selasky *	void
72*d6b92ffaSHans Petter Selasky *	cl_break();
73*d6b92ffaSHans Petter Selasky *
74*d6b92ffaSHans Petter Selasky * RETURN VALUE
75*d6b92ffaSHans Petter Selasky *	This function does not return a value.
76*d6b92ffaSHans Petter Selasky *
77*d6b92ffaSHans Petter Selasky * NOTES
78*d6b92ffaSHans Petter Selasky *	In a release build, cl_break has no effect.
79*d6b92ffaSHans Petter Selasky *********/
80*d6b92ffaSHans Petter Selasky /****f* Component Library: Debug Output/cl_is_debug
81*d6b92ffaSHans Petter Selasky * NAME
82*d6b92ffaSHans Petter Selasky *	cl_is_debug
83*d6b92ffaSHans Petter Selasky *
84*d6b92ffaSHans Petter Selasky * DESCRIPTION
85*d6b92ffaSHans Petter Selasky *	The cl_is_debug function returns TRUE if the complib was compiled
86*d6b92ffaSHans Petter Selasky *  in debug mode, and FALSE otherwise.
87*d6b92ffaSHans Petter Selasky *
88*d6b92ffaSHans Petter Selasky * SYNOPSIS
89*d6b92ffaSHans Petter Selasky */
90*d6b92ffaSHans Petter Selasky boolean_t cl_is_debug(void);
91*d6b92ffaSHans Petter Selasky /*
92*d6b92ffaSHans Petter Selasky * PARAMETERS
93*d6b92ffaSHans Petter Selasky *    None
94*d6b92ffaSHans Petter Selasky *
95*d6b92ffaSHans Petter Selasky * RETURN VALUE
96*d6b92ffaSHans Petter Selasky *	  TRUE if compiled in debug version. FALSE otherwise.
97*d6b92ffaSHans Petter Selasky *
98*d6b92ffaSHans Petter Selasky * NOTES
99*d6b92ffaSHans Petter Selasky *
100*d6b92ffaSHans Petter Selasky *********/
101*d6b92ffaSHans Petter Selasky 
102*d6b92ffaSHans Petter Selasky #if defined( _DEBUG_ )
103*d6b92ffaSHans Petter Selasky #ifndef cl_dbg_out
104*d6b92ffaSHans Petter Selasky /****f* Component Library: Debug Output/cl_dbg_out
105*d6b92ffaSHans Petter Selasky * NAME
106*d6b92ffaSHans Petter Selasky *	cl_dbg_out
107*d6b92ffaSHans Petter Selasky *
108*d6b92ffaSHans Petter Selasky * DESCRIPTION
109*d6b92ffaSHans Petter Selasky *	The cl_dbg_out function sends a debug message to the debug target in
110*d6b92ffaSHans Petter Selasky *	debug builds only.
111*d6b92ffaSHans Petter Selasky *
112*d6b92ffaSHans Petter Selasky * SYNOPSIS
113*d6b92ffaSHans Petter Selasky */
114*d6b92ffaSHans Petter Selasky void cl_dbg_out(IN const char *const debug_message, IN ...);
115*d6b92ffaSHans Petter Selasky /*
116*d6b92ffaSHans Petter Selasky * PARAMETERS
117*d6b92ffaSHans Petter Selasky *	debug_message
118*d6b92ffaSHans Petter Selasky *		[in] ANSI string formatted identically as for a call to the standard C
119*d6b92ffaSHans Petter Selasky *		function printf.
120*d6b92ffaSHans Petter Selasky *
121*d6b92ffaSHans Petter Selasky *	...
122*d6b92ffaSHans Petter Selasky *		[in] Extra parameters for string formatting, as defined for the
123*d6b92ffaSHans Petter Selasky *		standard C function printf.
124*d6b92ffaSHans Petter Selasky *
125*d6b92ffaSHans Petter Selasky * RETURN VALUE
126*d6b92ffaSHans Petter Selasky *	This function does not return a value.
127*d6b92ffaSHans Petter Selasky *
128*d6b92ffaSHans Petter Selasky * NOTES
129*d6b92ffaSHans Petter Selasky *	In a release build, cl_dbg_out has no effect.
130*d6b92ffaSHans Petter Selasky *
131*d6b92ffaSHans Petter Selasky *	The formatting of the debug_message string is the same as for printf
132*d6b92ffaSHans Petter Selasky *
133*d6b92ffaSHans Petter Selasky *	cl_dbg_out sends the debug message to the current debug target.
134*d6b92ffaSHans Petter Selasky *
135*d6b92ffaSHans Petter Selasky * SEE ALSO
136*d6b92ffaSHans Petter Selasky *	Debug Output, cl_msg_out
137*d6b92ffaSHans Petter Selasky *********/
138*d6b92ffaSHans Petter Selasky #endif
139*d6b92ffaSHans Petter Selasky #else
cl_dbg_out(IN const char * const debug_message,IN...)140*d6b92ffaSHans Petter Selasky static inline void cl_dbg_out(IN const char *const debug_message, IN ...)
141*d6b92ffaSHans Petter Selasky {
142*d6b92ffaSHans Petter Selasky 	UNUSED_PARAM(debug_message);
143*d6b92ffaSHans Petter Selasky }
144*d6b92ffaSHans Petter Selasky #endif				/* defined( _DEBUG_ ) */
145*d6b92ffaSHans Petter Selasky 
146*d6b92ffaSHans Petter Selasky #ifndef cl_msg_out
147*d6b92ffaSHans Petter Selasky /****f* Component Library: Debug Output/cl_msg_out
148*d6b92ffaSHans Petter Selasky * NAME
149*d6b92ffaSHans Petter Selasky *	cl_msg_out
150*d6b92ffaSHans Petter Selasky *
151*d6b92ffaSHans Petter Selasky * DESCRIPTION
152*d6b92ffaSHans Petter Selasky *	The cl_msg_out function sends a debug message to the message log target.
153*d6b92ffaSHans Petter Selasky *
154*d6b92ffaSHans Petter Selasky * SYNOPSIS
155*d6b92ffaSHans Petter Selasky */
156*d6b92ffaSHans Petter Selasky void cl_msg_out(IN const char *const message, IN ...);
157*d6b92ffaSHans Petter Selasky /*
158*d6b92ffaSHans Petter Selasky * PARAMETERS
159*d6b92ffaSHans Petter Selasky *	message
160*d6b92ffaSHans Petter Selasky *		[in] ANSI string formatted identically as for a call to the standard C
161*d6b92ffaSHans Petter Selasky *		function printf.
162*d6b92ffaSHans Petter Selasky *
163*d6b92ffaSHans Petter Selasky *	...
164*d6b92ffaSHans Petter Selasky *		[in] Extra parameters for string formatting, as defined for the
165*d6b92ffaSHans Petter Selasky *		standard C function printf.
166*d6b92ffaSHans Petter Selasky *
167*d6b92ffaSHans Petter Selasky * RETURN VALUE
168*d6b92ffaSHans Petter Selasky *	This function does not return a value.
169*d6b92ffaSHans Petter Selasky *
170*d6b92ffaSHans Petter Selasky * NOTES
171*d6b92ffaSHans Petter Selasky *	cl_msg_out is available in both debug and release builds.
172*d6b92ffaSHans Petter Selasky *
173*d6b92ffaSHans Petter Selasky *	The formatting of the message string is the same as for printf
174*d6b92ffaSHans Petter Selasky *
175*d6b92ffaSHans Petter Selasky *	cl_msg_out sends the message to the current message logging target.
176*d6b92ffaSHans Petter Selasky *
177*d6b92ffaSHans Petter Selasky * SEE ALSO
178*d6b92ffaSHans Petter Selasky *	Debug Output, cl_dbg_out
179*d6b92ffaSHans Petter Selasky *********/
180*d6b92ffaSHans Petter Selasky #endif
181*d6b92ffaSHans Petter Selasky 
182*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/Debug Levels
183*d6b92ffaSHans Petter Selasky * NAME
184*d6b92ffaSHans Petter Selasky *	Debug Levels
185*d6b92ffaSHans Petter Selasky *
186*d6b92ffaSHans Petter Selasky * DESCRIPTION
187*d6b92ffaSHans Petter Selasky *	The debug output macros reserve the upper bit of the debug level to
188*d6b92ffaSHans Petter Selasky *	convey an error.
189*d6b92ffaSHans Petter Selasky *
190*d6b92ffaSHans Petter Selasky * SYNOPSIS
191*d6b92ffaSHans Petter Selasky */
192*d6b92ffaSHans Petter Selasky #define	CL_DBG_DISABLE		0
193*d6b92ffaSHans Petter Selasky #define	CL_DBG_ERROR		0x80000000
194*d6b92ffaSHans Petter Selasky #define	CL_DBG_ALL			0xFFFFFFFF
195*d6b92ffaSHans Petter Selasky /*
196*d6b92ffaSHans Petter Selasky * VALUES
197*d6b92ffaSHans Petter Selasky *	CL_DBG_DISABLE
198*d6b92ffaSHans Petter Selasky *		Disable all debug output, including errors.
199*d6b92ffaSHans Petter Selasky *
200*d6b92ffaSHans Petter Selasky *	CL_DBG_ERROR
201*d6b92ffaSHans Petter Selasky *		Enable error debug output.
202*d6b92ffaSHans Petter Selasky *
203*d6b92ffaSHans Petter Selasky *	CL_DBG_ALL
204*d6b92ffaSHans Petter Selasky *		Enbale all debug output.
205*d6b92ffaSHans Petter Selasky *
206*d6b92ffaSHans Petter Selasky * NOTES
207*d6b92ffaSHans Petter Selasky *	Users can define custom debug levels using the lower 31 bits of their
208*d6b92ffaSHans Petter Selasky *	debug level to control non-error debug output.  Error messages are
209*d6b92ffaSHans Petter Selasky *	always displayed, regardless of the lower bit definition.
210*d6b92ffaSHans Petter Selasky *
211*d6b92ffaSHans Petter Selasky *	When specifying the debug output desired for non-error messages
212*d6b92ffaSHans Petter Selasky *	(the CHK_LVL parameter in the debug output macros), users must define
213*d6b92ffaSHans Petter Selasky *	all bits whose output they are interested in.
214*d6b92ffaSHans Petter Selasky *
215*d6b92ffaSHans Petter Selasky * SEE ALSO
216*d6b92ffaSHans Petter Selasky *	Debug Output, CL_PRINT, CL_ENTER, CL_EXIT, CL_TRACE, CL_TRACE_EXIT
217*d6b92ffaSHans Petter Selasky *********/
218*d6b92ffaSHans Petter Selasky 
219*d6b92ffaSHans Petter Selasky #if defined(_DEBUG_)
220*d6b92ffaSHans Petter Selasky 
221*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_PRINT
222*d6b92ffaSHans Petter Selasky * NAME
223*d6b92ffaSHans Petter Selasky *	CL_PRINT
224*d6b92ffaSHans Petter Selasky *
225*d6b92ffaSHans Petter Selasky * DESCRIPTION
226*d6b92ffaSHans Petter Selasky *	The CL_PRINT macro sends a string to the current debug target if
227*d6b92ffaSHans Petter Selasky *	the requested debug level matches the current debug level.
228*d6b92ffaSHans Petter Selasky *
229*d6b92ffaSHans Petter Selasky * SYNOPSIS
230*d6b92ffaSHans Petter Selasky *	CL_PRINT( DBG_LVL, CHK_LVL, STRING );
231*d6b92ffaSHans Petter Selasky *
232*d6b92ffaSHans Petter Selasky * PARAMETERS
233*d6b92ffaSHans Petter Selasky *	DBG_LVL
234*d6b92ffaSHans Petter Selasky *		[in] Debug level for the string to output
235*d6b92ffaSHans Petter Selasky *
236*d6b92ffaSHans Petter Selasky *	CHK_LVL
237*d6b92ffaSHans Petter Selasky *		[in] Current debug level against which to check DBG_LVL
238*d6b92ffaSHans Petter Selasky *
239*d6b92ffaSHans Petter Selasky *	STRING
240*d6b92ffaSHans Petter Selasky *		[in] String to send to the current debug target.  The string includes
241*d6b92ffaSHans Petter Selasky *		parentheses in order to allow additional parameters.
242*d6b92ffaSHans Petter Selasky *
243*d6b92ffaSHans Petter Selasky * RETURN VALUE
244*d6b92ffaSHans Petter Selasky *	This macro does not return a value.
245*d6b92ffaSHans Petter Selasky *
246*d6b92ffaSHans Petter Selasky * EXAMPLE
247*d6b92ffaSHans Petter Selasky *	#define	MY_FUNC_DBG_LVL	1
248*d6b92ffaSHans Petter Selasky *
249*d6b92ffaSHans Petter Selasky *	uint32_t	my_dbg_lvl = CL_DBG_ALL;
250*d6b92ffaSHans Petter Selasky *
251*d6b92ffaSHans Petter Selasky *	void
252*d6b92ffaSHans Petter Selasky *	my_func()
253*d6b92ffaSHans Petter Selasky *	{
254*d6b92ffaSHans Petter Selasky *		CL_PRINT( MY_FUNC_DBG_LVL, my_dbg_lvl, ("Hello %s!\n", "world") );
255*d6b92ffaSHans Petter Selasky *	}
256*d6b92ffaSHans Petter Selasky *
257*d6b92ffaSHans Petter Selasky * RESULT
258*d6b92ffaSHans Petter Selasky *	Hello world!
259*d6b92ffaSHans Petter Selasky *
260*d6b92ffaSHans Petter Selasky * NOTES
261*d6b92ffaSHans Petter Selasky *	The requested string is printed only if all bits set in DBG_LVL are also
262*d6b92ffaSHans Petter Selasky *	set in CHK_LVL unless the most significant bit is set (indicating an
263*d6b92ffaSHans Petter Selasky *	error), in which case the lower bits are ignored.  CHK_LVL may have
264*d6b92ffaSHans Petter Selasky *	additional bits set.
265*d6b92ffaSHans Petter Selasky *
266*d6b92ffaSHans Petter Selasky *	In multi-processor environments where the current processor can be
267*d6b92ffaSHans Petter Selasky *	determined, the zero-based number of the processor on which the output
268*d6b92ffaSHans Petter Selasky *	is generated is prepended to the output.
269*d6b92ffaSHans Petter Selasky *
270*d6b92ffaSHans Petter Selasky * SEE ALSO
271*d6b92ffaSHans Petter Selasky *	Debug Output, Debug Levels, CL_ENTER, CL_EXIT, CL_TRACE, CL_TRACE_EXIT
272*d6b92ffaSHans Petter Selasky *********/
273*d6b92ffaSHans Petter Selasky #define	CL_PRINT( DBG_LVL, CHK_LVL, STRING )								\
274*d6b92ffaSHans Petter Selasky 	{																		\
275*d6b92ffaSHans Petter Selasky 	if( DBG_LVL & CL_DBG_ERROR )											\
276*d6b92ffaSHans Petter Selasky 		cl_dbg_out STRING;													\
277*d6b92ffaSHans Petter Selasky 	else if( (DBG_LVL & CHK_LVL) == DBG_LVL )								\
278*d6b92ffaSHans Petter Selasky 		cl_dbg_out STRING;													\
279*d6b92ffaSHans Petter Selasky 	}
280*d6b92ffaSHans Petter Selasky 
281*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_ENTER
282*d6b92ffaSHans Petter Selasky * NAME
283*d6b92ffaSHans Petter Selasky *	CL_ENTER
284*d6b92ffaSHans Petter Selasky *
285*d6b92ffaSHans Petter Selasky * DESCRIPTION
286*d6b92ffaSHans Petter Selasky *	The CL_ENTER macro marks the entrance into a function by sending a
287*d6b92ffaSHans Petter Selasky *	string to the current debug target if the requested debug level matches
288*d6b92ffaSHans Petter Selasky *	the current debug level.
289*d6b92ffaSHans Petter Selasky *
290*d6b92ffaSHans Petter Selasky * SYNOPSIS
291*d6b92ffaSHans Petter Selasky *	CL_ENTER( DBG_LVL, CHK_LVL );
292*d6b92ffaSHans Petter Selasky *
293*d6b92ffaSHans Petter Selasky * PARAMETERS
294*d6b92ffaSHans Petter Selasky *	DBG_LVL
295*d6b92ffaSHans Petter Selasky *		[in] Debug level for the string to output
296*d6b92ffaSHans Petter Selasky *
297*d6b92ffaSHans Petter Selasky *	CHK_LVL
298*d6b92ffaSHans Petter Selasky *		[in] Current debug level against which to check DBG_LVL
299*d6b92ffaSHans Petter Selasky *
300*d6b92ffaSHans Petter Selasky * RETURN VALUE
301*d6b92ffaSHans Petter Selasky *	This macro does not return a value.
302*d6b92ffaSHans Petter Selasky *
303*d6b92ffaSHans Petter Selasky * EXAMPLE
304*d6b92ffaSHans Petter Selasky *	#define __MODULE__	"my_module"
305*d6b92ffaSHans Petter Selasky *	#define	MY_FUNC_DBG_LVL	1
306*d6b92ffaSHans Petter Selasky *
307*d6b92ffaSHans Petter Selasky *	uint32_t	my_dbg_lvl = CL_DBG_ALL;
308*d6b92ffaSHans Petter Selasky *
309*d6b92ffaSHans Petter Selasky *	void
310*d6b92ffaSHans Petter Selasky *	my_func()
311*d6b92ffaSHans Petter Selasky *	{
312*d6b92ffaSHans Petter Selasky *		CL_ENTER( MY_FUNC_DBG_LVL, my_dbg_lvl );
313*d6b92ffaSHans Petter Selasky *		CL_EXIT( MY_FUNC_DBG_LVL, my_dbg_lvl );
314*d6b92ffaSHans Petter Selasky *	}
315*d6b92ffaSHans Petter Selasky *
316*d6b92ffaSHans Petter Selasky * RESULT
317*d6b92ffaSHans Petter Selasky *	my_module:my_func() [
318*d6b92ffaSHans Petter Selasky *	my_module:my_func() ]
319*d6b92ffaSHans Petter Selasky *
320*d6b92ffaSHans Petter Selasky * NOTES
321*d6b92ffaSHans Petter Selasky *	The function entrance notification is printed only if all bits set
322*d6b92ffaSHans Petter Selasky *	in DBG_LVL are also set in CHK_LVL.  CHK_LVL may have additional bits set.
323*d6b92ffaSHans Petter Selasky *
324*d6b92ffaSHans Petter Selasky *	If the __MODULE__ preprocessor keyword is defined, that keyword will be
325*d6b92ffaSHans Petter Selasky *	prepended to the function name, separated with a colon.
326*d6b92ffaSHans Petter Selasky *
327*d6b92ffaSHans Petter Selasky *	In multi-processor environments where the current processor can be
328*d6b92ffaSHans Petter Selasky *	determined, the zero-based number of the processor on which the output
329*d6b92ffaSHans Petter Selasky *	is generated is prepended to the output.
330*d6b92ffaSHans Petter Selasky *
331*d6b92ffaSHans Petter Selasky * SEE ALSO
332*d6b92ffaSHans Petter Selasky *	Debug Output, Debug Levels, CL_PRINT, CL_EXIT, CL_TRACE, CL_TRACE_EXIT
333*d6b92ffaSHans Petter Selasky *********/
334*d6b92ffaSHans Petter Selasky #define CL_ENTER( DBG_LVL, CHK_LVL )										\
335*d6b92ffaSHans Petter Selasky 	CL_CHK_STK;																\
336*d6b92ffaSHans Petter Selasky 	CL_PRINT( DBG_LVL, CHK_LVL, _CL_DBG_ENTER );
337*d6b92ffaSHans Petter Selasky 
338*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_EXIT
339*d6b92ffaSHans Petter Selasky * NAME
340*d6b92ffaSHans Petter Selasky *	CL_EXIT
341*d6b92ffaSHans Petter Selasky *
342*d6b92ffaSHans Petter Selasky * DESCRIPTION
343*d6b92ffaSHans Petter Selasky *	The CL_EXIT macro marks the exit from a function by sending a string
344*d6b92ffaSHans Petter Selasky *	to the current debug target if the requested debug level matches the
345*d6b92ffaSHans Petter Selasky *	current debug level.
346*d6b92ffaSHans Petter Selasky *
347*d6b92ffaSHans Petter Selasky * SYNOPSIS
348*d6b92ffaSHans Petter Selasky *	CL_EXIT( DBG_LVL, CHK_LVL );
349*d6b92ffaSHans Petter Selasky *
350*d6b92ffaSHans Petter Selasky * PARAMETERS
351*d6b92ffaSHans Petter Selasky *	DBG_LVL
352*d6b92ffaSHans Petter Selasky *		[in] Debug level for the string to output
353*d6b92ffaSHans Petter Selasky *
354*d6b92ffaSHans Petter Selasky *	CHK_LVL
355*d6b92ffaSHans Petter Selasky *		[in] Current debug level against which to check DBG_LVL
356*d6b92ffaSHans Petter Selasky *
357*d6b92ffaSHans Petter Selasky * RETURN VALUE
358*d6b92ffaSHans Petter Selasky *	This macro does not return a value.
359*d6b92ffaSHans Petter Selasky *
360*d6b92ffaSHans Petter Selasky * EXAMPLE
361*d6b92ffaSHans Petter Selasky *	#define __MODULE__	"my_module"
362*d6b92ffaSHans Petter Selasky *	#define	MY_FUNC_DBG_LVL	1
363*d6b92ffaSHans Petter Selasky *
364*d6b92ffaSHans Petter Selasky *	uint32_t	my_dbg_lvl = CL_DBG_ALL;
365*d6b92ffaSHans Petter Selasky *
366*d6b92ffaSHans Petter Selasky *	void
367*d6b92ffaSHans Petter Selasky *	my_func()
368*d6b92ffaSHans Petter Selasky *	{
369*d6b92ffaSHans Petter Selasky *		CL_ENTER( MY_FUNC_DBG_LVL, my_dbg_lvl );
370*d6b92ffaSHans Petter Selasky *		CL_EXIT( MY_FUNC_DBG_LVL, my_dbg_lvl );
371*d6b92ffaSHans Petter Selasky *	}
372*d6b92ffaSHans Petter Selasky *
373*d6b92ffaSHans Petter Selasky * RESULT
374*d6b92ffaSHans Petter Selasky *	my_module:my_func() [
375*d6b92ffaSHans Petter Selasky *	my_module:my_func() ]
376*d6b92ffaSHans Petter Selasky *
377*d6b92ffaSHans Petter Selasky * NOTES
378*d6b92ffaSHans Petter Selasky *	The exit notification is printed only if all bits set in DBG_LVL are also
379*d6b92ffaSHans Petter Selasky *	set in CHK_LVL.  CHK_LVL may have additional bits set.
380*d6b92ffaSHans Petter Selasky *
381*d6b92ffaSHans Petter Selasky *	The CL_EXIT macro must only be used after the CL_ENTRY macro as it
382*d6b92ffaSHans Petter Selasky *	depends on that macro's implementation.
383*d6b92ffaSHans Petter Selasky *
384*d6b92ffaSHans Petter Selasky *	If the __MODULE__ preprocessor keyword is defined, that keyword will be
385*d6b92ffaSHans Petter Selasky *	prepended to the function name, separated with a colon.
386*d6b92ffaSHans Petter Selasky *
387*d6b92ffaSHans Petter Selasky *	In multi-processor environments where the current processor can be
388*d6b92ffaSHans Petter Selasky *	determined, the zero-based number of the processor on which the output
389*d6b92ffaSHans Petter Selasky *	is generated is prepended to the output.
390*d6b92ffaSHans Petter Selasky *
391*d6b92ffaSHans Petter Selasky * SEE ALSO
392*d6b92ffaSHans Petter Selasky *	Debug Output, Debug Levels, CL_PRINT, CL_ENTER, CL_TRACE, CL_TRACE_EXIT
393*d6b92ffaSHans Petter Selasky *********/
394*d6b92ffaSHans Petter Selasky #define CL_EXIT( DBG_LVL, CHK_LVL )											\
395*d6b92ffaSHans Petter Selasky 	CL_PRINT( DBG_LVL, CHK_LVL, _CL_DBG_EXIT );
396*d6b92ffaSHans Petter Selasky 
397*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_TRACE
398*d6b92ffaSHans Petter Selasky * NAME
399*d6b92ffaSHans Petter Selasky *	CL_TRACE
400*d6b92ffaSHans Petter Selasky *
401*d6b92ffaSHans Petter Selasky * DESCRIPTION
402*d6b92ffaSHans Petter Selasky *	The CL_TRACE macro sends a string to the current debug target if
403*d6b92ffaSHans Petter Selasky *	the requested debug level matches the current debug level.  The
404*d6b92ffaSHans Petter Selasky *	output is prepended with the function name and, depending on the
405*d6b92ffaSHans Petter Selasky *	debug level requested, an indication of the severity of the message.
406*d6b92ffaSHans Petter Selasky *
407*d6b92ffaSHans Petter Selasky * SYNOPSIS
408*d6b92ffaSHans Petter Selasky *	CL_TRACE( DBG_LVL, CHK_LVL, STRING );
409*d6b92ffaSHans Petter Selasky *
410*d6b92ffaSHans Petter Selasky * PARAMETERS
411*d6b92ffaSHans Petter Selasky *	DBG_LVL
412*d6b92ffaSHans Petter Selasky *		[in] Debug level for the string to output
413*d6b92ffaSHans Petter Selasky *
414*d6b92ffaSHans Petter Selasky *	CHK_LVL
415*d6b92ffaSHans Petter Selasky *		[in] Current debug level against which to check DBG_LVL
416*d6b92ffaSHans Petter Selasky *
417*d6b92ffaSHans Petter Selasky *	STRING
418*d6b92ffaSHans Petter Selasky *		[in] String to send to the current debug target.  The string includes
419*d6b92ffaSHans Petter Selasky *		parentheses in order to allow additional parameters.
420*d6b92ffaSHans Petter Selasky *
421*d6b92ffaSHans Petter Selasky * RETURN VALUE
422*d6b92ffaSHans Petter Selasky *	This macro does not return a value.
423*d6b92ffaSHans Petter Selasky *
424*d6b92ffaSHans Petter Selasky * EXAMPLE
425*d6b92ffaSHans Petter Selasky *	#define __MODULE__	"my_module"
426*d6b92ffaSHans Petter Selasky *	#define	MY_FUNC_DBG_LVL	1
427*d6b92ffaSHans Petter Selasky *
428*d6b92ffaSHans Petter Selasky *	uint32_t	my_dbg_lvl = CL_DBG_ALL;
429*d6b92ffaSHans Petter Selasky *
430*d6b92ffaSHans Petter Selasky *	void
431*d6b92ffaSHans Petter Selasky *	my_func()
432*d6b92ffaSHans Petter Selasky *	{
433*d6b92ffaSHans Petter Selasky *		CL_ENTER( MY_FUNC_DBG_LVL, my_dbg_lvl );
434*d6b92ffaSHans Petter Selasky *		CL_TRACE( MY_FUNC_DBG_LVL, my_dbg_lvl, ("Hello %s!\n", "world") );
435*d6b92ffaSHans Petter Selasky *		CL_EXIT( MY_FUNC_DBG_LVL, my_dbg_lvl );
436*d6b92ffaSHans Petter Selasky *	}
437*d6b92ffaSHans Petter Selasky *
438*d6b92ffaSHans Petter Selasky * RESULT
439*d6b92ffaSHans Petter Selasky *	my_module:my_func() [
440*d6b92ffaSHans Petter Selasky *	my_module:my_func(): Hello world!
441*d6b92ffaSHans Petter Selasky *	my_module:my_func() ]
442*d6b92ffaSHans Petter Selasky *
443*d6b92ffaSHans Petter Selasky * NOTES
444*d6b92ffaSHans Petter Selasky *	The requested string is printed only if all bits set in DBG_LVL are also
445*d6b92ffaSHans Petter Selasky *	set in CHK_LVL.  CHK_LVL may have additional bits set.
446*d6b92ffaSHans Petter Selasky *
447*d6b92ffaSHans Petter Selasky *	The CL_TRACE macro must only be used after the CL_ENTRY macro as it
448*d6b92ffaSHans Petter Selasky *	depends on that macro's implementation.
449*d6b92ffaSHans Petter Selasky *
450*d6b92ffaSHans Petter Selasky *	If the DBG_LVL has the upper bit set, the output will contain
451*d6b92ffaSHans Petter Selasky *	an "!ERROR!" statement between the function name and STRING.
452*d6b92ffaSHans Petter Selasky *
453*d6b92ffaSHans Petter Selasky *	If the __MODULE__ preprocessor keyword is defined, that keyword will be
454*d6b92ffaSHans Petter Selasky *	prepended to the function name, separated with a colon.
455*d6b92ffaSHans Petter Selasky *
456*d6b92ffaSHans Petter Selasky *	In multi-processor environments where the current processor can be
457*d6b92ffaSHans Petter Selasky *	determined, the zero-based number of the processor on which the output
458*d6b92ffaSHans Petter Selasky *	is generated is prepended to the output.
459*d6b92ffaSHans Petter Selasky *
460*d6b92ffaSHans Petter Selasky * SEE ALSO
461*d6b92ffaSHans Petter Selasky *	Debug Output, Debug Levels, CL_PRINT, CL_ENTER, CL_EXIT, CL_TRACE_EXIT
462*d6b92ffaSHans Petter Selasky *********/
463*d6b92ffaSHans Petter Selasky #define CL_TRACE( DBG_LVL, CHK_LVL, STRING )								\
464*d6b92ffaSHans Petter Selasky {																			\
465*d6b92ffaSHans Petter Selasky switch( DBG_LVL & CL_DBG_ERROR )											\
466*d6b92ffaSHans Petter Selasky {																			\
467*d6b92ffaSHans Petter Selasky 	case CL_DBG_ERROR:														\
468*d6b92ffaSHans Petter Selasky 		CL_PRINT( DBG_LVL, CHK_LVL, _CL_DBG_ERROR );						\
469*d6b92ffaSHans Petter Selasky 		break;																\
470*d6b92ffaSHans Petter Selasky 	default:																\
471*d6b92ffaSHans Petter Selasky 		CL_PRINT( DBG_LVL, CHK_LVL, _CL_DBG_INFO );							\
472*d6b92ffaSHans Petter Selasky 		break;																\
473*d6b92ffaSHans Petter Selasky }																			\
474*d6b92ffaSHans Petter Selasky CL_PRINT( DBG_LVL, CHK_LVL, STRING );										\
475*d6b92ffaSHans Petter Selasky }
476*d6b92ffaSHans Petter Selasky 
477*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/CL_TRACE_EXIT
478*d6b92ffaSHans Petter Selasky * NAME
479*d6b92ffaSHans Petter Selasky *	CL_TRACE_EXIT
480*d6b92ffaSHans Petter Selasky *
481*d6b92ffaSHans Petter Selasky * DESCRIPTION
482*d6b92ffaSHans Petter Selasky *	The CL_TRACE_EXIT macro combines the functionality of the CL_TRACE and
483*d6b92ffaSHans Petter Selasky *	CL_EXIT macros, in that order.
484*d6b92ffaSHans Petter Selasky *
485*d6b92ffaSHans Petter Selasky * SYNOPSIS
486*d6b92ffaSHans Petter Selasky *	CL_TRACE_EXIT(  DBG_LVL, CHK_LVL, STRING );
487*d6b92ffaSHans Petter Selasky *
488*d6b92ffaSHans Petter Selasky * PARAMETERS
489*d6b92ffaSHans Petter Selasky *	DBG_LVL
490*d6b92ffaSHans Petter Selasky *		[in] Debug level for the string to output
491*d6b92ffaSHans Petter Selasky *
492*d6b92ffaSHans Petter Selasky *	CHK_LVL
493*d6b92ffaSHans Petter Selasky *		[in] Current debug level against which to check DBG_LVL
494*d6b92ffaSHans Petter Selasky *
495*d6b92ffaSHans Petter Selasky *	STRING
496*d6b92ffaSHans Petter Selasky *		[in] String to send to the current debug target.  The string includes
497*d6b92ffaSHans Petter Selasky *		parentheses in order to allow additional parameters.
498*d6b92ffaSHans Petter Selasky *
499*d6b92ffaSHans Petter Selasky * RETURN VALUE
500*d6b92ffaSHans Petter Selasky *	This macro does not return a value.
501*d6b92ffaSHans Petter Selasky *
502*d6b92ffaSHans Petter Selasky * EXAMPLE
503*d6b92ffaSHans Petter Selasky *	#define __MODULE__	"my_module"
504*d6b92ffaSHans Petter Selasky *	#define	MY_FUNC_DBG_LVL	1
505*d6b92ffaSHans Petter Selasky *
506*d6b92ffaSHans Petter Selasky *	uint32_t	my_dbg_lvl = CL_DBG_ALL;
507*d6b92ffaSHans Petter Selasky *
508*d6b92ffaSHans Petter Selasky *	void
509*d6b92ffaSHans Petter Selasky *	my_func()
510*d6b92ffaSHans Petter Selasky *	{
511*d6b92ffaSHans Petter Selasky *		CL_ENTER( MY_FUNC_DBG_LVL, my_dbg_lvl );
512*d6b92ffaSHans Petter Selasky *		CL_TRACE_EXIT( MY_FUNC_DBG_LVL, my_dbg_lvl, ("Hello %s!\n", "world") );
513*d6b92ffaSHans Petter Selasky *	}
514*d6b92ffaSHans Petter Selasky *
515*d6b92ffaSHans Petter Selasky * RESULT
516*d6b92ffaSHans Petter Selasky *	my_module:my_func() [
517*d6b92ffaSHans Petter Selasky *	my_module:my_func(): Hello world!
518*d6b92ffaSHans Petter Selasky *	my_module:my_func() ]
519*d6b92ffaSHans Petter Selasky *
520*d6b92ffaSHans Petter Selasky * NOTES
521*d6b92ffaSHans Petter Selasky *	The requested string is printed only if all bits set in DBG_LVL are also
522*d6b92ffaSHans Petter Selasky *	set in CHK_LVL.  CHK_LVL may have additional bits set.
523*d6b92ffaSHans Petter Selasky *
524*d6b92ffaSHans Petter Selasky *	The CL_TRACE_EXIT macro must only be used after the CL_ENTRY macro as it
525*d6b92ffaSHans Petter Selasky *	depends on that macro's implementation.
526*d6b92ffaSHans Petter Selasky *
527*d6b92ffaSHans Petter Selasky *	If the DBG_LVL has the upper bit set, the output will contain
528*d6b92ffaSHans Petter Selasky *	an "!ERROR!" statement between the function name and STRING.
529*d6b92ffaSHans Petter Selasky *
530*d6b92ffaSHans Petter Selasky *	If the __MODULE__ preprocessor keyword is defined, that keyword will be
531*d6b92ffaSHans Petter Selasky *	prepended to the function name, separated with a colon.
532*d6b92ffaSHans Petter Selasky *
533*d6b92ffaSHans Petter Selasky *	In multi-processor environments where the current processor can be
534*d6b92ffaSHans Petter Selasky *	determined, the zero-based number of the processor on which the output
535*d6b92ffaSHans Petter Selasky *	is generated is prepended to the output.
536*d6b92ffaSHans Petter Selasky *
537*d6b92ffaSHans Petter Selasky * SEE ALSO
538*d6b92ffaSHans Petter Selasky *	Debug Output, Debug Levels, CL_PRINT, CL_ENTER, CL_EXIT, CL_TRACE
539*d6b92ffaSHans Petter Selasky *********/
540*d6b92ffaSHans Petter Selasky #define CL_TRACE_EXIT( DBG_LVL, CHK_LVL, STRING )							\
541*d6b92ffaSHans Petter Selasky 	CL_TRACE( DBG_LVL, CHK_LVL, STRING );									\
542*d6b92ffaSHans Petter Selasky 	CL_EXIT( DBG_LVL, CHK_LVL );
543*d6b92ffaSHans Petter Selasky 
544*d6b92ffaSHans Petter Selasky #else				/* defined(_DEBUG_) */
545*d6b92ffaSHans Petter Selasky 
546*d6b92ffaSHans Petter Selasky /* Define as NULL macros in a free build. */
547*d6b92ffaSHans Petter Selasky #define CL_PRINT( DBG_LVL, CHK_LVL, STRING );
548*d6b92ffaSHans Petter Selasky #define CL_ENTER( DBG_LVL, CHK_LVL );
549*d6b92ffaSHans Petter Selasky #define CL_EXIT( DBG_LVL, CHK_LVL );
550*d6b92ffaSHans Petter Selasky #define CL_TRACE( DBG_LVL, CHK_LVL, STRING );
551*d6b92ffaSHans Petter Selasky #define CL_TRACE_EXIT( DBG_LVL, CHK_LVL, STRING );
552*d6b92ffaSHans Petter Selasky 
553*d6b92ffaSHans Petter Selasky #endif				/* defined(_DEBUG_) */
554*d6b92ffaSHans Petter Selasky 
555*d6b92ffaSHans Petter Selasky /****d* Component Library: Debug Output/64-bit Print Format
556*d6b92ffaSHans Petter Selasky * NAME
557*d6b92ffaSHans Petter Selasky *	64-bit Print Format
558*d6b92ffaSHans Petter Selasky *
559*d6b92ffaSHans Petter Selasky * DESCRIPTION
560*d6b92ffaSHans Petter Selasky *	The 64-bit print keywords allow users to use 64-bit values in debug or
561*d6b92ffaSHans Petter Selasky *	console output.
562*d6b92ffaSHans Petter Selasky *
563*d6b92ffaSHans Petter Selasky *	Different platforms define 64-bit print formats differently. The 64-bit
564*d6b92ffaSHans Petter Selasky *	print formats exposed by the component library are supported in all
565*d6b92ffaSHans Petter Selasky *	platforms.
566*d6b92ffaSHans Petter Selasky *
567*d6b92ffaSHans Petter Selasky * VALUES
568*d6b92ffaSHans Petter Selasky *	PRId64
569*d6b92ffaSHans Petter Selasky *		Print a 64-bit integer in signed decimal format.
570*d6b92ffaSHans Petter Selasky *	PRIx64
571*d6b92ffaSHans Petter Selasky *		Print a 64-bit integer in hexadecimal format.
572*d6b92ffaSHans Petter Selasky *	PRIo64
573*d6b92ffaSHans Petter Selasky *		Print a 64-bit integer in octal format.
574*d6b92ffaSHans Petter Selasky *	PRIu64
575*d6b92ffaSHans Petter Selasky *		Print a 64-bit integer in unsigned decimal format.
576*d6b92ffaSHans Petter Selasky *
577*d6b92ffaSHans Petter Selasky * EXAMPLE
578*d6b92ffaSHans Petter Selasky *	uint64 MyVal = 2;
579*d6b92ffaSHans Petter Selasky *	// Print a 64-bit integer in hexadecimal format.
580*d6b92ffaSHans Petter Selasky *	cl_dbg_out( "MyVal: 0x%" PRIx64 "\n", MyVal );
581*d6b92ffaSHans Petter Selasky *
582*d6b92ffaSHans Petter Selasky * NOTES
583*d6b92ffaSHans Petter Selasky *	Standard print flags to specify padding and precision can still be used
584*d6b92ffaSHans Petter Selasky *	following the '%' sign in the string preceding the 64-bit print keyword.
585*d6b92ffaSHans Petter Selasky *
586*d6b92ffaSHans Petter Selasky *	The above keywords are strings and make use of compilers' string
587*d6b92ffaSHans Petter Selasky *	concatenation ability.
588*d6b92ffaSHans Petter Selasky *********/
589*d6b92ffaSHans Petter Selasky void complib_init(void);
590*d6b92ffaSHans Petter Selasky 
591*d6b92ffaSHans Petter Selasky void complib_exit(void);
592*d6b92ffaSHans Petter Selasky 
593*d6b92ffaSHans Petter Selasky END_C_DECLS
594*d6b92ffaSHans Petter Selasky #endif				/* _CL_DEBUG_H_ */
595