Author: hbelusca
Date: Tue May 7 00:14:36 2013
New Revision: 58964
URL:
http://svn.reactos.org/svn/reactos?rev=58964&view=rev
Log:
[KDROSDBG]
In fact, the kdcom used for KDBG (in GCC builds) is really a thin layer atop of CPORTLIB.
Remove extra code (remove also the KD_PORT_INFORMATION type) and replace it with calls to
CPORTLIB functions.
Next step is to put all that thing into KDBG directly, as helper functions. Then, if one
wants to make a really kdcom (as we have for MSVC builds), one has to refactor all KDBG.
Modified:
branches/kd++/drivers/base/kdcom/kdcom.c
branches/kd++/drivers/base/kdrosdbg/arm/kdbg.c
branches/kd++/drivers/base/kdrosdbg/i386/kdbg.c
branches/kd++/drivers/base/kdrosdbg/kdrosdbg.spec
branches/kd++/ntoskrnl/include/internal/kd.h
branches/kd++/ntoskrnl/kd/kdinit.c
branches/kd++/ntoskrnl/kd/kdio.c
branches/kd++/ntoskrnl/kd/wrappers/gdbstub.c
branches/kd++/ntoskrnl/kd/wrappers/gdbstub_powerpc.c
Modified: branches/kd++/drivers/base/kdcom/kdcom.c
URL:
http://svn.reactos.org/svn/reactos/branches/kd%2B%2B/drivers/base/kdcom/kdc…
==============================================================================
--- branches/kd++/drivers/base/kdcom/kdcom.c [iso-8859-1] (original)
+++ branches/kd++/drivers/base/kdcom/kdcom.c [iso-8859-1] Tue May 7 00:14:36 2013
@@ -17,8 +17,7 @@
#define DEFAULT_DEBUG_COM2_IRQ 3 /* COM2 IRQ */
#define DEFAULT_DEBUG_BAUD_RATE 115200 /* 115200 Baud */
-#define DEFAULT_BAUD_RATE 19200
-
+#define DEFAULT_BAUD_RATE 19200
#if defined(_M_IX86) || defined(_M_AMD64)
const ULONG BaseArray[] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8};
Modified: branches/kd++/drivers/base/kdrosdbg/arm/kdbg.c
URL:
http://svn.reactos.org/svn/reactos/branches/kd%2B%2B/drivers/base/kdrosdbg/…
==============================================================================
--- branches/kd++/drivers/base/kdrosdbg/arm/kdbg.c [iso-8859-1] (original)
+++ branches/kd++/drivers/base/kdrosdbg/arm/kdbg.c [iso-8859-1] Tue May 7 00:14:36 2013
@@ -10,27 +10,20 @@
#define NOEXTAPI
#include <ntifs.h>
+#include <arc/arc.h>
#include <halfuncs.h>
+#include <windbgkd.h>
+#include <ioaccess.h> /* port intrinsics */
+#include <cportlib/cportlib.h>
+#include <arm/peripherals/pl011.h>
#include <stdio.h>
-#include <arc/arc.h>
-#include <windbgkd.h>
-#include <kddll.h>
-#include <ioaccess.h>
-#include <arm/peripherals/pl011.h>
#define NDEBUG
#include <debug.h>
/* GLOBALS ********************************************************************/
-typedef struct _KD_PORT_INFORMATION
-{
- ULONG ComPort;
- ULONG BaudRate;
- ULONG BaseAddress;
-} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
-
-KD_PORT_INFORMATION DefaultPort = {0, 0, 0};
+CPPORT DefaultPort = {0, 0, 0};
//
// We need to build this in the configuration root and use KeFindConfigurationEntry
@@ -42,42 +35,41 @@
BOOLEAN
NTAPI
-KdPortInitializeEx(IN PKD_PORT_INFORMATION PortInformation,
- IN ULONG Unknown1,
- IN ULONG Unknown2)
+KdPortInitializeEx(IN PCPPORT PortInformation,
+ IN ULONG ComPortNumber)
{
ULONG Divider, Remainder, Fraction;
ULONG Baudrate = PortInformation->BaudRate;
-
+
//
// Calculate baudrate clock divider and remainder
//
Divider = HACK / (16 * Baudrate);
Remainder = HACK % (16 * Baudrate);
-
+
//
// Calculate the fractional part
//
Fraction = (8 * Remainder / Baudrate) >> 1;
Fraction += (8 * Remainder / Baudrate) & 1;
-
+
//
// Disable interrupts
//
WRITE_REGISTER_ULONG(UART_PL011_CR, 0);
-
+
//
// Set the baud rate
//
WRITE_REGISTER_ULONG(UART_PL011_IBRD, Divider);
WRITE_REGISTER_ULONG(UART_PL011_FBRD, Fraction);
-
+
//
// Set 8 bits for data, 1 stop bit, no parity, FIFO enabled
//
WRITE_REGISTER_ULONG(UART_PL011_LCRH,
UART_PL011_LCRH_WLEN_8 | UART_PL011_LCRH_FEN);
-
+
//
// Clear and enable FIFO
//
@@ -85,7 +77,7 @@
UART_PL011_CR_UARTEN |
UART_PL011_CR_TXE |
UART_PL011_CR_RXE);
-
+
//
// Done
//
@@ -94,7 +86,7 @@
BOOLEAN
NTAPI
-KdPortGetByteEx(IN PKD_PORT_INFORMATION PortInformation,
+KdPortGetByteEx(IN PCPPORT PortInformation,
OUT PUCHAR ByteReceived)
{
UNIMPLEMENTED;
@@ -104,7 +96,7 @@
VOID
NTAPI
-KdPortPutByteEx(IN PKD_PORT_INFORMATION PortInformation,
+KdPortPutByteEx(IN PCPPORT PortInformation,
IN UCHAR ByteToSend)
{
//
Modified: branches/kd++/drivers/base/kdrosdbg/i386/kdbg.c
URL:
http://svn.reactos.org/svn/reactos/branches/kd%2B%2B/drivers/base/kdrosdbg/…
==============================================================================
--- branches/kd++/drivers/base/kdrosdbg/i386/kdbg.c [iso-8859-1] (original)
+++ branches/kd++/drivers/base/kdrosdbg/i386/kdbg.c [iso-8859-1] Tue May 7 00:14:36 2013
@@ -11,26 +11,18 @@
#define NOEXTAPI
#include <ntifs.h>
+#include <arc/arc.h>
#include <halfuncs.h>
-#include <stdio.h>
-#include <arc/arc.h>
#include <windbgkd.h>
-#include <kddll.h>
#include <ioaccess.h> /* port intrinsics */
#include <cportlib/cportlib.h>
+#include <stdio.h>
#define NDEBUG
#include <debug.h>
-typedef struct _KD_PORT_INFORMATION
-{
- ULONG ComPort;
- ULONG BaudRate;
- ULONG BaseAddress;
-} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
-
-#define DEFAULT_BAUD_RATE 19200
+#define DEFAULT_BAUD_RATE 19200
#if defined(_M_IX86) || defined(_M_AMD64)
const ULONG BaseArray[] = {0, 0x3F8, 0x2F8, 0x3E8, 0x2E8};
@@ -44,57 +36,11 @@
#error Unknown architecture
#endif
-/* MACROS *******************************************************************/
+/* STATIC VARIABLES ***********************************************************/
-#define SER_RBR(x) ((PUCHAR)(x)+0)
-#define SER_THR(x) ((PUCHAR)(x)+0)
-#define SER_DLL(x) ((PUCHAR)(x)+0)
-#define SER_IER(x) ((PUCHAR)(x)+1)
-#define SR_IER_ERDA 0x01
-#define SR_IER_ETHRE 0x02
-#define SR_IER_ERLSI 0x04
-#define SR_IER_EMS 0x08
-#define SR_IER_ALL 0x0F
-#define SER_DLM(x) ((PUCHAR)(x)+1)
-#define SER_IIR(x) ((PUCHAR)(x)+2)
-#define SER_FCR(x) ((PUCHAR)(x)+2)
-#define SR_FCR_ENABLE_FIFO 0x01
-#define SR_FCR_CLEAR_RCVR 0x02
-#define SR_FCR_CLEAR_XMIT 0x04
-#define SER_LCR(x) ((PUCHAR)(x)+3)
-#define SR_LCR_CS5 0x00
-#define SR_LCR_CS6 0x01
-#define SR_LCR_CS7 0x02
-#define SR_LCR_CS8 0x03
-#define SR_LCR_ST1 0x00
-#define SR_LCR_ST2 0x04
-#define SR_LCR_PNO 0x00
-#define SR_LCR_POD 0x08
-#define SR_LCR_PEV 0x18
-#define SR_LCR_PMK 0x28
-#define SR_LCR_PSP 0x38
-#define SR_LCR_BRK 0x40
-#define SR_LCR_DLAB 0x80
-#define SER_MCR(x) ((PUCHAR)(x)+4)
-#define SR_MCR_DTR 0x01
-#define SR_MCR_RTS 0x02
-#define SR_MCR_OUT1 0x04
-#define SR_MCR_OUT2 0x08
-#define SR_MCR_LOOP 0x10
-#define SER_LSR(x) ((PUCHAR)(x)+5)
-#define SR_LSR_DR 0x01
-#define SR_LSR_TBE 0x20
-#define SER_MSR(x) ((PUCHAR)(x)+6)
-#define SR_MSR_CTS 0x10
-#define SR_MSR_DSR 0x20
-#define SER_SCR(x) ((PUCHAR)(x)+7)
+// static CPPORT DefaultPort = {0, 0, 0};
-
-/* STATIC VARIABLES *********************************************************/
-
-// static KD_PORT_INFORMATION DefaultPort = { 0, 0, 0 };
-
-/* The com port must only be initialized once! */
+/* The COM port must only be initialized once! */
// static BOOLEAN PortInitialized = FALSE;
@@ -103,14 +49,11 @@
BOOLEAN
NTAPI
KdPortInitializeEx(
- IN PKD_PORT_INFORMATION PortInformation,
- IN ULONG Unknown1,
- IN ULONG Unknown2)
+ IN PCPPORT PortInformation,
+ IN ULONG ComPortNumber)
{
- ULONG ComPortBase;
+ NTSTATUS Status;
CHAR buffer[80];
- ULONG divisor;
- UCHAR lcr;
#if 0 // Deactivated because never used in fact (was in KdPortInitialize but we use
KdPortInitializeEx)
/*
@@ -122,7 +65,7 @@
{
DefaultPort.BaudRate = PortInformation->BaudRate;
- if (PortInformation->ComPort == 0)
+ if (ComPortNumber == 0)
{
/*
* Start enumerating COM ports from the last one to the first one,
@@ -134,12 +77,12 @@
{
if (CpDoesPortExist(UlongToPtr(BaseArray[i])))
{
- PortInformation->BaseAddress = DefaultPort.BaseAddress =
BaseArray[i];
- PortInformation->ComPort = DefaultPort.ComPort = i;
+ PortInformation->Address = DefaultPort.Address = BaseArray[i];
+ ComPortNumber = (ULONG)i;
break;
}
}
- if (i == 0)
+ if (ComPortNumber == 0)
{
sprintf(buffer,
"\nKernel Debugger: No COM port found!\n\n");
@@ -155,108 +98,54 @@
/*
* Initialize the port
*/
-
- if (PortInformation->BaudRate == 0)
- PortInformation->BaudRate = DEFAULT_BAUD_RATE;
-
- if (PortInformation->ComPort != 0)
+ Status = CpInitialize(PortInformation,
+ (ComPortNumber == 0 ? PortInformation->Address
+ : UlongToPtr(BaseArray[ComPortNumber])),
+ (PortInformation->BaudRate == 0 ? DEFAULT_BAUD_RATE
+ :
PortInformation->BaudRate));
+ if (!NT_SUCCESS(Status))
{
- if (!CpDoesPortExist(UlongToPtr(BaseArray[PortInformation->ComPort])))
- {
- sprintf(buffer,
- "\nKernel Debugger: Serial port not found!\n\n");
- HalDisplayString(buffer);
- return FALSE;
- }
-
- ComPortBase = BaseArray[PortInformation->ComPort];
- PortInformation->BaseAddress = ComPortBase;
+ sprintf(buffer,
+ "\nKernel Debugger: Serial port not found!\n\n");
+ HalDisplayString(buffer);
+ return FALSE;
}
else
{
- ComPortBase = PortInformation->BaseAddress;
- }
-
- if (ComPortBase == 0)
- return FALSE;
-
#ifndef NDEBUG
- sprintf(buffer,
- "\nSerial port COM%ld found at 0x%lx\n",
- PortInformation->ComPort,
- ComPortBase);
- HalDisplayString(buffer);
-#endif /* NDEBUG */
-
- /* set baud rate and data format (8N1) */
-
- /* turn on DTR and RTS */
- WRITE_PORT_UCHAR(SER_MCR(ComPortBase), SR_MCR_DTR | SR_MCR_RTS);
-
- /* set DLAB */
- lcr = READ_PORT_UCHAR(SER_LCR(ComPortBase)) | SR_LCR_DLAB;
- WRITE_PORT_UCHAR(SER_LCR(ComPortBase), lcr);
-
- /* set baud rate */
- divisor = 115200 / PortInformation->BaudRate;
- WRITE_PORT_UCHAR(SER_DLL(ComPortBase), (UCHAR)(divisor & 0xff));
- WRITE_PORT_UCHAR(SER_DLM(ComPortBase), (UCHAR)((divisor >> 8) & 0xff));
-
- /* reset DLAB and set 8N1 format */
- WRITE_PORT_UCHAR(SER_LCR(ComPortBase),
- SR_LCR_CS8 | SR_LCR_ST1 | SR_LCR_PNO);
-
- /* read junk out of the RBR */
- lcr = READ_PORT_UCHAR(SER_RBR(ComPortBase));
-
-#ifndef NDEBUG
- /* print message to blue screen */
- sprintf(buffer,
- "\nKernel Debugger: COM%ld (Port 0x%lx) BaudRate %ld\n\n",
- PortInformation->ComPort,
- ComPortBase,
- PortInformation->BaudRate);
-
- HalDisplayString(buffer);
+ /* Print message to blue screen */
+ sprintf(buffer,
+ "\nKernel Debugger: Serial port found: COM%ld (Port 0x%lx) BaudRate
%ld\n\n",
+ ComPortNumber,
+ PortInformation->Address,
+ PortInformation->BaudRate);
+ HalDisplayString(buffer);
#endif /* NDEBUG */
#if 0
- /* set global info */
- KdComPortInUse = (PUCHAR)DefaultPort.BaseAddress;
+ /* Set global info */
+ KdComPortInUse = DefaultPort.Address;
#endif
-
- return TRUE;
+ return TRUE;
+ }
}
BOOLEAN
NTAPI
KdPortGetByteEx(
- IN PKD_PORT_INFORMATION PortInformation,
+ IN PCPPORT PortInformation,
OUT PUCHAR ByteReceived)
{
- PUCHAR ComPortBase = (PUCHAR)PortInformation->BaseAddress;
-
- if ((READ_PORT_UCHAR(SER_LSR(ComPortBase)) & SR_LSR_DR))
- {
- *ByteReceived = READ_PORT_UCHAR(SER_RBR(ComPortBase));
- return TRUE;
- }
-
- return FALSE;
+ return (CpGetByte(PortInformation, ByteReceived, FALSE) == CP_GET_SUCCESS);
}
VOID
NTAPI
KdPortPutByteEx(
- IN PKD_PORT_INFORMATION PortInformation,
+ IN PCPPORT PortInformation,
IN UCHAR ByteToSend)
{
- PUCHAR ComPortBase = (PUCHAR)PortInformation->BaseAddress;
-
- while ((READ_PORT_UCHAR(SER_LSR(ComPortBase)) & SR_LSR_TBE) == 0)
- ;
-
- WRITE_PORT_UCHAR(SER_THR(ComPortBase), ByteToSend);
+ CpPutByte(PortInformation, ByteToSend);
}
/* EOF */
Modified: branches/kd++/drivers/base/kdrosdbg/kdrosdbg.spec
URL:
http://svn.reactos.org/svn/reactos/branches/kd%2B%2B/drivers/base/kdrosdbg/…
==============================================================================
--- branches/kd++/drivers/base/kdrosdbg/kdrosdbg.spec [iso-8859-1] (original)
+++ branches/kd++/drivers/base/kdrosdbg/kdrosdbg.spec [iso-8859-1] Tue May 7 00:14:36
2013
@@ -8,6 +8,6 @@
8 stdcall KdSendPacket(long ptr ptr ptr)
; Legacy KD
-@ stdcall KdPortInitializeEx(ptr long long)
+@ stdcall KdPortInitializeEx(ptr long)
@ stdcall KdPortGetByteEx(ptr ptr)
@ stdcall KdPortPutByteEx(ptr long)
Modified: branches/kd++/ntoskrnl/include/internal/kd.h
URL:
http://svn.reactos.org/svn/reactos/branches/kd%2B%2B/ntoskrnl/include/inter…
==============================================================================
--- branches/kd++/ntoskrnl/include/internal/kd.h [iso-8859-1] (original)
+++ branches/kd++/ntoskrnl/include/internal/kd.h [iso-8859-1] Tue May 7 00:14:36 2013
@@ -1,4 +1,6 @@
#pragma once
+
+#include <cportlib/cportlib.h>
#ifdef _M_PPC
#define KdDebuggerEnabled _KdDebuggerEnabled
@@ -8,15 +10,8 @@
//
// Kernel Debugger Port Definition
//
-typedef struct _KD_PORT_INFORMATION
-{
- ULONG ComPort;
- ULONG BaudRate;
- ULONG BaseAddress;
-} KD_PORT_INFORMATION, *PKD_PORT_INFORMATION;
-
struct _KD_DISPATCH_TABLE;
-extern KD_PORT_INFORMATION GdbPortInfo;
+extern CPPORT GdbPortInfo;
extern BOOLEAN _KdDebuggerEnabled;
extern BOOLEAN _KdDebuggerNotPresent;
extern BOOLEAN KdBreakAfterSymbolLoad;
@@ -26,21 +21,20 @@
BOOLEAN
NTAPI
KdPortInitializeEx(
- PKD_PORT_INFORMATION PortInformation,
- ULONG Unknown1,
- ULONG Unknown2
+ PCPPORT PortInformation,
+ ULONG ComPortNumber
);
BOOLEAN
NTAPI
KdPortGetByteEx(
- PKD_PORT_INFORMATION PortInformation,
+ PCPPORT PortInformation,
PUCHAR ByteReceived);
VOID
NTAPI
KdPortPutByteEx(
- PKD_PORT_INFORMATION PortInformation,
+ PCPPORT PortInformation,
UCHAR ByteToSend
);
@@ -340,7 +334,8 @@
extern ULONG KdpPort;
/* Port Information for the Serial Native Mode */
-extern KD_PORT_INFORMATION SerialPortInfo;
+extern ULONG SerialPortNumber;
+extern CPPORT SerialPortInfo;
/* Init Functions for Native Providers */
extern PKDP_INIT_ROUTINE InitRoutines[KdMax];
Modified: branches/kd++/ntoskrnl/kd/kdinit.c
URL:
http://svn.reactos.org/svn/reactos/branches/kd%2B%2B/ntoskrnl/kd/kdinit.c?r…
==============================================================================
--- branches/kd++/ntoskrnl/kd/kdinit.c [iso-8859-1] (original)
+++ branches/kd++/ntoskrnl/kd/kdinit.c [iso-8859-1] Tue May 7 00:14:36 2013
@@ -16,7 +16,8 @@
/* VARIABLES ***************************************************************/
-KD_PORT_INFORMATION PortInfo = {DEFAULT_DEBUG_PORT, DEFAULT_DEBUG_BAUD_RATE, 0};
+ULONG PortNumber = DEFAULT_DEBUG_PORT;
+CPPORT PortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
ULONG KdpPortIrq;
#ifdef AUTO_ENABLE_BOCHS
KDP_DEBUG_MODE KdpDebugMode = {{{.Bochs=TRUE}}};
@@ -68,7 +69,7 @@
KdpDebugMode.Serial = TRUE;
/* Set the port to use */
- SerialPortInfo.ComPort = Value;
+ SerialPortNumber = Value;
KdpPort = Value;
}
}
@@ -78,8 +79,8 @@
if (Value)
{
KdpDebugMode.Serial = TRUE;
- SerialPortInfo.BaseAddress = Value;
- SerialPortInfo.ComPort = 0;
+ SerialPortInfo.Address = UlongToPtr(Value);
+ SerialPortNumber = 0;
KdpPort = 0;
}
}
Modified: branches/kd++/ntoskrnl/kd/kdio.c
URL:
http://svn.reactos.org/svn/reactos/branches/kd%2B%2B/ntoskrnl/kd/kdio.c?rev…
==============================================================================
--- branches/kd++/ntoskrnl/kd/kdio.c [iso-8859-1] (original)
+++ branches/kd++/ntoskrnl/kd/kdio.c [iso-8859-1] Tue May 7 00:14:36 2013
@@ -26,7 +26,8 @@
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;
@@ -358,12 +359,12 @@
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);
Modified: branches/kd++/ntoskrnl/kd/wrappers/gdbstub.c
URL:
http://svn.reactos.org/svn/reactos/branches/kd%2B%2B/ntoskrnl/kd/wrappers/g…
==============================================================================
--- branches/kd++/ntoskrnl/kd/wrappers/gdbstub.c [iso-8859-1] (original)
+++ branches/kd++/ntoskrnl/kd/wrappers/gdbstub.c [iso-8859-1] Tue May 7 00:14:36 2013
@@ -44,7 +44,8 @@
extern LIST_ENTRY PsActiveProcessHead;
/* FIXME hardcoded for COM2, 115200 baud */
-KD_PORT_INFORMATION GdbPortInfo = { 2, 115200, 0 };
+ULONG GdbPortNumber = DEFAULT_DEBUG_PORT;
+CPPORT GdbPortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
static CHAR GspInBuffer[1000];
static CHAR GspOutBuffer[1000];
@@ -126,9 +127,7 @@
{
UCHAR Value;
- while (!KdPortGetByteEx(&GdbPortInfo, &Value))
- ;
-
+ while (!KdPortGetByteEx(&GdbPortInfo, &Value)) ;
return Value;
}
@@ -145,8 +144,7 @@
while (TRUE)
{
/* wait around for the start character, ignore all other characters */
- while ((ch = GdbGetChar()) != '$')
- ;
+ while ((ch = GdbGetChar()) != '$') ;
retry:
Checksum = 0;
@@ -784,7 +782,6 @@
}
else if (strncmp(Request, "Rcmd,", 5) == 0)
{
- ;
}
}
@@ -943,12 +940,14 @@
ULONG Index;
for (Index = 0; Index < GspSwBreakpointCount; Index++)
+ {
if (GspSwBreakpoints[Index].Address == Address)
{
if (PIndex)
*PIndex = Index;
return TRUE;
}
+ }
return FALSE;
}
@@ -1569,7 +1568,7 @@
WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
/* Initialize the Port */
- KdPortInitializeEx(&GdbPortInfo, 0, 0);
+ KdPortInitializeEx(&GdbPortInfo, GdbPortNumber);
}
else if (BootPhase == 1)
{
Modified: branches/kd++/ntoskrnl/kd/wrappers/gdbstub_powerpc.c
URL:
http://svn.reactos.org/svn/reactos/branches/kd%2B%2B/ntoskrnl/kd/wrappers/g…
==============================================================================
--- branches/kd++/ntoskrnl/kd/wrappers/gdbstub_powerpc.c [iso-8859-1] (original)
+++ branches/kd++/ntoskrnl/kd/wrappers/gdbstub_powerpc.c [iso-8859-1] Tue May 7 00:14:36
2013
@@ -88,44 +88,47 @@
#include <debug.h>
/************************************************************************/
+
+static BOOLEAN GspInitialized;
+static BOOLEAN GspRemoteDebug;
+
+static CONST CHAR HexChars[]="0123456789abcdef";
+
+static PETHREAD GspRunThread; /* NULL means run all threads */
+static PETHREAD GspDbgThread;
+static PETHREAD GspEnumThread;
+
+static FAST_MUTEX GspLock;
+
+extern LIST_ENTRY PsActiveProcessHead;
+
+/* FIXME hardcoded for COM2, 115200 baud */
+ULONG GdbPortNumber = DEFAULT_DEBUG_PORT;
+CPPORT GdbPortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
+
/* BUFMAX defines the maximum number of characters in inbound/outbound buffers*/
/* at least NUMREGBYTES*2 are needed for register packets */
#define BUFMAX 1000
-
-static BOOLEAN GspInitialized;
-
-static BOOLEAN GspRemoteDebug;
-
-static CONST CHAR HexChars[]="0123456789abcdef";
-
-static PETHREAD GspRunThread; /* NULL means run all threads */
-static PETHREAD GspDbgThread;
-static PETHREAD GspEnumThread;
-
-static FAST_MUTEX GspLock;
-
-extern LIST_ENTRY PsActiveProcessHead;
-
-/* FIXME hardcoded for COM2, 115200 baud */
-KD_PORT_INFORMATION GdbPortInfo = { 2, 115200, 0 };
+static CHAR GspInBuffer[BUFMAX];
+static CHAR GspOutBuffer[BUFMAX];
/* Number of Registers. */
#define NUMREGS 16
enum REGISTER_NAMES
{
- EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
- PC /* also known as eip */,
- PS /* also known as eflags */,
- CS, SS, DS, ES, FS, GS
+ EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI,
+ PC /* also known as eip */,
+ PS /* also known as eflags */,
+ CS, SS, DS, ES, FS, GS
};
typedef struct _CPU_REGISTER
{
- ULONG Size;
- ULONG OffsetInTF;
- ULONG OffsetInContext;
- BOOLEAN SetInContext;
+ ULONG Size;
+ ULONG OffsetInTF;
+ ULONG OffsetInContext;
+ BOOLEAN SetInContext;
} CPU_REGISTER, *PCPU_REGISTER;
static CPU_REGISTER GspRegisters[NUMREGS] =
@@ -134,54 +137,45 @@
static PCHAR GspThreadStates[DeferredReady+1] =
{
- "Initialized",
- "Ready",
- "Running",
- "Standby",
- "Terminated",
- "Waiting",
- "Transition",
- "DeferredReady"
+ "Initialized",
+ "Ready",
+ "Running",
+ "Standby",
+ "Terminated",
+ "Waiting",
+ "Transition",
+ "DeferredReady"
};
LONG
HexValue(CHAR ch)
{
- if ((ch >= '0') && (ch <= '9'))
- {
- return (ch - '0');
- }
- if ((ch >= 'a') && (ch <= 'f'))
- {
- return (ch - 'a' + 10);
- }
- if ((ch >= 'A') && (ch <= 'F'))
- {
- return (ch - 'A' + 10);
- }
-
- return -1;
-}
-
-static CHAR GspInBuffer[BUFMAX];
-static CHAR GspOutBuffer[BUFMAX];
+ if ((ch >= '0') && (ch <= '9'))
+ return (ch - '0');
+
+ if ((ch >= 'a') && (ch <= 'f'))
+ return (ch - 'a' + 10);
+
+ if ((ch >= 'A') && (ch <= 'F'))
+ return (ch - 'A' + 10);
+
+ return -1;
+}
VOID
GdbPutChar(UCHAR Value)
{
- KdPortPutByteEx(&GdbPortInfo, Value);
+ KdPortPutByteEx(&GdbPortInfo, Value);
}
UCHAR
GdbGetChar(VOID)
{
- UCHAR Value;
-
- while (!KdPortGetByteEx(&GdbPortInfo, &Value))
- ;
-
- return Value;
+ UCHAR Value;
+
+ while (!KdPortGetByteEx(&GdbPortInfo, &Value)) ;
+ return Value;
}
/* scan for the sequence $<data>#<Checksum> */
@@ -189,57 +183,53 @@
PCHAR
GspGetPacket()
{
- PCHAR Buffer = &GspInBuffer[0];
- CHAR Checksum;
- CHAR XmitChecksum;
- ULONG Count;
- CHAR ch;
-
- while (TRUE)
- {
- /* wait around for the start character, ignore all other characters */
- while ((ch = GdbGetChar ()) != '$')
- ;
-
- retry:
- Checksum = 0;
- XmitChecksum = -1;
- Count = 0;
-
- /* now, read until a # or end of Buffer is found */
- while (Count < BUFMAX)
- {
- ch = GdbGetChar();
- if (ch == '$')
- {
- goto retry;
- }
- if (ch == '#')
- {
- break;
- }
- Checksum = Checksum + ch;
- Buffer[Count] = ch;
- Count = Count + 1;
- }
- Buffer[Count] = 0;
-
- if (ch == '#')
- {
- ch = GdbGetChar();
- XmitChecksum = (CHAR)(HexValue(ch) << 4);
- ch = GdbGetChar();
- XmitChecksum += (CHAR)(HexValue(ch));
-
- if (Checksum != XmitChecksum)
- {
- GdbPutChar('-'); /* failed checksum */
- }
- else
- {
- GdbPutChar('+'); /* successful transfer */
-
- return &Buffer[0];
+ PCHAR Buffer = &GspInBuffer[0];
+ CHAR Checksum;
+ CHAR XmitChecksum;
+ ULONG Count;
+ CHAR ch;
+
+ while (TRUE)
+ {
+ /* wait around for the start character, ignore all other characters */
+ while ((ch = GdbGetChar ()) != '$') ;
+
+retry:
+ Checksum = 0;
+ XmitChecksum = -1;
+ Count = 0;
+
+ /* now, read until a # or end of Buffer is found */
+ while (Count < BUFMAX)
+ {
+ ch = GdbGetChar();
+ if (ch == '$')
+ goto retry;
+
+ if (ch == '#')
+ break;
+
+ Checksum = Checksum + ch;
+ Buffer[Count] = ch;
+ Count = Count + 1;
+ }
+ Buffer[Count] = 0;
+
+ if (ch == '#')
+ {
+ ch = GdbGetChar();
+ XmitChecksum = (CHAR)(HexValue(ch) << 4);
+ ch = GdbGetChar();
+ XmitChecksum += (CHAR)(HexValue(ch));
+
+ if (Checksum != XmitChecksum)
+ {
+ GdbPutChar('-'); /* failed checksum */
+ }
+ else
+ {
+ GdbPutChar('+'); /* successful transfer */
+ return &Buffer[0];
}
}
}
@@ -250,54 +240,54 @@
VOID
GspPutPacket(PCHAR Buffer)
{
- CHAR Checksum;
- LONG Count;
- CHAR ch;
-
- /* $<packet info>#<Checksum>. */
- do
- {
- GdbPutChar('$');
- Checksum = 0;
- Count = 0;
-
- while ((ch = Buffer[Count]))
- {
- GdbPutChar(ch);
- Checksum += ch;
- Count += 1;
- }
-
- GdbPutChar('#');
- GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
- GdbPutChar(HexChars[Checksum & 0xf]);
- }
- while (GdbGetChar() != '+');
+ CHAR Checksum;
+ LONG Count;
+ CHAR ch;
+
+ /* $<packet info>#<Checksum>. */
+ do
+ {
+ GdbPutChar('$');
+ Checksum = 0;
+ Count = 0;
+
+ while ((ch = Buffer[Count]))
+ {
+ GdbPutChar(ch);
+ Checksum += ch;
+ Count += 1;
+ }
+
+ GdbPutChar('#');
+ GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
+ GdbPutChar(HexChars[Checksum & 0xf]);
+ }
+ while (GdbGetChar() != '+');
}
VOID
GspPutPacketNoWait(PCHAR Buffer)
{
- CHAR Checksum;
- LONG Count;
- CHAR ch;
-
- /* $<packet info>#<Checksum>. */
- GdbPutChar('$');
- Checksum = 0;
- Count = 0;
-
- while ((ch = Buffer[Count]))
- {
- GdbPutChar(ch);
- Checksum += ch;
- Count += 1;
- }
-
- GdbPutChar('#');
- GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
- GdbPutChar(HexChars[Checksum & 0xf]);
+ CHAR Checksum;
+ LONG Count;
+ CHAR ch;
+
+ /* $<packet info>#<Checksum>. */
+ GdbPutChar('$');
+ Checksum = 0;
+ Count = 0;
+
+ while ((ch = Buffer[Count]))
+ {
+ GdbPutChar(ch);
+ Checksum += ch;
+ Count += 1;
+ }
+
+ GdbPutChar('#');
+ GdbPutChar(HexChars[(Checksum >> 4) & 0xf]);
+ GdbPutChar(HexChars[Checksum & 0xf]);
}
/* Indicate to caller of GspMem2Hex or GspHex2Mem that there has been an
@@ -308,19 +298,33 @@
static CHAR
GspReadMemSafe(PCHAR Address)
{
- CHAR ch;
-
- if (NULL == Address)
- {
- GspMemoryError = TRUE;
- return '\0';
- }
-
- GspAccessLocation = Address;
- ch = *Address;
- GspAccessLocation = NULL;
-
- return ch;
+ CHAR ch;
+
+ if (NULL == Address)
+ {
+ GspMemoryError = TRUE;
+ return '\0';
+ }
+
+ GspAccessLocation = Address;
+ ch = *Address;
+ GspAccessLocation = NULL;
+
+ return ch;
+}
+
+static CHAR
+GspWriteMemSafeGetContent(PVOID Context, ULONG Offset)
+{
+ ASSERT(0 == Offset);
+ return *((PCHAR) Context);
+}
+
+static void
+GspWriteMemSafe(PCHAR Address,
+ CHAR Ch)
+{
+ GspWriteMem(Address, 1, TRUE, GspWriteMemSafeGetContent, &Ch);
}
/* Convert the memory pointed to by Address into hex, placing result in Buffer */
@@ -329,131 +333,110 @@
a fault; if FALSE treat a fault like any other fault in the stub. */
static PCHAR
GspMem2Hex(PCHAR Address,
- PCHAR Buffer,
- LONG Count,
- BOOLEAN MayFault)
-{
- ULONG i;
- CHAR ch;
-
- for (i = 0; i < (ULONG) Count; i++)
- {
- if (MayFault)
- {
- ch = GspReadMemSafe(Address);
- if (GspMemoryError)
- {
- return Buffer;
- }
- }
- else
- {
- ch = *Address;
- }
- *Buffer++ = HexChars[(ch >> 4) & 0xf];
- *Buffer++ = HexChars[ch & 0xf];
- Address++;
- }
-
- *Buffer = 0;
- return Buffer;
+ PCHAR Buffer,
+ LONG Count,
+ BOOLEAN MayFault)
+{
+ ULONG i;
+ CHAR ch;
+
+ for (i = 0; i < (ULONG) Count; i++)
+ {
+ if (MayFault)
+ {
+ ch = GspReadMemSafe(Address);
+ if (GspMemoryError)
+ return Buffer;
+ }
+ else
+ {
+ ch = *Address;
+ }
+ *Buffer++ = HexChars[(ch >> 4) & 0xf];
+ *Buffer++ = HexChars[ch & 0xf];
+ Address++;
+ }
+
+ *Buffer = 0;
+ return Buffer;
}
static ULONG
GspWriteMem(PCHAR Address,
- ULONG Count,
- BOOLEAN MayFault,
- CHAR (*GetContent)(PVOID Context, ULONG Offset),
- PVOID Context)
-{
- PCHAR Current;
- PCHAR Page;
- ULONG CountInPage;
- ULONG i;
- CHAR ch;
- ULONG OldProt = 0;
-
- Current = Address;
- while (Current < Address + Count)
- {
- Page = (PCHAR)PAGE_ROUND_DOWN(Current);
- if (Address + Count <= Page + PAGE_SIZE)
- {
- /* Fits in this page */
- CountInPage = Count;
- }
- else
- {
- /* Flows into next page, handle only current page in this iteration */
- CountInPage = PAGE_SIZE - (Address - Page);
- }
- if (MayFault)
- {
- OldProt = MmGetPageProtect(NULL, Address);
- MmSetPageProtect(NULL, Address, PAGE_EXECUTE_READWRITE);
- }
-
- for (i = 0; i < CountInPage && ! GspMemoryError; i++)
- {
- ch = (*GetContent)(Context, Current - Address);
-
- if (MayFault)
- {
- GspAccessLocation = Current;
- }
- *Current = ch;
- if (MayFault)
- {
- GspAccessLocation = NULL;
- }
- Current++;
- }
- if (MayFault)
- {
- MmSetPageProtect(NULL, Page, OldProt);
- if (GspMemoryError)
- {
- return Current - Address;
- }
- }
- }
-
- return Current - Address;
+ ULONG Count,
+ BOOLEAN MayFault,
+ CHAR (*GetContent)(PVOID Context, ULONG Offset),
+ PVOID Context)
+{
+ PCHAR Current;
+ PCHAR Page;
+ ULONG CountInPage;
+ ULONG i;
+ CHAR ch;
+ ULONG OldProt = 0;
+
+ Current = Address;
+ while (Current < Address + Count)
+ {
+ Page = (PCHAR)PAGE_ROUND_DOWN(Current);
+ if (Address + Count <= Page + PAGE_SIZE)
+ {
+ /* Fits in this page */
+ CountInPage = Count;
+ }
+ else
+ {
+ /* Flows into next page, handle only current page in this iteration */
+ CountInPage = PAGE_SIZE - (Address - Page);
+ }
+ if (MayFault)
+ {
+ OldProt = MmGetPageProtect(NULL, Address);
+ MmSetPageProtect(NULL, Address, PAGE_EXECUTE_READWRITE);
+ }
+
+ for (i = 0; i < CountInPage && ! GspMemoryError; i++)
+ {
+ ch = (*GetContent)(Context, Current - Address);
+
+ if (MayFault)
+ GspAccessLocation = Current;
+
+ *Current = ch;
+
+ if (MayFault)
+ GspAccessLocation = NULL;
+
+ Current++;
+ }
+ if (MayFault)
+ {
+ MmSetPageProtect(NULL, Page, OldProt);
+ if (GspMemoryError)
+ return Current - Address;
+ }
+ }
+
+ return Current - Address;
}
static CHAR
GspHex2MemGetContent(PVOID Context, ULONG Offset)
{
- return (CHAR)((HexValue(*((PCHAR) Context + 2 * Offset)) << 4) +
- HexValue(*((PCHAR) Context + 2 * Offset + 1)));
+ return (CHAR)((HexValue(*((PCHAR) Context + 2 * Offset)) << 4) +
+ HexValue(*((PCHAR) Context + 2 * Offset + 1)));
}
/* Convert the hex array pointed to by Buffer into binary to be placed at Address */
/* Return a pointer to the character AFTER the last byte read from Buffer */
static PCHAR
GspHex2Mem(PCHAR Buffer,
- PCHAR Address,
- ULONG Count,
- BOOLEAN MayFault)
-{
- Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer);
-
- return Buffer + 2 * Count;
-}
-
-static CHAR
-GspWriteMemSafeGetContent(PVOID Context, ULONG Offset)
-{
- ASSERT(0 == Offset);
-
- return *((PCHAR) Context);
-}
-
-static void
-GspWriteMemSafe(PCHAR Address,
- CHAR Ch)
-{
- GspWriteMem(Address, 1, TRUE, GspWriteMemSafeGetContent, &Ch);
+ PCHAR Address,
+ ULONG Count,
+ BOOLEAN MayFault)
+{
+ Count = GspWriteMem(Address, Count, MayFault, GspHex2MemGetContent, Buffer);
+ return Buffer + 2 * Count;
}
@@ -462,33 +445,38 @@
ULONG
GspComputeSignal(NTSTATUS ExceptionCode)
{
- ULONG SigVal;
-
- switch (ExceptionCode)
- {
- case STATUS_INTEGER_DIVIDE_BY_ZERO:
- SigVal = 8; /* divide by zero */
- break;
- case STATUS_SINGLE_STEP:
- case STATUS_BREAKPOINT:
- SigVal = 5; /* breakpoint */
- break;
- case STATUS_INTEGER_OVERFLOW:
- case STATUS_ARRAY_BOUNDS_EXCEEDED:
- SigVal = 16; /* bound instruction */
- break;
- case STATUS_ILLEGAL_INSTRUCTION:
- SigVal = 4; /* Invalid opcode */
- break;
- case STATUS_STACK_OVERFLOW:
- case STATUS_DATATYPE_MISALIGNMENT:
- case STATUS_ACCESS_VIOLATION:
- SigVal = 11; /* access violation */
- break;
- default:
- SigVal = 7; /* "software generated" */
- }
- return SigVal;
+ ULONG SigVal;
+
+ switch (ExceptionCode)
+ {
+ case STATUS_INTEGER_DIVIDE_BY_ZERO:
+ SigVal = 8; /* divide by zero */
+ break;
+
+ case STATUS_SINGLE_STEP:
+ case STATUS_BREAKPOINT:
+ SigVal = 5; /* breakpoint */
+ break;
+
+ case STATUS_INTEGER_OVERFLOW:
+ case STATUS_ARRAY_BOUNDS_EXCEEDED:
+ SigVal = 16; /* bound instruction */
+ break;
+
+ case STATUS_ILLEGAL_INSTRUCTION:
+ SigVal = 4; /* Invalid opcode */
+ break;
+
+ case STATUS_STACK_OVERFLOW:
+ case STATUS_DATATYPE_MISALIGNMENT:
+ case STATUS_ACCESS_VIOLATION:
+ SigVal = 11; /* access violation */
+ break;
+
+ default:
+ SigVal = 7; /* "software generated" */
+ }
+ return SigVal;
}
@@ -1626,43 +1614,39 @@
BOOLEAN
NTAPI
GspBreakIn(PKINTERRUPT Interrupt,
- PVOID ServiceContext)
-{
- PKTRAP_FRAME TrapFrame;
- BOOLEAN DoBreakIn;
- CONTEXT Context;
- KIRQL OldIrql;
- UCHAR Value;
-
- DPRINT("Break In\n");
-
- DoBreakIn = FALSE;
- while (KdPortGetByteEx(&GdbPortInfo, &Value))
- {
- if (Value == 0x03)
- {
- DoBreakIn = TRUE;
- }
- }
-
- if (!DoBreakIn)
- {
- return TRUE;
- }
-
- KeRaiseIrql(HIGH_LEVEL, &OldIrql);
-
- TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame;
-
- KeTrapFrameToContext(TrapFrame, NULL, &Context);
-
- KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame);
-
- KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags, KernelMode);
-
- KeLowerIrql(OldIrql);
-
- return TRUE;
+ PVOID ServiceContext)
+{
+ PKTRAP_FRAME TrapFrame;
+ BOOLEAN DoBreakIn;
+ CONTEXT Context;
+ KIRQL OldIrql;
+ UCHAR Value;
+
+ DPRINT("Break In\n");
+
+ DoBreakIn = FALSE;
+ while (KdPortGetByteEx(&GdbPortInfo, &Value))
+ {
+ if (Value == 0x03)
+ DoBreakIn = TRUE;
+ }
+
+ if (!DoBreakIn)
+ return TRUE;
+
+ KeRaiseIrql(HIGH_LEVEL, &OldIrql);
+
+ TrapFrame = PsGetCurrentThread()->Tcb.TrapFrame;
+
+ KeTrapFrameToContext(TrapFrame, NULL, &Context);
+
+ KdpGdbEnterDebuggerException(NULL, &Context, TrapFrame);
+
+ KeContextToTrapFrame(&Context, NULL, TrapFrame, Context.ContextFlags,
KernelMode);
+
+ KeLowerIrql(OldIrql);
+
+ return TRUE;
}
VOID
@@ -1677,39 +1661,36 @@
KdpGdbStubInit(PKD_DISPATCH_TABLE WrapperTable,
ULONG BootPhase)
{
- if (!KdDebuggerEnabled || !KdpDebugMode.Gdb)
- {
- return;
- }
-
- if (BootPhase == 0)
- {
- ExInitializeFastMutex(&GspLock);
-
- /* Write out the functions that we support for now */
- WrapperTable->KdpInitRoutine = KdpGdbStubInit;
- WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint;
- WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
-
- /* Initialize the Port */
- KdPortInitializeEx(&GdbPortInfo, 0, 0);
-
- KdpPort = GdbPortInfo.ComPort;
- }
- else if (BootPhase == 1)
- {
- GspInitialized = TRUE;
-
- GspRunThread = NULL;
- GspDbgThread = NULL;
- GspEnumThread = NULL;
-
- HalDisplayString("Waiting for GDB to attach\n");
- DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
- }
- else if (BootPhase == 2)
- {
- HalDisplayString("\n GDB debugging enabled\n\n");
+ if (!KdDebuggerEnabled || !KdpDebugMode.Gdb)
+ return;
+
+ if (BootPhase == 0)
+ {
+ ExInitializeFastMutex(&GspLock);
+
+ /* Write out the functions that we support for now */
+ WrapperTable->KdpInitRoutine = KdpGdbStubInit;
+ WrapperTable->KdpPrintRoutine = KdpGdbDebugPrint;
+ WrapperTable->KdpExceptionRoutine = KdpGdbEnterDebuggerException;
+
+ /* Initialize the Port */
+ KdPortInitializeEx(&GdbPortInfo, GdbPortNumber);
+ // KdpPort = GdbPortInfo.ComPort;
+ }
+ else if (BootPhase == 1)
+ {
+ GspInitialized = TRUE;
+
+ GspRunThread = NULL;
+ GspDbgThread = NULL;
+ GspEnumThread = NULL;
+
+ HalDisplayString("Waiting for GDB to attach\n");
+ DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C);
+ }
+ else if (BootPhase == 2)
+ {
+ HalDisplayString("\n GDB debugging enabled\n\n");
}
}