* [Qemu-devel] [PATCH v7 0/2] Qemu: gdbstub: fix vCont
@ 2017-01-27 18:11 Claudio Imbrenda
2017-01-27 18:11 ` [Qemu-devel] [PATCH v7 1/2] move vm_start to cpus.c Claudio Imbrenda
2017-01-27 18:11 ` [Qemu-devel] [PATCH v7 2/2] gdbstub: Fix vCont behaviour Claudio Imbrenda
0 siblings, 2 replies; 7+ messages in thread
From: Claudio Imbrenda @ 2017-01-27 18:11 UTC (permalink / raw)
To: pbonzini; +Cc: borntraeger, qemu-devel, palves, alex.bennee
This small patchset fixes the incorrect behaviour of the vCont command
in the gdb stub.
The first patch, as suggested be Paolo, refactors some code. The most
visible change is that it moves vm_start to cpus.c
The second one fixes the incorrect behaviour of the vCont command.
Previously, continuing or stepping a single thread (CPU) caused all
other CPUs to be started too, whereas the GDB specification clearly
states that without a default action all threads not explicitly
mentioned in the command should stay stopped.
So if the Qemu gdbstub receives a vCont;c:1 packet, no other CPU
should be restarted except the first, and when a vCont;s:1 is
received, the first CPU should be stepped without restarting the others.
With this patchset Qemu now behaves as expected.
See here for reference material about the packets:
https://sourceware.org/gdb/current/onlinedocs/gdb/Packets.html
https://sourceware.org/gdb/onlinedocs/gdb/Packets.html
v6 -> v7
* fixed description of patch 1 to reflect what is actually happening
and improved description of patch 2
* removed leftover header declaration of resume_some_vcpus which had
been removed a few versions ago
* fixed a compilation issue when compiling userspace-mode only
(global variable max_cpus is not defined when not in system-mode)
v4 -> v6
* rebased on master after target-s390x was moved
* put qemu_clock_enable back into resume_all_vcpus
* improved the parsing function of the vCont packet
* added qemu_clock_enable to gdb_continue_partial
v3 -> v4
* rebased on v2.8.0-rc2, no changes needed
v2 -> v3
* removed resume_some_vcpus
* cleared up the code and simplified the implementation in light of the
clarification in the specification of the vCont packet
Claudio Imbrenda (2):
move vm_start to cpus.c
gdbstub: Fix vCont behaviour
cpus.c | 42 +++++++++++
gdbstub.c | 194 ++++++++++++++++++++++++++++++++++++------------
include/sysemu/sysemu.h | 2 +
vl.c | 30 +-------
4 files changed, 192 insertions(+), 76 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH v7 1/2] move vm_start to cpus.c
2017-01-27 18:11 [Qemu-devel] [PATCH v7 0/2] Qemu: gdbstub: fix vCont Claudio Imbrenda
@ 2017-01-27 18:11 ` Claudio Imbrenda
2017-02-06 9:53 ` Paolo Bonzini
2017-01-27 18:11 ` [Qemu-devel] [PATCH v7 2/2] gdbstub: Fix vCont behaviour Claudio Imbrenda
1 sibling, 1 reply; 7+ messages in thread
From: Claudio Imbrenda @ 2017-01-27 18:11 UTC (permalink / raw)
To: pbonzini; +Cc: borntraeger, qemu-devel, palves, alex.bennee
This patch:
* moves vm_start to cpus.c.
* exports qemu_vmstop_requested, since it's needed by vm_start.
* extracts vm_prepare_start from vm_start; it does what vm_start did,
except restarting the cpus.
* vm_start now calls vm_prepare_start and then restarts the cpus.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
---
cpus.c | 42 ++++++++++++++++++++++++++++++++++++++++++
include/sysemu/sysemu.h | 2 ++
vl.c | 30 +-----------------------------
3 files changed, 45 insertions(+), 29 deletions(-)
diff --git a/cpus.c b/cpus.c
index 71a82e5..061de39 100644
--- a/cpus.c
+++ b/cpus.c
@@ -1578,6 +1578,48 @@ int vm_stop(RunState state)
return do_vm_stop(state);
}
+/**
+ * Prepare for (re)starting the VM.
+ * Returns -1 if the vCPUs are not to be restarted (e.g. if they are already
+ * running or in case of an error condition), 0 otherwise.
+ */
+int vm_prepare_start(void)
+{
+ RunState requested;
+ int res = 0;
+
+ qemu_vmstop_requested(&requested);
+ if (runstate_is_running() && requested == RUN_STATE__MAX) {
+ return -1;
+ }
+
+ /* Ensure that a STOP/RESUME pair of events is emitted if a
+ * vmstop request was pending. The BLOCK_IO_ERROR event, for
+ * example, according to documentation is always followed by
+ * the STOP event.
+ */
+ if (runstate_is_running()) {
+ qapi_event_send_stop(&error_abort);
+ res = -1;
+ } else {
+ replay_enable_events();
+ cpu_enable_ticks();
+ runstate_set(RUN_STATE_RUNNING);
+ vm_state_notify(1, RUN_STATE_RUNNING);
+ }
+
+ /* XXX: is it ok to send this even before actually resuming the CPUs? */
+ qapi_event_send_resume(&error_abort);
+ return res;
+}
+
+void vm_start(void)
+{
+ if (!vm_prepare_start()) {
+ resume_all_vcpus();
+ }
+}
+
/* does a state transition even if the VM is already stopped,
current state is forgotten forever */
int vm_stop_force_state(RunState state)
diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
index ff8ffb5..0bb0c40 100644
--- a/include/sysemu/sysemu.h
+++ b/include/sysemu/sysemu.h
@@ -37,6 +37,7 @@ void vm_state_notify(int running, RunState state);
#define VMRESET_REPORT true
void vm_start(void);
+int vm_prepare_start(void);
int vm_stop(RunState state);
int vm_stop_force_state(RunState state);
@@ -60,6 +61,7 @@ void qemu_register_powerdown_notifier(Notifier *notifier);
void qemu_system_debug_request(void);
void qemu_system_vmstop_request(RunState reason);
void qemu_system_vmstop_request_prepare(void);
+bool qemu_vmstop_requested(RunState *r);
int qemu_shutdown_requested_get(void);
int qemu_reset_requested_get(void);
void qemu_system_killed(int signal, pid_t pid);
diff --git a/vl.c b/vl.c
index abb0900..7a32a30 100644
--- a/vl.c
+++ b/vl.c
@@ -757,7 +757,7 @@ StatusInfo *qmp_query_status(Error **errp)
return info;
}
-static bool qemu_vmstop_requested(RunState *r)
+bool qemu_vmstop_requested(RunState *r)
{
qemu_mutex_lock(&vmstop_lock);
*r = vmstop_requested;
@@ -778,34 +778,6 @@ void qemu_system_vmstop_request(RunState state)
qemu_notify_event();
}
-void vm_start(void)
-{
- RunState requested;
-
- qemu_vmstop_requested(&requested);
- if (runstate_is_running() && requested == RUN_STATE__MAX) {
- return;
- }
-
- /* Ensure that a STOP/RESUME pair of events is emitted if a
- * vmstop request was pending. The BLOCK_IO_ERROR event, for
- * example, according to documentation is always followed by
- * the STOP event.
- */
- if (runstate_is_running()) {
- qapi_event_send_stop(&error_abort);
- } else {
- replay_enable_events();
- cpu_enable_ticks();
- runstate_set(RUN_STATE_RUNNING);
- vm_state_notify(1, RUN_STATE_RUNNING);
- resume_all_vcpus();
- }
-
- qapi_event_send_resume(&error_abort);
-}
-
-
/***********************************************************/
/* real time host monotonic timer */
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH v7 2/2] gdbstub: Fix vCont behaviour
2017-01-27 18:11 [Qemu-devel] [PATCH v7 0/2] Qemu: gdbstub: fix vCont Claudio Imbrenda
2017-01-27 18:11 ` [Qemu-devel] [PATCH v7 1/2] move vm_start to cpus.c Claudio Imbrenda
@ 2017-01-27 18:11 ` Claudio Imbrenda
2017-02-06 10:00 ` Paolo Bonzini
1 sibling, 1 reply; 7+ messages in thread
From: Claudio Imbrenda @ 2017-01-27 18:11 UTC (permalink / raw)
To: pbonzini; +Cc: borntraeger, qemu-devel, palves, alex.bennee
When GDB issues a "vCont", QEMU was not handling it correctly when
multiple VCPUs are active.
For vCont, for each thread (VCPU), it can be specified whether to
single step, continue or stop that thread. The default is to stop a
thread.
However, when (for example) "vCont;s:2" is issued, all VCPUs continue
to run, although all but VCPU nr 2 are to be stopped.
This patch completely rewrites the vCont parsing code.
Please note that this improvement only works in system emulation mode,
when in userspace emulation mode the old behaviour is preserved.
Signed-off-by: Claudio Imbrenda <imbrenda@linux.vnet.ibm.com>
---
gdbstub.c | 194 +++++++++++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 147 insertions(+), 47 deletions(-)
diff --git a/gdbstub.c b/gdbstub.c
index de9b62b..c298bf0 100644
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -386,6 +386,51 @@ static inline void gdb_continue(GDBState *s)
#endif
}
+/*
+ * Resume execution, per CPU actions. For user-mode emulation it's
+ * equivalent to gdb_continue.
+ */
+static int gdb_continue_partial(GDBState *s, char *newstates)
+{
+ int res = 0;
+#ifdef CONFIG_USER_ONLY
+ s->running_state = 1;
+#else
+ CPUState *cpu;
+ int flag = 0;
+
+ if (!runstate_needs_reset()) {
+ if (vm_prepare_start()) {
+ return 0;
+ }
+
+ CPU_FOREACH(cpu) {
+ switch (newstates[cpu_index(cpu) - 1]) {
+ case 0:
+ case 1:
+ break; /* nothing to do here */
+ case 's':
+ cpu_single_step(cpu, sstep_flags);
+ cpu_resume(cpu);
+ flag = 1;
+ break;
+ case 'c':
+ cpu_resume(cpu);
+ flag = 1;
+ break;
+ default:
+ res = -1;
+ break;
+ }
+ }
+ }
+ if (flag) {
+ qemu_clock_enable(QEMU_CLOCK_VIRTUAL, true);
+ }
+#endif
+ return res;
+}
+
static void put_buffer(GDBState *s, const uint8_t *buf, int len)
{
#ifdef CONFIG_USER_ONLY
@@ -784,6 +829,101 @@ static int is_query_packet(const char *p, const char *query, char separator)
(p[query_len] == '\0' || p[query_len] == separator);
}
+/**
+ * gdb_handle_vcont - Parses and handles a vCont packet.
+ * returns -ENOTSUP if a command is unsupported, -EINVAL or -ERANGE if there is
+ * a format error, 0 on success.
+ */
+static int gdb_handle_vcont(GDBState *s, const char *p)
+{
+ int res, idx, signal = 0;
+ char cur_action;
+ char *newstates;
+ unsigned long tmp;
+ CPUState *cpu;
+#ifdef CONFIG_USER_ONLY
+ int max_cpus = 1; /* global variable max_cpus exists only in system mode */
+
+ CPU_FOREACH(cpu) {
+ max_cpus = max_cpus < cpu_index(cpu) ? cpu_index(cpu) : max_cpus;
+ }
+#endif
+ /* uninitialised CPUs stay 0 */
+ newstates = g_new0(char, max_cpus);
+
+ /* mark valid CPUs with 1 */
+ CPU_FOREACH(cpu) {
+ newstates[cpu_index(cpu) - 1] = 1;
+ }
+
+ /*
+ * res keeps track of what error we are returning, with -1 meaning
+ * that the command is unknown or unsupported, and thus returning
+ * an empty packet, while -22 returns an E22 packet due to
+ * invalid or incorrect parameters passed.
+ */
+ res = 0;
+ while (*p) {
+ if (*p++ != ';') {
+ res = -ENOTSUP;
+ goto out;
+ }
+
+ cur_action = *p++;
+ if (cur_action == 'C' || cur_action == 'S') {
+ cur_action = tolower(cur_action);
+ res = qemu_strtoul(p + 1, &p, 16, &tmp);
+ if (res) {
+ goto out;
+ }
+ signal = gdb_signal_to_target(tmp);
+ } else if (cur_action != 'c' && cur_action != 's') {
+ /* unknown/invalid/unsupported command */
+ res = -ENOTSUP;
+ goto out;
+ }
+ /* thread specification. special values: (none), -1 = all; 0 = any */
+ if ((p[0] == ':' && p[1] == '-' && p[2] == '1') || (p[0] != ':')) {
+ if (*p == ':') {
+ p += 3;
+ }
+ for (idx = 0; idx < max_cpus; idx++) {
+ if (newstates[idx] == 1) {
+ newstates[idx] = cur_action;
+ }
+ }
+ } else if (*p == ':') {
+ p++;
+ res = qemu_strtoul(p, &p, 16, &tmp);
+ if (res) {
+ goto out;
+ }
+ idx = tmp;
+ /* 0 means any thread, so we pick the first valid CPU */
+ if (!idx) {
+ idx = cpu_index(first_cpu);
+ }
+
+ /* invalid CPU specified */
+ if (!idx || idx > max_cpus || !newstates[idx - 1]) {
+ res = -EINVAL;
+ goto out;
+ }
+ /* only use if no previous match occourred */
+ if (newstates[idx - 1] == 1) {
+ newstates[idx - 1] = cur_action;
+ }
+ }
+ }
+ s->signal = signal;
+ gdb_continue_partial(s, newstates);
+
+out:
+ g_free(newstates);
+
+ return res;
+}
+
static int gdb_handle_packet(GDBState *s, const char *line_buf)
{
CPUState *cpu;
@@ -829,60 +969,20 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
return RS_IDLE;
case 'v':
if (strncmp(p, "Cont", 4) == 0) {
- int res_signal, res_thread;
-
p += 4;
if (*p == '?') {
put_packet(s, "vCont;c;C;s;S");
break;
}
- res = 0;
- res_signal = 0;
- res_thread = 0;
- while (*p) {
- int action, signal;
-
- if (*p++ != ';') {
- res = 0;
- break;
- }
- action = *p++;
- signal = 0;
- if (action == 'C' || action == 'S') {
- signal = gdb_signal_to_target(strtoul(p, (char **)&p, 16));
- if (signal == -1) {
- signal = 0;
- }
- } else if (action != 'c' && action != 's') {
- res = 0;
- break;
- }
- thread = 0;
- if (*p == ':') {
- thread = strtoull(p+1, (char **)&p, 16);
- }
- action = tolower(action);
- if (res == 0 || (res == 'c' && action == 's')) {
- res = action;
- res_signal = signal;
- res_thread = thread;
- }
- }
+
+ res = gdb_handle_vcont(s, p);
+
if (res) {
- if (res_thread != -1 && res_thread != 0) {
- cpu = find_cpu(res_thread);
- if (cpu == NULL) {
- put_packet(s, "E22");
- break;
- }
- s->c_cpu = cpu;
- }
- if (res == 's') {
- cpu_single_step(s->c_cpu, sstep_flags);
+ if ((res == -EINVAL) || (res == -ERANGE)) {
+ put_packet(s, "E22");
+ break;
}
- s->signal = res_signal;
- gdb_continue(s);
- return RS_IDLE;
+ goto unknown_command;
}
break;
} else {
--
1.9.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v7 1/2] move vm_start to cpus.c
2017-01-27 18:11 ` [Qemu-devel] [PATCH v7 1/2] move vm_start to cpus.c Claudio Imbrenda
@ 2017-02-06 9:53 ` Paolo Bonzini
0 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2017-02-06 9:53 UTC (permalink / raw)
To: Claudio Imbrenda; +Cc: borntraeger, qemu-devel, palves, alex.bennee
On 27/01/2017 19:11, Claudio Imbrenda wrote:
> + }
> +
> + /* XXX: is it ok to send this even before actually resuming the CPUs? */
> + qapi_event_send_resume(&error_abort);
> + return res;
> +}
> +
Yes, it is. :)
Paolo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v7 2/2] gdbstub: Fix vCont behaviour
2017-01-27 18:11 ` [Qemu-devel] [PATCH v7 2/2] gdbstub: Fix vCont behaviour Claudio Imbrenda
@ 2017-02-06 10:00 ` Paolo Bonzini
2017-02-07 9:59 ` Claudio Imbrenda
0 siblings, 1 reply; 7+ messages in thread
From: Paolo Bonzini @ 2017-02-06 10:00 UTC (permalink / raw)
To: Claudio Imbrenda; +Cc: borntraeger, qemu-devel, palves, alex.bennee
On 27/01/2017 19:11, Claudio Imbrenda wrote:
> + /* mark valid CPUs with 1 */
> + CPU_FOREACH(cpu) {
> + newstates[cpu_index(cpu) - 1] = 1;
> + }
Sorry I didn't notice this before: CPU indices are zero-based in QEMU,
so you are probably overwriting newstates[-1]. I can adjust it myself,
but can you please double check?
Paolo
> +
> + /*
> + * res keeps track of what error we are returning, with -1 meaning
> + * that the command is unknown or unsupported, and thus returning
> + * an empty packet, while -22 returns an E22 packet due to
> + * invalid or incorrect parameters passed.
> + */
> + res = 0;
> + while (*p) {
> + if (*p++ != ';') {
> + res = -ENOTSUP;
> + goto out;
> + }
> +
> + cur_action = *p++;
> + if (cur_action == 'C' || cur_action == 'S') {
> + cur_action = tolower(cur_action);
> + res = qemu_strtoul(p + 1, &p, 16, &tmp);
> + if (res) {
> + goto out;
> + }
> + signal = gdb_signal_to_target(tmp);
> + } else if (cur_action != 'c' && cur_action != 's') {
> + /* unknown/invalid/unsupported command */
> + res = -ENOTSUP;
> + goto out;
> + }
> + /* thread specification. special values: (none), -1 = all; 0 = any */
> + if ((p[0] == ':' && p[1] == '-' && p[2] == '1') || (p[0] != ':')) {
> + if (*p == ':') {
> + p += 3;
> + }
> + for (idx = 0; idx < max_cpus; idx++) {
> + if (newstates[idx] == 1) {
> + newstates[idx] = cur_action;
> + }
> + }
> + } else if (*p == ':') {
> + p++;
> + res = qemu_strtoul(p, &p, 16, &tmp);
> + if (res) {
> + goto out;
> + }
> + idx = tmp;
> + /* 0 means any thread, so we pick the first valid CPU */
> + if (!idx) {
> + idx = cpu_index(first_cpu);
> + }
> +
> + /* invalid CPU specified */
> + if (!idx || idx > max_cpus || !newstates[idx - 1]) {
> + res = -EINVAL;
> + goto out;
> + }
> + /* only use if no previous match occourred */
> + if (newstates[idx - 1] == 1) {
> + newstates[idx - 1] = cur_action;
> + }
> + }
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v7 2/2] gdbstub: Fix vCont behaviour
2017-02-06 10:00 ` Paolo Bonzini
@ 2017-02-07 9:59 ` Claudio Imbrenda
2017-02-07 15:10 ` Paolo Bonzini
0 siblings, 1 reply; 7+ messages in thread
From: Claudio Imbrenda @ 2017-02-07 9:59 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: borntraeger, qemu-devel, palves, alex.bennee
On 06/02/17 11:00, Paolo Bonzini wrote:
>
>
> On 27/01/2017 19:11, Claudio Imbrenda wrote:
>> + /* mark valid CPUs with 1 */
>> + CPU_FOREACH(cpu) {
>> + newstates[cpu_index(cpu) - 1] = 1;
>> + }
>
> Sorry I didn't notice this before: CPU indices are zero-based in QEMU,
> so you are probably overwriting newstates[-1]. I can adjust it myself,
> but can you please double check?
they are zero based in the struct, but the already existing cpu_index
function (include/exec/gdbstub.h) does this:
static inline int cpu_index(CPUState *cpu)
{
#if defined(CONFIG_USER_ONLY)
return cpu->host_tid;
#else
return cpu->cpu_index + 1;
#endif
}
maybe that can just become newstates[cpu->cpu_index] = 1 ?
(since we're not in CONFIG_USER_ONLY anyway)
> Paolo
>
>> +
>> + /*
>> + * res keeps track of what error we are returning, with -1 meaning
>> + * that the command is unknown or unsupported, and thus returning
>> + * an empty packet, while -22 returns an E22 packet due to
>> + * invalid or incorrect parameters passed.
>> + */
>> + res = 0;
>> + while (*p) {
>> + if (*p++ != ';') {
>> + res = -ENOTSUP;
>> + goto out;
>> + }
>> +
>> + cur_action = *p++;
>> + if (cur_action == 'C' || cur_action == 'S') {
>> + cur_action = tolower(cur_action);
>> + res = qemu_strtoul(p + 1, &p, 16, &tmp);
>> + if (res) {
>> + goto out;
>> + }
>> + signal = gdb_signal_to_target(tmp);
>> + } else if (cur_action != 'c' && cur_action != 's') {
>> + /* unknown/invalid/unsupported command */
>> + res = -ENOTSUP;
>> + goto out;
>> + }
>> + /* thread specification. special values: (none), -1 = all; 0 = any */
>> + if ((p[0] == ':' && p[1] == '-' && p[2] == '1') || (p[0] != ':')) {
>> + if (*p == ':') {
>> + p += 3;
>> + }
>> + for (idx = 0; idx < max_cpus; idx++) {
>> + if (newstates[idx] == 1) {
>> + newstates[idx] = cur_action;
>> + }
>> + }
>> + } else if (*p == ':') {
>> + p++;
>> + res = qemu_strtoul(p, &p, 16, &tmp);
>> + if (res) {
>> + goto out;
>> + }
>> + idx = tmp;
>> + /* 0 means any thread, so we pick the first valid CPU */
>> + if (!idx) {
>> + idx = cpu_index(first_cpu);
>> + }
>> +
>> + /* invalid CPU specified */
>> + if (!idx || idx > max_cpus || !newstates[idx - 1]) {
>> + res = -EINVAL;
>> + goto out;
>> + }
>> + /* only use if no previous match occourred */
>> + if (newstates[idx - 1] == 1) {
>> + newstates[idx - 1] = cur_action;
>> + }
>> + }
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v7 2/2] gdbstub: Fix vCont behaviour
2017-02-07 9:59 ` Claudio Imbrenda
@ 2017-02-07 15:10 ` Paolo Bonzini
0 siblings, 0 replies; 7+ messages in thread
From: Paolo Bonzini @ 2017-02-07 15:10 UTC (permalink / raw)
To: Claudio Imbrenda; +Cc: borntraeger, qemu-devel, palves, alex.bennee
On 07/02/2017 10:59, Claudio Imbrenda wrote:
> static inline int cpu_index(CPUState *cpu)
> {
> #if defined(CONFIG_USER_ONLY)
> return cpu->host_tid;
> #else
> return cpu->cpu_index + 1;
> #endif
> }
>
>
> maybe that can just become newstates[cpu->cpu_index] = 1 ?
> (since we're not in CONFIG_USER_ONLY anyway)
Yes, I think it should be like that, especially if in the future we want
to support CONFIG_USER_ONLY it makes no sense to use host PIDs.
Paolo
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2017-02-07 15:10 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-01-27 18:11 [Qemu-devel] [PATCH v7 0/2] Qemu: gdbstub: fix vCont Claudio Imbrenda
2017-01-27 18:11 ` [Qemu-devel] [PATCH v7 1/2] move vm_start to cpus.c Claudio Imbrenda
2017-02-06 9:53 ` Paolo Bonzini
2017-01-27 18:11 ` [Qemu-devel] [PATCH v7 2/2] gdbstub: Fix vCont behaviour Claudio Imbrenda
2017-02-06 10:00 ` Paolo Bonzini
2017-02-07 9:59 ` Claudio Imbrenda
2017-02-07 15:10 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).