/*++ Copyright (c) 1998-1999 Microsoft Corporation Module Name: dbg.h Abstract: Debug-related definitions for ARP1394 Author: Revision History: Who When What -------- -------- ---- josephj 11-20-98 created, adapted from L2TP. --*/ //----------------------------------------------------------------------------- // Debug constants //----------------------------------------------------------------------------- // Memory tags used with NdisAllocateMemoryWithTag to identify allocations // made by the L2TP driver. Also, several context blocks define a first field // of 'ulTag' set to these values for ASSERT sanity checking and eased memory // dump browsing. Such tags are set to MTAG_FREED just before NdisFreeMemory // is called. // // Rm/generic tags // #define MTAG_DBGINFO 'd31A' #define MTAG_TASK 't31A' #define MTAG_STRING 's31A' #define MTAG_FREED 'z31A' #define MTAG_RMINTERNAL 'r31A' // Arp-sepcific // #define MTAG_ADAPTER 'A31A' #define MTAG_INTERFACE 'I31A' #define MTAG_LOCAL_IP 'L31A' #define MTAG_REMOTE_IP 'R31A' #define MTAG_REMOTE_ETH 'E31A' #define MTAG_DEST 'D31A' #define MTAG_PKT 'P31A' #define MTAG_MCAP_GD 'G31A' #define MTAG_ICS_BUF 'i31A' #define MTAG_ARP_GENERIC 'g31A' // Trace levels. // #define TL_FATAL 0x0 // Fatal errors -- always printed in checked build. #define TL_WARN 0x1 // Warnings #define TL_INFO 0x2 // Informational (highest level workable for general use) #define TL_VERB 0x3 // VERBOSE // Trace mask bits. // #define TM_MISC (0x1<<0) // Misc. #define TM_NT (0x1<<1) // Driver entry, dispatch, ioctl handling (nt.c) #define TM_ND (0x1<<2) // Ndis handlers except connection-oriented (nd.c) #define TM_CO (0x1<<3) // Connection-oriented handlers (co.c) #define TM_IP (0x1<<4) // Interface to IP (ip.c) #define TM_WMI (0x1<<5) // WMI (wmi.c) #define TM_CFG (0x1<<6) // Configuration (cfg.c) #define TM_RM (0x1<<7) // RM APIs (rm.c) #define TM_UT (0x1<<8) // UTIL APIs (util.c) #define TM_BUF (0x1<<9) // Buffer management (buf.c) #define TM_FAKE (0x1<<10) // FAKE ndis and ip entrypoints (fake.c) #define TM_ARP (0x1<<11) // ARP request/response handling code (arp.c) #define TM_PKT (0x1<<12) // ARP control packet management (pkt.c) #define TM_MCAP (0x1<<13) // MCAP protocol (mcap.c) #define TM_ETH (0x1<<14) // Ethernet-emulation (eth.c) // Bytes to appear on each line of dump output. // #define DUMP_BytesPerLine 16 //----------------------------------------------------------------------------- // Debug global declarations (defined in debug.c) //----------------------------------------------------------------------------- // Active debug trace level and active trace set mask. Set these variables // with the debugger at startup to enable and filter the debug output. All // messages with (TL_*) level less than or equal to 'g_ulTraceLevel' and from // any (TM_*) set(s) present in 'g_ulTraceMask' are displayed. // extern INT g_ulTraceLevel; extern ULONG g_ulTraceMask; extern INT g_SkipAll; extern INT g_DiscardNonUnicastPackets; //----------------------------------------------------------------------------- // Debug macros //----------------------------------------------------------------------------- #if DBG // TRACE sends printf style output to the kernel debugger. Caller indicates a // "verbosity" level with the 'ulLevel' argument and associates the trace with // one or more trace sets with the 'ulMask' bit mask argument. Notice that // the variable count printf arguments 'Args' must be parenthesized. // #define TRACE(ulLevel, Args) \ { \ if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & TM_CURRENT)) \ { \ DbgPrint( "A13: %s:", dbg_func_name); \ DbgPrint Args; \ DbgPrint ("\n"); \ } \ } // TRACE0 is like TRACE, except that it doesn't print the prefix. // #define TRACE0(ulLevel, Args) \ { \ if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & TM_CURRENT)) \ { \ DbgPrint Args; \ } \ } #define TR_FATAL(Args) \ TRACE(TL_FATAL, Args) #define TR_INFO(Args) \ TRACE(TL_INFO, Args) #define TR_WARN(Args) \ TRACE(TL_WARN, Args) #define TR_VERB(Args) \ TRACE(TL_VERB, Args) #define ENTER(_Name, _locid) \ char *dbg_func_name = (_Name); \ UINT dbg_func_locid = (_locid); #define EXIT() // ASSERT checks caller's assertion expression and if false, prints a kernel // debugger message and breaks. // #undef ASSERT #define ASSERT(x) \ { \ if (!(x)) \ { \ DbgPrint( "A13: !ASSERT( %s ) L:%d,F:%s\n", \ #x, __LINE__, __FILE__ ); \ DbgBreakPoint(); \ } \ } #define ASSERTEX(x, ctxt) \ { \ if (!(x)) \ { \ DbgPrint( "A13: !ASSERT( %s ) C:0x%p L:%d,F:%s\n", \ #x, (ctxt), __LINE__, __FILE__ ); \ DbgBreakPoint(); \ } \ } // DUMP prints to the kernel debugger a hex dump of 'cb' bytes starting at 'p' // in groups of 'ul'. If 'f' is set the address of each line in shown before // the dump. DUMPB, DUMPW, and DUMPDW are BYTE, WORD, and DWORD dumps // respectively. Note that the multi-byte dumps do not reflect little-endian // (Intel) byte order. The 'ulLevel' and 'ulMask' are described for TRACE. // #define DUMP(ulLevel,ulMask,p,cb,f,ul) \ { \ if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & ulMask)) \ { \ Dump( (CHAR* )p, cb, f, ul ); \ } \ } #define DUMPB(ulLevel,ulMask,p,cb) \ { \ if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & ulMask)) \ { \ Dump( (CHAR* )p, cb, 0, 1 ); \ } \ } #define DUMPW(ulLevel,ulMask,p,cb) \ { \ if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & ulMask)) \ { \ Dump( (CHAR* )p, cb, 0, 2 ); \ } \ } #define DUMPDW(ulLevel,ulMask,p,cb) \ { \ if (ulLevel <= g_ulTraceLevel && (g_ulTraceMask & ulMask)) \ { \ Dump( (CHAR* )p, cb, 0, 4 ); \ } \ } // DbgMark does nothing useful. But it is convenient to insert DBGMARK in // places in your code while debugging, and set a breakpoint on DbgMark, so that // the debugger will stop at the places you inserted DBGMARK. It's a bit more // flexible than inserting a hardcoded DbgBreakPoint. // void DbgMark(UINT Luid); #define DBGMARK(_Luid) DbgMark(_Luid) #define DBGSTMT(_stmt) _stmt #define RETAILASSERTEX ASSERTEX #define RETAILASSERT ASSERT #define ARP_INIT_REENTRANCY_COUNT() \ static LONG ReentrancyCount=1; #define ARP_INC_REENTRANCY() \ arpDbgIncrementReentrancy(&ReentrancyCount) #define ARP_DEC_REENTRANCY() \ arpDbgDecrementReentrancy(&ReentrancyCount) #else // !DBG // Debug macros compile out of non-DBG builds. // #define TRACE(ulLevel,ulMask,Args) #define TR_FATAL(Args) #define TR_INFO(Args) #define TR_WARN(Args) #define TR_VERB(Args) #undef ASSERT #define ASSERT(x) #define ASSERTEX(x, ctxt) #define DUMP(ulLevel,ulMask,p,cb,f,dw) #define DUMPB(ulLevel,ulMask,p,cb) #define DUMPW(ulLevel,ulMask,p,cb) #define DUMPDW(ulLevel,ulMask,p,cb) #define ENTER(_Name, _locid) #define EXIT() #define DBGMARK(_Luid) (0) #define DBGSTMT(_stmt) #if 1 #define ARP_INIT_REENTRANCY_COUNT() #define ARP_INC_REENTRANCY() 0 #define ARP_DEC_REENTRANCY() 0 #else // !0 #define ARP_INIT_REENTRANCY_COUNT() \ static LONG ReentrancyCount=1; #define ARP_INC_REENTRANCY() \ arpDbgIncrementReentrancy(&ReentrancyCount) #define ARP_DEC_REENTRANCY() \ arpDbgDecrementReentrancy(&ReentrancyCount) #endif // 0 #define RETAILASSERT(x) \ { \ if (!(x)) \ { \ DbgPrint( "A13: !RETAILASSERT( %s ) L:%d,F:%s\n", \ #x, __LINE__, __FILE__ ); \ DbgBreakPoint(); \ } \ } #define RETAILASSERTEX(x, ctxt) \ { \ if (!(x)) \ { \ DbgPrint( "A13: !RETAILASSERT( %s ) C:0x%p L:%d,F:%s\n",\ #x, (ctxt), __LINE__, __FILE__ ); \ DbgBreakPoint(); \ } \ } #endif #if BINARY_COMPATIBLE #define ASSERT_PASSIVE() (0) #else // !BINARY_COMPATIBLE #define ASSERT_PASSIVE() \ ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL) #endif // !BINARY_COMPATIBLE //----------------------------------------------------------------------------- // Prototypes //----------------------------------------------------------------------------- VOID CheckList( IN LIST_ENTRY* pList, IN BOOLEAN fShowLinks ); VOID Dump( CHAR* p, ULONG cb, BOOLEAN fAddress, ULONG ulGroup ); VOID DumpLine( CHAR* p, ULONG cb, BOOLEAN fAddress, ULONG ulGroup );