1/*
2 * Copyright 2014-2017 Cavium, Inc.
3 * The contents of this file are subject to the terms of the Common Development
4 * and Distribution License, v.1,  (the "License").
5 *
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the License at available
9 * at http://opensource.org/licenses/CDDL-1.0
10 *
11 * See the License for the specific language governing permissions and
12 * limitations under the License.
13 */
14
15/*
16 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
17 */
18
19#ifndef _DEBUG_H
20#define	_DEBUG_H
21
22
23
24/*
25 * Debug break and output routines.
26 */
27
28void
29debug_break(void *ctx);
30
31void debug_msg(void *ctx, unsigned long level, char *file, unsigned long line,
32    char *msg, ...);
33
34void debug_msgx(void *ctx, unsigned long level, char *msg, ...);
35
36
37
38/*
39 * Debug macros
40 */
41
42/* Code paths. */
43#define	CP_INIT			0x010000    /* Initialization */
44#define	CP_SEND			0x020000    /* Transmit */
45#define	CP_RCV			0x040000    /* Recieve */
46#define	CP_INT			0x080000    /* Interrupt */
47#define	CP_UINIT		0x100000    /* Unload */
48#define	CP_RESET		0x200000    /* Reset */
49#define	CP_GEN_BUF		0x400000    /* Generic buffer. */
50#define	CP_ALL			0xffff0000  /* All code path */
51
52#define	CP_MASK			0xffff0000
53
54
55/* Mess	ge levels. */
56#define	LV_VERBOSE		0x03
57#define	LV_INFORM		0x02
58#define	LV_WARN			0x01
59#define	LV_FATAL		0x00
60
61#define	LV_MASK			0xffff
62
63
64/*
65 * Code path and messsage level combined.  These are the first argument
66 * of the DbgMessage macro.
67 */
68
69#define	VERBOSEi		(CP_INIT | LV_VERBOSE)
70#define	INFORMi			(CP_INIT | LV_INFORM)
71#define	WARNi			(CP_INIT | LV_WARN)
72
73#define	VERBOSEtx		(CP_SEND | LV_VERBOSE)
74#define	INFORMtx		(CP_SEND | LV_INFORM)
75#define	WARNtx			(CP_SEND | LV_WARN)
76
77#define	VERBOSErx		(CP_RCV | LV_VERBOSE)
78#define	INFORMrx		(CP_RCV | LV_INFORM)
79#define	WARNrx			(CP_RCV | LV_WARN)
80
81#define	VERBOSEint		(CP_INT | LV_VERBOSE)
82#define	INFORMint		(CP_INT | LV_INFORM)
83#define	WARNint			(CP_INT | LV_WARN)
84
85#define	VERBOSEu		(CP_UINIT | LV_VERBOSE)
86#define	INFORMu			(CP_UINIT | LV_INFORM)
87#define	WARNu			(CP_UINIT | LV_WARN)
88
89#define	VERBOSErs		(CP_RESET | LV_VERBOSE)
90#define	INFORMrs		(CP_RESET | LV_INFORM)
91#define	WARNrs			(CP_RESET | LV_WARN)
92
93#define	VERBOSEgb		(CP_GEN_BUF | LV_VERBOSE)
94#define	INFORMgb		(CP_GEN_BUF | LV_INFORM)
95#define	WARNgb			(CP_GEN_BUF | LV_WARN)
96
97
98#define	FATAL			(CP_ALL | LV_FATAL)
99#define	WARN			(CP_ALL | LV_WARN)
100#define	INFORM			(CP_ALL | LV_INFORM)
101#define	VERBOSE			(CP_ALL | LV_VERBOSE)
102
103
104#if DBG
105
106/*
107 * These constants control the output of messages.
108 * Set your debug message output level and code path here.
109 */
110#ifndef	DBG_MSG_CP
111#define	DBG_MSG_CP		CP_ALL	/* Where to output messages. */
112#endif
113
114#ifndef	DBG_MSG_LV
115#define	DBG_MSG_LV		LV_VERBOSE	/* Level of message output. */
116#endif
117
118
119/* CSTYLED */
120#define	STATIC
121#define	DbgBreak(_c)		debug_break(_c)
122
123
124#define	CODE_PATH(_m)		((_m) & DBG_MSG_CP)
125#define	MSG_LEVEL(_m)		((_m) & LV_MASK)
126#define	LOG_MSG(_m)		(CODE_PATH(_m) && \
127				    MSG_LEVEL(_m) <= DBG_MSG_LV)
128
129
130/* BEGIN CSTYLED */
131#define	DbgMessage(_c, _m, _s)                                              \
132    if (LOG_MSG(_m))                                                        \
133    {                                                                       \
134        debug_msg(_c, _m, __FILE__, __LINE__, _s);                          \
135    }
136#define	DbgMessage1(_c, _m, _s, _d1)                                        \
137    if (LOG_MSG(_m))                                                        \
138    {                                                                       \
139        debug_msg(_c, _m, __FILE__, __LINE__, _s, _d1);                     \
140    }
141#define	DbgMessage2(_c, _m, _s, _d1, _d2)                                   \
142    if (LOG_MSG(_m))                                                        \
143    {                                                                       \
144        debug_msg(_c, _m, __FILE__, __LINE__, _s, _d1, _d2);                \
145    }
146#define	DbgMessage3(_c, _m, _s, _d1, _d2, _d3)                              \
147    if (LOG_MSG(_m))                                                        \
148    {                                                                       \
149        debug_msg(_c, _m, __FILE__, __LINE__, _s, _d1, _d2, _d3);           \
150    }
151#define	DbgMessage4(_c, _m, _s, _d1, _d2, _d3, _d4)                         \
152    if (LOG_MSG(_m))                                                        \
153    {                                                                       \
154        debug_msg(_c, _m, __FILE__, __LINE__, _s, _d1, _d2, _d3, _d4);      \
155    }
156#define	DbgMessage5(_c, _m, _s, _d1, _d2, _d3, _d4, _d5)                    \
157    if (LOG_MSG(_m))                                                        \
158    {                                                                       \
159        debug_msg(_c, _m, __FILE__, __LINE__, _s, _d1, _d2, _d3, _d4, _d5); \
160    }
161#define	DbgMessage6(_c, _m, _s, _d1, _d2, _d3, _d4, _d5, _d6)               \
162    if (LOG_MSG(_m))                                                        \
163    {                                                                       \
164        debug_msg(_c, _m, __FILE__, __LINE__, _s, _d1,_d2,_d3,_d4,_d5,_d6); \
165    }
166
167#define	DbgMessageX(_c, _m, _s)                                             \
168    if (LOG_MSG(_m))                                                        \
169    {                                                                       \
170        debug_msgx(_c, _m, _s);                                             \
171    }
172#define	DbgMessageX1(_c, _m, _s, _d1)                                       \
173    if (LOG_MSG(_m))                                                        \
174    {                                                                       \
175        debug_msgx(_c, _m, _s, _d1);                                        \
176    }
177#define	DbgMessageX2(_c, _m, _s, _d1, _d2)                                  \
178    if (LOG_MSG(_m))                                                        \
179    {                                                                       \
180        debug_msgx(_c, _m, _s, _d1, _d2);                                   \
181    }
182#define	DbgMessageX3(_c, _m, _s, _d1, _d2, _d3)                             \
183    if (LOG_MSG(_m))                                                        \
184    {                                                                       \
185        debug_msgx(_c, _m, _s, _d1, _d2, _d3);                              \
186    }
187#define	DbgMessageX4(_c, _m, _s, _d1, _d2, _d3, _d4)                        \
188    if (LOG_MSG(_m))                                                        \
189    {                                                                       \
190        debug_msgx(_c, _m, _s, _d1, _d2, _d3, _d4);                         \
191    }
192#define	DbgMessageX5(_c, _m, _s, _d1, _d2, _d3, _d4, _d5)                   \
193    if (LOG_MSG(_m))                                                        \
194    {                                                                       \
195        debug_msgx(_c, _m, _s, _d1, _d2, _d3, _d4, _d5);                    \
196    }
197#define	DbgMessageX6(_c, _m, _s, _d1, _d2, _d3, _d4, _d5, _d6)              \
198    if (LOG_MSG(_m))                                                        \
199    {                                                                       \
200        debug_msgx(_c, _m, _s, _d1,_d2,_d3,_d4,_d5,_d6);                    \
201    }
202
203#define	DbgBreakIf(_c)							\
204    if (_c)								\
205    {									\
206        debug_msg(NULL, FATAL, __FILE__, __LINE__, "if("#_c##")\n");	\
207        debug_break(NULL);						\
208    }
209
210#define	DbgBreakMsg(_m)	debug_msg(NULL, FATAL, __FILE__, __LINE__, _m); \
211    debug_break(NULL)
212/* END CSTYLED */
213
214
215#else
216
217/* CSTYLED */
218#define	STATIC static
219
220#define	DbgBreak(_c)
221
222#define	DbgMessage(_c, _m, _s)
223#define	DbgMessage1(_c, _m, _s, _d1)
224#define	DbgMessage2(_c, _m, _s, _d1, _d2)
225#define	DbgMessage3(_c, _m, _s, _d1, _d2, _d3)
226#define	DbgMessage4(_c, _m, _s, _d1, _d2, _d3, _d4)
227#define	DbgMessage5(_c, _m, _s, _d1, _d2, _d3, _d4, _d5)
228#define	DbgMessage6(_c, _m, _s, _d1, _d2, _d3, _d4, _d5, _d6)
229
230#define	DbgMessageX(_c, _m, _s)
231#define	DbgMessageX1(_c, _m, _s, _d1)
232#define	DbgMessageX2(_c, _m, _s, _d1, _d2)
233#define	DbgMessageX3(_c, _m, _s, _d1, _d2, _d3)
234#define	DbgMessageX4(_c, _m, _s, _d1, _d2, _d3, _d4)
235#define	DbgMessageX5(_c, _m, _s, _d1, _d2, _d3, _d4, _d5)
236#define	DbgMessageX6(_c, _m, _s, _d1, _d2, _d3, _d4, _d5, _d6)
237
238#define	DbgBreakIf(_c)
239#define	DbgBreakMsg(_m)
240
241#endif
242
243#endif /* _DEBUG_H */
244