Author: tkreuzer Date: Tue Dec 9 19:07:03 2008 New Revision: 37986
URL: http://svn.reactos.org/svn/reactos?rev=37986&view=rev Log: Implement KdDebuggerInitialize0 and stubplement KdSendPacket, enough to get DebugOutput with WINKD work
Modified: branches/ros-amd64-bringup/reactos/drivers/base/kdcom/i386/kdbg.c
Modified: branches/ros-amd64-bringup/reactos/drivers/base/kdcom/i386/kdbg.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/driver... ============================================================================== --- branches/ros-amd64-bringup/reactos/drivers/base/kdcom/i386/kdbg.c [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/drivers/base/kdcom/i386/kdbg.c [iso-8859-1] Tue Dec 9 19:07:03 2008 @@ -14,6 +14,7 @@ #define NDEBUG #include <halfuncs.h> #include <stdio.h> +#include <stdlib.h> #include <debug.h> #include "arc/arc.h" #include "windbgkd.h" @@ -51,6 +52,12 @@ KdPortPutByteEx( IN PKD_PORT_INFORMATION PortInformation, IN UCHAR ByteToSend); + +/* serial debug connection */ +#define DEFAULT_DEBUG_PORT 2 /* COM2 */ +#define DEFAULT_DEBUG_COM1_IRQ 4 /* COM1 IRQ */ +#define DEFAULT_DEBUG_COM2_IRQ 3 /* COM2 IRQ */ +#define DEFAULT_DEBUG_BAUD_RATE 115200 /* 115200 Baud */
#define DEFAULT_BAUD_RATE 19200
@@ -123,6 +130,8 @@ /* The com port must only be initialized once! */ static BOOLEAN PortInitialized = FALSE;
+ULONG KdpPort; +ULONG KdpPortIrq;
/* STATIC FUNCTIONS *********************************************************/
@@ -477,15 +486,113 @@ }
/* - * @unimplemented + * @implemented */ NTSTATUS NTAPI KdDebuggerInitialize0( IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + ULONG Value; + PCHAR CommandLine, Port, BaudRate, Irq; + + /* Apply default values */ + KdpPortIrq = 0; + DefaultPort.ComPort = DEFAULT_DEBUG_PORT; + DefaultPort.BaudRate = DEFAULT_DEBUG_BAUD_RATE; + + /* Check if e have a LoaderBlock */ + if (LoaderBlock) + { + /* Get the Command Line */ + CommandLine = LoaderBlock->LoadOptions; + + /* Upcase it */ + _strupr(CommandLine); + + /* Get the port and baud rate */ + Port = strstr(CommandLine, "DEBUGPORT"); + BaudRate = strstr(CommandLine, "BAUDRATE"); + Irq = strstr(CommandLine, "IRQ"); + + /* Check if we got the /DEBUGPORT parameter */ + if (Port) + { + /* Move past the actual string, to reach the port*/ + Port += strlen("DEBUGPORT"); + + /* Now get past any spaces and skip the equal sign */ + while (*Port == ' ') Port++; + Port++; + + /* Do we have a serial port? */ + if (strncmp(Port, "COM", 3) != 0) + { + return STATUS_INVALID_PARAMETER; + } + + /* Gheck for a valid Serial Port */ + Port += 3; + Value = atol(Port); + if (Value > 4) + { + return STATUS_INVALID_PARAMETER; + } + + /* Set the port to use */ + DefaultPort.ComPort = Value; + } + + /* Check if we got a baud rate */ + if (BaudRate) + { + /* Move past the actual string, to reach the rate */ + BaudRate += strlen("BAUDRATE"); + + /* Now get past any spaces */ + while (*BaudRate == ' ') BaudRate++; + + /* And make sure we have a rate */ + if (*BaudRate) + { + /* Read and set it */ + Value = atol(BaudRate + 1); + if (Value) DefaultPort.BaudRate = Value; + } + } + + /* Check Serial Port Settings [IRQ] */ + if (Irq) + { + /* Move past the actual string, to reach the rate */ + Irq += strlen("IRQ"); + + /* Now get past any spaces */ + while (*Irq == ' ') Irq++; + + /* And make sure we have an IRQ */ + if (*Irq) + { + /* Read and set it */ + Value = atol(Irq + 1); + if (Value) KdpPortIrq = Value; + } + } + } + + /* Get base address */ + DefaultPort.BaseAddress = BaseArray[DefaultPort.ComPort]; + + /* Check if the COM port does exist */ + if (!KdpDoesComPortExist(DefaultPort.BaseAddress)) + { + return STATUS_INVALID_PARAMETER; + } + + /* Initialize the port */ + KdPortInitializeEx(&DefaultPort, 0, 0); + + return STATUS_SUCCESS; }
/* @@ -535,7 +642,31 @@ IN PSTRING MessageData, IN OUT PKD_CONTEXT Context) { - UNIMPLEMENTED; + ULONG i; + + switch (PacketType) + { + case PACKET_TYPE_KD_DEBUG_IO: + /* Copy Message to COM port */ + for (i = 0; i < MessageData->Length; i++) + { + char c = MessageData->Buffer[i]; + if ( c == 10 ) + { + KdPortPutByteEx(&DefaultPort, 13); + KdPortPutByteEx(&DefaultPort, 10); + } + else + { + KdPortPutByteEx(&DefaultPort, c); + } + } + break; + + default: + break; + } + return; }
@@ -551,7 +682,7 @@ OUT PULONG DataLength, IN OUT PKD_CONTEXT Context) { - UNIMPLEMENTED; +// UNIMPLEMENTED; return 0; }