From bc6cb9fca3e67087536f4dda5041a6ed39e560c768ca81bd0aa5848b779d385f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Sat, 17 Aug 2013 13:11:12 +0000 Subject: [PATCH] Accepting request 195492 from home:a_faerber:branches:Virtualization Add patch to fix gdbstub for arm/m68k/ppc guests OBS-URL: https://build.opensuse.org/request/show/195492 OBS-URL: https://build.opensuse.org/package/show/Virtualization/qemu?expand=0&rev=155 --- ...-gdbstub-Fix-gdb_register_coprocesso.patch | 93 +++++++++++++++++++ qemu-linux-user.changes | 5 + qemu-linux-user.spec | 2 + qemu.changes | 5 + qemu.spec | 2 + 5 files changed, 107 insertions(+) create mode 100644 0038-gdbstub-Fix-gdb_register_coprocesso.patch diff --git a/0038-gdbstub-Fix-gdb_register_coprocesso.patch b/0038-gdbstub-Fix-gdb_register_coprocesso.patch new file mode 100644 index 00000000..5b95d73f --- /dev/null +++ b/0038-gdbstub-Fix-gdb_register_coprocesso.patch @@ -0,0 +1,93 @@ +From 1fd884e9d531b5b5b3e021eb3277a8784714df2f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Andreas=20F=C3=A4rber?= +Date: Mon, 12 Aug 2013 18:09:47 +0200 +Subject: [PATCH] gdbstub: Fix gdb_register_coprocessor() register counting +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Commit a0e372f0c49ac01faeaeb73a6e8f50e8ac615f34 reorganized the register +counting for GDB. While it seems correct not to let the total number of +registers skyrocket in an SMP scenario through a static variable, the +distinction between total register count and 'g' packet register count +(last_reg vs. num_g_regs) got lost among the way. + +Fix this by introducing CPUState::gdb_num_g_regs and using that in +gdb_handle_packet(). + +Reported-by: Aneesh Kumar K.V +Cc: qemu-stable@nongnu.org (stable-1.6) +Tested-by: Aneesh Kumar K.V +Tested-by: Max Filippov +Tested-by: Peter Maydell +Signed-off-by: Andreas Färber +--- + gdbstub.c | 6 ++++-- + include/qom/cpu.h | 2 ++ + qom/cpu.c | 2 +- + 3 files changed, 7 insertions(+), 3 deletions(-) + +diff --git a/gdbstub.c b/gdbstub.c +index 1af25a6..9d067d6 100644 +--- a/gdbstub.c ++++ b/gdbstub.c +@@ -621,6 +621,8 @@ void gdb_register_coprocessor(CPUState *cpu, + if (g_pos != s->base_reg) { + fprintf(stderr, "Error: Bad gdb register numbering for '%s'\n" + "Expected %d got %d\n", xml, g_pos, s->base_reg); ++ } else { ++ cpu->gdb_num_g_regs = cpu->gdb_num_regs; + } + } + } +@@ -902,7 +904,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf) + case 'g': + cpu_synchronize_state(s->g_cpu); + len = 0; +- for (addr = 0; addr < s->g_cpu->gdb_num_regs; addr++) { ++ for (addr = 0; addr < s->g_cpu->gdb_num_g_regs; addr++) { + reg_size = gdb_read_register(s->g_cpu, mem_buf + len, addr); + len += reg_size; + } +@@ -914,7 +916,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf) + registers = mem_buf; + len = strlen(p) / 2; + hextomem((uint8_t *)registers, p, len); +- for (addr = 0; addr < s->g_cpu->gdb_num_regs && len > 0; addr++) { ++ for (addr = 0; addr < s->g_cpu->gdb_num_g_regs && len > 0; addr++) { + reg_size = gdb_write_register(s->g_cpu, registers, addr); + len -= reg_size; + registers += reg_size; +diff --git a/include/qom/cpu.h b/include/qom/cpu.h +index 0d6e95c..3e49936 100644 +--- a/include/qom/cpu.h ++++ b/include/qom/cpu.h +@@ -152,6 +152,7 @@ struct kvm_run; + * @current_tb: Currently executing TB. + * @gdb_regs: Additional GDB registers. + * @gdb_num_regs: Number of total registers accessible to GDB. ++ * @gdb_num_g_regs: Number of registers in GDB 'g' packets. + * @next_cpu: Next CPU sharing TB cache. + * @kvm_fd: vCPU file descriptor for KVM. + * +@@ -188,6 +189,7 @@ struct CPUState { + struct TranslationBlock *current_tb; + struct GDBRegisterState *gdb_regs; + int gdb_num_regs; ++ int gdb_num_g_regs; + CPUState *next_cpu; + + int kvm_fd; +diff --git a/qom/cpu.c b/qom/cpu.c +index aa95108..e71e57b 100644 +--- a/qom/cpu.c ++++ b/qom/cpu.c +@@ -240,7 +240,7 @@ static void cpu_common_initfn(Object *obj) + CPUState *cpu = CPU(obj); + CPUClass *cc = CPU_GET_CLASS(obj); + +- cpu->gdb_num_regs = cc->gdb_num_core_regs; ++ cpu->gdb_num_regs = cpu->gdb_num_g_regs = cc->gdb_num_core_regs; + } + + static int64_t cpu_common_get_arch_id(CPUState *cpu) diff --git a/qemu-linux-user.changes b/qemu-linux-user.changes index 4adcc615..25aeb7ec 100644 --- a/qemu-linux-user.changes +++ b/qemu-linux-user.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Sat Aug 17 12:12:57 UTC 2013 - afaerber@suse.de + +- Fix gdbstub for arm/m68k/ppc guests (from pending upstream pull) + ------------------------------------------------------------------- Fri Aug 16 23:36:12 UTC 2013 - afaerber@suse.de diff --git a/qemu-linux-user.spec b/qemu-linux-user.spec index 99b2c485..34bfab43 100644 --- a/qemu-linux-user.spec +++ b/qemu-linux-user.spec @@ -62,6 +62,7 @@ Patch0034: 0034-console-add-question-mark-escape-op.patch Patch0035: 0035-Make-char-muxer-more-robust-wrt-sma.patch Patch0036: 0036-linux-user-lseek-explicitly-cast-no.patch Patch0037: 0037-virtfs-proxy-helper-Provide-__u64-f.patch +Patch0038: 0038-gdbstub-Fix-gdb_register_coprocesso.patch # Please do not add patches manually here, run update_git.sh. # this is to make lint happy Source300: rpmlintrc @@ -151,6 +152,7 @@ run cross-architecture builds. %patch0035 -p1 %patch0036 -p1 %patch0037 -p1 +%patch0038 -p1 %build ./configure --prefix=%_prefix --sysconfdir=%_sysconfdir \ diff --git a/qemu.changes b/qemu.changes index 62de244c..53e23882 100644 --- a/qemu.changes +++ b/qemu.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Sat Aug 17 12:12:57 UTC 2013 - afaerber@suse.de + +- Fix gdbstub for arm/m68k/ppc guests (from pending upstream pull) + ------------------------------------------------------------------- Fri Aug 16 23:36:12 UTC 2013 - afaerber@suse.de diff --git a/qemu.spec b/qemu.spec index 20944fc8..b6f10c8d 100644 --- a/qemu.spec +++ b/qemu.spec @@ -62,6 +62,7 @@ Patch0034: 0034-console-add-question-mark-escape-op.patch Patch0035: 0035-Make-char-muxer-more-robust-wrt-sma.patch Patch0036: 0036-linux-user-lseek-explicitly-cast-no.patch Patch0037: 0037-virtfs-proxy-helper-Provide-__u64-f.patch +Patch0038: 0038-gdbstub-Fix-gdb_register_coprocesso.patch # Please do not add patches manually here, run update_git.sh. # this is to make lint happy Source300: rpmlintrc @@ -211,6 +212,7 @@ This sub-package contains the guest agent. %patch0035 -p1 %patch0036 -p1 %patch0037 -p1 +%patch0038 -p1 %build ./configure --prefix=%_prefix --sysconfdir=%_sysconfdir \