gdbstub: Fix client Ctrl-C handling
The gdb remote protocol has a special interrupt character (0x03) that is transmitted outside the regular packet processing, and represents a Ctrl-C pressed in the client. Despite not being a regular packet, it does expect a regular stop response if the stub successfully stops the running program. See: https://sourceware.org/gdb/onlinedocs/gdb/Interrupts.html Inhibiting the stop reply packet can lead to gdb client hang. So permit a stop response when receiving a character from gdb that stops the vm. Additionally, add a warning if that was not a 0x03 character, because the gdb session is likely to end up getting confused if this happens. Cc: qemu-stable@nongnu.org Fixes: 758370052fb ("gdbstub: only send stop-reply packets when allowed to") Reported-by: Frederic Barrat <fbarrat@linux.ibm.com> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Tested-by: Joel Stanley <joel@jms.id.au> Message-id: 20230711085903.304496-1-npiggin@gmail.com Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
fe6bda58e0
commit
108e8180c6
@ -2051,8 +2051,17 @@ void gdb_read_byte(uint8_t ch)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (runstate_is_running()) {
|
if (runstate_is_running()) {
|
||||||
/* when the CPU is running, we cannot do anything except stop
|
/*
|
||||||
it when receiving a char */
|
* When the CPU is running, we cannot do anything except stop
|
||||||
|
* it when receiving a char. This is expected on a Ctrl-C in the
|
||||||
|
* gdb client. Because we are in all-stop mode, gdb sends a
|
||||||
|
* 0x03 byte which is not a usual packet, so we handle it specially
|
||||||
|
* here, but it does expect a stop reply.
|
||||||
|
*/
|
||||||
|
if (ch != 0x03) {
|
||||||
|
warn_report("gdbstub: client sent packet while target running\n");
|
||||||
|
}
|
||||||
|
gdbserver_state.allow_stop_reply = true;
|
||||||
vm_stop(RUN_STATE_PAUSED);
|
vm_stop(RUN_STATE_PAUSED);
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user