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