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.
 
 
 
 
 
 

229 lines
5.9 KiB

/******************************Module*Header*******************************\
* Module Name: debug.c
*
* Debug helper routines.
*
* Copyright (c) 1992-1995 Microsoft Corporation
*
\**************************************************************************/
#include "precomp.h"
#if DBG
////////////////////////////////////////////////////////////////////////////
// DEBUGGING INITIALIZATION CODE
//
// When you're bringing up your display for the first time, you can
// recompile with 'DebugLevel' set to 100. That will cause absolutely
// all DISPDBG messages to be displayed on the kernel debugger (this
// is known as the "PrintF Approach to Debugging" and is about the only
// viable method for debugging driver initialization code).
LONG DebugLevel = 0; // Set to '100' to debug initialization code
// (the default is '0')
////////////////////////////////////////////////////////////////////////////
LONG gcFifo = 0; // Number of currently free FIFO entries
#define LARGE_LOOP_COUNT 10000000
////////////////////////////////////////////////////////////////////////////
// Miscellaneous Driver Debug Routines
////////////////////////////////////////////////////////////////////////////
/*****************************************************************************
*
* Routine Description:
*
* This function is variable-argument, level-sensitive debug print
* routine.
* If the specified debug level for the print statement is lower or equal
* to the current debug level, the message will be printed.
*
* Arguments:
*
* DebugPrintLevel - Specifies at which debugging level the string should
* be printed
*
* DebugMessage - Variable argument ascii c string
*
* Return Value:
*
* None.
*
***************************************************************************/
VOID
DebugPrint(
LONG DebugPrintLevel,
PCHAR DebugMessage,
...
)
{
va_list ap;
#if TARGET_BUILD <= 351
char buffer[128];
#endif
va_start(ap, DebugMessage);
if (DebugPrintLevel <= DebugLevel)
{
#if TARGET_BUILD > 351
EngDebugPrint(STANDARD_DEBUG_PREFIX, DebugMessage, ap);
EngDebugPrint("", "\n", ap);
#else
vsprintf( buffer, DebugMessage, ap );
OutputDebugString( buffer );
OutputDebugString("\n");
#endif
}
va_end(ap);
} // DebugPrint()
/******************************Public*Routine******************************\
* VOID vCheckFifoWrite
\**************************************************************************/
VOID vCheckFifoWrite()
{
gcFifo--;
if (gcFifo < 0)
{
gcFifo = 0;
RIP("Incorrect FIFO wait count");
}
}
/******************************Public*Routine******************************\
* VOID vI32CheckFifoSpace
\**************************************************************************/
VOID vI32CheckFifoSpace(
PDEV* ppdev,
VOID* pbase,
LONG level)
{
LONG i;
ASSERTDD((level > 0) && (level <= 16), "Illegal wait level");
ASSERTDD((ppdev->iMachType == MACH_IO_32) || (ppdev->iMachType == MACH_MM_32),
"Wrong Mach type!");
gcFifo = level;
for (i = LARGE_LOOP_COUNT; i != 0; i--)
{
if (!(I32_IW(pbase, EXT_FIFO_STATUS) & (0x10000L >> (level))))
return; // There are 'level' entries free
}
RIP("vI32CheckFifoSpace timeout -- The hardware is in a funky state.");
}
/******************************Public*Routine******************************\
* VOID vM32CheckFifoSpace
\**************************************************************************/
VOID vM32CheckFifoSpace(
PDEV* ppdev,
VOID* pbase,
LONG level)
{
LONG i;
ASSERTDD((level > 0) && (level <= 16), "Illegal wait level");
ASSERTDD(ppdev->iMachType == MACH_MM_32, "Wrong Mach type!");
gcFifo = level;
for (i = LARGE_LOOP_COUNT; i != 0; i--)
{
if (!(M32_IW(pbase, EXT_FIFO_STATUS) & (0x10000L >> (level))))
return; // There are 'level' entries free
}
RIP("vM32CheckFifoSpace timeout -- The hardware is in a funky state.");
}
/******************************Public*Routine******************************\
* VOID vM64CheckFifoSpace
\**************************************************************************/
VOID vM64CheckFifoSpace(
PDEV* ppdev,
VOID* pbase,
LONG level)
{
LONG i;
ASSERTDD((level > 0) && (level <= 16), "Illegal wait level");
ASSERTDD(ppdev->iMachType == MACH_MM_64, "Wrong Mach type!");
gcFifo = level;
for (i = LARGE_LOOP_COUNT; i != 0; i--)
{
if (!(M64_ID((pbase), FIFO_STAT) & (0x10000L >> (level))))
return; // There are 'level' entries free
}
RIP("vM64CheckFifoSpace timeout -- The hardware is in a funky state.");
}
/******************************Public*Routine******************************\
* ULONG ulM64FastFifoCheck
\**************************************************************************/
ULONG ulM64FastFifoCheck(
PDEV* ppdev,
VOID* pbase,
LONG level,
ULONG ulFifo)
{
LONG i;
ULONG ulFree;
LONG cFree;
ASSERTDD((level > 0) && (level <= 16), "Illegal wait level");
ASSERTDD(ppdev->iMachType == MACH_MM_64, "Wrong Mach type!");
i = LARGE_LOOP_COUNT;
do {
ulFifo = ~M64_ID((pbase), FIFO_STAT); // Invert bits
// Count the number of empty slots:
ulFree = ulFifo;
cFree = 0;
while (ulFree & 0x8000)
{
cFree++;
ulFree <<= 1;
}
// Break if we've been looping a zillion times:
if (--i == 0)
{
RIP("vM64CheckFifoSpace timeout -- The hardware is in a funky state.");
break;
}
} while (cFree < level);
gcFifo = cFree;
// Account for the slots we're about to use:
return(ulFifo << level);
}
////////////////////////////////////////////////////////////////////////////
#endif // DBG