/* GLOBALS *******************************************************************/
-#define BufferSize 32*1024
+#define BufferSize 32*1024
HANDLE KdbLogFileHandle;
BOOLEAN KdpLogInitialized;
CurrentPosition,
NULL,
NULL);
-
+
/* Clear the Current Position */
CurrentPosition = 0;
-
+
/* A new item can be queued now */
ItemQueued = FALSE;
}
VOID
STDCALL
-KdpPrintToLog(PCH String)
+KdpPrintToLog(PCH String,
+ ULONG StringLength)
{
- ULONG StringLength = strlen(String);
-
/* Don't overflow */
if ((CurrentPosition + StringLength) > BufferSize) return;
-
+
/* Add the string to the buffer */
RtlMoveMemory(&DebugBuffer[CurrentPosition], String, StringLength);
-
+
/* Update the Current Position */
CurrentPosition += StringLength;
-
+
/* Make sure we are initialized and can queue */
if (!KdpLogInitialized || (ItemQueued)) return;
-
- /* Queue the work item */
- ExQueueWorkItem(&KdpDebugLogQueue, HyperCriticalWorkQueue);
- ItemQueued = TRUE;
+
+ /*
+ * Queue the work item
+ * Note that we don't want to queue if we are > DISPATCH_LEVEL...
+ * The message is in the buffer and will simply be taken care of at
+ * the next time we are at <= DISPATCH, so it won't be lost.
+ */
+ if (KeGetCurrentIrql() <= DISPATCH_LEVEL)
+ {
+ ExQueueWorkItem(&KdpDebugLogQueue, HyperCriticalWorkQueue);
+ ItemQueued = TRUE;
+ }
}
VOID
KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
ULONG BootPhase)
{
- if (!KdpDebugMode.File) return;
NTSTATUS Status;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING FileName;
- IO_STATUS_BLOCK Iosb;
-
+ IO_STATUS_BLOCK Iosb;
+
+ if (!KdpDebugMode.File) return;
+
if (BootPhase == 0)
{
/* Write out the functions that we support for now */
DispatchTable->KdpInitRoutine = KdpInitDebugLog;
DispatchTable->KdpPrintRoutine = KdpPrintToLog;
-
+
/* Register as a Provider */
InsertTailList(&KdProviders, &DispatchTable->KdProvidersList);
}
0,
NULL,
NULL);
-
+
/* Create the Log File */
Status = NtCreateFile(&KdbLogFileHandle,
FILE_ALL_ACCESS,
FILE_WRITE_THROUGH | FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
-
+
/* Allow it to be used */
ExInitializeWorkItem(&KdpDebugLogQueue, &KdpPrintToLogInternal, NULL);
KdpLogInitialized = TRUE;
VOID
STDCALL
-KdpSerialDebugPrint(LPSTR Message)
+KdpSerialDebugPrint(LPSTR Message,
+ ULONG Length)
{
PCHAR pch = (PCHAR) Message;
/* Write out the functions that we support for now */
DispatchTable->KdpInitRoutine = KdpSerialInit;
DispatchTable->KdpPrintRoutine = KdpSerialDebugPrint;
-
+
/* Initialize the Port */
- KdPortInitializeEx(&SerialPortInfo, 0, 0);
-
+ if (!KdPortInitializeEx(&SerialPortInfo, 0, 0))
+ {
+ KdpDebugMode.Serial = FALSE;
+ return;
+ }
+
/* Register as a Provider */
InsertTailList(&KdProviders, &DispatchTable->KdProvidersList);
}
else if (BootPhase == 2)
{
HalDisplayString("\n Serial debugging enabled\n\n");
- }
+ }
}
/* SCREEN FUNCTIONS **********************************************************/
+VOID
+STDCALL
+KdpScreenPrint(LPSTR Message,
+ ULONG Length)
+{
+ /* Call HAL */
+ HalDisplayString(Message);
+}
+
VOID
STDCALL
KdpScreenInit(PKD_DISPATCH_TABLE DispatchTable,
{
/* Write out the functions that we support for now */
DispatchTable->KdpInitRoutine = KdpScreenInit;
- DispatchTable->KdpPrintRoutine = HalDisplayString;
-
+ DispatchTable->KdpPrintRoutine = KdpScreenPrint;
+
/* Register as a Provider */
InsertTailList(&KdProviders, &DispatchTable->KdProvidersList);
}
else if (BootPhase == 2)
{
HalDisplayString("\n Screen debugging enabled\n\n");
- }
+ }
}
/* GENERAL FUNCTIONS *********************************************************/
case 3: ComPortBase = 0x3e8; break;
case 4: ComPortBase = 0x2e8; break;
}
-
+
/* search for this port address in DriverList */
for (i = 0; i < DriverList->List[0].PartialResourceList.Count; i++)
{
ResourceDescriptor = &DriverList->List[0].PartialResourceList.PartialDescriptors[i];
if (ResourceDescriptor->Type == CmResourceTypePort)
{
- if ((ResourceDescriptor->u.Port.Start.u.LowPart <= ComPortBase) &&
- (ResourceDescriptor->u.Port.Start.u.LowPart +
+ if ((ResourceDescriptor->u.Port.Start.u.LowPart <= ComPortBase) &&
+ (ResourceDescriptor->u.Port.Start.u.LowPart +
ResourceDescriptor->u.Port.Length > ComPortBase))
{
/* Conflict found */
}
}
}
-
+
/* No Conflicts */
return FALSE;
}
ULONG
STDCALL
-KdpPrintString(PANSI_STRING String)
+KdpPrintString(LPSTR String,
+ ULONG Length)
{
- if (!KdpDebugMode.Value) return 0;
- PCH pch = String->Buffer;
PLIST_ENTRY CurrentEntry;
PKD_DISPATCH_TABLE CurrentTable;
-
+
+ if (!KdpDebugMode.Value) return 0;
+
/* Call the registered handlers */
CurrentEntry = KdProviders.Flink;
while (CurrentEntry != &KdProviders)
{
/* Get the current table */
- CurrentTable = CONTAINING_RECORD(CurrentEntry,
+ CurrentTable = CONTAINING_RECORD(CurrentEntry,
KD_DISPATCH_TABLE,
KdProvidersList);
-
+
/* Call it */
- CurrentTable->KdpPrintRoutine(pch);
-
+ CurrentTable->KdpPrintRoutine(String, Length);
+
/* Next Table */
CurrentEntry = CurrentEntry->Flink;
}
-
+
/* Call the Wrapper Routine */
- if (WrapperInitRoutine) WrapperTable.KdpPrintRoutine(pch);
+ if (WrapperInitRoutine) WrapperTable.KdpPrintRoutine(String, Length);
/* Return the Length */
- return((ULONG)String->Length);
+ return Length;
}
/* EOF */