/*++ Copyright (c) 1993 Microsoft Corporation :ts=4 Module Name: dbg.h Abstract: debug macros Environment: Kernel & user mode Revision History: 10-27-95 : created --*/ #ifndef __DBG_H__ #define __DBG_H__ // // Structure signatures // #define UHCD_TAG 0x44434855 //"UHCD" #define SIG_QH 0x68714851 //"QHqh" signature for queue head #define SIG_TD 0x64744454 //"TDtd" signature for transfer descriptor #define SIG_EP 0x70655045 //"EPep" signature for endpoint #define SIG_MD 0x646D444D //"MDmd" signature for memory descriptor #define SIG_RH 0x68724852 //"RHrh" signature for root hub #define UHCD_FREE_TAG 0xFFFFFFFF //"" signature free memory #define LOG_MISC 0x00000001 //debug log entries #define LOG_PROFILE 0x00000002 //profile log entries #define LOG_ISO 0x00000004 #define LOG_IO 0x00000008 // Log all I/O access // // Assert Macros // #if DBG // // Assert Macros // // We define our own assert function because ntkern will // not stop in the debugger on assert failures in our own // code. // VOID UHCD_Assert( PVOID FailedAssertion, PVOID FileName, ULONG LineNumber, PCHAR Message ); #define UHCD_ASSERT( exp ) \ if (!(exp)) \ UHCD_Assert( #exp, __FILE__, __LINE__, NULL ) #define UHCD_ASSERTMSG( msg, exp ) \ if (!(exp)) \ UHCD_Assert( #exp, __FILE__, __LINE__, msg ) #define ASSERT_TRANFSER_DESCRIPTOR(td) UHCD_ASSERT(td->Sig == SIG_TD) #define ASSERT_QUEUE_HEAD(qh) UHCD_ASSERT(qh->Sig == SIG_QH) #define ASSERT_ENDPOINT(ep) UHCD_ASSERT(ep->Sig == SIG_EP) #define ASSERT_MD(md) UHCD_ASSERT(md->Sig == SIG_MD) #define ASSERT_RH(rh) UHCD_ASSERT(rh->Sig == SIG_RH) VOID UHCD_CheckSystemBuffer( IN PUCHAR VirtualAddress, IN ULONG Length ); //#define ASSERT_BUFFER(buf, len) UHCD_CheckSystemBuffer(buf, len) #define ASSERT_BUFFER(buf, len) // // Heap Macros for debug heap services // extern LONG UHCD_TotalAllocatedHeapSpace; #define GETHEAP(pooltype, numbytes) UHCD_Debug_GetHeap(pooltype, numbytes, UHCD_TAG, &UHCD_TotalAllocatedHeapSpace) #define RETHEAP(p) UHCD_Debug_RetHeap(p, UHCD_TAG, &UHCD_TotalAllocatedHeapSpace); VOID UHCD_PrintPnPMessage( PUCHAR Label, UCHAR MinorFunction ); VOID UHCD_PrintPowerMessage( PUCHAR Label, UCHAR MinorFunction ); ULONG _cdecl UHCD_KdPrintX( ULONG l, PCH Format, ... ); #define UHCD_KdPrint(_x_) UHCD_KdPrintX _x_ // // ** DEBUG TRAPS // // Ntkern currently implements DebugBreak with a global int 3, // we really would like the int 3 in our own code. // TEST_TRAP() is a code coverage trap these should be removed // if you are able to 'g' past them OK // // KdTrap() breaks in the debugger on the debugger build // these indicate bugs in client drivers or fatal error // conditions that should be debugged. also used to mark // code for features not implemented yet. // // KdBreak() breaks in the debugger when in MAX_DEBUG mode // ie debug trace info is turned on, these are intended to help // debug drivers devices and special conditions on the // bus. #ifdef NTKERN #pragma message ("warning: ntkern debug enabled") #define TRAP() _asm { int 3 } #define TEST_TRAP() _asm { int 3 } #else #define TRAP() DbgBreakPoint() #define TEST_TRAP() { \ DbgPrint ("'UHCD.SYS: Code Coverage %s, %d\n", __FILE__, __LINE__);\ TRAP(); \ } #endif #ifdef MAX_DEBUG #define UHCD_KdBreak(_s_) {UHCD_KdPrintX _s_ ; TRAP();} #else //#define UHCD_KdBreak(_s_) {DbgPrint("'UHCD: "); DbgPrint _s_; } #define UHCD_KdBreak(_s_) #endif #define UHCD_KdTrap(_s_) {DbgPrint("UHCD: "); DbgPrint _s_; TRAP();} VOID UHCD_Debug_DumpTD( IN struct _HW_TRANSFER_DESCRIPTOR *Transfer ); PVOID UHCD_Debug_GetHeap( IN POOL_TYPE PoolType, IN ULONG NumberOfBytes, IN ULONG Signature, IN PLONG TotalAllocatedHeapSpace ); VOID UHCD_Debug_RetHeap( IN PVOID P, IN ULONG Signature, IN PLONG TotalAllocatedHeapSpace ); #define UHCD_ASSERT_QSTOPPED(devobj, ep, qtd) #ifdef PROFILE2 #define DEBUG_LOG #define STARTPROC(tag) LONG start, stop; \ LONG delta; \ start = ; \ LOGENTRY(LOG_PROFILE, tag, start, 0, 0); #define ENDPROC(tag) stop = ; \ delta = stop - start; \ LOGENTRY(LOG_PROFILE, tag, stop, start, delta); #else #define STARTPROC(tag) #define ENDPROC(tag) #endif /* PROFILE */ #else /* NOT DBG */ #define UHCD_KdTrap(_s_) #define UHCD_KdBreak(_s_) #define ASSERT_TRANFSER_DESCRIPTOR(td) #define ASSERT_QUEUE_HEAD(qh) #define ASSERT_ENDPOINT(ep) #define ASSERT_MD(md) #define ASSERT_RH(rh) #define UHCD_KdPrint(_x_) #define TRAP() #define TEST_TRAP(); #define UHCD_ASSERT_QSTOPPED(devobj, ep, qtd) #define UHCD_ASSERT( exp ) #define ASSERT_BUFFER(buf, len) #define UHCD_Debug_DumpTD(transfer) #define GETHEAP(pooltype, numbytes) ExAllocatePoolWithTag(pooltype, numbytes, UHCD_TAG) #define RETHEAP(p) ExFreePool(p); #define STARTPROC(tag) #define ENDPROC(tag) #define UHCD_PrintPnPMessage(Label, MinorFunction) #define UHCD_PrintPowerMessage(Label, MinorFunction) #endif /* DBG */ #ifdef DEBUG_LOG VOID UHCD_LogTD( IN ULONG s, IN PULONG p ); #define LOGENTRY(mask, sig, info1, info2, info3) \ UHCD_Debug_LogEntry(mask, sig, (ULONG_PTR)info1, \ (ULONG_PTR)info2, \ (ULONG_PTR)info3) #define LOG_TD(sig, td) UHCD_LogTD(sig, (PULONG)td) #ifdef DEBUG_LOG_IO #define WRITE_PORT_USHORT(P, V) UhcdLogIoUshort((P), (V), 1) #define WRITE_PORT_ULONG(P, V) UhcdLogIoUlong((P), (V), 1) #define WRITE_PORT_UCHAR(P, V) UhcdLogIoUchar((P), (V), 1) #define READ_PORT_USHORT(P) UhcdLogIoUshort((P), 0, 0) #define READ_PORT_ULONG(P) UhcdLogIoUlong((P), 0, 0) #define READ_PORT_UCHAR(P) UhcdLogIoUchar((P), 0, 0) USHORT UhcdLogIoUshort(PUSHORT Port, USHORT Val, BOOLEAN Write); ULONG UhcdLogIoUlong(PULONG Port, ULONG Val, BOOLEAN Write); UCHAR UhcdLogIoUchar(PUCHAR Port, UCHAR Val, BOOLEAN Write); #endif // DEBUG_LOG_IO VOID UHCD_Debug_LogEntry( IN ULONG Mask, IN ULONG Sig, IN ULONG_PTR Info1, IN ULONG_PTR Info2, IN ULONG_PTR Info3 ); VOID UHCD_LogInit( ); VOID UHCD_LogFree( ); #else #define LOGENTRY(mask, sig, info1, info2, info3) #define LOG_TD(sig, td) #endif #endif /* __DBG_H__ */