315 lines
7.8 KiB
C
315 lines
7.8 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1995 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
blprint.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module implements the OS loader debug logging routines.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Chuck Lenzmeier (chuckl) 2-Nov-1995
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "bldr.h"
|
|||
|
#include <stdio.h>
|
|||
|
|
|||
|
#if DBG || BLLOGENABLED
|
|||
|
|
|||
|
ULONG BlLogFileId = (ULONG)-1;
|
|||
|
ULONG BlLogActiveTargets = 0;
|
|||
|
|
|||
|
VOID
|
|||
|
BlLogInitialize (
|
|||
|
ULONG LogfileDeviceId
|
|||
|
)
|
|||
|
{
|
|||
|
ARC_STATUS Status;
|
|||
|
|
|||
|
BlLogActiveTargets = 0;
|
|||
|
|
|||
|
if (BlLoaderBlock->LoadOptions != NULL) {
|
|||
|
|
|||
|
if (strstr(BlLoaderBlock->LoadOptions,"DBGDISPLAY") != NULL) {
|
|||
|
BlLogActiveTargets |= LOG_DISPLAY;
|
|||
|
}
|
|||
|
|
|||
|
if (strstr(BlLoaderBlock->LoadOptions,"DBGDEBUGGER") != NULL) {
|
|||
|
BlLogActiveTargets |= LOG_DEBUGGER;
|
|||
|
}
|
|||
|
|
|||
|
if (strstr(BlLoaderBlock->LoadOptions,"DBGLOG") != NULL) {
|
|||
|
Status = BlOpen(LogfileDeviceId, "\\LDRDBG.LOG", ArcSupersedeReadWrite, &BlLogFileId);
|
|||
|
if (Status == 0) {
|
|||
|
BlLogActiveTargets |= LOG_LOGFILE;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if 0
|
|||
|
BlLogArcDescriptors(LOG_ALL);
|
|||
|
BlLogMemoryDescriptors(LOG_ALL_W);
|
|||
|
#endif
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
BlLogTerminate (
|
|||
|
VOID
|
|||
|
)
|
|||
|
{
|
|||
|
#if 0
|
|||
|
BlLogMemoryDescriptors(LOG_ALL);
|
|||
|
#endif
|
|||
|
BlLog((
|
|||
|
0 ? BlLogActiveTargets | LOG_WAIT : BlLogActiveTargets,
|
|||
|
"BlLog terminating"
|
|||
|
));
|
|||
|
|
|||
|
if ((BlLogActiveTargets & LOG_LOGFILE) != 0) {
|
|||
|
BlClose(BlLogFileId);
|
|||
|
}
|
|||
|
BlLogActiveTargets = 0;
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
BlLogWait (
|
|||
|
IN ULONG Targets
|
|||
|
)
|
|||
|
{
|
|||
|
if ((Targets & BlLogActiveTargets & LOG_DEBUGGER) != 0) {
|
|||
|
DbgBreakPoint( );
|
|||
|
} else if ((Targets & BlLogActiveTargets & LOG_DISPLAY) != 0) {
|
|||
|
BlLogWaitForKeystroke();
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
BlLogPrint (
|
|||
|
ULONG Targets,
|
|||
|
PCHAR Format,
|
|||
|
...
|
|||
|
)
|
|||
|
{
|
|||
|
va_list arglist;
|
|||
|
int count;
|
|||
|
UCHAR buffer[79];
|
|||
|
ULONG activeTargets;
|
|||
|
|
|||
|
activeTargets = Targets & BlLogActiveTargets;
|
|||
|
|
|||
|
if (activeTargets != 0) {
|
|||
|
|
|||
|
va_start(arglist, Format);
|
|||
|
|
|||
|
count = _vsnprintf(buffer, sizeof(buffer), Format, arglist);
|
|||
|
if (count != -1) {
|
|||
|
RtlFillMemory(&buffer[count], sizeof(buffer)-count-2, ' ');
|
|||
|
}
|
|||
|
count = sizeof(buffer);
|
|||
|
buffer[count-2] = '\r';
|
|||
|
buffer[count-1] = '\n';
|
|||
|
|
|||
|
if ((activeTargets & LOG_LOGFILE) != 0) {
|
|||
|
BlWrite(BlLogFileId, buffer, count, &count);
|
|||
|
}
|
|||
|
|
|||
|
if ((activeTargets & LOG_DISPLAY) != 0) {
|
|||
|
ArcWrite(ARC_CONSOLE_OUTPUT, buffer, count, &count);
|
|||
|
}
|
|||
|
if ((activeTargets & LOG_DEBUGGER) != 0) {
|
|||
|
DbgPrint( buffer );
|
|||
|
}
|
|||
|
|
|||
|
if ((Targets & LOG_WAIT) != 0) {
|
|||
|
BlLogWait( Targets );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
BlLogArcDescriptors (
|
|||
|
ULONG Targets
|
|||
|
)
|
|||
|
{
|
|||
|
PMEMORY_DESCRIPTOR CurrentDescriptor;
|
|||
|
ULONG activeTargets;
|
|||
|
|
|||
|
activeTargets = Targets & BlLogActiveTargets;
|
|||
|
|
|||
|
if (activeTargets != 0) {
|
|||
|
|
|||
|
BlLog((activeTargets,"***** ARC Memory List *****"));
|
|||
|
|
|||
|
CurrentDescriptor = NULL;
|
|||
|
while ((CurrentDescriptor = ArcGetMemoryDescriptor(CurrentDescriptor)) != NULL) {
|
|||
|
BlLog((activeTargets,
|
|||
|
"Descriptor %8x: Type %8x Base %8x Pages %8x",
|
|||
|
CurrentDescriptor,
|
|||
|
(USHORT)(CurrentDescriptor->MemoryType),
|
|||
|
CurrentDescriptor->BasePage,
|
|||
|
CurrentDescriptor->PageCount));
|
|||
|
}
|
|||
|
|
|||
|
//BlLog((activeTargets,"***************************"));
|
|||
|
|
|||
|
if ((Targets & LOG_WAIT) != 0) {
|
|||
|
BlLogWait( Targets );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
BlLogMemoryDescriptors (
|
|||
|
ULONG Targets
|
|||
|
)
|
|||
|
{
|
|||
|
PLIST_ENTRY CurrentLink;
|
|||
|
PMEMORY_ALLOCATION_DESCRIPTOR CurrentDescriptor;
|
|||
|
ULONG Index;
|
|||
|
ULONG ExpectedIndex;
|
|||
|
ULONG ExpectedBase;
|
|||
|
ULONG FoundIndex;
|
|||
|
PMEMORY_ALLOCATION_DESCRIPTOR FoundDescriptor;
|
|||
|
TYPE_OF_MEMORY LastType;
|
|||
|
ULONG FreeBlocks = 0;
|
|||
|
ULONG FreePages = 0;
|
|||
|
ULONG LargestFree = 0;
|
|||
|
|
|||
|
ULONG activeTargets;
|
|||
|
|
|||
|
activeTargets = Targets & BlLogActiveTargets;
|
|||
|
|
|||
|
if (activeTargets != 0) {
|
|||
|
|
|||
|
BlLog((activeTargets,"***** System Memory List *****"));
|
|||
|
|
|||
|
ExpectedIndex = 0;
|
|||
|
ExpectedBase = 0;
|
|||
|
LastType = (ULONG)-1;
|
|||
|
|
|||
|
do {
|
|||
|
Index = 0;
|
|||
|
FoundDescriptor = NULL;
|
|||
|
CurrentLink = BlLoaderBlock->MemoryDescriptorListHead.Flink;
|
|||
|
|
|||
|
while (CurrentLink != &BlLoaderBlock->MemoryDescriptorListHead) {
|
|||
|
|
|||
|
CurrentDescriptor = (PMEMORY_ALLOCATION_DESCRIPTOR)CurrentLink;
|
|||
|
if (CurrentDescriptor->BasePage == ExpectedBase) {
|
|||
|
if ((FoundDescriptor != NULL) && (FoundDescriptor->BasePage == ExpectedBase)) {
|
|||
|
BlLog((activeTargets,
|
|||
|
"ACK! Found multiple descriptors with base %x: %x and %x",
|
|||
|
ExpectedBase,
|
|||
|
FoundDescriptor,
|
|||
|
CurrentDescriptor));
|
|||
|
} else {
|
|||
|
FoundDescriptor = CurrentDescriptor;
|
|||
|
FoundIndex = Index;
|
|||
|
}
|
|||
|
} else if (CurrentDescriptor->BasePage > ExpectedBase) {
|
|||
|
if ((FoundDescriptor == NULL) ||
|
|||
|
(CurrentDescriptor->BasePage < FoundDescriptor->BasePage)) {
|
|||
|
FoundDescriptor = CurrentDescriptor;
|
|||
|
FoundIndex = Index;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
CurrentLink = CurrentLink->Flink;
|
|||
|
Index++;
|
|||
|
}
|
|||
|
|
|||
|
if (FoundDescriptor != NULL) {
|
|||
|
|
|||
|
if (FoundDescriptor->BasePage != ExpectedBase) {
|
|||
|
BlLog((activeTargets,
|
|||
|
" ACK! MISSING MEMORY! ACK! Base %8x Pages %8x",
|
|||
|
ExpectedBase,
|
|||
|
FoundDescriptor->BasePage - ExpectedBase));
|
|||
|
}
|
|||
|
BlLog((activeTargets,
|
|||
|
"%c%c%2d Descriptor %8x: Type %8x Base %8x Pages %8x",
|
|||
|
FoundDescriptor->MemoryType == LastType ? '^' : ' ',
|
|||
|
FoundIndex == ExpectedIndex ? ' ' : '*',
|
|||
|
FoundIndex,
|
|||
|
FoundDescriptor,
|
|||
|
(USHORT)(FoundDescriptor->MemoryType),
|
|||
|
FoundDescriptor->BasePage,
|
|||
|
FoundDescriptor->PageCount));
|
|||
|
|
|||
|
if (FoundIndex == ExpectedIndex) {
|
|||
|
ExpectedIndex++;
|
|||
|
}
|
|||
|
ExpectedBase = FoundDescriptor->BasePage + FoundDescriptor->PageCount;
|
|||
|
|
|||
|
LastType = FoundDescriptor->MemoryType;
|
|||
|
if (LastType != MemoryFree) {
|
|||
|
LastType = (ULONG)-1;
|
|||
|
} else {
|
|||
|
FreeBlocks++;
|
|||
|
FreePages += FoundDescriptor->PageCount;
|
|||
|
if (FoundDescriptor->PageCount > LargestFree) {
|
|||
|
LargestFree = FoundDescriptor->PageCount;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
} while ( FoundDescriptor != NULL );
|
|||
|
|
|||
|
BlLog((activeTargets,
|
|||
|
"Total free blocks %2d, free pages %4x, largest free %4x",
|
|||
|
FreeBlocks,
|
|||
|
FreePages,
|
|||
|
LargestFree));
|
|||
|
|
|||
|
//BlLog((activeTargets,"******************************"));
|
|||
|
|
|||
|
if ((Targets & LOG_WAIT) != 0) {
|
|||
|
BlLogWait( Targets );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
BlLogWaitForKeystroke (
|
|||
|
VOID
|
|||
|
)
|
|||
|
{
|
|||
|
UCHAR Key=0;
|
|||
|
ULONG Count;
|
|||
|
|
|||
|
if ((BlLogActiveTargets & LOG_DISPLAY) != 0) {
|
|||
|
do {
|
|||
|
if (ArcGetReadStatus(ARC_CONSOLE_INPUT) == ESUCCESS) {
|
|||
|
ArcRead(ARC_CONSOLE_INPUT,
|
|||
|
&Key,
|
|||
|
sizeof(Key),
|
|||
|
&Count);
|
|||
|
break;
|
|||
|
}
|
|||
|
} while ( TRUE );
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
#endif // DBG
|