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.
 
 
 
 
 
 

757 lines
14 KiB

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
debug.c
Abstract:
This module contains all debug-related code.
Revision History:
Who When What
-------- -------- ----------------------------------------------
arvindm 06-13-96 Created
Notes:
--*/
#include <precomp.h>
#include "ntddk.h"
#include <cxport.h>
#include "ndis.h"
#include "debug.h"
#if DBG
#ifdef ATMARP_WIN98
INT AaDebugLevel=AAD_WARNING;
INT AaMcDebugLevel=AAD_WARNING;
#else
INT AaDebugLevel=AAD_WARNING;
INT AaMcDebugLevel=AAD_WARNING;
#endif
INT AaDataDebugLevel=0;
INT AadBigDataLength=8000;
INT AaSkipAll = 0;
PAAD_ALLOCATION AadMemoryHead = (PAAD_ALLOCATION)NULL;
PAAD_ALLOCATION AadMemoryTail = (PAAD_ALLOCATION)NULL;
ULONG AadAllocCount = 0; // how many allocated so far (unfreed)
NDIS_SPIN_LOCK AadMemoryLock;
BOOLEAN AadInitDone = FALSE;
PVOID
AaAuditAllocMem(
PVOID pPointer,
ULONG Size,
ULONG FileNumber,
ULONG LineNumber
)
{
PVOID pBuffer;
PAAD_ALLOCATION pAllocInfo;
if (!AadInitDone)
{
NdisAllocateSpinLock(&(AadMemoryLock));
AadInitDone = TRUE;
}
NdisAllocateMemoryWithTag(
(PVOID *)&pAllocInfo,
Size+FIELD_OFFSET(AAD_ALLOCATION, UserData),
(ULONG)'CPRA'
);
if (pAllocInfo == (PAAD_ALLOCATION)NULL)
{
AADEBUGP(AAD_VERY_LOUD+50,
("AaAuditAllocMem: file %d, line %d, Size %d failed!\n",
FileNumber, LineNumber, Size));
pBuffer = NULL;
}
else
{
pBuffer = (PVOID)&(pAllocInfo->UserData);
AA_SET_MEM(pBuffer, 0xaf, Size);
pAllocInfo->Signature = AAD_MEMORY_SIGNATURE;
pAllocInfo->FileNumber = FileNumber;
pAllocInfo->LineNumber = LineNumber;
pAllocInfo->Size = Size;
pAllocInfo->Location = pPointer;
pAllocInfo->Next = (PAAD_ALLOCATION)NULL;
NdisAcquireSpinLock(&(AadMemoryLock));
pAllocInfo->Prev = AadMemoryTail;
if (AadMemoryTail == (PAAD_ALLOCATION)NULL)
{
// empty list
AadMemoryHead = AadMemoryTail = pAllocInfo;
}
else
{
AadMemoryTail->Next = pAllocInfo;
}
AadMemoryTail = pAllocInfo;
AadAllocCount++;
NdisReleaseSpinLock(&(AadMemoryLock));
}
AADEBUGP(AAD_VERY_LOUD+100,
("AaAuditAllocMem: file %c%c%c%c, line %d, %d bytes, [0x%x] <- 0x%x\n",
(CHAR)(FileNumber & 0xff),
(CHAR)((FileNumber >> 8) & 0xff),
(CHAR)((FileNumber >> 16) & 0xff),
(CHAR)((FileNumber >> 24) & 0xff),
LineNumber, Size, pPointer, pBuffer));
return (pBuffer);
}
VOID
AaAuditFreeMem(
PVOID Pointer
)
{
PAAD_ALLOCATION pAllocInfo;
pAllocInfo = STRUCT_OF(AAD_ALLOCATION, Pointer, UserData);
if (pAllocInfo->Signature != AAD_MEMORY_SIGNATURE)
{
AADEBUGP(AAD_ERROR,
("AaAuditFreeMem: unknown buffer 0x%x!\n", Pointer));
#ifdef DBG
DbgBreakPoint();
#endif
return;
}
NdisAcquireSpinLock(&(AadMemoryLock));
pAllocInfo->Signature = (ULONG)'DEAD';
if (pAllocInfo->Prev != (PAAD_ALLOCATION)NULL)
{
pAllocInfo->Prev->Next = pAllocInfo->Next;
}
else
{
AadMemoryHead = pAllocInfo->Next;
}
if (pAllocInfo->Next != (PAAD_ALLOCATION)NULL)
{
pAllocInfo->Next->Prev = pAllocInfo->Prev;
}
else
{
AadMemoryTail = pAllocInfo->Prev;
}
AadAllocCount--;
NdisReleaseSpinLock(&(AadMemoryLock));
NdisFreeMemory(pAllocInfo, 0, 0);
}
VOID
AaAuditShutdown(
VOID
)
{
if (AadInitDone)
{
if (AadAllocCount != 0)
{
AADEBUGP(AAD_ERROR, ("AuditShutdown: unfreed memory, %d blocks!\n",
AadAllocCount));
AADEBUGP(AAD_ERROR, ("MemoryHead: 0x%x, MemoryTail: 0x%x\n",
AadMemoryHead, AadMemoryTail));
DbgBreakPoint();
{
PAAD_ALLOCATION pAllocInfo;
while (AadMemoryHead != (PAAD_ALLOCATION)NULL)
{
pAllocInfo = AadMemoryHead;
AADEBUGP(AAD_INFO, ("AuditShutdown: will free 0x%x\n", pAllocInfo));
AaAuditFreeMem(&(pAllocInfo->UserData));
}
}
}
AadInitDone = FALSE;
}
}
#define MAX_HD_LENGTH 128
VOID
DbgPrintHexDump(
IN PUCHAR pBuffer,
IN ULONG Length
)
/*++
Routine Description:
Print a hex dump of the given contiguous buffer. If the length
is too long, we truncate it.
Arguments:
pBuffer - Points to start of data to be dumped
Length - Length of above.
Return Value:
None
--*/
{
ULONG i;
if (Length > MAX_HD_LENGTH)
{
Length = MAX_HD_LENGTH;
}
for (i = 0; i < Length; i++)
{
//
// Check if we are at the end of a line
//
if ((i > 0) && ((i & 0xf) == 0))
{
DbgPrint("\n");
}
//
// Print addr if we are at start of a new line
//
if ((i & 0xf) == 0)
{
DbgPrint("%08x ", pBuffer);
}
DbgPrint(" %02x", *pBuffer++);
}
//
// Terminate the last line.
//
if (Length > 0)
{
DbgPrint("\n");
}
}
VOID
DbgPrintAtmAddr(
IN PCHAR pString,
IN ATM_ADDRESS UNALIGNED * pAddr
)
{
ULONG i;
ULONG NumOfDigits;
PUCHAR pSrc, pDst;
UCHAR AddrString[(ATM_ADDRESS_LENGTH*2) + 1];
//
// Prepare the Address string in ASCII
//
if ((NumOfDigits = pAddr->NumberOfDigits) > ATM_ADDRESS_LENGTH)
{
NumOfDigits = ATM_ADDRESS_LENGTH;
}
pSrc = pAddr->Address;
pDst = AddrString;
for (i = 0; i < NumOfDigits; i++, pSrc++)
{
*pDst = ((*pSrc) >> 4);
*pDst += (((*pDst) > 9) ? ('A' - 10) : '0');
pDst++;
*pDst = ((*pSrc) & 0x0F);
*pDst += (((*pDst) > 9) ? ('A' - 10) : '0');
pDst++;
}
*pDst = '\0';
DbgPrint("%s%s\n", pString, AddrString);
}
VOID
DbgPrintMapping(
IN PCHAR pString,
IN UCHAR UNALIGNED * pIpAddr,
IN ATM_ADDRESS UNALIGNED * pAtmAddr
)
{
DbgPrint("ATMARPC: %s %d.%d.%d.%d -> ",
pString,
((PUCHAR)pIpAddr)[0],
((PUCHAR)pIpAddr)[1],
((PUCHAR)pIpAddr)[2],
((PUCHAR)pIpAddr)[3]
);
DbgPrintAtmAddr("", pAtmAddr);
}
ULONG OutstandingSends = 0;
VOID
AaCoSendPackets(
IN NDIS_HANDLE NdisVcHandle,
IN PNDIS_PACKET * PacketArray,
IN UINT PacketCount
)
{
PNDIS_PACKET pNdisPacket;
UINT c;
NDIS_STATUS Status;
PNDIS_BUFFER pNdisBuffer;
PULONG pContext;
for (c = 0; c < PacketCount; c++)
{
pNdisPacket = PacketArray[c];
AA_ASSERT(pNdisPacket->Private.Head != NULL);
Status = NDIS_GET_PACKET_STATUS(pNdisPacket);
AA_ASSERT(Status != NDIS_STATUS_FAILURE);
pContext = (PULONG)&(pNdisPacket->WrapperReserved[0]);
*pContext = 'AaAa';
}
NdisInterlockedIncrement(&OutstandingSends);
NdisCoSendPackets(NdisVcHandle, PacketArray, PacketCount);
}
#endif // DBG
#if DBG_SPIN_LOCK
ULONG AadSpinLockInitDone = 0;
NDIS_SPIN_LOCK AadLockLock;
VOID
AtmArpAllocateSpinLock(
IN PATMARP_LOCK pLock,
IN ULONG FileNumber,
IN ULONG LineNumber
)
{
if (AadSpinLockInitDone == 0)
{
AadSpinLockInitDone = 1;
NdisAllocateSpinLock(&(AadLockLock));
}
NdisAcquireSpinLock(&(AadLockLock));
pLock->Signature = AAL_SIG;
pLock->TouchedByFileNumber = FileNumber;
pLock->TouchedInLineNumber = LineNumber;
pLock->IsAcquired = 0;
pLock->OwnerThread = 0;
NdisAllocateSpinLock(&(pLock->NdisLock));
NdisReleaseSpinLock(&(AadLockLock));
}
VOID
AtmArpAcquireSpinLock(
IN PATMARP_LOCK pLock,
IN ULONG FileNumber,
IN ULONG LineNumber
)
{
PKTHREAD pThread;
pThread = KeGetCurrentThread();
NdisAcquireSpinLock(&(AadLockLock));
if (pLock->Signature != AAL_SIG)
{
DbgPrint("Trying to acquire uninited lock 0x%x, File %c%c%c%c, Line %d\n",
pLock,
(CHAR)(FileNumber & 0xff),
(CHAR)((FileNumber >> 8) & 0xff),
(CHAR)((FileNumber >> 16) & 0xff),
(CHAR)((FileNumber >> 24) & 0xff),
LineNumber);
DbgBreakPoint();
}
if (pLock->IsAcquired != 0)
{
if (pLock->OwnerThread == pThread)
{
DbgPrint("Detected multiple locking!: pLock 0x%x, File %c%c%c%c, Line %d\n",
pLock,
(CHAR)(FileNumber & 0xff),
(CHAR)((FileNumber >> 8) & 0xff),
(CHAR)((FileNumber >> 16) & 0xff),
(CHAR)((FileNumber >> 24) & 0xff),
LineNumber);
DbgPrint("pLock 0x%x already acquired in File %c%c%c%c, Line %d\n",
pLock,
(CHAR)(pLock->TouchedByFileNumber & 0xff),
(CHAR)((pLock->TouchedByFileNumber >> 8) & 0xff),
(CHAR)((pLock->TouchedByFileNumber >> 16) & 0xff),
(CHAR)((pLock->TouchedByFileNumber >> 24) & 0xff),
pLock->TouchedInLineNumber);
DbgBreakPoint();
}
}
pLock->IsAcquired++;
NdisReleaseSpinLock(&(AadLockLock));
NdisAcquireSpinLock(&(pLock->NdisLock));
//
// Mark this lock.
//
pLock->OwnerThread = pThread;
pLock->TouchedByFileNumber = FileNumber;
pLock->TouchedInLineNumber = LineNumber;
}
VOID
AtmArpReleaseSpinLock(
IN PATMARP_LOCK pLock,
IN ULONG FileNumber,
IN ULONG LineNumber
)
{
NdisDprAcquireSpinLock(&(AadLockLock));
if (pLock->Signature != AAL_SIG)
{
DbgPrint("Trying to release uninited lock 0x%x, File %c%c%c%c, Line %d\n",
pLock,
(CHAR)(FileNumber & 0xff),
(CHAR)((FileNumber >> 8) & 0xff),
(CHAR)((FileNumber >> 16) & 0xff),
(CHAR)((FileNumber >> 24) & 0xff),
LineNumber);
DbgBreakPoint();
}
if (pLock->IsAcquired == 0)
{
DbgPrint("Detected release of unacquired lock 0x%x, File %c%c%c%c, Line %d\n",
pLock,
(CHAR)(FileNumber & 0xff),
(CHAR)((FileNumber >> 8) & 0xff),
(CHAR)((FileNumber >> 16) & 0xff),
(CHAR)((FileNumber >> 24) & 0xff),
LineNumber);
DbgBreakPoint();
}
pLock->TouchedByFileNumber = FileNumber;
pLock->TouchedInLineNumber = LineNumber;
pLock->IsAcquired--;
pLock->OwnerThread = 0;
NdisDprReleaseSpinLock(&(AadLockLock));
NdisReleaseSpinLock(&(pLock->NdisLock));
}
#endif // DBG_SPIN_LOCK
#ifdef PERF
#define MAX_SEND_LOG_ENTRIES 100
LARGE_INTEGER TimeFrequency;
BOOLEAN SendLogInitDone = FALSE;
BOOLEAN SendLogUpdate = TRUE;
NDIS_SPIN_LOCK SendLogLock;
AAD_SEND_LOG_ENTRY SendLog[MAX_SEND_LOG_ENTRIES];
ULONG SendLogIndex = 0;
PAAD_SEND_LOG_ENTRY pSendLog = SendLog;
ULONG MaxSendTime;
#define TIME_TO_ULONG(_pTime) *((PULONG)_pTime)
VOID
AadLogSendStart(
IN PNDIS_PACKET pNdisPacket,
IN ULONG Destination,
IN PVOID pRCE
)
{
ULONG Length;
if (SendLogInitDone == FALSE)
{
SendLogInitDone = TRUE;
(VOID)KeQueryPerformanceCounter(&TimeFrequency);
MaxSendTime = (TIME_TO_ULONG(&TimeFrequency) * 2)/3;
NdisAllocateSpinLock(&SendLogLock);
}
NdisQueryPacket(
pNdisPacket,
NULL,
NULL,
NULL,
&Length
);
NdisAcquireSpinLock(&SendLogLock);
pSendLog->Flags = AAD_SEND_FLAG_WAITING_COMPLETION;
if (pRCE != NULL)
{
pSendLog->Flags |= AAD_SEND_FLAG_RCE_GIVEN;
}
pSendLog->pNdisPacket = pNdisPacket;
pSendLog->Destination = Destination;
pSendLog->Length = Length;
pSendLog->SendTime = KeQueryPerformanceCounter(&TimeFrequency);
pSendLog++;
SendLogIndex++;
if (SendLogIndex == MAX_SEND_LOG_ENTRIES)
{
SendLogIndex = 0;
pSendLog = SendLog;
}
NdisReleaseSpinLock(&SendLogLock);
}
VOID
AadLogSendUpdate(
IN PNDIS_PACKET pNdisPacket
)
{
PAAD_SEND_LOG_ENTRY pEntry;
ULONG Index;
ULONG SendTime;
if (!SendLogUpdate)
{
return;
}
NdisAcquireSpinLock(&SendLogLock);
pEntry = SendLog;
for (Index = 0; Index < MAX_SEND_LOG_ENTRIES; Index++)
{
if (((pEntry->Flags & AAD_SEND_FLAG_WAITING_COMPLETION) != 0) &&
(pEntry->pNdisPacket == pNdisPacket))
{
pEntry->SendTime = KeQueryPerformanceCounter(&TimeFrequency);
break;
}
pEntry++;
}
NdisReleaseSpinLock(&SendLogLock);
}
VOID
AadLogSendComplete(
IN PNDIS_PACKET pNdisPacket
)
{
PAAD_SEND_LOG_ENTRY pEntry;
ULONG Index;
ULONG SendTime;
NdisAcquireSpinLock(&SendLogLock);
pEntry = SendLog;
for (Index = 0; Index < MAX_SEND_LOG_ENTRIES; Index++)
{
if (((pEntry->Flags & AAD_SEND_FLAG_WAITING_COMPLETION) != 0) &&
(pEntry->pNdisPacket == pNdisPacket))
{
pEntry->Flags &= ~AAD_SEND_FLAG_WAITING_COMPLETION;
pEntry->Flags |= AAD_SEND_FLAG_COMPLETED;
pEntry->SendCompleteTime = KeQueryPerformanceCounter(&TimeFrequency);
if (((pEntry->Flags & AAD_SEND_FLAG_RCE_GIVEN) != 0) &&
((SendTime = TIME_TO_ULONG(&pEntry->SendCompleteTime) -
TIME_TO_ULONG(&pEntry->SendTime)) > MaxSendTime))
{
DbgPrint("Dest %d.%d.%d.%d, Pkt 0x%x, Len %d, Flags 0x%x, Took Long %d (0x%x)\n",
((PUCHAR)&pEntry->Destination)[0],
((PUCHAR)&pEntry->Destination)[1],
((PUCHAR)&pEntry->Destination)[2],
((PUCHAR)&pEntry->Destination)[3],
pNdisPacket, pEntry->Length, pEntry->Flags, SendTime, SendTime);
}
break;
}
pEntry++;
}
NdisReleaseSpinLock(&SendLogLock);
}
VOID
AadLogSendAbort(
IN PNDIS_PACKET pNdisPacket
)
{
PAAD_SEND_LOG_ENTRY pEntry;
ULONG Index;
ULONG SendTime;
NdisAcquireSpinLock(&SendLogLock);
pEntry = SendLog;
for (Index = 0; Index < MAX_SEND_LOG_ENTRIES; Index++)
{
if (((pEntry->Flags & AAD_SEND_FLAG_WAITING_COMPLETION) != 0) &&
(pEntry->pNdisPacket == pNdisPacket))
{
pEntry->Flags = 0;
break;
}
pEntry++;
}
NdisReleaseSpinLock(&SendLogLock);
}
#endif // PERF
#if DBG
extern
VOID
AtmArpReferenceAtmEntryEx(
IN PATMARP_ATM_ENTRY pAtmEntry,
AE_REFTYPE RefType
)
{
AA_ASSERT(RefType>=0 && RefType < AE_REFTYPE_COUNT);
pAtmEntry->Refs[RefType]++;
// AA_ASSERT(pAtmEntry->Refs[RefType] < 128);
AtmArpReferenceAtmEntry(pAtmEntry);
}
extern
ULONG
AtmArpDereferenceAtmEntryEx(
IN PATMARP_ATM_ENTRY pAtmEntry,
IN AE_REFTYPE RefType,
IN BOOLEAN fOkToDelete
)
{
AA_ASSERT(RefType>=0 && RefType < AE_REFTYPE_COUNT);
// AA_ASSERT(pAtmEntry->Refs[RefType]);
pAtmEntry->Refs[RefType]--;
if (fOkToDelete)
{
return AtmArpDereferenceAtmEntry(pAtmEntry);
}
else
{
AA_ASSERT(pAtmEntry->RefCount);
return --(pAtmEntry->RefCount);
}
}
extern
VOID
AtmArpReferenceIPEntryEx(
IN PATMARP_IP_ENTRY pIpEntry,
IN IE_REFTYPE RefType
)
{
AA_ASSERT(RefType>=0 && RefType < IE_REFTYPE_COUNT);
pIpEntry->Refs[RefType]++;
// AA_ASSERT(pIpEntry->Refs[RefType] < 128);
AtmArpReferenceIPEntry(pIpEntry);
}
extern
ULONG
AtmArpDereferenceIPEntryEx(
IN PATMARP_IP_ENTRY pIpEntry,
IN IE_REFTYPE RefType,
IN BOOLEAN fOkToDelete
)
{
AA_ASSERT(RefType>=0 && RefType < IE_REFTYPE_COUNT);
// AA_ASSERT(pIpEntry->Refs[RefType]);
pIpEntry->Refs[RefType]--;
if (fOkToDelete)
{
return AtmArpDereferenceIPEntry(pIpEntry);
}
else
{
AA_ASSERT(pIpEntry->RefCount);
return --(pIpEntry->RefCount);
}
}
VOID
AtmArpReferenceJoinEntryEx(
IN PATMARP_IPMC_JOIN_ENTRY pJoinEntry,
IN ULONG RefInfo
)
{
AA_STRUCT_ASSERT(pJoinEntry, aamj);
pJoinEntry->LastIncrRef = RefInfo;
AtmArpReferenceJoinEntry(pJoinEntry);
}
ULONG
AtmArpDereferenceJoinEntryEx(
IN PATMARP_IPMC_JOIN_ENTRY pJoinEntry,
IN ULONG RefInfo
)
{
AA_STRUCT_ASSERT(pJoinEntry, aamj);
pJoinEntry->LastDecrRef = RefInfo;
return (AtmArpDereferenceJoinEntry(pJoinEntry));
}
#endif //DBG