307 lines
6.5 KiB
C
307 lines
6.5 KiB
C
|
/*++
|
||
|
|
||
|
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__ */
|