1 
2 #ifndef _DEBUG_H_
3 #define _DEBUG_H_
4 /* TBA - complete debug.h file content */
5 
6 #ifdef __LINUX
7 #include <linux/types.h>
8 #include <linux/kernel.h>
9 #elif defined(USER_LINUX)
10 #include <stdio.h>
11 #include <string.h>
12 #include <stdlib.h>
13 #include <sys/types.h>
14 #elif defined(__SunOS)
15 #include <sys/types.h>
16 #include <sys/cmn_err.h>
17 #include <sys/ddi.h>
18 #include <sys/sunddi.h>
19 #undef u /* see solaris/src/bnxe.h for explanation */
20 #endif
21 #include "bcmtype.h"
22 
23 u8_t win_debug_enter_fatal_state( const IN u8_t b_dbg );
24 
25 #define DBG_ERR_STR "(!)"
26 #define DBG_WRN_STR "(?)"
27 
28 // convert __FILE__ to wchar_t - __WFILE__
29 #define WIDEN2(x) L ## x
30 #define WIDEN(x) WIDEN2(x)
31 #define __WFILE__ WIDEN(__FILE__)
32 
33 // This is a substitution for __FILE__ in order to get rid of entire file path
34 #if !(defined _VBD_CMD_)
35 #define __FILE_STRIPPED__  strrchr(__FILE__, '\\')   ?   strrchr(__FILE__, '\\')   + 1 : __FILE__
36 #define __WFILE_STRIPPED__ wcsrchr(__WFILE__, L'\\') ?   wcsrchr(__WFILE__, L'\\') + 1 : __WFILE__
37 
38 #else // VBD_CMD
39 
40 #define __FILE_STRIPPED__   __FILE__
41 #define __WFILE_STRIPPED__  __WFILE__
42 
43 // Currently only VBD_CMD support it but maybe other USER_MODE like WineDiag should support it as well
44 
45 void printf_color( unsigned long color, const char *format, ... );
46 
47 #define printf_ex printf_color
48 
49 #endif // !(_VBD_CMD_)
50 
51 #define MAX_STR_DBG_LOGGER_NAME 100
52 
53 // logger callback prototype
54 typedef u8_t (*debug_logger_cb_t)( void *context, long msg_code, long gui_code, u8_t b_raise_gui, u32_t string_cnt, u32_t data_cnt, ...) ;
55 
56 // logger functins prototype
57 u8_t debug_deregister_logger          ( IN const void* context ) ;
58 u8_t debug_register_logger            ( debug_logger_cb_t debug_logger_cb,
59                                         long              msg_code,
60                                         long              gui_code,
61                                         u8_t              b_raise_gui,
62                                         void*             context,
63                                         u32_t             times_to_log ) ;
64 u8_t debug_execute_loggers            ( unsigned short* wsz_file, unsigned long line, unsigned short* wsz_cond ) ;
65 void debug_register_logger_device_name( unsigned short* wstr_device_desc, unsigned long size ) ;
66 
67 
68 // max number of loggers
69 #define MAX_DEBUG_LOGGER_CNT 3
70 
71 typedef struct _dbg_logger_t
72 {
73     debug_logger_cb_t debug_logger_cb ; // callback
74     void*             context ;         // unique context
75     u32_t             msg_code ;        // msg_code
76     u32_t             gui_code ;        // gui_code
77     u8_t              b_raise_gui ;     // do raise gui message
78     u32_t             times_to_log ;    // number of times to log
79 } dbg_logger_t ;
80 
81 extern dbg_logger_t g_dbg_logger_arr[MAX_DEBUG_LOGGER_CNT] ;
82 
83 /* Debug Break Filters */
84 extern u32_t g_dbg_flags;
85 #define MEMORY_ALLOCATION_FAILURE       0x1
86 #define FW_SANITY_UPLOAD_CHECK          0x2
87 #define UNDER_TEST                      0x4
88 #define INVALID_MESSAGE_ID              0x8
89 #define ABORTIVE_DISCONNECT_DURING_IND  0x10
90 #define SRIOV_TEST                      0x20
91 
92 #define DBG_BREAK_ON(_cond)  (GET_FLAGS(g_dbg_flags, _cond) != 0)
93 
94 /* Storage defined in the module main c file */
95 extern u8_t     dbg_trace_level;
96 extern u32_t    dbg_code_path;
97 
98 /* code paths */
99 #define CP_INIT                 0x00000100    /* Initialization */
100 #define CP_NVM                  0x00000200    /* nvram          */
101 #define CP_ELINK                0x00000400    /* ELINK          */
102 #define CP_L2_SP                0x00001000    /* L2 Slow Path   */
103 #define CP_L2_SEND              0x00002000    /* L2 Transmit    */
104 #define CP_L2_RECV              0x00004000    /* L2 Receive     */
105 #define CP_L2_INTERRUPT         0x00008000    /* L2 Interrupt   */
106 #define CP_L2                   0x0000f000    /* L2 all         */
107 #define CP_L4_SP                0x00010000    /* L4 Slow Path   */
108 #define CP_L4_SEND              0x00020000    /* L4 Transmit    */
109 #define CP_L4_RECV              0x00040000    /* L4 Receive     */
110 #define CP_L4_INTERRUPT         0x00080000    /* L4 Interrupt   */
111 #define CP_L4                   0x000f0000    /* L4 all         */
112 #define CP_L5_SP                0x00100000    /* L5 Slow Path   */
113 #define CP_L5_SEND              0x00200000    /* L5 Transmit    */
114 #define CP_L5_RECV              0x00400000    /* L5 Receive     */
115 #define CP_L5                   0x00f00000    /* L5 all         */
116 #define CP_VF                   0x01000000    /* VF all         */
117 #define CP_EQ                   0x02000000    /* Event Queue    */
118 #define CP_STAT                 0x04000000    /* Statistics     */
119 #define CP_ER                   0x08000000    /* Event Queue    */
120 #define CP_OMGR                 0x10000000    /* OOO Manager    */
121 #define CP_ENCAP                0x20000000    /* Encapsulated packets  */
122 #define CP_DIAG                 0x40000000    /* Diagnostics    */
123 #define CP_MISC                 0x80000000    /* Miscellaneous  */
124 
125 
126 /* more code paths can be added
127  * bits that are still not defined can be privately used in each module */
128 #define CP_ALL                  0xffffff00
129 #define CP_MASK                 0xffffff00
130 
131 /* Message levels. */
132 typedef enum
133 {
134     LV_VERBOSE = 0x04,
135     LV_INFORM  = 0x03,
136     LV_WARN    = 0x02,
137     LV_FATAL   = 0x01
138 } msg_level_t;
139 
140 #define LV_MASK                 0xff
141 
142 /* Code path and messsage level combined.  These are the first argument
143  * of the DbgMessage macro. */
144 
145 #define VERBOSEi                (CP_INIT | LV_VERBOSE)
146 #define INFORMi                 (CP_INIT | LV_INFORM)
147 #define WARNi                   (CP_INIT | LV_WARN)
148 
149 #define VERBOSEnv               (CP_NVM | LV_VERBOSE)
150 #define INFORMnv                (CP_NVM | LV_INFORM)
151 #define WARNnv                  (CP_NVM | LV_WARN)
152 
153 #define VERBOSEl2sp             (CP_L2_SP | LV_VERBOSE)
154 #define INFORMl2sp              (CP_L2_SP | LV_INFORM)
155 #define WARNl2sp                (CP_L2_SP | LV_WARN)
156 
157 #define VERBOSEl2tx             (CP_L2_SEND | LV_VERBOSE)
158 #define INFORMl2tx              (CP_L2_SEND | LV_INFORM)
159 #define WARNl2tx                (CP_L2_SEND | LV_WARN)
160 
161 #define VERBOSEl2rx             (CP_L2_RECV | LV_VERBOSE)
162 #define INFORMl2rx              (CP_L2_RECV | LV_INFORM)
163 #define WARNl2rx                (CP_L2_RECV | LV_WARN)
164 
165 #define VERBOSEl2int            (CP_L2_INTERRUPT | LV_VERBOSE)
166 #define INFORMl2int             (CP_L2_INTERRUPT | LV_INFORM)
167 #define WARNl2int               (CP_L2_INTERRUPT | LV_WARN)
168 
169 #define VERBOSEl2               (CP_L2 | LV_VERBOSE)
170 #define INFORMl2                (CP_L2 | LV_INFORM)
171 #define WARNl2                  (CP_L2 | LV_WARN)
172 
173 #define VERBOSEl4sp             (CP_L4_SP | LV_VERBOSE)
174 #define INFORMl4sp              (CP_L4_SP | LV_INFORM)
175 #define WARNl4sp                (CP_L4_SP | LV_WARN)
176 
177 #define VERBOSEl4tx             (CP_L4_SEND | LV_VERBOSE)
178 #define INFORMl4tx              (CP_L4_SEND | LV_INFORM)
179 #define WARNl4tx                (CP_L4_SEND | LV_WARN)
180 
181 #define VERBOSEl4rx             (CP_L4_RECV | LV_VERBOSE)
182 #define INFORMl4rx              (CP_L4_RECV | LV_INFORM)
183 #define WARNl4rx                (CP_L4_RECV | LV_WARN)
184 
185 #define VERBOSEl4fp             (CP_L4_RECV | CP_L4_SEND | LV_VERBOSE)
186 #define INFORMl4fp              (CP_L4_RECV | CP_L4_SEND | LV_INFORM)
187 #define WARNl4fp                (CP_L4_RECV | CP_L4_SEND | LV_WARN)
188 
189 #define VERBOSEl4int            (CP_L4_INTERRUPT | LV_VERBOSE)
190 #define INFORMl4int             (CP_L4_INTERRUPT | LV_INFORM)
191 #define WARNl4int               (CP_L4_INTERRUPT | LV_WARN)
192 
193 #define VERBOSEl4               (CP_L4 | LV_VERBOSE)
194 #define INFORMl4                (CP_L4 | LV_INFORM)
195 #define WARNl4                  (CP_L4 | LV_WARN)
196 
197 #define VERBOSEl5sp             (CP_L5_SP | LV_VERBOSE)
198 #define INFORMl5sp              (CP_L5_SP | LV_INFORM)
199 #define WARNl5sp                (CP_L5_SP | LV_WARN)
200 
201 #define VERBOSEl5tx             (CP_L5_SEND | LV_VERBOSE)
202 #define INFORMl5tx              (CP_L5_SEND | LV_INFORM)
203 #define WARNl5tx                (CP_L5_SEND | LV_WARN)
204 
205 #define VERBOSEl5rx             (CP_L5_RECV | LV_VERBOSE)
206 #define INFORMl5rx              (CP_L5_RECV | LV_INFORM)
207 #define WARNl5rx                (CP_L5_RECV | LV_WARN)
208 
209 #define VERBOSEl5               (CP_L5 | LV_VERBOSE)
210 #define INFORMl5                (CP_L5 | LV_INFORM)
211 #define WARNl5                  (CP_L5 | LV_WARN)
212 
213 #define VERBOSEvf               (CP_VF | LV_VERBOSE)
214 #define INFORMvf                (CP_VF | LV_INFORM)
215 #define WARNvf                  (CP_VF | LV_WARN)
216 #define FATALvf                 (CP_VF | LV_FATAL)
217 
218 #define VERBOSEmi               (CP_MISC | LV_VERBOSE)
219 #define INFORMmi                (CP_MISC | LV_INFORM)
220 #define WARNmi                  (CP_MISC | LV_WARN)
221 
222 #define VERBOSEeq               (CP_EQ | LV_VERBOSE)
223 #define INFORMeq                (CP_EQ | LV_INFORM)
224 #define WARNeq                  (CP_EQ | LV_WARN)
225 
226 #define VERBOSOmgr              (CP_OMGR | LV_VERBOSE)
227 #define INFOROmgr               (CP_OMGR | LV_INFORM)
228 #define WAROmgr                 (CP_OMGR | LV_WARN)
229 
230 #define VERBOSEstat             (CP_STAT | LV_VERBOSE)
231 #define INFORMstat              (CP_STAT | LV_INFORM)
232 #define WARNstat                (CP_STAT | LV_WARN)
233 
234 /* Error Recovery */
235 #define VERBOSEer               (CP_ER | LV_VERBOSE)
236 #define INFORMer                (CP_ER | LV_INFORM)
237 #define WARNer                  (CP_ER | LV_WARN)
238 
239 /* Elink */
240 #define VERBOSEelink            (CP_ELINK | LV_VERBOSE)
241 #define INFORMelink             (CP_ELINK | LV_INFORM)
242 #define WARNelink               (CP_ELINK | LV_WARN)
243 
244 /* Encapsulated packets */
245 #define VERBOSEencap            (CP_ENCAP | LV_VERBOSE)
246 #define INFORMencap             (CP_ENCAP | LV_INFORM)
247 #define WARNencap               (CP_ENCAP | LV_WARN)
248 
249 #define FATAL                   (CP_ALL | LV_FATAL)
250 /* This is an existing debug macro in 2.6.27 Linux kernel */
251 #ifdef WARN
252 #undef WARN
253 #endif
254 
255 #if defined(_VBD_)
256 #define WARN                    (0)
257 #else
258 #define WARN                    (CP_ALL | LV_WARN)
259 #endif
260 #define INFORM                  (CP_ALL | LV_INFORM)
261 #define VERBOSE                 (CP_ALL | LV_VERBOSE)
262 
263 #if defined(DOS) || defined(__USER_MODE_DEBUG) || defined(UEFI)
264 #define DbgBreakIfAll(_cond) do {\
265     if(_cond) \
266     { \
267         printf("DEBUG BREAK! Condition failed: if("#_cond##")\n"); \
268         fflush(stdout); \
269 	log_message("DEBUG BREAK! Condition failed: if("#_cond##") at file %s (line %4d)\n", __FILE_STRIPPED__, __LINE__); \
270         assert(0); \
271     } \
272 } while(0)
273 
274 #define EXECUTE_LOGGERS(_s)        do {\
275         printf(_s);      \
276         fflush(stdout);  \
277 } while(0)
278 
279 #elif  defined(_VBD_CMD_)
280 #include <assert.h>
281 #include <string.h>
282 #define DbgBreakIfAll(_cond) do {\
283     if(_cond) \
284     { \
285         DbgMessage(NULL, FATAL, "DEBUG BREAK! Condition failed: if("#_cond##")\n"); \
286         assert(0); \
287     } \
288 } while(0)
289 
290 
291 #define EXECUTE_LOGGERS(_s)                  DbgMessage(NULL, FATAL, _s);
292 
293 #elif  defined(__LINUX) || defined(USER_LINUX)
294 
295 #define DbgBreakIfAll(_cond) do {\
296     if(_cond) \
297     { \
298         DbgMessage(NULL, FATAL, "DEBUG BREAK! Condition failed: if(%s)\n", #_cond); \
299         debug_break(); \
300     } \
301 } while(0)
302 
303 #define EXECUTE_LOGGERS(_s)                  DbgMessage(NULL, FATAL, _s);
304 
305 #elif defined(__SunOS)
306 
307 #if defined(__SunOS_MDB)
308 
309 #define DbgBreakIfAll(_c)      \
310     do {                       \
311         if (_c)                \
312         {                      \
313             /* nop in MDB */ ; \
314         }                      \
315     } while (0)
316 
317 #else /* !__SunOS_MDB */
318 
319 #define DbgBreakIfAll(_c)                                                     \
320     do {                                                                      \
321         if (_c)                                                               \
322         {                                                                     \
323             cmn_err(CE_PANIC, "<%d> %s(%4d): Condition Failed! - if ("#_c")", \
324                     ((FATAL) & LV_MASK),                                      \
325                     __FILE_STRIPPED__,                                        \
326                     __LINE__);                                                \
327         }                                                                     \
328     } while (0)
329 
330 #endif /* __SunOS_MDB */
331 
332 #define EXECUTE_LOGGERS(_s)
333 
334 #else // Windows
335 
336 unsigned char  __cdecl win_debug_log_assert( void*          drv_object,
337                                              long           msg_code,
338                                              long           gui_code,
339                                              unsigned char  b_raise_gui,
340                                              unsigned int   string_cnt,
341                                              unsigned int   data_cnt,
342                                              ...);
343 
344 #if DBG
345 
346 #define DbgBreakIfAll(_cond) DbgBreakIf(_cond)
347 
348 #else
349 
350 #include <ntddk.h>
351 #include <wchar.h>
352 
353 /*******************************************************************************
354  * Debug Print callback - printk (DbgPrint/vDbgPrintEx)
355  ******************************************************************************/
356 
357 typedef
358 ULONG
359 (__cdecl* PFN_DRIVER_TRACE)(
360     IN PCHAR String,
361     ...);
362 
363 extern PFN_DRIVER_TRACE            printk;
364 
365 #define DbgBreakIfAll(_cond) do {\
366     if(_cond) \
367     { \
368         debug_execute_loggers( __WFILE_STRIPPED__ , __LINE__, WIDEN(#_cond##) ); \
369         printk("eVBD-DRV: DEBUG BREAK! Condition failed: if("#_cond##")\n"); \
370         if ( win_debug_enter_fatal_state(FALSE) )\
371         {\
372            DbgBreakPoint();\
373         }\
374     } \
375 } while(0)
376 
377 #endif //DBG
378 
379 #define EXECUTE_LOGGERS(_s)                  debug_execute_loggers( __WFILE_STRIPPED__ , __LINE__, WIDEN(#_s##) )
380 
381 #endif
382 
383 
384 #if DBG
385 
386 /* These constants control the output of messages.
387  * Set your debug message output level and code path here. */
388 #ifndef DBG_MSG_CP
389 #define DBG_MSG_CP              CP_ALL      /* Where to output messages. */
390 #endif
391 
392 #ifndef DBG_MSG_LV
393 #ifdef _VBD_CMD_
394 #define DBG_MSG_LV              dbg_trace_level
395 #else
396 //change this to higher level than FATAL to open debug messages.
397 #define DBG_MSG_LV              LV_FATAL  /* Level of message output. */
398 #endif
399 #endif
400 
401 //STATIC is now not empty define
402 #ifndef STATIC
403 #define STATIC static
404 #endif
405 //#define DbgBreak(_c)
406 
407 /* This is the original implementation where both code path and debug level can only be defined
408    once at compile time */
409 #if 0
410 #define CODE_PATH(_m)           ((_m) & DBG_MSG_CP)
411 #define MSG_LEVEL(_m)           ((_m) & LV_MASK)
412 #define LOG_MSG(_m)             (CODE_PATH(_m) && \
413                                 MSG_LEVEL(_m) <= DBG_MSG_LV)
414 #endif
415 
416 #define CODE_PATH(_m)           ((_m) & dbg_code_path)
417 #define MSG_LEVEL(_m)           ((_m) & LV_MASK)
418 #define LOG_MSG(_m)             (CODE_PATH(_m) && \
419                                 MSG_LEVEL(_m) <= dbg_trace_level)
420 
421 
422 
423 void mm_print_bdf(int level, void* dev);
424 
425 /* per OS methods */
426 #if defined(UEFI)
427 #include <stdio.h>
428 #include <assert.h>
429 #include <string.h>
430 void console_cleanup(void);
431 void
432 console_init(
433     void
434     );
435 u32_t
436 console_print(
437     void * console_buffer_p
438     );
439 void __cdecl
440 debug_msgx(
441     unsigned long level,
442     char *msg,
443     ...);
444 
445 #define MessageHdr(_dev, _level) \
446     do { \
447         debug_msgx((_level), "TrLv<%d>, %s (%4d): ", ((_level) & LV_MASK), __FILE_STRIPPED__, __LINE__); \
448         mm_print_bdf(_level, (void*)(_dev)); \
449     } while (0)
450 
451 //void DbgMessage(void *dummy, int level, char *msg, ...);
452 #define DbgMessage
453 #define log_message
454 
455 #define debug_break() do { \
456     debug_msgx(FATAL, "DEBUG BREAK!\n"); \
457     console_print(NULL); \
458     fflush(stdout); \
459     assert(0); \
460 } while(0)
461 #define DbgBreak()            debug_break()
462 #define DbgBreakIf(_cond) do {\
463     if(_cond) \
464     { \
465         MessageHdr(NULL,LV_FATAL); \
466         debug_msgx(FATAL, "Condition failed: if("#_cond##")\n"); \
467         debug_break(); \
468     } \
469 } while(0)
470 #define DbgBreakMsg(_s) do { \
471     MessageHdr(NULL,LV_FATAL); \
472     debug_msgx(FATAL, "Debug Break Message: " _s); \
473     debug_break(); \
474 } while(0)
475 #define DbgBreakFastPath()        DbgBreak()
476 #define DbgBreakIfFastPath(_cond) DbgBreakIf(_cond)
477 #define DbgBreakMsgFastPath(_s)   DbgBreakMsg(_s)
478 #define dbg_out(_c, _m, _s, _d1) debug_msgx((WARN), "TrLv<%d>, %s (%4d): %p"##_s" %s\n", ((WARN) & LV_MASK), __FILE_STRIPPED__, __LINE__, _c, _d1 )
479 #elif defined(DOS)
480 #include <stdio.h>
481 #include <assert.h>
482 #include <string.h>
483 
484 void console_cleanup(void);
485 
486 void
487 console_init(
488     void
489     );
490 
491 u32_t
492 console_print(
493     void * console_buffer_p
494     );
495 
496 void __cdecl
497 debug_msgx(
498     unsigned long level,
499     char *msg,
500     ...);
501 
502 void __cdecl
503 log_msgx(
504     char *msg,
505     ...);
506 
507 // DOS
508 #define debug_message(l, fmt, ...) debug_msgx(l, fmt, ##__VA_ARGS__)
509 #define log_message(fmt, ...)	log_msgx(fmt, ##__VA_ARGS__)
510 
511 
512 
513 // TODO: need to relate to dbg_trace_module_name
514 /*
515 #define MessageHdr(_dev, _level) \
516     debug_message("%s, TrLv<%d>, %s (%d): %p ", dbg_trace_module_name, (_level), __FILE_STRIPPED__, __LINE__, _dev )
517 */
518 
519 // DOS
520 #define MessageHdr(_dev, _level) \
521         do { \
522         debug_message((_level), "TrLv<%d>, %s (%4d): ", ((_level) & LV_MASK), __FILE_STRIPPED__, __LINE__); \
523         mm_print_bdf(_level, (void*)(_dev)); \
524     } while (0)
525 
526 #define DbgMessage(_c, _m, _s, ...)                                            	\
527 do { 										\
528         MessageHdr((_c), (_m));                                                 \
529         debug_message((_m), _s, ##__VA_ARGS__); \
530 } while(0)
531 
532 // DOS
533 #define debug_break() do { \
534     debug_message(FATAL, "DEBUG BREAK at file %s (line %4d)!\n", __FILE_STRIPPED__, __LINE__); \
535     log_message("DEBUG BREAK at file %s (line %4d)!\n", __FILE_STRIPPED__, __LINE__); \
536     console_print(NULL); \
537     fflush(stdout); \
538     assert(0); \
539 } while(0)
540 
541 // DOS
542 #define DbgBreak()            debug_break()
543 // DOS
544 #define DbgBreakIf(_cond) do {\
545     if(_cond) \
546     { \
547         MessageHdr(NULL,LV_FATAL); \
548         debug_message(FATAL, "Condition failed: if("#_cond##")\n"); \
549         debug_break(); \
550     } \
551 } while(0)
552 // DOS
553 #define DbgBreakMsg(_s) do { \
554     MessageHdr(NULL,LV_FATAL); \
555     debug_message(FATAL, "Debug Break Message: " _s); \
556     debug_break(); \
557 } while(0)
558 
559 // DOS
560 #define DbgBreakFastPath()        DbgBreak()
561 #define DbgBreakIfFastPath(_cond) DbgBreakIf(_cond)
562 #define DbgBreakMsgFastPath(_s)   DbgBreakMsg(_s)
563 
564 
565 // DOS
566 #define dbg_out(_c, _m, _s, _d1) debug_msgx((WARN), "TrLv<%d>, %s (%4d): %p"##_s" %s\n", ((WARN) & LV_MASK), __FILE_STRIPPED__, __LINE__, _c, _d1 )
567 
568 #elif defined(__USER_MODE_DEBUG)
569 #include <stdio.h>
570 #include <assert.h>
571 #include <string.h>
572 void __cdecl
573 log_msgx(
574     char *msg,
575     ...);
576 
577 #define debug_message(fmt, ...) printf(fmt, ##__VA_ARGS__); fflush(stdout);
578 #define log_message(fmt, ...)	log_msgx(fmt, ##__VA_ARGS__)
579 
580 // TODO: need to relate to dbg_trace_module_name
581 /*
582 #define MessageHdr(_dev, _level) \
583     debug_message("%s, TrLv<%d>, %s (%d): %p ", dbg_trace_module_name, (_level), __FILE_STRIPPED__, __LINE__, _dev )
584 */
585 // __USER_MODE_DEBUG
586 #define MessageHdr(_dev, _level) \
587     debug_message("TrLv<%d>, %-12s (%4d): %p ", ((_level) & LV_MASK), __FILE_STRIPPED__, __LINE__, _dev )
588 
589 #define DbgMessage(_c, _m, _s, ...)                                            		\
590     if(LOG_MSG(_m))                                                   			\
591     {                                                               			\
592         MessageHdr((_c), (_m));                                                 	\
593         debug_message(_s, ##__VA_ARGS__);                                                 	\
594     }
595 
596 // __USER_MODE_DEBUG
597 #define debug_break() do { \
598     debug_message("DEBUG BREAK at file %s (line %4d)!\n", __FILE_STRIPPED__, __LINE__); \
599     log_message("DEBUG BREAK at file %s (line %4d)!\n", __FILE_STRIPPED__, __LINE__); \
600     fflush(stdout); \
601     assert(0); \
602 } while(0)
603 
604 // __USER_MODE_DEBUG
605 #define DbgBreak()            debug_break()
606 
607 #define DbgBreakIf(_cond) do {\
608     if(_cond) \
609     { \
610         MessageHdr(NULL,LV_FATAL); \
611         debug_message("Condition failed: if("#_cond##")\n"); \
612         debug_break(); \
613     } \
614 } while(0)
615 
616 // __USER_MODE_DEBUG
617 #define DbgBreakMsg(_s) do { \
618     MessageHdr(NULL,LV_FATAL); \
619     debug_message("Debug Break Message: " _s); \
620     debug_break(); \
621 } while(0)
622 
623 // __USER_MODE_DEBUG
624 #define DbgBreakFastPath()        DbgBreak()
625 #define DbgBreakIfFastPath(_cond) DbgBreakIf(_cond)
626 #define DbgBreakMsgFastPath(_s)   DbgBreakMsg(_s)
627 
628 //#define dbg_out(_c, _m, _s, _d1) DbgMessage((_c), (_m), (_s), (_d1))
629 #define dbg_out(_c, _m, _s, _d1) printf(_s, _d1)
630 
631 #elif defined(__LINUX) || defined(USER_LINUX)
632 
633 #define __cdecl
634 
635 #define DbgBreak            debug_break
636 
637 #undef __FILE_STRIPPED__
638 #ifdef __LINUX
639 char *os_if_strrchr(char *a, int   n);
640 
641 #define __FILE_STRIPPED__  os_if_strrchr(__FILE__, '/')   ?   os_if_strrchr(__FILE__, '/')   + 1 : __FILE__
642 #else
643 #define __FILE_STRIPPED__  strrchr(__FILE__, '/')   ?   strrchr(__FILE__, '/')   + 1 : __FILE__
644 #endif
645 
646 /*******************************************************************************
647  * Debug break and output routines.
648  ******************************************************************************/
649 void __cdecl
650 debug_msgx(
651     unsigned long level,
652     char *msg,
653     ...);
654 
655 #ifdef USER_LINUX
656 
657 void __cdecl
658 log_msgx(
659     char *msg,
660     ...);
661 
662 #define MessageHdr(_dev, _level) \
663     printf("TrLv<%d>, %s (%4d): %p ", ((_level) & LV_MASK), __FILE_STRIPPED__, __LINE__, _dev )
664 
665 #define log_message(fmt, ...)	log_msgx(fmt, ##__VA_ARGS__)
666 
667 #define debug_break() do { \
668     MessageHdr(NULL, LV_FATAL); \
669     debug_msgx(FATAL, "DEBUG BREAK at file %s (line %4d)!\n", __FILE_STRIPPED__, __LINE__); \
670     log_message("DEBUG BREAK at file %s (line %4d)!\n", __FILE_STRIPPED__, __LINE__); \
671     fflush(stdout); \
672     exit(1); \
673 } while(0)
674 
675 #else /* KERNEL */
676 
677 #define MessageHdr(_dev, _level) \
678     do { \
679         printk(KERN_CRIT "TrLv<%d>, %s (%4d): ", ((_level) & LV_MASK), __FILE_STRIPPED__, __LINE__); \
680         mm_print_bdf(_level, (void*)(_dev)); \
681     } while (0)
682 
683 void debug_break(void);
684 #endif
685 
686 #ifdef USER_LINUX
687 #define DbgMessageXX(_c, _m, _s...)                    \
688     if(LOG_MSG(_m))                                    \
689     {                                                  \
690     MessageHdr(_c, _m);                \
691         debug_msgx(_m, ##_s);   \
692     }
693 #else  /* __LINUX */
694 #define DbgMessageXX(_c, _m, _s...)                    \
695     if(unlikely(LOG_MSG(_m)))                                    \
696     {                                                  \
697     MessageHdr(_c, _m);                \
698         debug_msgx(_m, ##_s);   \
699     }
700 #endif
701 
702 #define DbgMessage  DbgMessageXX
703 
704 // LINUX
705 #ifdef USER_LINUX
706 #define DbgBreakIf(_c) \
707     if(_c) \
708     { \
709         DbgMessage(NULL, FATAL, "if("#_c")\n"); \
710         DbgBreak(); \
711     }
712 #else /* __LINUX */
713 #define DbgBreakIf(_c) \
714     if(unlikely(_c)) \
715     { \
716         DbgMessage(NULL, FATAL, "if("#_c")\n"); \
717         DbgBreak(); \
718     }
719 #endif
720 
721 // LINUX
722 #define DbgBreakMsg(_m)     do {DbgMessage(NULL, FATAL, _m); DbgBreak();} while (0)
723 
724 // LINUX
725 #define DbgBreakFastPath()        DbgBreak()
726 #define DbgBreakIfFastPath(_cond) DbgBreakIf(_cond)
727 #define DbgBreakMsgFastPath(_s)   DbgBreakMsg(_s)
728 
729 #define dbg_out(_c, _m, _s, _d1) debug_msgx(_m, "TrLv<%d>, %s (%4d): %p"_s" %s\n", ((WARN) & LV_MASK), __FILE_STRIPPED__, __LINE__, _c, _d1 )
730 
731 #elif defined(__SunOS)
732 
733 #if defined(__SunOS_MDB)
734 #define DbgMessage(_c, _m, _s, ...)
735 #define DbgBreak()
736 #define DbgBreakIf(_cond)
737 #define DbgBreakMsg(_s)
738 #define DbgBreakFastPath()
739 #define DbgBreakIfFastPath(_cond)
740 #define DbgBreakMsgFastPath(_s)
741 #define dbg_out(_c, _m, _s, _d1) cmn_err(CE_NOTE, _s, _d1)
742 #else
743 /* under //servers/main/nx2/577xx/drivers/solaris/src */
744 #include "bnxe_debug.h"
745 #endif
746 
747 #elif defined(__WINDOWS)
748 
749 #else
750 
751 #if defined(_VBD_)
752 #include <SAL.h>
753 #endif
754 
755 #ifndef _In_
756 #define _In_
757 #endif
758 #ifndef _Out_
759 #define _Out_
760 #endif
761 
762 /*******************************************************************************
763  * Debug break and output routines.
764  ******************************************************************************/
765 
766 void
767 debug_break(
768     void *ctx);
769 
770 void __cdecl
771 debug_msg(
772     void *ctx,
773     unsigned long level,
774     _In_ char *file,
775     unsigned long line,
776     _In_ char *msg,
777     ...);
778 
779 void __cdecl
780 debug_msgx(
781     void *ctx,
782     unsigned long level,
783     _In_ char *msg,
784     ...);
785 
786 void um_dbg_log_msg(void* ctx, char *file, char *function, unsigned long line, const char* format_msg, unsigned int args_num, ...);
787 
788 #define VA_NUM_ARGS_SIZE_PREFIX__VA_NUM_ARGS_SIZE_POSTFIX ,,,,,,,,,,0
789 #define VA_NUM_ARGS(...) VA_NUM_ARGS_IMP_((VA_NUM_ARGS_SIZE_PREFIX_ ## __VA_ARGS__ ## _VA_NUM_ARGS_SIZE_POSTFIX,10,9,8,7,6,5,4,3,2,1,0))
790 #define VA_NUM_ARGS_IMP_(__args) VA_NUM_ARGS_IMP __args
791 #define VA_NUM_ARGS_IMP(__p0,__p1,__p2,__p3,__p4,__p5,__p6,__p7,__p8,__p9,__n,...) __n
792 
793 // WINDDK
794 #define DbgMessage(_c, _m, _s, ...)                                                                                \
795     if(LOG_MSG(_m))                                                                                                \
796     {                                                                                                              \
797         debug_msg(_c, _m, __FILE__, __LINE__, _s, ##__VA_ARGS__);                                                  \
798         um_dbg_log_msg(_c, __FILE__, __FUNCTION__, __LINE__, _s, VA_NUM_ARGS(##__VA_ARGS__), ##__VA_ARGS__);       \
799     }
800 
801 // WINDDK
802 
803 #define DbgBreakIf(_c) \
804     if(_c) \
805     { \
806         debug_msg(NULL, FATAL, __FILE__, __LINE__, "if("#_c##")\n"); \
807         debug_execute_loggers( __WFILE_STRIPPED__ , __LINE__, WIDEN(#_c##) );\
808         win_debug_enter_fatal_state(TRUE);\
809         __debugbreak(); \
810     }
811 
812 // WINDDK
813 #define DbgBreakMsg(_m)     debug_msg(NULL, FATAL, __FILE__, __LINE__, _m); \
814                             debug_execute_loggers( __WFILE_STRIPPED__ , __LINE__, WIDEN(#_m##) );\
815                             __debugbreak()
816 // WINDDK
817 #define DbgBreak()          debug_execute_loggers( __WFILE_STRIPPED__ , __LINE__, L"DbgBreak" );\
818                             __debugbreak()
819 // WINDDK (debug)
820 #define DbgBreakFastPath()          DbgBreak()
821 #define DbgBreakIfFastPath(_cond)   DbgBreakIf(_cond)
822 #define DbgBreakMsgFastPath(_s)     DbgBreakMsg(_s)
823 
824 // WINDDK
825 #define dbg_out(_c, _m, _s, _d1) debug_msg(_c, _m, __FILE__, __LINE__, _s, _d1)
826 
827 #endif //OS architectures
828 
829 // Error Macros (Currently supports Windows DDK & DOS):
830 // in debug builds - outputs a debug message and enter condition in case TRUE
831 // in release builds - enters condition in case TRUE (like debug but without the debug print)
832 
833 // Macro for checking parameter for NULL value
834 //    Usage Example:
835 //       if( CHECK_NULL( ptr ))
836 //       {
837 //          return FALSE ;
838 //       }
839 #define CHK_NULL(p) ((p==NULL)    ? (dbg_out(NULL, WARN, DBG_ERR_STR" %s is NULL\n",#p), TRUE): FALSE )
840 
841 // Macros that returns the value of the expression and outputs a debug string in debug versions
842 //    Usage Example:
843 //       if( ERR_IF( val < 0 ))
844 //       {
845 //          return FALSE ;
846 //       }
847 #define ERR_IF(cond)(((cond)==TRUE) ? (dbg_out(NULL, WARN, DBG_ERR_STR" ErrIf failed %s\n",#cond), TRUE): FALSE )
848 #define WRN_IF(cond)(((cond)==TRUE) ? (dbg_out(NULL, WARN, DBG_WRN_STR" WrnIf failed %s\n",#cond), TRUE): FALSE )
849 
850 #else // !DBG
851 #define STATIC static
852 
853 #define DbgMessage(_c, _m, ...)
854 
855 
856 #if ! (defined(WIN_DIAG) || defined(__LINUX) || defined(USER_LINUX) || defined(__SunOS))
857 // WINDDK DbgBreak (retail) and logging an event
858 #define DbgBreak()                       debug_execute_loggers( __WFILE_STRIPPED__ , __LINE__, L"DbgBreak" )
859 #define DbgBreakIf(_cond)     if(_cond){ debug_execute_loggers( __WFILE_STRIPPED__ , __LINE__, WIDEN(#_cond##) ); }
860 #define DbgBreakMsg(_s)                  debug_execute_loggers( __WFILE_STRIPPED__ , __LINE__, WIDEN(#_s##) )
861 
862 // WINDDK DbgBreak (retail) without logging an event
863 #define DbgBreakNoLog()
864 #define DbgBreakIfNoLog(_cond)
865 #define DbgBreakMsgNoLog(_s)
866 
867 // WINDDK DbgBreak FastPath (retail)
868 #define DbgBreakFastPath()         DbgBreakNoLog()
869 #define DbgBreakIfFastPath(_cond)  DbgBreakIfNoLog(_cond)
870 #define DbgBreakMsgFastPath(_s)    DbgBreakMsgNoLog(_s)
871 
872 #else // WIN_DIAG and Linux and Solaris
873 #define DbgBreak()
874 #define DbgBreakIf(_cond)
875 #define DbgBreakMsg(_s)
876 #define DbgBreakFastPath()
877 #define DbgBreakIfFastPath(_cond)
878 #define DbgBreakMsgFastPath(_s)
879 #endif // !WIN_DIAG
880 
881 #define CHK_NULL(p) (p==NULL)
882 #define ERR_IF(cond)((cond)==TRUE)
883 #define WRN_IF(cond)((cond)==TRUE)
884 
885 #endif // !DBG
886 
887 
888 #endif /* _DEBUG_H_ */
889