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