* Move the KdbEntryCount (check for exception inside KDB) into the critical section to prevent KDB from not handling simultaneous exceptions correctly. * Flush input when KDB is entered. * Detect if terminal is connected and filter out escape sequences if no terminal is present. Modified: trunk/reactos/ntoskrnl/dbg/kdb.c Modified: trunk/reactos/ntoskrnl/dbg/kdb_cli.c _____
Modified: trunk/reactos/ntoskrnl/dbg/kdb.c --- trunk/reactos/ntoskrnl/dbg/kdb.c 2005-03-31 14:23:11 UTC (rev 14388) +++ trunk/reactos/ntoskrnl/dbg/kdb.c 2005-03-31 16:08:09 UTC (rev 14389) @@ -1141,12 +1141,6 @@
BOOLEAN EnterConditionMet = TRUE; ULONG OldEflags;
- /* Exception inside the debugger? Game over. */ - if (InterlockedIncrement(&KdbEntryCount) > 1) - { - return kdHandleException; - } - KdbCurrentProcess = PsGetCurrentProcess();
/* Set continue type to kdContinue for single steps and breakpoints */ @@ -1342,7 +1336,6 @@ { if (!EnterConditionMet) { - InterlockedDecrement(&KdbEntryCount); return ContinueType; } DbgPrint("Entered debugger on unexpected debug trap!\n"); @@ -1357,7 +1350,6 @@ } if (!EnterConditionMet) { - InterlockedDecrement(&KdbEntryCount); return ContinueType; }
@@ -1372,7 +1364,6 @@
if (!EnterConditionMet) { - InterlockedDecrement(&KdbEntryCount); return ContinueType; }
@@ -1419,6 +1410,12 @@ Ke386SaveFlags(OldEflags); Ke386DisableInterrupts();
+ /* Exception inside the debugger? Game over. */ + if (InterlockedIncrement(&KdbEntryCount) > 1) + { + return kdHandleException; + } + /* Call the main loop. */ KdbpInternalEnter();
@@ -1461,6 +1458,9 @@ "r"(KdbTrapFrame.Cr3), "r"(KdbTrapFrame.Cr4)); #endif
+ /* Decrement the entry count */ + InterlockedDecrement(&KdbEntryCount); + /* Leave critical section */ Ke386RestoreFlags(OldEflags);
@@ -1479,7 +1479,6 @@
}
- InterlockedDecrement(&KdbEntryCount); return ContinueType; }
_____
Modified: trunk/reactos/ntoskrnl/dbg/kdb_cli.c --- trunk/reactos/ntoskrnl/dbg/kdb_cli.c 2005-03-31 14:23:11 UTC (rev 14388) +++ trunk/reactos/ntoskrnl/dbg/kdb_cli.c 2005-03-31 16:08:09 UTC (rev 14389) @@ -1678,11 +1678,12 @@
{ STATIC CHAR Buffer[4096]; STATIC BOOLEAN TerminalInitialized = FALSE; + STATIC BOOLEAN TerminalConnected = FALSE; STATIC BOOLEAN TerminalReportsSize = TRUE; CHAR c = '\0'; - PCHAR p; + PCHAR p, p2; INT Length; - INT i; + INT i, j; INT RowsPrintedByTerminal; ULONG ScanCode; va_list ap; @@ -1695,7 +1696,25 @@ if (!TerminalInitialized) { DbgPrint("\x1b[7h"); /* Enable linewrap */ + + /* Query terminal type */ + /*DbgPrint("\x1b[Z");*/ + DbgPrint("\x05"); + TerminalInitialized = TRUE; + Length = 0; + for (;;) + { + c = KdbpTryGetCharSerial(5000); + if (c == -1) + break; + Buffer[Length++] = c; + if (Length >= (sizeof (Buffer) - 1)) + break; + } + Buffer[Length] = '\0'; + if (Length > 0) + TerminalConnected = TRUE; }
/* Get number of rows and columns in terminal */ @@ -1706,17 +1725,17 @@ { /* Try to query number of rows from terminal. A reply looks like "\x1b[8;24;80t" */ TerminalReportsSize = FALSE; - //DbgPrint("\x1b[18t"); - c = KdbpTryGetCharSerial(10); + DbgPrint("\x1b[18t"); + c = KdbpTryGetCharSerial(5000); if (c == KEY_ESC) { - c = KdbpTryGetCharSerial(5); + c = KdbpTryGetCharSerial(5000); if (c == '[') { Length = 0; for (;;) { - c = KdbpTryGetCharSerial(5); + c = KdbpTryGetCharSerial(5000); if (c == -1) break; Buffer[Length++] = c; @@ -1815,6 +1834,20 @@ { c = '\0'; } + + /* Remove escape sequences from the line if there's no terminal connected */ + if (!TerminalConnected) + { + while ((p2 = strrchr(p, '\x1b')) != NULL) /* Look for escape character */ + { + if (p2[1] == '[') + { + j = 2; + while (!isalpha(p2[j++])); + strcpy(p2, p2 + j); + } + } + }
DbgPrint("%s", p);
@@ -1920,12 +1953,12 @@ OUT PCHAR Buffer, IN ULONG Size) { - CHAR Key, NextKey; + CHAR Key; PCHAR Orig = Buffer; ULONG ScanCode = 0; BOOLEAN EchoOn; STATIC CHAR LastCommand[1024] = ""; - STATIC CHAR LastKey = '\0'; + STATIC CHAR NextKey = '\0'; INT CmdHistIndex = -1; INT i;
@@ -1935,7 +1968,7 @@ { if (KdDebugState & KD_DEBUG_KDSERIAL) { - Key = KdbpGetCharSerial(); + Key = (NextKey == '\0') ? KdbpGetCharSerial() : NextKey; ScanCode = 0; if (Key == KEY_ESC) /* ESC */ { @@ -1961,7 +1994,8 @@ } else { - Key = KdbpGetCharKeyboard(&ScanCode); + ScanCode = 0; + Key = (NextKey == '\0') ? KdbpGetCharKeyboard(&ScanCode) : NextKey; }
if ((Buffer - Orig) >= (Size - 1)) @@ -1980,6 +2014,8 @@ NextKey = KdbpTryGetCharSerial(5); else NextKey = KdbpTryGetCharKeyboard(&ScanCode, 5); + if (NextKey == '\n') + NextKey = '\0'; DbgPrint("\n"); /* * Repeat the last command if the user presses enter. Reduces the @@ -1996,7 +2032,6 @@ strncpy(LastCommand, Orig, sizeof (LastCommand)); LastCommand[sizeof (LastCommand) - 1] = '\0'; } - LastKey = Key; return; } else if (Key == KEY_BS || Key == KEY_DEL) @@ -2079,7 +2114,6 @@ *Buffer = Key; Buffer++; } - LastKey = Key; } }
@@ -2163,6 +2197,18 @@ DbgPrint("\n"); }
+ /* Flush the input buffer */ + if (KdDebugState & KD_DEBUG_KDSERIAL) + { + while (KdbpTryGetCharSerial(1) != -1); + } + else + { + ULONG ScanCode; + while (KdbpTryGetCharKeyboard(&ScanCode, 1) != -1); + } + + /* Main loop */ do { /* Print the prompt */