[REACTX] Fix 64 bit issues
[reactos.git] / ntoskrnl / kd / kdio.c
index bcddcdb..53c99c4 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <ntoskrnl.h>
 #include <reactos/buildno.h>
+#define NDEBUG
 #include <debug.h>
 
 /* GLOBALS *******************************************************************/
@@ -26,13 +27,14 @@ HANDLE KdpLogFileHandle;
 ANSI_STRING KdpLogFileName = RTL_CONSTANT_STRING("\\SystemRoot\\debug.log");
 
 KSPIN_LOCK KdpSerialSpinLock;
-KD_PORT_INFORMATION SerialPortInfo = { DEFAULT_DEBUG_PORT, DEFAULT_DEBUG_BAUD_RATE, 0 };
+ULONG  SerialPortNumber = DEFAULT_DEBUG_PORT;
+CPPORT SerialPortInfo   = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
 
 /* Current Port in use. FIXME: Do we support more then one? */
 ULONG KdpPort;
 
-#define KdpScreenLineLenght 80
-CHAR KdpScreenLineBuffer[KdpScreenLineLenght + 1] = "";
+#define KdpScreenLineLengthDefault 80
+CHAR KdpScreenLineBuffer[KdpScreenLineLengthDefault + 1] = "";
 ULONG KdpScreenLineBufferPos = 0, KdpScreenLineLength = 0;
 
 const ULONG KdpDmesgBufferSize = 128 * 1024; // 512*1024; // 5*1024*1024;
@@ -52,9 +54,11 @@ volatile BOOLEAN KdbpIsInDmesgMode = FALSE;
  *
  * Strongly inspired by:
  * mm\ARM3\mminit.c : MiScanMemoryDescriptors(...)
+ *
+ * See also: kd64\kdinit.c
  */
-SIZE_T
-NTAPI
+static SIZE_T
+INIT_FUNCTION
 KdpGetMemorySizeInMBs(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
 {
     PLIST_ENTRY ListEntry;
@@ -92,6 +96,18 @@ KdpGetMemorySizeInMBs(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
     return NumberOfPhysicalPages * PAGE_SIZE / 1024 / 1024;
 }
 
+/* See also: kd64\kdinit.c */
+static VOID
+INIT_FUNCTION
+KdpPrintBanner(IN SIZE_T MemSizeMBs)
+{
+    DPRINT1("-----------------------------------------------------\n");
+    DPRINT1("ReactOS " KERNEL_VERSION_STR " (Build " KERNEL_VERSION_BUILD_STR ") (Commit " KERNEL_VERSION_COMMIT_HASH ")\n");
+    DPRINT1("%u System Processor [%u MB Memory]\n", KeNumberProcessors, MemSizeMBs);
+    DPRINT1("Command Line: %s\n", KeLoaderBlock->LoadOptions);
+    DPRINT1("ARC Paths: %s %s %s %s\n", KeLoaderBlock->ArcBootDeviceName, KeLoaderBlock->NtHalPathName, KeLoaderBlock->ArcHalDeviceName, KeLoaderBlock->NtBootPathName);
+}
+
 /* FILE DEBUG LOG FUNCTIONS **************************************************/
 
 VOID
@@ -239,14 +255,12 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
         KeInitializeSpinLock(&KdpDebugLogSpinLock);
 
         /* Display separator + ReactOS version at start of the debug log */
-        DPRINT1("---------------------------------------------------------------\n");
-        DPRINT1("ReactOS "KERNEL_VERSION_STR" (Build "KERNEL_VERSION_BUILD_STR")\n");
         MemSizeMBs = MmNumberOfPhysicalPages * PAGE_SIZE / 1024 / 1024;
-        DPRINT1("%u System Processor [%u MB Memory]\n", KeNumberProcessors, MemSizeMBs);
+        KdpPrintBanner(MemSizeMBs);
     }
     else if (BootPhase == 2)
     {
-        HalDisplayString("\n   File log debugging enabled\n\n");
+        HalDisplayString("\r\n   File log debugging enabled\r\n\r\n");
     }
     else if (BootPhase == 3)
     {
@@ -326,7 +340,7 @@ KdpSerialDebugPrint(LPSTR Message,
     }
 
     /* Output the message */
-    while (*pch != 0)
+    while (pch < Message + Length && *pch != '\0')
     {
         if (*pch == '\n')
         {
@@ -358,12 +372,12 @@ KdpSerialInit(PKD_DISPATCH_TABLE DispatchTable,
         DispatchTable->KdpPrintRoutine = KdpSerialDebugPrint;
 
         /* Initialize the Port */
-        if (!KdPortInitializeEx(&SerialPortInfo, 0, 0))
+        if (!KdPortInitializeEx(&SerialPortInfo, SerialPortNumber))
         {
             KdpDebugMode.Serial = FALSE;
             return;
         }
-        KdComPortInUse = (PUCHAR)(ULONG_PTR)SerialPortInfo.BaseAddress;
+        KdComPortInUse = SerialPortInfo.Address;
 
         /* Initialize spinlock */
         KeInitializeSpinLock(&KdpSerialSpinLock);
@@ -372,19 +386,12 @@ KdpSerialInit(PKD_DISPATCH_TABLE DispatchTable,
         InsertTailList(&KdProviders, &DispatchTable->KdProvidersList);
 
         /* Display separator + ReactOS version at start of the debug log */
-        DPRINT1("-----------------------------------------------------\n");
-        DPRINT1("ReactOS "KERNEL_VERSION_STR" (Build "KERNEL_VERSION_BUILD_STR")\n");
         MemSizeMBs = KdpGetMemorySizeInMBs(KeLoaderBlock);
-        DPRINT1("%u System Processor [%u MB Memory]\n", KeNumberProcessors, MemSizeMBs);
-        DPRINT1("Command Line: %s\n", KeLoaderBlock->LoadOptions);
-        DPRINT1("ARC Paths: %s %s %s %s\n", KeLoaderBlock->ArcBootDeviceName,
-                                            KeLoaderBlock->NtHalPathName,
-                                            KeLoaderBlock->ArcHalDeviceName,
-                                            KeLoaderBlock->NtBootPathName);
+        KdpPrintBanner(MemSizeMBs);
     }
     else if (BootPhase == 2)
     {
-        HalDisplayString("\n   Serial debugging enabled\n\n");
+        HalDisplayString("\r\n   Serial debugging enabled\r\n\r\n");
     }
 }
 
@@ -405,7 +412,7 @@ KdpScreenPrint(LPSTR Message,
     KIRQL OldIrql;
     PCHAR pch = (PCHAR) Message;
 
-    while (*pch)
+    while (pch < Message + Length && *pch)
     {
         if(*pch == '\b')
         {
@@ -427,7 +434,7 @@ KdpScreenPrint(LPSTR Message,
             KdpScreenLineBuffer[KdpScreenLineLength] = '\0';
         }
 
-        if(*pch == '\n' || KdpScreenLineLength == KdpScreenLineLenght)
+        if(*pch == '\n' || KdpScreenLineLength == KdpScreenLineLengthDefault)
         {
             /* Print buffered characters */
             if(KdpScreenLineBufferPos != KdpScreenLineLength)
@@ -547,19 +554,12 @@ KdpScreenInit(PKD_DISPATCH_TABLE DispatchTable,
         KeInitializeSpinLock(&KdpDmesgLogSpinLock);
 
         /* Display separator + ReactOS version at start of the debug log */
-        DPRINT1("-----------------------------------------------------\n");
-        DPRINT1("ReactOS "KERNEL_VERSION_STR" (Build "KERNEL_VERSION_BUILD_STR")\n");
         MemSizeMBs = MmNumberOfPhysicalPages * PAGE_SIZE / 1024 / 1024;
-        DPRINT1("%u System Processor [%u MB Memory]\n", KeNumberProcessors, MemSizeMBs);
-        DPRINT1("Command Line: %s\n", KeLoaderBlock->LoadOptions);
-        DPRINT1("ARC Paths: %s %s %s %s\n", KeLoaderBlock->ArcBootDeviceName,
-                                            KeLoaderBlock->NtHalPathName,
-                                            KeLoaderBlock->ArcHalDeviceName,
-                                            KeLoaderBlock->NtBootPathName);
+        KdpPrintBanner(MemSizeMBs);
     }
     else if (BootPhase == 2)
     {
-        HalDisplayString("\n   Screen debugging enabled\n\n");
+        HalDisplayString("\r\n   Screen debugging enabled\r\n\r\n");
     }
 }
 
@@ -567,14 +567,39 @@ KdpScreenInit(PKD_DISPATCH_TABLE DispatchTable,
 
 ULONG
 NTAPI
-KdpPrintString(LPSTR String,
-               ULONG Length)
+KdpPrintString(
+    _In_reads_bytes_(Length) PCHAR UnsafeString,
+    _In_ ULONG Length,
+    _In_ KPROCESSOR_MODE PreviousMode)
 {
     PLIST_ENTRY CurrentEntry;
     PKD_DISPATCH_TABLE CurrentTable;
+    PCHAR String;
+    CHAR StringBuffer[512];
 
     if (!KdpDebugMode.Value) return 0;
 
+    Length = min(Length, sizeof(StringBuffer));
+
+    if (PreviousMode != KernelMode)
+    {
+        _SEH2_TRY
+        {
+            ProbeForRead(UnsafeString, Length, 1);
+            String = StringBuffer;
+            RtlCopyMemory(String, UnsafeString, Length);
+        }
+        _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+        {
+            return 0;
+        }
+        _SEH2_END;
+    }
+    else
+    {
+        String = UnsafeString;
+    }
+
     /* Call the registered handlers */
     CurrentEntry = KdProviders.Flink;
     while (CurrentEntry != &KdProviders)