mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
* 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. svn path=/trunk/; revision=14389
This commit is contained in:
parent
97db1efac1
commit
91203bfc8d
2 changed files with 67 additions and 22 deletions
|
@ -1141,12 +1141,6 @@ KdbEnterDebuggerException(
|
||||||
BOOLEAN EnterConditionMet = TRUE;
|
BOOLEAN EnterConditionMet = TRUE;
|
||||||
ULONG OldEflags;
|
ULONG OldEflags;
|
||||||
|
|
||||||
/* Exception inside the debugger? Game over. */
|
|
||||||
if (InterlockedIncrement(&KdbEntryCount) > 1)
|
|
||||||
{
|
|
||||||
return kdHandleException;
|
|
||||||
}
|
|
||||||
|
|
||||||
KdbCurrentProcess = PsGetCurrentProcess();
|
KdbCurrentProcess = PsGetCurrentProcess();
|
||||||
|
|
||||||
/* Set continue type to kdContinue for single steps and breakpoints */
|
/* Set continue type to kdContinue for single steps and breakpoints */
|
||||||
|
@ -1342,7 +1336,6 @@ KdbEnterDebuggerException(
|
||||||
{
|
{
|
||||||
if (!EnterConditionMet)
|
if (!EnterConditionMet)
|
||||||
{
|
{
|
||||||
InterlockedDecrement(&KdbEntryCount);
|
|
||||||
return ContinueType;
|
return ContinueType;
|
||||||
}
|
}
|
||||||
DbgPrint("Entered debugger on unexpected debug trap!\n");
|
DbgPrint("Entered debugger on unexpected debug trap!\n");
|
||||||
|
@ -1357,7 +1350,6 @@ KdbEnterDebuggerException(
|
||||||
}
|
}
|
||||||
if (!EnterConditionMet)
|
if (!EnterConditionMet)
|
||||||
{
|
{
|
||||||
InterlockedDecrement(&KdbEntryCount);
|
|
||||||
return ContinueType;
|
return ContinueType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1372,7 +1364,6 @@ KdbEnterDebuggerException(
|
||||||
|
|
||||||
if (!EnterConditionMet)
|
if (!EnterConditionMet)
|
||||||
{
|
{
|
||||||
InterlockedDecrement(&KdbEntryCount);
|
|
||||||
return ContinueType;
|
return ContinueType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1419,6 +1410,12 @@ KdbEnterDebuggerException(
|
||||||
Ke386SaveFlags(OldEflags);
|
Ke386SaveFlags(OldEflags);
|
||||||
Ke386DisableInterrupts();
|
Ke386DisableInterrupts();
|
||||||
|
|
||||||
|
/* Exception inside the debugger? Game over. */
|
||||||
|
if (InterlockedIncrement(&KdbEntryCount) > 1)
|
||||||
|
{
|
||||||
|
return kdHandleException;
|
||||||
|
}
|
||||||
|
|
||||||
/* Call the main loop. */
|
/* Call the main loop. */
|
||||||
KdbpInternalEnter();
|
KdbpInternalEnter();
|
||||||
|
|
||||||
|
@ -1461,6 +1458,9 @@ KdbEnterDebuggerException(
|
||||||
"r"(KdbTrapFrame.Cr3), "r"(KdbTrapFrame.Cr4));
|
"r"(KdbTrapFrame.Cr3), "r"(KdbTrapFrame.Cr4));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Decrement the entry count */
|
||||||
|
InterlockedDecrement(&KdbEntryCount);
|
||||||
|
|
||||||
/* Leave critical section */
|
/* Leave critical section */
|
||||||
Ke386RestoreFlags(OldEflags);
|
Ke386RestoreFlags(OldEflags);
|
||||||
|
|
||||||
|
@ -1479,7 +1479,6 @@ continue_execution:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InterlockedDecrement(&KdbEntryCount);
|
|
||||||
return ContinueType;
|
return ContinueType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1678,11 +1678,12 @@ KdbpPrint(
|
||||||
{
|
{
|
||||||
STATIC CHAR Buffer[4096];
|
STATIC CHAR Buffer[4096];
|
||||||
STATIC BOOLEAN TerminalInitialized = FALSE;
|
STATIC BOOLEAN TerminalInitialized = FALSE;
|
||||||
|
STATIC BOOLEAN TerminalConnected = FALSE;
|
||||||
STATIC BOOLEAN TerminalReportsSize = TRUE;
|
STATIC BOOLEAN TerminalReportsSize = TRUE;
|
||||||
CHAR c = '\0';
|
CHAR c = '\0';
|
||||||
PCHAR p;
|
PCHAR p, p2;
|
||||||
INT Length;
|
INT Length;
|
||||||
INT i;
|
INT i, j;
|
||||||
INT RowsPrintedByTerminal;
|
INT RowsPrintedByTerminal;
|
||||||
ULONG ScanCode;
|
ULONG ScanCode;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
@ -1695,7 +1696,25 @@ KdbpPrint(
|
||||||
if (!TerminalInitialized)
|
if (!TerminalInitialized)
|
||||||
{
|
{
|
||||||
DbgPrint("\x1b[7h"); /* Enable linewrap */
|
DbgPrint("\x1b[7h"); /* Enable linewrap */
|
||||||
|
|
||||||
|
/* Query terminal type */
|
||||||
|
/*DbgPrint("\x1b[Z");*/
|
||||||
|
DbgPrint("\x05");
|
||||||
|
|
||||||
TerminalInitialized = TRUE;
|
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 */
|
/* Get number of rows and columns in terminal */
|
||||||
|
@ -1706,17 +1725,17 @@ KdbpPrint(
|
||||||
{
|
{
|
||||||
/* Try to query number of rows from terminal. A reply looks like "\x1b[8;24;80t" */
|
/* Try to query number of rows from terminal. A reply looks like "\x1b[8;24;80t" */
|
||||||
TerminalReportsSize = FALSE;
|
TerminalReportsSize = FALSE;
|
||||||
//DbgPrint("\x1b[18t");
|
DbgPrint("\x1b[18t");
|
||||||
c = KdbpTryGetCharSerial(10);
|
c = KdbpTryGetCharSerial(5000);
|
||||||
if (c == KEY_ESC)
|
if (c == KEY_ESC)
|
||||||
{
|
{
|
||||||
c = KdbpTryGetCharSerial(5);
|
c = KdbpTryGetCharSerial(5000);
|
||||||
if (c == '[')
|
if (c == '[')
|
||||||
{
|
{
|
||||||
Length = 0;
|
Length = 0;
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
c = KdbpTryGetCharSerial(5);
|
c = KdbpTryGetCharSerial(5000);
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
Buffer[Length++] = c;
|
Buffer[Length++] = c;
|
||||||
|
@ -1815,6 +1834,20 @@ KdbpPrint(
|
||||||
{
|
{
|
||||||
c = '\0';
|
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);
|
DbgPrint("%s", p);
|
||||||
|
|
||||||
|
@ -1920,12 +1953,12 @@ KdbpReadCommand(
|
||||||
OUT PCHAR Buffer,
|
OUT PCHAR Buffer,
|
||||||
IN ULONG Size)
|
IN ULONG Size)
|
||||||
{
|
{
|
||||||
CHAR Key, NextKey;
|
CHAR Key;
|
||||||
PCHAR Orig = Buffer;
|
PCHAR Orig = Buffer;
|
||||||
ULONG ScanCode = 0;
|
ULONG ScanCode = 0;
|
||||||
BOOLEAN EchoOn;
|
BOOLEAN EchoOn;
|
||||||
STATIC CHAR LastCommand[1024] = "";
|
STATIC CHAR LastCommand[1024] = "";
|
||||||
STATIC CHAR LastKey = '\0';
|
STATIC CHAR NextKey = '\0';
|
||||||
INT CmdHistIndex = -1;
|
INT CmdHistIndex = -1;
|
||||||
INT i;
|
INT i;
|
||||||
|
|
||||||
|
@ -1935,7 +1968,7 @@ KdbpReadCommand(
|
||||||
{
|
{
|
||||||
if (KdDebugState & KD_DEBUG_KDSERIAL)
|
if (KdDebugState & KD_DEBUG_KDSERIAL)
|
||||||
{
|
{
|
||||||
Key = KdbpGetCharSerial();
|
Key = (NextKey == '\0') ? KdbpGetCharSerial() : NextKey;
|
||||||
ScanCode = 0;
|
ScanCode = 0;
|
||||||
if (Key == KEY_ESC) /* ESC */
|
if (Key == KEY_ESC) /* ESC */
|
||||||
{
|
{
|
||||||
|
@ -1961,7 +1994,8 @@ KdbpReadCommand(
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Key = KdbpGetCharKeyboard(&ScanCode);
|
ScanCode = 0;
|
||||||
|
Key = (NextKey == '\0') ? KdbpGetCharKeyboard(&ScanCode) : NextKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Buffer - Orig) >= (Size - 1))
|
if ((Buffer - Orig) >= (Size - 1))
|
||||||
|
@ -1980,6 +2014,8 @@ KdbpReadCommand(
|
||||||
NextKey = KdbpTryGetCharSerial(5);
|
NextKey = KdbpTryGetCharSerial(5);
|
||||||
else
|
else
|
||||||
NextKey = KdbpTryGetCharKeyboard(&ScanCode, 5);
|
NextKey = KdbpTryGetCharKeyboard(&ScanCode, 5);
|
||||||
|
if (NextKey == '\n')
|
||||||
|
NextKey = '\0';
|
||||||
DbgPrint("\n");
|
DbgPrint("\n");
|
||||||
/*
|
/*
|
||||||
* Repeat the last command if the user presses enter. Reduces the
|
* Repeat the last command if the user presses enter. Reduces the
|
||||||
|
@ -1996,7 +2032,6 @@ KdbpReadCommand(
|
||||||
strncpy(LastCommand, Orig, sizeof (LastCommand));
|
strncpy(LastCommand, Orig, sizeof (LastCommand));
|
||||||
LastCommand[sizeof (LastCommand) - 1] = '\0';
|
LastCommand[sizeof (LastCommand) - 1] = '\0';
|
||||||
}
|
}
|
||||||
LastKey = Key;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (Key == KEY_BS || Key == KEY_DEL)
|
else if (Key == KEY_BS || Key == KEY_DEL)
|
||||||
|
@ -2079,7 +2114,6 @@ KdbpReadCommand(
|
||||||
*Buffer = Key;
|
*Buffer = Key;
|
||||||
Buffer++;
|
Buffer++;
|
||||||
}
|
}
|
||||||
LastKey = Key;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2163,6 +2197,18 @@ KdbpCliMainLoop(
|
||||||
DbgPrint("\n");
|
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
|
do
|
||||||
{
|
{
|
||||||
/* Print the prompt */
|
/* Print the prompt */
|
||||||
|
|
Loading…
Reference in a new issue