Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / ntoskrnl / kd / i386 / kdbg.c
diff --git a/ntoskrnl/kd/i386/kdbg.c b/ntoskrnl/kd/i386/kdbg.c
new file mode 100644 (file)
index 0000000..11c9efe
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS kernel
+ * FILE:            ntoskrnl/kd/i386/kdbg.c
+ * PURPOSE:         Serial i/o functions for the kernel debugger.
+ * PROGRAMMER:      Alex Ionescu
+ *                  HervĂ© Poussineau
+ */
+
+/* INCLUDES *****************************************************************/
+
+#include <ntoskrnl.h>
+#define NDEBUG
+#include <debug.h>
+
+
+#define DEFAULT_BAUD_RATE   19200
+
+#if defined(_M_IX86) || defined(_M_AMD64)
+const ULONG BaseArray[] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8};
+#elif defined(_M_PPC)
+const ULONG BaseArray[] = {0, 0x800003F8};
+#elif defined(_M_MIPS)
+const ULONG BaseArray[] = {0, 0x80006000, 0x80007000};
+#elif defined(_M_ARM)
+const ULONG BaseArray[] = {0, 0xF1012000};
+#else
+#error Unknown architecture
+#endif
+
+#define MAX_COM_PORTS   (sizeof(BaseArray) / sizeof(BaseArray[0]) - 1)
+
+/* STATIC VARIABLES ***********************************************************/
+
+// static CPPORT DefaultPort = {0, 0, 0};
+
+/* The COM port must only be initialized once! */
+// static BOOLEAN PortInitialized = FALSE;
+
+/* REACTOS FUNCTIONS **********************************************************/
+
+NTSTATUS
+NTAPI
+KdDebuggerInitialize1(
+    IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL)
+{
+    return STATUS_NOT_IMPLEMENTED;
+}
+
+BOOLEAN
+NTAPI
+KdPortInitializeEx(
+    IN PCPPORT PortInformation,
+    IN ULONG ComPortNumber)
+{
+    NTSTATUS Status;
+
+#if 0 // Deactivated because never used in fact (was in KdPortInitialize but we use KdPortInitializeEx)
+    /*
+     * Find the port if needed
+     */
+
+    if (!PortInitialized)
+    {
+        DefaultPort.BaudRate = PortInformation->BaudRate;
+
+        if (ComPortNumber == 0)
+        {
+            /*
+             * Start enumerating COM ports from the last one to the first one,
+             * and break when we find a valid port.
+             * If we reach the first element of the list, the invalid COM port,
+             * then it means that no valid port was found.
+             */
+            for (ComPortNumber = MAX_COM_PORTS; ComPortNumber > 0; ComPortNumber--)
+            {
+                if (CpDoesPortExist(UlongToPtr(BaseArray[ComPortNumber])))
+                {
+                    PortInformation->Address = DefaultPort.Address = BaseArray[ComPortNumber];
+                    break;
+                }
+            }
+            if (ComPortNumber == 0)
+            {
+                HalDisplayString("\r\nKernel Debugger: No COM port found!\r\n\r\n");
+                return FALSE;
+            }
+        }
+
+        PortInitialized = TRUE;
+    }
+#endif
+
+    /*
+     * Initialize the port
+     */
+    Status = CpInitialize(PortInformation,
+                          (ComPortNumber == 0 ? PortInformation->Address
+                                              : UlongToPtr(BaseArray[ComPortNumber])),
+                          (PortInformation->BaudRate == 0 ? DEFAULT_BAUD_RATE
+                                                          : PortInformation->BaudRate));
+    if (!NT_SUCCESS(Status))
+    {
+        HalDisplayString("\r\nKernel Debugger: Serial port not found!\r\n\r\n");
+        return FALSE;
+    }
+    else
+    {
+#ifndef NDEBUG
+        CHAR buffer[80];
+
+        /* Print message to blue screen */
+        sprintf(buffer,
+                "\r\nKernel Debugger: Serial port found: COM%ld (Port 0x%lx) BaudRate %ld\r\n\r\n",
+                ComPortNumber,
+                PortInformation->Address,
+                PortInformation->BaudRate);
+        HalDisplayString(buffer);
+#endif /* NDEBUG */
+
+#if 0
+        /* Set global info */
+        KdComPortInUse = DefaultPort.Address;
+#endif
+        return TRUE;
+    }
+}
+
+BOOLEAN
+NTAPI
+KdPortGetByteEx(
+    IN PCPPORT PortInformation,
+    OUT PUCHAR ByteReceived)
+{
+    return (CpGetByte(PortInformation, ByteReceived, FALSE, FALSE) == CP_GET_SUCCESS);
+}
+
+VOID
+NTAPI
+KdPortPutByteEx(
+    IN PCPPORT PortInformation,
+    IN UCHAR ByteToSend)
+{
+    CpPutByte(PortInformation, ByteToSend);
+}
+
+/* EOF */