-/* $Id: kdebug.c,v 1.33 2002/02/08 02:57:06 chorns Exp $
+/* $Id: kdebug.c,v 1.46 2003/08/11 18:50:12 chorns Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
/* bochs debug output */
#define BOCHS_LOGGER_PORT (0xe9)
-
-/* TYPEDEFS ****************************************************************/
-
-typedef enum
-{
- NoDebug,
- ScreenDebug,
- SerialDebug,
- BochsDebug,
- FileLogDebug
-} DEBUG_TYPE;
-
/* VARIABLES ***************************************************************/
BOOLEAN
static BOOLEAN KdpBreakPending = FALSE;
-static BOOLEAN KdpLogOnly = TRUE;
-static DEBUG_TYPE KdpDebugType = NoDebug;
+ULONG KdDebugState = KD_DEBUG_DISABLED;
ULONG KdpPortIrq = 0;
+KD_PORT_INFORMATION GdbPortInfo;
+KD_PORT_INFORMATION LogPortInfo;
+
/* PRIVATE FUNCTIONS ********************************************************/
static VOID
DbgRDebugInit();
#endif
- /* set debug port default values */
+#ifdef KDBG
+ /* Initialize the local kernel debugger. */
+ KdDebuggerEnabled = TRUE;
+ KdDebugState |= KD_DEBUG_KDB;
+#endif
+
+ /* Set debug port default values */
PortInfo.ComPort = DEFAULT_DEBUG_PORT;
PortInfo.BaudRate = DEFAULT_DEBUG_BAUD_RATE;
KdpPortIrq = DEFAULT_DEBUG_COM2_IRQ;
- /* parse kernel command line */
+ /* Set serial log port default values */
+ LogPortInfo.ComPort = DEFAULT_DEBUG_PORT;
+ LogPortInfo.BaudRate = DEFAULT_DEBUG_BAUD_RATE;
+
+ /* Parse kernel command line */
- /* check for 'DEBUGPORT' */
+ /* Check for 'DEBUGPORT' */
p1 = (PCHAR)LoaderBlock->CommandLine;
while (p1 && (p2 = strchr(p1, '/')))
{
{
p2 += 6;
KdDebuggerEnabled = TRUE;
- KdpDebugType = ScreenDebug;
+ KdDebugState |= KD_DEBUG_SCREEN;
}
else if (!_strnicmp(p2, "BOCHS", 5))
{
p2 += 5;
KdDebuggerEnabled = TRUE;
- KdpDebugType = BochsDebug;
+ KdDebugState |= KD_DEBUG_BOCHS;
+ }
+ else if (!_strnicmp(p2, "GDB", 3))
+ {
+ p2 += 3;
+ KdDebuggerEnabled = TRUE;
+ KdDebugState |= KD_DEBUG_GDB;
+
+ /* Reset port information to defaults */
+ RtlMoveMemory(&GdbPortInfo, &PortInfo, sizeof(KD_PORT_INFORMATION));
+ PortInfo.ComPort = DEFAULT_DEBUG_PORT;
+ PortInfo.BaudRate = DEFAULT_DEBUG_BAUD_RATE;
+ }
+ else if (!_strnicmp(p2, "PICE", 4))
+ {
+ p2 += 4;
+ KdDebuggerEnabled = TRUE;
+ KdDebugState |= KD_DEBUG_PICE;
}
else if (!_strnicmp(p2, "COM", 3))
{
if (Value > 0 && Value < 5)
{
KdDebuggerEnabled = TRUE;
- KdpDebugType = SerialDebug;
- PortInfo.ComPort = Value;
+ KdDebugState |= KD_DEBUG_SERIAL;
+ LogPortInfo.ComPort = Value;
}
}
else if (!_strnicmp(p2, "FILE", 4))
{
p2 += 4;
KdDebuggerEnabled = TRUE;
- KdpDebugType = FileLogDebug;
+ KdDebugState |= KD_DEBUG_FILELOG;
+ }
+ else if (!_strnicmp(p2, "MDA", 3))
+ {
+ p2 += 3;
+ KdDebuggerEnabled = TRUE;
+ KdDebugState |= KD_DEBUG_MDA;
}
}
}
{
p2 += 5;
KdDebuggerEnabled = TRUE;
- KdpDebugType = SerialDebug;
+ KdDebugState |= KD_DEBUG_SERIAL;
}
else if (!_strnicmp(p2, "NODEBUG", 7))
{
p2 += 7;
KdDebuggerEnabled = FALSE;
- KdpDebugType = NoDebug;
+ KdDebugState = KD_DEBUG_DISABLED;
}
else if (!_strnicmp(p2, "CRASHDEBUG", 10))
{
p2 += 10;
KdDebuggerEnabled = FALSE;
- KdpDebugType = NoDebug;
+ KdDebugState = KD_DEBUG_DISABLED;
}
else if (!_strnicmp(p2, "BREAK", 5))
{
- p2 += 7;
+ p2 += 5;
KdpBreakPending = TRUE;
}
- else if (!_strnicmp(p2, "BAUDRATE", 8))
+ else if (!_strnicmp(p2, "COM", 3))
{
- p2 += 8;
- if (*p2 != '=')
+ p2 += 3;
+ if ('=' == *p2)
{
p2++;
Value = (ULONG)atol(p2);
- if (Value > 0)
+ if (0 < Value && Value < 5)
{
- KdDebuggerEnabled = TRUE;
- KdpDebugType = SerialDebug;
- PortInfo.BaudRate = Value;
+ PortInfo.ComPort = Value;
}
}
- else if (!_strnicmp(p2, "IRQ", 3))
+ }
+ else if (!_strnicmp(p2, "BAUDRATE", 8))
+ {
+ p2 += 8;
+ if ('=' == *p2)
{
- p2 += 3;
- if (*p2 != '=')
+ p2++;
+ Value = (ULONG)atol(p2);
+ if (0 < Value)
{
- p2++;
- Value = (ULONG)atol(p2);
- if (Value > 0)
- {
- KdDebuggerEnabled = TRUE;
- KdpDebugType = SerialDebug;
- KdpPortIrq = Value;
- }
+ PortInfo.BaudRate = Value;
}
}
}
- else if (!_strnicmp(p2, "GDB", 3))
+ else if (!_strnicmp(p2, "IRQ", 3))
{
p2 += 3;
- KdpLogOnly = FALSE;
+ if ('=' == *p2)
+ {
+ p2++;
+ Value = (ULONG)atol(p2);
+ if (0 < Value)
+ {
+ KdpPortIrq = Value;
+ }
+ }
}
+#ifdef KDBG
+ else if (!_strnicmp(p2, "PROFILE", 7))
+ {
+ KdbInitProfiling();
+ }
+#endif /* KDBG */
p1 = p2;
}
- /* print some information */
+ /* Perform any initialization nescessary */
if (KdDebuggerEnabled == TRUE)
{
- switch (KdpDebugType)
- {
- case NoDebug:
- break;
+ if (KdDebugState & KD_DEBUG_GDB)
+ KdPortInitializeEx(&GdbPortInfo, 0, 0);
- case ScreenDebug:
- //PrintString("\n Screen debugging enabled\n\n");
- break;
+ if (KdDebugState & KD_DEBUG_SERIAL)
+ KdPortInitializeEx(&LogPortInfo, 0, 0);
- case BochsDebug:
- PrintString("\n Bochs debugging enabled\n\n");
- break;
-
- case SerialDebug:
- PrintString("\n Serial debugging enabled: COM%ld %ld Baud\n\n",
- PortInfo.ComPort, PortInfo.BaudRate);
- break;
-
- case FileLogDebug:
- PrintString("\n File log debugging enabled\n\n");
- break;
- }
- }
-
- /* initialize debug port */
- if (KdDebuggerEnabled == TRUE)
- {
- switch (KdpDebugType)
- {
- case SerialDebug:
- KdPortInitialize(&PortInfo,
- 0,
- 0);
- break;
-
- case FileLogDebug:
+ if (KdDebugState & KD_DEBUG_FILELOG)
DebugLogInit();
- break;
- default:
- break;
- }
+ if (KdDebugState & KD_DEBUG_MDA)
+ KdInitializeMda();
}
}
VOID
KdInit1(VOID)
{
- /* Initialize kernel debugger */
- if (KdDebuggerEnabled == TRUE &&
- KdpDebugType == SerialDebug &&
- KdpLogOnly == FALSE)
+ /* Initialize kernel debugger (phase 0) */
+ if ((KdDebuggerEnabled == TRUE) &&
+ (KdDebugState & KD_DEBUG_GDB))
{
KdGdbStubInit(0);
}
VOID KdInit2(VOID)
{
- if (KdDebuggerEnabled == TRUE &&
- KdpDebugType == SerialDebug &&
- KdpLogOnly == FALSE)
+ /* Initialize kernel debugger (phase 1) */
+ if ((KdDebuggerEnabled == TRUE) &&
+ (KdDebugState & KD_DEBUG_GDB))
{
KdGdbStubInit(1);
}
}
+
+VOID
+KdInit3(VOID)
+{
+ /* Print some information */
+ if (KdDebuggerEnabled == TRUE)
+ {
+ if (KdDebugState & KD_DEBUG_GDB)
+ PrintString("\n GDB debugging enabled. COM%ld %ld Baud\n\n",
+ GdbPortInfo.ComPort, GdbPortInfo.BaudRate);
+
+ if (KdDebugState & KD_DEBUG_PICE)
+ PrintString("\n Private ICE debugger enabled\n\n");
+
+ if (KdDebugState & KD_DEBUG_SCREEN)
+ PrintString("\n Screen debugging enabled\n\n");
+
+ if (KdDebugState & KD_DEBUG_BOCHS)
+ PrintString("\n Bochs debugging enabled\n\n");
+
+ if (KdDebugState & KD_DEBUG_SERIAL)
+ PrintString("\n Serial debugging enabled. COM%ld %ld Baud\n\n",
+ LogPortInfo.ComPort, LogPortInfo.BaudRate);
+
+ if (KdDebugState & KD_DEBUG_FILELOG)
+ PrintString("\n File log debugging enabled\n\n");
+ if (KdDebugState & KD_DEBUG_MDA)
+ PrintString("\n MDA debugging enabled\n\n");
+ }
+}
+
+
VOID
-KdDebugPrint (LPSTR Message)
+KdSerialDebugPrint (LPSTR Message)
{
PCHAR pch = (PCHAR) Message;
{
if (*pch == '\n')
{
- KdPortPutByte ('\r');
+ KdPortPutByteEx (&LogPortInfo, '\r');
}
- KdPortPutByte (*pch);
+ KdPortPutByteEx (&LogPortInfo, *pch);
pch++;
}
}
-ULONG
-KdpPrintString(PANSI_STRING String)
-{
- PCH pch = String->Buffer;
- switch (KdpDebugType)
- {
- case NoDebug:
- break;
-
- case ScreenDebug:
- HalDisplayString(pch);
- break;
-
- case SerialDebug:
- if (KdpLogOnly == TRUE)
- KdDebugPrint(pch);
- else
- KdGdbDebugPrint(pch);
- break;
-
- case BochsDebug:
- while (*pch != 0)
+VOID
+KdBochsDebugPrint(IN LPSTR Message)
+{
+ while (*Message != 0)
{
- if (*pch == '\n')
+ if (*Message == '\n')
{
WRITE_PORT_UCHAR((PUCHAR)BOCHS_LOGGER_PORT, '\r');
}
- WRITE_PORT_UCHAR((PUCHAR)BOCHS_LOGGER_PORT, *pch);
- pch++;
+ WRITE_PORT_UCHAR((PUCHAR)BOCHS_LOGGER_PORT, *Message);
+ Message++;
}
- break;
+}
- case FileLogDebug:
- DebugLogWrite(pch);
- break;
- }
- return((ULONG)String->Length);
+ULONG
+KdpPrintString(PANSI_STRING String)
+{
+ PCH pch = String->Buffer;
+
+ if (KdDebugState & KD_DEBUG_GDB)
+ KdGdbDebugPrint(pch);
+
+ if (KdDebugState & KD_DEBUG_SCREEN)
+ HalDisplayString(pch);
+
+ if (KdDebugState & KD_DEBUG_SERIAL)
+ KdSerialDebugPrint(pch);
+
+ if (KdDebugState & KD_DEBUG_BOCHS)
+ KdBochsDebugPrint(pch);
+
+ if (KdDebugState & KD_DEBUG_FILELOG)
+ DebugLogWrite(pch);
+
+ if (KdDebugState & KD_DEBUG_MDA)
+ KdPrintMda(pch);
+
+ return((ULONG)String->Length);
}
/* PUBLIC FUNCTIONS *********************************************************/
/* NTOSKRNL.KdPollBreakIn */
+/*
+ * @implemented
+ */
BOOLEAN STDCALL
KdPollBreakIn(VOID)
{
- return FALSE;
-
-#if 0
- if (!KdDebuggerEnabled || KdpDebugType != SerialDebug)
+ if ((!KdDebuggerEnabled) || (!(KdDebugState & KD_DEBUG_SERIAL)))
return FALSE;
- return TRUE;
-#endif
+ return KdpBreakPending;
}
+/*
+ * @implemented
+ */
VOID STDCALL
KeEnterKernelDebugger(VOID)
{
/* B - Bug check the system. */
else if (Code == 1)
{
- KeBugCheck(0);
+ KEBUGCHECK(0);
}
/*
* C - Dump statistics about the distribution of tagged blocks in
VOID
KdPutChar(UCHAR Value)
{
- KdPortPutByte (Value);
+ KdPortPutByteEx (&GdbPortInfo, Value);
}
{
UCHAR Value;
- while (!KdPortGetByte (&Value));
+ while (!KdPortGetByteEx (&GdbPortInfo, &Value));
return Value;
}