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