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