Samuel Bronson naesten@gmail.com: Reduce the time it takes GDB to attach Modified: trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c _____
Modified: trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c --- trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c 2005-08-17 07:07:43 UTC (rev 17421) +++ trunk/reactos/ntoskrnl/kd/wrappers/gdbstub.c 2005-08-17 07:23:05 UTC (rev 17422) @@ -242,6 +242,7 @@
{ GdbPutChar ('+'); /* successful transfer */
+#if 0 /* if a sequence char is present, reply the sequence ID */ if (Buffer[2] == ':') { @@ -250,6 +251,7 @@
return &Buffer[3]; } +#endif
return &Buffer[0]; } @@ -860,10 +862,12 @@ GspMem2Hex ((PCHAR) &ThreadCount, &GspOutBuffer[2], 1, TRUE); } #endif +#if 0 else if (strncmp (Command, "Offsets", 7) == 0) { strcpy (GspOutBuffer, "Text=0;Data=0;Bss=0"); } +#endif }
VOID @@ -1064,6 +1068,7 @@ }
+static BOOL gdb_attached_yet = TRUE; /* * This function does all command procesing for interfacing to gdb. */ @@ -1079,7 +1084,6 @@ LONG SigVal; LONG NewPC; PCHAR ptr; - LONG Esp;
/* FIXME: Stop on other CPUs too */ /* Disable hardware debugging while we are inside the stub */ @@ -1098,7 +1102,7 @@ { GspAccessLocation = NULL; GspMemoryError = TRUE; - TrapFrame->Eip += 2; + TrapFrame->Eip += 3; } else { @@ -1111,36 +1115,45 @@ GspDbgThread = NULL; }
- /* reply to host that an exception has occurred */ - SigVal = GspComputeSignal (ExceptionRecord->ExceptionCode); + /* ugly hack to avoid attempting to send status at the very + * beginning, right when GDB is trying to query the stub */ + if (gdb_attached_yet) { + LONG Esp; + + stop_reply: + /* reply to host that an exception has occurred */ + SigVal = GspComputeSignal (ExceptionRecord->ExceptionCode); + + ptr = &GspOutBuffer[0];
- ptr = &GspOutBuffer[0]; + *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */ + *ptr++ = HexChars[(SigVal >> 4) & 0xf]; + *ptr++ = HexChars[SigVal & 0xf];
- *ptr++ = 'T'; /* notify gdb with signo, PC, FP and SP */ - *ptr++ = HexChars[(SigVal >> 4) & 0xf]; - *ptr++ = HexChars[SigVal & 0xf]; + *ptr++ = HexChars[ESP]; + *ptr++ = ':'; + + Esp = GspGetEspFromTrapFrame (TrapFrame); /* SP */ + ptr = GspMem2Hex ((PCHAR) &Esp, ptr, 4, 0); + *ptr++ = ';'; + + *ptr++ = HexChars[EBP]; + *ptr++ = ':'; + ptr = GspMem2Hex ((PCHAR) &TrapFrame->Ebp, ptr, 4, 0); /* FP */ + *ptr++ = ';'; + + *ptr++ = HexChars[PC]; + *ptr++ = ':'; + ptr = GspMem2Hex((PCHAR) &TrapFrame->Eip, ptr, 4, 0); /* PC */ + *ptr++ = ';';
- *ptr++ = HexChars[ESP]; - *ptr++ = ':'; + *ptr = '\0';
- Esp = GspGetEspFromTrapFrame (TrapFrame); /* SP */ - ptr = GspMem2Hex ((PCHAR) &Esp, ptr, 4, 0); - *ptr++ = ';'; - - *ptr++ = HexChars[EBP]; - *ptr++ = ':'; - ptr = GspMem2Hex ((PCHAR) &TrapFrame->Ebp, ptr, 4, 0); /* FP */ - *ptr++ = ';'; - - *ptr++ = HexChars[PC]; - *ptr++ = ':'; - ptr = GspMem2Hex((PCHAR) &TrapFrame->Eip, ptr, 4, 0); /* PC */ - *ptr++ = ';'; - - *ptr = '\0'; - - GspPutPacket (&GspOutBuffer[0]); - + GspPutPacket (&GspOutBuffer[0]); + } else { + gdb_attached_yet = 1; + } + Stepping = FALSE;
while (TRUE) @@ -1152,6 +1165,8 @@ switch (*ptr++) { case '?': + /* a little hack to send more complete status information */ + goto stop_reply; GspOutBuffer[0] = 'S'; GspOutBuffer[1] = HexChars[SigVal >> 4]; GspOutBuffer[2] = HexChars[SigVal % 16];