- Implemented InterlockedBitTestAndReset, InterlockedBitTestAndSet, InterlockedExchan...
[reactos.git] / reactos / ntoskrnl / kd / kdio.c
index d53473b..a15a8b9 100644 (file)
@@ -14,7 +14,7 @@
 
 /* GLOBALS *******************************************************************/
 
-#define BufferSize 32*1024 
+#define BufferSize 32*1024
 
 HANDLE KdbLogFileHandle;
 BOOLEAN KdpLogInitialized;
@@ -45,35 +45,42 @@ KdpPrintToLogInternal(PVOID Context)
                 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
@@ -81,18 +88,19 @@ STDCALL
 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);
     }
@@ -109,7 +117,7 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
                                    0,
                                    NULL,
                                    NULL);
-                            
+
         /* Create the Log File */
         Status = NtCreateFile(&KdbLogFileHandle,
                               FILE_ALL_ACCESS,
@@ -122,7 +130,7 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
                               FILE_WRITE_THROUGH | FILE_SYNCHRONOUS_IO_NONALERT,
                               NULL,
                               0);
-    
+
         /* Allow it to be used */
         ExInitializeWorkItem(&KdpDebugLogQueue, &KdpPrintToLogInternal, NULL);
         KdpLogInitialized = TRUE;
@@ -133,7 +141,8 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
 
 VOID
 STDCALL
-KdpSerialDebugPrint(LPSTR Message)
+KdpSerialDebugPrint(LPSTR Message,
+                    ULONG Length)
 {
     PCHAR pch = (PCHAR) Message;
 
@@ -160,21 +169,34 @@ KdpSerialInit(PKD_DISPATCH_TABLE DispatchTable,
         /* 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,
@@ -186,15 +208,15 @@ 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 *********************************************************/
@@ -215,15 +237,15 @@ KdpDetectConflicts(PCM_RESOURCE_LIST DriverList)
         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 */
@@ -231,41 +253,42 @@ KdpDetectConflicts(PCM_RESOURCE_LIST DriverList)
             }
         }
     }
-    
+
     /* 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 */