gdbstub: fixes cases where wrong threads were reported to GDB on SIGINT

This fix is implemented by having the vCont handler set the value of
`gdbserver_state.c_cpu` if any threads are to be resumed. The specific
CPU picked is arbitrarily from the ones to be resumed, but it should
be okay, as all GDB cares about is that it is a resumed thread.

Signed-off-by: Matheus Branco Borella <dark.ryu.550@gmail.com>
Message-Id: <20230804182633.47300-2-dark.ryu.550@gmail.com>
[AJB: style and whitespace fixes]
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1725
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20230829161528.2707696-9-alex.bennee@linaro.org>
This commit is contained in:
Matheus Branco Borella 2023-08-29 17:15:24 +01:00 committed by Alex Bennée
parent a8fea70f65
commit 761e3c1088
4 changed files with 164 additions and 2 deletions

View file

@ -27,7 +27,15 @@ run-gdbstub-memory: memory
"-monitor none -display none -chardev file$(COMMA)path=$<.out$(COMMA)id=output $(QEMU_OPTS)" \
--bin $< --test $(MULTIARCH_SRC)/gdbstub/memory.py, \
softmmu gdbstub support)
run-gdbstub-interrupt: interrupt
$(call run-test, $@, $(GDB_SCRIPT) \
--gdb $(HAVE_GDB_BIN) \
--qemu $(QEMU) \
--output $<.gdb.out \
--qargs \
"-smp 2 -monitor none -display none -chardev file$(COMMA)path=$<.out$(COMMA)id=output $(QEMU_OPTS)" \
--bin $< --test $(MULTIARCH_SRC)/gdbstub/interrupt.py, \
softmmu gdbstub support)
run-gdbstub-untimely-packet: hello
$(call run-test, $@, $(GDB_SCRIPT) \
--gdb $(HAVE_GDB_BIN) \
@ -50,4 +58,4 @@ run-gdbstub-%:
$(call skip-test, "gdbstub test $*", "need working gdb")
endif
MULTIARCH_RUNS += run-gdbstub-memory run-gdbstub-untimely-packet
MULTIARCH_RUNS += run-gdbstub-memory run-gdbstub-interrupt run-gdbstub-untimely-packet

View file

@ -0,0 +1,28 @@
/*
* External interruption test. This test is structured in such a way that it
* passes the cases that require it to exit, but we can make it enter an
* infinite loop from GDB.
*
* We don't have the benefit of libc, just builtin C primitives and
* whatever is in minilib.
*/
#include <minilib.h>
void loop(void)
{
do {
/*
* Loop forever. Just make sure the condition is always a constant
* expression, so that this loop is not UB, as per the C
* standard.
*/
} while (1);
}
int main(void)
{
return 0;
}