Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

306 lines
6.5 KiB

/*++
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__ */