mirror of
https://github.com/reactos/reactos.git
synced 2025-02-28 19:32:59 +00:00
[NTOS:KD/KDROSDBG] Move debug output from ntoskrnl to kdcom.dll
CORE-10749
This commit is contained in:
parent
8cf3e9942b
commit
6a48b358cd
2 changed files with 141 additions and 118 deletions
|
@ -63,6 +63,10 @@ typedef struct _KDP_DEBUG_MODE
|
||||||
ULONG KdbDebugState = 0; /* KDBG Settings (NOECHO, KDSERIAL) */
|
ULONG KdbDebugState = 0; /* KDBG Settings (NOECHO, KDSERIAL) */
|
||||||
KDP_DEBUG_MODE KdpDebugMode;
|
KDP_DEBUG_MODE KdpDebugMode;
|
||||||
|
|
||||||
|
#define KdpScreenLineLengthDefault 80
|
||||||
|
static CHAR KdpScreenLineBuffer[KdpScreenLineLengthDefault + 1] = "";
|
||||||
|
static ULONG KdpScreenLineBufferPos = 0, KdpScreenLineLength = 0;
|
||||||
|
|
||||||
/* Port Information for the Serial Native Mode */
|
/* Port Information for the Serial Native Mode */
|
||||||
ULONG SerialPortNumber;
|
ULONG SerialPortNumber;
|
||||||
CPPORT SerialPortInfo;
|
CPPORT SerialPortInfo;
|
||||||
|
@ -165,6 +169,57 @@ KdpGetDebugMode(PCHAR Currentp2)
|
||||||
|
|
||||||
/* SCREEN FUNCTIONS **********************************************************/
|
/* SCREEN FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
NTAPI
|
||||||
|
KdpScreenDebugPrint(PCHAR String,
|
||||||
|
ULONG Length)
|
||||||
|
{
|
||||||
|
PCHAR pch = String;
|
||||||
|
|
||||||
|
while (pch < String + Length && *pch)
|
||||||
|
{
|
||||||
|
if (*pch == '\b')
|
||||||
|
{
|
||||||
|
/* HalDisplayString does not support '\b'. Workaround it and use '\r' */
|
||||||
|
if (KdpScreenLineLength > 0)
|
||||||
|
{
|
||||||
|
/* Remove last character from buffer */
|
||||||
|
KdpScreenLineBuffer[--KdpScreenLineLength] = '\0';
|
||||||
|
KdpScreenLineBufferPos = KdpScreenLineLength;
|
||||||
|
|
||||||
|
/* Clear row and print line again */
|
||||||
|
HalDisplayString("\r");
|
||||||
|
HalDisplayString(KdpScreenLineBuffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
KdpScreenLineBuffer[KdpScreenLineLength++] = *pch;
|
||||||
|
KdpScreenLineBuffer[KdpScreenLineLength] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*pch == '\n' || KdpScreenLineLength == KdpScreenLineLengthDefault)
|
||||||
|
{
|
||||||
|
/* Print buffered characters */
|
||||||
|
if (KdpScreenLineBufferPos != KdpScreenLineLength)
|
||||||
|
HalDisplayString(KdpScreenLineBuffer + KdpScreenLineBufferPos);
|
||||||
|
|
||||||
|
/* Clear line buffer */
|
||||||
|
KdpScreenLineBuffer[0] = '\0';
|
||||||
|
KdpScreenLineLength = KdpScreenLineBufferPos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
++pch;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print buffered characters */
|
||||||
|
if (KdpScreenLineBufferPos != KdpScreenLineLength)
|
||||||
|
{
|
||||||
|
HalDisplayString(KdpScreenLineBuffer + KdpScreenLineBufferPos);
|
||||||
|
KdpScreenLineBufferPos = KdpScreenLineLength;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
KdpScreenAcquire(VOID)
|
KdpScreenAcquire(VOID)
|
||||||
{
|
{
|
||||||
|
@ -202,6 +257,25 @@ KdpScreenInit(ULONG BootPhase)
|
||||||
|
|
||||||
/* SERIAL FUNCTIONS **********************************************************/
|
/* SERIAL FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
NTAPI
|
||||||
|
KdpSerialDebugPrint(PCHAR String,
|
||||||
|
ULONG Length)
|
||||||
|
{
|
||||||
|
PCHAR pch = String;
|
||||||
|
|
||||||
|
/* Output the message */
|
||||||
|
while (pch < String + Length && *pch != '\0')
|
||||||
|
{
|
||||||
|
if (*pch == '\n')
|
||||||
|
{
|
||||||
|
CpPutByte(&SerialPortInfo, '\r');
|
||||||
|
}
|
||||||
|
CpPutByte(&SerialPortInfo, *pch);
|
||||||
|
pch++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static BOOLEAN
|
static BOOLEAN
|
||||||
NTAPI
|
NTAPI
|
||||||
KdPortInitializeEx(
|
KdPortInitializeEx(
|
||||||
|
@ -263,6 +337,10 @@ KdpSerialInit(ULONG BootPhase)
|
||||||
|
|
||||||
/* FILE FUNCTIONS **********************************************************/
|
/* FILE FUNCTIONS **********************************************************/
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
NTAPI
|
||||||
|
KdpFileInit(ULONG BootPhase);
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
KdpLoggerThread(PVOID Context)
|
KdpLoggerThread(PVOID Context)
|
||||||
|
@ -310,6 +388,52 @@ KdpLoggerThread(PVOID Context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
NTAPI
|
||||||
|
KdpFileDebugPrint(PCHAR String,
|
||||||
|
ULONG Length)
|
||||||
|
|
||||||
|
{
|
||||||
|
ULONG beg, end, num;
|
||||||
|
|
||||||
|
if (KdpDebugBuffer == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!KdpLogFileHandle)
|
||||||
|
{
|
||||||
|
KIRQL OldIrql = KeGetCurrentIrql();
|
||||||
|
KeLowerIrql(PASSIVE_LEVEL);
|
||||||
|
KdpFileInit(3);
|
||||||
|
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
|
||||||
|
}
|
||||||
|
|
||||||
|
beg = KdpCurrentPosition;
|
||||||
|
num = KdpFreeBytes;
|
||||||
|
if (Length < num)
|
||||||
|
num = Length;
|
||||||
|
|
||||||
|
if (num != 0)
|
||||||
|
{
|
||||||
|
end = (beg + num) % KdpBufferSize;
|
||||||
|
KdpCurrentPosition = end;
|
||||||
|
KdpFreeBytes -= num;
|
||||||
|
|
||||||
|
if (end > beg)
|
||||||
|
{
|
||||||
|
RtlCopyMemory(KdpDebugBuffer + beg, String, num);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
RtlCopyMemory(KdpDebugBuffer + beg, String, KdpBufferSize - beg);
|
||||||
|
RtlCopyMemory(KdpDebugBuffer, String + KdpBufferSize - beg, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Signal the logger thread */
|
||||||
|
if (KdpLogFileHandle)
|
||||||
|
KeSetEvent(&KdpLoggerThreadEvent, IO_NO_INCREMENT, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
NTAPI
|
NTAPI
|
||||||
KdpFileInit(ULONG BootPhase)
|
KdpFileInit(ULONG BootPhase)
|
||||||
|
@ -407,6 +531,18 @@ KdpFileInit(ULONG BootPhase)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
KdpPrintString(
|
||||||
|
_In_ PSTRING Output)
|
||||||
|
{
|
||||||
|
if (KdpDebugMode.Screen)
|
||||||
|
KdpScreenDebugPrint(Output->Buffer, Output->Length);
|
||||||
|
if (KdpDebugMode.Serial)
|
||||||
|
KdpSerialDebugPrint(Output->Buffer, Output->Length);
|
||||||
|
if (KdpDebugMode.File)
|
||||||
|
KdpFileDebugPrint(Output->Buffer, Output->Length);
|
||||||
|
}
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -534,6 +670,11 @@ KdSendPacket(
|
||||||
IN PSTRING MessageData,
|
IN PSTRING MessageData,
|
||||||
IN OUT PKD_CONTEXT Context)
|
IN OUT PKD_CONTEXT Context)
|
||||||
{
|
{
|
||||||
|
if (PacketType == PACKET_TYPE_KD_DEBUG_IO)
|
||||||
|
{
|
||||||
|
KdpPrintString(MessageData);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -23,8 +23,6 @@
|
||||||
/* GLOBALS *******************************************************************/
|
/* GLOBALS *******************************************************************/
|
||||||
|
|
||||||
#define KdpBufferSize (1024 * 512)
|
#define KdpBufferSize (1024 * 512)
|
||||||
static BOOLEAN KdpLoggingEnabled = FALSE;
|
|
||||||
static BOOLEAN KdpLoggingStarting = FALSE;
|
|
||||||
static PCHAR KdpDebugBuffer = NULL;
|
static PCHAR KdpDebugBuffer = NULL;
|
||||||
static volatile ULONG KdpCurrentPosition = 0;
|
static volatile ULONG KdpCurrentPosition = 0;
|
||||||
static volatile ULONG KdpFreeBytes = 0;
|
static volatile ULONG KdpFreeBytes = 0;
|
||||||
|
@ -38,10 +36,6 @@ static KSPIN_LOCK KdpSerialSpinLock;
|
||||||
ULONG SerialPortNumber = DEFAULT_DEBUG_PORT;
|
ULONG SerialPortNumber = DEFAULT_DEBUG_PORT;
|
||||||
CPPORT SerialPortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
|
CPPORT SerialPortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
|
||||||
|
|
||||||
#define KdpScreenLineLengthDefault 80
|
|
||||||
static CHAR KdpScreenLineBuffer[KdpScreenLineLengthDefault + 1] = "";
|
|
||||||
static ULONG KdpScreenLineBufferPos = 0, KdpScreenLineLength = 0;
|
|
||||||
|
|
||||||
KDP_DEBUG_MODE KdpDebugMode;
|
KDP_DEBUG_MODE KdpDebugMode;
|
||||||
LIST_ENTRY KdProviders = {&KdProviders, &KdProviders};
|
LIST_ENTRY KdProviders = {&KdProviders, &KdProviders};
|
||||||
KD_DISPATCH_TABLE DispatchTable[KdMax];
|
KD_DISPATCH_TABLE DispatchTable[KdMax];
|
||||||
|
@ -114,8 +108,6 @@ KdpLoggerThread(PVOID Context)
|
||||||
|
|
||||||
ASSERT(ExGetPreviousMode() == KernelMode);
|
ASSERT(ExGetPreviousMode() == KernelMode);
|
||||||
|
|
||||||
KdpLoggingEnabled = TRUE;
|
|
||||||
|
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
KeWaitForSingleObject(&KdpLoggerThreadEvent, Executive, KernelMode, FALSE, NULL);
|
KeWaitForSingleObject(&KdpLoggerThreadEvent, Executive, KernelMode, FALSE, NULL);
|
||||||
|
@ -159,53 +151,6 @@ NTAPI
|
||||||
KdpPrintToLogFile(PCHAR String,
|
KdpPrintToLogFile(PCHAR String,
|
||||||
ULONG Length)
|
ULONG Length)
|
||||||
{
|
{
|
||||||
KIRQL OldIrql;
|
|
||||||
ULONG beg, end, num;
|
|
||||||
BOOLEAN DoReinit = FALSE;
|
|
||||||
|
|
||||||
if (KdpDebugBuffer == NULL) return;
|
|
||||||
|
|
||||||
/* Acquire the printing spinlock without waiting at raised IRQL */
|
|
||||||
OldIrql = KdpAcquireLock(&KdpDebugLogSpinLock);
|
|
||||||
|
|
||||||
beg = KdpCurrentPosition;
|
|
||||||
num = KdpFreeBytes;
|
|
||||||
if (Length < num)
|
|
||||||
num = Length;
|
|
||||||
|
|
||||||
if (num != 0)
|
|
||||||
{
|
|
||||||
end = (beg + num) % KdpBufferSize;
|
|
||||||
KdpCurrentPosition = end;
|
|
||||||
KdpFreeBytes -= num;
|
|
||||||
|
|
||||||
if (end > beg)
|
|
||||||
{
|
|
||||||
RtlCopyMemory(KdpDebugBuffer + beg, String, num);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RtlCopyMemory(KdpDebugBuffer + beg, String, KdpBufferSize - beg);
|
|
||||||
RtlCopyMemory(KdpDebugBuffer, String + KdpBufferSize - beg, end);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release the spinlock */
|
|
||||||
if (OldIrql == PASSIVE_LEVEL && !KdpLoggingStarting && !KdpLoggingEnabled && ExpInitializationPhase >= 2)
|
|
||||||
{
|
|
||||||
DoReinit = TRUE;
|
|
||||||
}
|
|
||||||
KdpReleaseLock(&KdpDebugLogSpinLock, OldIrql);
|
|
||||||
|
|
||||||
if (DoReinit)
|
|
||||||
{
|
|
||||||
KdpLoggingStarting = TRUE;
|
|
||||||
KdpDebugLogInit(NULL, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Signal the logger thread */
|
|
||||||
if (OldIrql <= DISPATCH_LEVEL && KdpLoggingEnabled)
|
|
||||||
KeSetEvent(&KdpLoggerThreadEvent, IO_NO_INCREMENT, FALSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -315,25 +260,6 @@ NTAPI
|
||||||
KdpSerialPrint(PCHAR String,
|
KdpSerialPrint(PCHAR String,
|
||||||
ULONG Length)
|
ULONG Length)
|
||||||
{
|
{
|
||||||
PCHAR pch = String;
|
|
||||||
KIRQL OldIrql;
|
|
||||||
|
|
||||||
/* Acquire the printing spinlock without waiting at raised IRQL */
|
|
||||||
OldIrql = KdpAcquireLock(&KdpSerialSpinLock);
|
|
||||||
|
|
||||||
/* Output the string */
|
|
||||||
while (pch < String + Length && *pch)
|
|
||||||
{
|
|
||||||
if (*pch == '\n')
|
|
||||||
{
|
|
||||||
KdPortPutByteEx(&SerialPortInfo, '\r');
|
|
||||||
}
|
|
||||||
KdPortPutByteEx(&SerialPortInfo, *pch);
|
|
||||||
pch++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release the spinlock */
|
|
||||||
KdpReleaseLock(&KdpSerialSpinLock, OldIrql);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
@ -407,50 +333,6 @@ NTAPI
|
||||||
KdpScreenPrint(PCHAR String,
|
KdpScreenPrint(PCHAR String,
|
||||||
ULONG Length)
|
ULONG Length)
|
||||||
{
|
{
|
||||||
PCHAR pch = String;
|
|
||||||
|
|
||||||
while (pch < String + Length && *pch)
|
|
||||||
{
|
|
||||||
if (*pch == '\b')
|
|
||||||
{
|
|
||||||
/* HalDisplayString does not support '\b'. Workaround it and use '\r' */
|
|
||||||
if (KdpScreenLineLength > 0)
|
|
||||||
{
|
|
||||||
/* Remove last character from buffer */
|
|
||||||
KdpScreenLineBuffer[--KdpScreenLineLength] = '\0';
|
|
||||||
KdpScreenLineBufferPos = KdpScreenLineLength;
|
|
||||||
|
|
||||||
/* Clear row and print line again */
|
|
||||||
HalDisplayString("\r");
|
|
||||||
HalDisplayString(KdpScreenLineBuffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
KdpScreenLineBuffer[KdpScreenLineLength++] = *pch;
|
|
||||||
KdpScreenLineBuffer[KdpScreenLineLength] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*pch == '\n' || KdpScreenLineLength == KdpScreenLineLengthDefault)
|
|
||||||
{
|
|
||||||
/* Print buffered characters */
|
|
||||||
if (KdpScreenLineBufferPos != KdpScreenLineLength)
|
|
||||||
HalDisplayString(KdpScreenLineBuffer + KdpScreenLineBufferPos);
|
|
||||||
|
|
||||||
/* Clear line buffer */
|
|
||||||
KdpScreenLineBuffer[0] = '\0';
|
|
||||||
KdpScreenLineLength = KdpScreenLineBufferPos = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
++pch;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print buffered characters */
|
|
||||||
if (KdpScreenLineBufferPos != KdpScreenLineLength)
|
|
||||||
{
|
|
||||||
HalDisplayString(KdpScreenLineBuffer + KdpScreenLineBufferPos);
|
|
||||||
KdpScreenLineBufferPos = KdpScreenLineLength;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
Loading…
Reference in a new issue