From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LTiLi-0005T8-UL for qemu-devel@nongnu.org; Sun, 01 Feb 2009 14:51:22 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LTiLi-0005Sf-4R for qemu-devel@nongnu.org; Sun, 01 Feb 2009 14:51:22 -0500 Received: from [199.232.76.173] (port=51056 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LTiLh-0005Sc-VZ for qemu-devel@nongnu.org; Sun, 01 Feb 2009 14:51:22 -0500 Received: from moutng.kundenserver.de ([212.227.126.187]:62730) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LTiLg-0001eW-CR for qemu-devel@nongnu.org; Sun, 01 Feb 2009 14:51:21 -0500 Received: from localhost ([127.0.0.1] ident=stefan) by flocke.weilnetz.de with esmtp (Exim 4.69) (envelope-from ) id 1LTiLZ-0005Hh-Cl for qemu-devel@nongnu.org; Sun, 01 Feb 2009 20:51:13 +0100 Message-ID: <4985FD31.4010000@mail.berlios.de> Date: Sun, 01 Feb 2009 20:51:13 +0100 From: Stefan Weil MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH] Add single stepping option for all targets References: <494D18B1.8080900@mail.berlios.de> In-Reply-To: <494D18B1.8080900@mail.berlios.de> Content-Type: multipart/mixed; boundary="------------070600030902080205060900" Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: QEMU Developers This is a multi-part message in MIME format. --------------070600030902080205060900 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Stefan Weil schrieb: > This patch replaces the compile time options SH4_SINGLE_STEP, > DO_SINGLE_STEP and MIPS_SINGLE_STEP > by a command line option -singlestep. > > It also adds single step mode for targets which did not have a compile > time option, > so all system emulations can be used with -singlestep. Please note that > I did only run a short test for i386 and mips targets. > > A new monitor command is provided to enable or disable single step mode. > The monitor command "info status" was modified to display single step > mode when activated. > > Single stepping in Qemu's system emulation mode is useful to see the cpu > state > for each cpu instruction when used with -d in_asm,cpu. It is also a > simple way to slow down the emulation. > > The patch does not add single step mode for Qemu's user mode emulation. > Would this be useful, too? > > Kind regards > Stefan Weil > > Hello, here is an update of the patch. Please apply it to Qemu trunk. Regards Stefan Weil --------------070600030902080205060900 Content-Type: text/x-diff; name="singlestep.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="singlestep.patch" Add new command line option for tcg single stepping. This replaces a compile time option for some targets and adds this feature to targets which did not have a compile time option. Add monitor command to enable or disable single step mode. Modify monitor command "info status" to display single step mode. Signed-off-by: Stefan Weil Index: trunk/target-sh4/translate.c =================================================================== --- trunk.orig/target-sh4/translate.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/target-sh4/translate.c 2009-02-01 19:18:33.000000000 +0100 @@ -1896,9 +1896,8 @@ break; if (num_insns >= max_insns) break; -#ifdef SH4_SINGLE_STEP - break; -#endif + if (vm_singlestep) + break; } if (tb->cflags & CF_LAST_IO) gen_io_end(); Index: trunk/target-cris/translate.c =================================================================== --- trunk.orig/target-cris/translate.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/target-cris/translate.c 2009-02-01 19:18:33.000000000 +0100 @@ -3271,6 +3271,7 @@ break; } while (!dc->is_jmp && !dc->cpustate_changed && gen_opc_ptr < gen_opc_end + && !vm_singlestep && (dc->pc < next_page_start) && num_insns < max_insns); Index: trunk/target-alpha/translate.c =================================================================== --- trunk.orig/target-alpha/translate.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/target-alpha/translate.c 2009-02-01 19:18:33.000000000 +0100 @@ -2413,11 +2413,10 @@ if (env->singlestep_enabled) { gen_excp(&ctx, EXCP_DEBUG, 0); break; - } + } -#if defined (DO_SINGLE_STEP) - break; -#endif + if (vm_singlestep) + break; } if (ret != 1 && ret != 3) { tcg_gen_movi_i64(cpu_pc, ctx.pc); Index: trunk/vl.c =================================================================== --- trunk.orig/vl.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/vl.c 2009-02-01 19:18:33.000000000 +0100 @@ -193,6 +193,7 @@ int nb_nics; NICInfo nd_table[MAX_NICS]; int vm_running; +int vm_singlestep; static int rtc_utc = 1; static int rtc_date_offset = -1; /* -1 means no change */ int cirrus_vga_enabled = 1; @@ -3984,6 +3985,7 @@ "-parallel dev redirect the parallel port to char device 'dev'\n" "-monitor dev redirect the monitor to char device 'dev'\n" "-pidfile file write PID to 'file'\n" + "-singlestep always run in singlestep mode\n" "-S freeze CPU at startup (use 'c' to start execution)\n" "-s wait gdb connection to port\n" "-p port set gdb connection port [default=%s]\n" @@ -4119,6 +4121,7 @@ QEMU_OPTION_parallel, QEMU_OPTION_monitor, QEMU_OPTION_pidfile, + QEMU_OPTION_singlestep, QEMU_OPTION_S, QEMU_OPTION_s, QEMU_OPTION_p, @@ -4238,6 +4241,7 @@ { "parallel", HAS_ARG, QEMU_OPTION_parallel }, { "monitor", HAS_ARG, QEMU_OPTION_monitor }, { "pidfile", HAS_ARG, QEMU_OPTION_pidfile }, + { "singlestep", 0, QEMU_OPTION_singlestep }, { "S", 0, QEMU_OPTION_S }, { "s", 0, QEMU_OPTION_s }, { "p", HAS_ARG, QEMU_OPTION_p }, Index: trunk/target-ppc/translate.c =================================================================== --- trunk.orig/target-ppc/translate.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/target-ppc/translate.c 2009-02-01 19:18:33.000000000 +0100 @@ -38,7 +38,6 @@ #define GDBSTUB_SINGLE_STEP 0x4 /* Include definitions for instructions classes and implementations flags */ -//#define DO_SINGLE_STEP //#define PPC_DEBUG_DISAS //#define DO_PPC_STATISTICS @@ -8305,9 +8304,9 @@ */ break; } -#if defined (DO_SINGLE_STEP) - break; -#endif + + if (vm_singlestep) + break; } if (tb->cflags & CF_LAST_IO) gen_io_end(); Index: trunk/target-mips/translate.c =================================================================== --- trunk.orig/target-mips/translate.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/target-mips/translate.c 2009-02-01 19:18:33.000000000 +0100 @@ -38,7 +38,6 @@ //#define MIPS_DEBUG_DISAS //#define MIPS_DEBUG_SIGN_EXTENSIONS -//#define MIPS_SINGLE_STEP /* MIPS major opcodes */ #define MASK_OP_MAJOR(op) (op & (0x3F << 26)) @@ -8247,9 +8246,9 @@ if (num_insns >= max_insns) break; -#if defined (MIPS_SINGLE_STEP) - break; -#endif + + if (vm_singlestep) + break; } if (tb->cflags & CF_LAST_IO) gen_io_end(); Index: trunk/monitor.c =================================================================== --- trunk.orig/monitor.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/monitor.c 2009-02-01 19:18:33.000000000 +0100 @@ -489,6 +489,18 @@ cpu_set_log(mask); } +static void do_singlestep(const char *option) +{ + qemu_printf("setting vm_singlestep to %s\n", option); + if (!option) { + vm_singlestep = 1; + } else if (!strcmp(option, "off")) { + vm_singlestep = 0; + } else { + term_printf("unexpected option %s\n", option); + } +} + static void do_stop(void) { vm_stop(EXCP_INTERRUPT); @@ -1403,9 +1415,13 @@ static void do_info_status(void) { - if (vm_running) - term_printf("VM status: running\n"); - else + if (vm_running) { + if (vm_singlestep) { + term_printf("VM status: running (single step mode)\n"); + } else { + term_printf("VM status: running\n"); + } + } else term_printf("VM status: paused\n"); } @@ -1455,6 +1471,8 @@ "tag|id", "restore a VM snapshot from its tag or id" }, { "delvm", "s", do_delvm, "tag|id", "delete a VM snapshot from its tag or id" }, + { "singlestep", "s?", do_singlestep, + "[off]", "run emulation in singlestep mode or switch to normal mode", }, { "stop", "", do_stop, "", "stop emulation", }, { "c|cont", "", do_cont, Index: trunk/target-i386/translate.c =================================================================== --- trunk.orig/target-i386/translate.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/target-i386/translate.c 2009-02-01 19:18:33.000000000 +0100 @@ -7661,6 +7661,11 @@ gen_eob(dc); break; } + if (vm_singlestep) { + gen_jmp_im(pc_ptr - dc->cs_base); + gen_eob(dc); + break; + } } if (tb->cflags & CF_LAST_IO) gen_io_end(); Index: trunk/target-arm/translate.c =================================================================== --- trunk.orig/target-arm/translate.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/target-arm/translate.c 2009-02-01 19:18:33.000000000 +0100 @@ -8788,7 +8788,7 @@ * ensures prefetch aborts occur at the right place. */ num_insns ++; } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end && - !env->singlestep_enabled && + !env->singlestep_enabled && !vm_singlestep && dc->pc < next_page_start && num_insns < max_insns); Index: trunk/target-m68k/translate.c =================================================================== --- trunk.orig/target-m68k/translate.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/target-m68k/translate.c 2009-02-01 19:18:33.000000000 +0100 @@ -3028,7 +3028,7 @@ disas_m68k_insn(env, dc); num_insns++; } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end && - !env->singlestep_enabled && + !env->singlestep_enabled && !vm_singlestep && (pc_offset) < (TARGET_PAGE_SIZE - 32) && num_insns < max_insns); Index: trunk/target-sparc/translate.c =================================================================== --- trunk.orig/target-sparc/translate.c 2009-02-01 19:12:41.000000000 +0100 +++ trunk/target-sparc/translate.c 2009-02-01 19:18:33.000000000 +0100 @@ -4858,7 +4858,7 @@ break; /* if single step mode, we generate only one instruction and generate an exception */ - if (env->singlestep_enabled) { + if (env->singlestep_enabled || vm_singlestep) { tcg_gen_movi_tl(cpu_pc, dc->pc); tcg_gen_exit_tb(0); break; Index: trunk/qemu-doc.texi =================================================================== --- trunk.orig/qemu-doc.texi 2009-02-01 19:12:41.000000000 +0100 +++ trunk/qemu-doc.texi 2009-02-01 19:18:33.000000000 +0100 @@ -1064,6 +1064,9 @@ @item -s Wait gdb connection to port 1234 (@pxref{gdb_usage}). +@item -singlestep +Run the emulation in single step mode. + @item -p @var{port} Change gdb connection port. @var{port} can be either a decimal number to specify a TCP port, or a host device (same devices as the serial port). @@ -1383,6 +1386,10 @@ @item delvm @var{tag}|@var{id} Delete the snapshot identified by @var{tag} or @var{id}. +@item singlestep [off] +Run the emulation in single step mode. +If called with option off, the emulation returns to normal mode. + @item stop Stop emulation. Index: trunk/exec-all.h =================================================================== --- trunk.orig/exec-all.h 2009-02-01 19:18:18.000000000 +0100 +++ trunk/exec-all.h 2009-02-01 19:18:33.000000000 +0100 @@ -386,6 +386,12 @@ #endif +#if defined(CONFIG_USER_ONLY) +# define vm_singlestep 0 +#else +extern int vm_singlestep; +#endif + typedef void (CPUDebugExcpHandler)(CPUState *env); CPUDebugExcpHandler *cpu_set_debug_excp_handler(CPUDebugExcpHandler *handler); --------------070600030902080205060900--