/*++

Copyright (c) 1995    Microsoft Corporation

Module Name:

    DBG.H

Abstract:

    This module contains the PRIVATE (driver-only) definitions for the
    code that implements the usbd driver.

Environment:

    Kernel & user mode

Revision History:

    09-29-95 : created

--*/


#define NAME_MAX 64

#define USBD_TAG         0x44425355     /* "USBD" */
#define USBD_FREE_TAG     0x65657266    /* "free" */

#if DBG
#define DEBUG_LOG
#define DEBUG_HEAP
#endif

#define SIG_CONFIG          0x464E4F43        //"CONF" signature for config handle
#define SIG_PIPE            0x45504950        //"PIPE" signature for pipe handle
#define SIG_INTERFACE       0x43414658        //"XFAC" signature for interface handle 
#define SIG_DEVICE          0x56454455        //"UDEV" signature for device handle


#if DBG
                                
#define ASSERT_CONFIG(ch)       USBD_ASSERT((ch)->Sig == SIG_CONFIG)
#define ASSERT_PIPE(ph)         USBD_ASSERT((ph)->Sig == SIG_PIPE)
#define ASSERT_INTERFACE(ih)    USBD_ASSERT((ih)->Sig == SIG_INTERFACE)
#define ASSERT_DEVICE(d)        USBD_ASSERT((d)->Sig == SIG_DEVICE)



ULONG
_cdecl
USBD_KdPrintX(
    PCH Format,
    ...
    );

extern ULONG USBD_Debug_Trace_Level;

// the convention here is to print to the ntkern log if 
// l (level) is > 1 otherwise print to the terminal
// in usbd you have to manully specify the ' in the output 
// string
#define USBD_KdPrint(l, _x_) if (((l) == 0) || (((l)-1) < USBD_Debug_Trace_Level)) \
    {\
        if ((l) == 1) {\
            DbgPrint("USBD: ");\
        } else {\
            DbgPrint("'USBD: ");\
        }\
        USBD_KdPrintX _x_;\
    }

VOID
USBD_Assert(
    PVOID FailedAssertion,
    PVOID FileName,
    ULONG LineNumber,
    PCHAR Message
    );

#define USBD_ASSERT( exp ) \
    if (!(exp)) \
        USBD_Assert( #exp, __FILE__, __LINE__, NULL )

#define USBD_ASSERTMSG( msg, exp ) \
    if (!(exp)) \
        USBD_Assert( #exp, __FILE__, __LINE__, msg )

// TEST_TRAP() is a code coverage trap these should be removed
// if you are able to 'g' past the OK
// 
// TRAP() 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
// Ntkern currently implements DebugBreak with a global int 3,
// we really would like the int 3 in our own code.
    
#define DBGBREAK() _asm { int 3 }
#else
#define DBGBREAK() DbgBreakPoint()
#endif /* NTKERN */

#define TEST_TRAP() { DbgPrint( " Code Coverage Trap %s %d\n", __FILE__, __LINE__); \
                      DBGBREAK(); }

#ifdef MAX_DEBUG
#define USBD_KdBreak(_x_) { DbgPrint("USBD:"); \
                            DbgPrint _x_ ; \
                            DBGBREAK(); }
#else
#define USBD_KdBreak(_x_)
#endif

#define USBD_KdTrap(_x_)  { DbgPrint( "USBD: "); \
                            DbgPrint _x_; \
                            DBGBREAK(); }

VOID 
USBD_Debug_LogEntry(
    IN CHAR *Name, 
    IN ULONG_PTR Info1, 
    IN ULONG_PTR Info2, 
    IN ULONG_PTR Info3
    );

#define LOGENTRY(sig, info1, info2, info3) \
    USBD_Debug_LogEntry(sig, (ULONG_PTR)info1, (ULONG_PTR)info2, (ULONG_PTR)info3)

extern LONG USBDTotalHeapAllocated;

PVOID
USBD_Debug_GetHeap(
    IN POOL_TYPE PoolType,
    IN ULONG NumberOfBytes,
    IN ULONG Signature,
    IN PLONG TotalAllocatedHeapSpace
    );
    
#define GETHEAP(pooltype, numbytes) USBD_Debug_GetHeap(pooltype, numbytes,\
                                         USBD_TAG, &USBDTotalHeapAllocated)               

VOID
USBD_Debug_RetHeap(
    IN PVOID P,
    IN ULONG Signature,
    IN PLONG TotalAllocatedHeapSpace
    );

#define RETHEAP(p)    USBD_Debug_RetHeap(p, USBD_TAG, &USBDTotalHeapAllocated)    

#else /* DBG not defined */

#define USBD_KdBreak(_x_) 

#define USBD_KdPrint(l, _x_) 

#define USBD_KdTrap(_x_)  

#define TEST_TRAP()

#define ASSERT_CONFIG(ch)        
#define ASSERT_PIPE(ph)            
#define ASSERT_INTERFACE(ih)    
#define ASSERT_DEVICE(d)   

#define USBD_ASSERT( exp )

#define USBD_ASSERTMSG( msg, exp )

#define GETHEAP(pooltype, numbytes) ExAllocatePoolWithTag(pooltype, numbytes, USBD_TAG)               

#define RETHEAP(p) ExFreePool(p)               

#endif /* DBG */