qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [7004] Add new command line option -singlestep for tcg sing


From: Aurelien Jarno
Subject: [Qemu-devel] [7004] Add new command line option -singlestep for tcg single stepping.
Date: Sun, 05 Apr 2009 20:08:59 +0000

Revision: 7004
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=7004
Author:   aurel32
Date:     2009-04-05 20:08:59 +0000 (Sun, 05 Apr 2009)
Log Message:
-----------
Add new command line option -singlestep 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 <address@hidden>
Signed-off-by: Aurelien Jarno <address@hidden>

Modified Paths:
--------------
    trunk/bsd-user/main.c
    trunk/darwin-user/main.c
    trunk/exec-all.h
    trunk/linux-user/main.c
    trunk/monitor.c
    trunk/qemu-doc.texi
    trunk/qemu-options.hx
    trunk/target-alpha/translate.c
    trunk/target-arm/translate.c
    trunk/target-cris/translate.c
    trunk/target-i386/translate.c
    trunk/target-m68k/translate.c
    trunk/target-mips/translate.c
    trunk/target-ppc/translate.c
    trunk/target-sh4/translate.c
    trunk/target-sparc/translate.c
    trunk/vl.c

Modified: trunk/bsd-user/main.c
===================================================================
--- trunk/bsd-user/main.c       2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/bsd-user/main.c       2009-04-05 20:08:59 UTC (rev 7004)
@@ -33,6 +33,8 @@
 
 #define DEBUG_LOGFILE "/tmp/qemu.log"
 
+int singlestep;
+
 static const char *interp_prefix = CONFIG_QEMU_PREFIX;
 const char *qemu_uname_release = CONFIG_UNAME_RELEASE;
 extern char **environ;
@@ -378,6 +380,7 @@
            "Debug options:\n"
            "-d options   activate log (logfile=%s)\n"
            "-p pagesize  set the host page size to 'pagesize'\n"
+           "-singlestep  always run in singlestep mode\n"
            "-strace      log system calls\n"
            "\n"
            "Environment variables:\n"
@@ -500,6 +503,8 @@
                 usage();
             }
             optind++;
+        } else if (!strcmp(r, "singlestep")) {
+            singlestep = 1;
         } else if (!strcmp(r, "strace")) {
             do_strace = 1;
         } else

Modified: trunk/darwin-user/main.c
===================================================================
--- trunk/darwin-user/main.c    2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/darwin-user/main.c    2009-04-05 20:08:59 UTC (rev 7004)
@@ -41,6 +41,8 @@
 #include <mach/mach_init.h>
 #include <mach/vm_map.h>
 
+int singlestep;
+
 const char *interp_prefix = "";
 
 asm(".zerofill __STD_PROG_ZONE, __STD_PROG_ZONE, __std_prog_zone, 0x0dfff000");
@@ -751,6 +753,7 @@
            "-d options   activate log (logfile='%s')\n"
            "-g wait for gdb on port 1234\n"
            "-p pagesize  set the host page size to 'pagesize'\n",
+           "-singlestep  always run in singlestep mode\n"
            TARGET_ARCH,
            TARGET_ARCH,
            interp_prefix,
@@ -842,6 +845,8 @@
 #endif
                 exit(1);
             }
+        } else if (!strcmp(r, "singlestep")) {
+            singlestep = 1;
         } else
         {
             usage();

Modified: trunk/exec-all.h
===================================================================
--- trunk/exec-all.h    2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/exec-all.h    2009-04-05 20:08:59 UTC (rev 7004)
@@ -384,4 +384,8 @@
 typedef void (CPUDebugExcpHandler)(CPUState *env);
 
 CPUDebugExcpHandler *cpu_set_debug_excp_handler(CPUDebugExcpHandler *handler);
+
+/* vl.c */
+extern int singlestep;
+
 #endif

Modified: trunk/linux-user/main.c
===================================================================
--- trunk/linux-user/main.c     2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/linux-user/main.c     2009-04-05 20:08:59 UTC (rev 7004)
@@ -39,6 +39,8 @@
 
 char *exec_path;
 
+int singlestep;
+
 static const char *interp_prefix = CONFIG_QEMU_PREFIX;
 const char *qemu_uname_release = CONFIG_UNAME_RELEASE;
 
@@ -2217,6 +2219,7 @@
            "Debug options:\n"
            "-d options   activate log (logfile=%s)\n"
            "-p pagesize  set the host page size to 'pagesize'\n"
+           "-singlestep  always run in singlestep mode\n"
            "-strace      log system calls\n"
            "\n"
            "Environment variables:\n"
@@ -2359,6 +2362,8 @@
             }
         } else if (!strcmp(r, "drop-ld-preload")) {
             (void) envlist_unsetenv(envlist, "LD_PRELOAD");
+        } else if (!strcmp(r, "singlestep")) {
+            singlestep = 1;
         } else if (!strcmp(r, "strace")) {
             do_strace = 1;
         } else

Modified: trunk/monitor.c
===================================================================
--- trunk/monitor.c     2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/monitor.c     2009-04-05 20:08:59 UTC (rev 7004)
@@ -527,6 +527,17 @@
     cpu_set_log(mask);
 }
 
+static void do_singlestep(Monitor *mon, const char *option)
+{
+    if (!option || !strcmp(option, "on")) {
+        singlestep = 1;
+    } else if (!strcmp(option, "off")) {
+        singlestep = 0;
+    } else {
+        monitor_printf(mon, "unexpected option %s\n", option);
+    }
+}
+
 static void do_stop(Monitor *mon)
 {
     vm_stop(EXCP_INTERRUPT);
@@ -1511,9 +1522,13 @@
 
 static void do_info_status(Monitor *mon)
 {
-    if (vm_running)
-       monitor_printf(mon, "VM status: running\n");
-    else
+    if (vm_running) {
+        if (singlestep) {
+            monitor_printf(mon, "VM status: running (single step mode)\n");
+        } else {
+            monitor_printf(mon, "VM status: running\n");
+        }
+    } else
        monitor_printf(mon, "VM status: paused\n");
 }
 
@@ -1644,6 +1659,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,
+      "[on|off]", "run emulation in singlestep mode or switch to normal mode", 
},
     { "stop", "", do_stop,
       "", "stop emulation", },
     { "c|cont", "", do_cont,

Modified: trunk/qemu-doc.texi
===================================================================
--- trunk/qemu-doc.texi 2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/qemu-doc.texi 2009-04-05 20:08:59 UTC (rev 7004)
@@ -490,6 +490,10 @@
 @item delvm @var{tag}|@var{id}
 Delete the snapshot identified by @var{tag} or @var{id}.
 
address@hidden singlestep [off]
+Run the emulation in single step mode.
+If called with option off, the emulation returns to normal mode.
+
 @item stop
 Stop emulation.
 
@@ -2370,6 +2374,8 @@
 Act as if the host page size was 'pagesize' bytes
 @item -g port
 Wait gdb connection to port
address@hidden -singlestep
+Run the emulation in single step mode.
 @end table
 
 Environment variables:
@@ -2488,6 +2494,8 @@
 Activate log (logfile=/tmp/qemu.log)
 @item -p pagesize
 Act as if the host page size was 'pagesize' bytes
address@hidden -singlestep
+Run the emulation in single step mode.
 @end table
 
 @node BSD User space emulator
@@ -2550,6 +2558,8 @@
 Activate log (logfile=/tmp/qemu.log)
 @item -p pagesize
 Act as if the host page size was 'pagesize' bytes
address@hidden -singlestep
+Run the emulation in single step mode.
 @end table
 
 @node compilation

Modified: trunk/qemu-options.hx
===================================================================
--- trunk/qemu-options.hx       2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/qemu-options.hx       2009-04-05 20:08:59 UTC (rev 7004)
@@ -1209,6 +1209,13 @@
 from a script.
 ETEXI
 
+DEF("singlestep", 0, QEMU_OPTION_singlestep, \
+    "-singlestep   always run in singlestep mode\n")
+STEXI
address@hidden -singlestep
+Run the emulation in single step mode.
+ETEXI
+
 DEF("S", 0, QEMU_OPTION_S, \
     "-S              freeze CPU at startup (use 'c' to start execution)\n")
 STEXI

Modified: trunk/target-alpha/translate.c
===================================================================
--- trunk/target-alpha/translate.c      2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/target-alpha/translate.c      2009-04-05 20:08:59 UTC (rev 7004)
@@ -2412,11 +2412,11 @@
         if (env->singlestep_enabled) {
             gen_excp(&ctx, EXCP_DEBUG, 0);
             break;
-       }
+        }
 
-#if defined (DO_SINGLE_STEP)
-        break;
-#endif
+        if (singlestep) {
+            break;
+        }
     }
     if (ret != 1 && ret != 3) {
         tcg_gen_movi_i64(cpu_pc, ctx.pc);

Modified: trunk/target-arm/translate.c
===================================================================
--- trunk/target-arm/translate.c        2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/target-arm/translate.c        2009-04-05 20:08:59 UTC (rev 7004)
@@ -8791,6 +8791,7 @@
         num_insns ++;
     } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
              !env->singlestep_enabled &&
+             !singlestep &&
              dc->pc < next_page_start &&
              num_insns < max_insns);
 

Modified: trunk/target-cris/translate.c
===================================================================
--- trunk/target-cris/translate.c       2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/target-cris/translate.c       2009-04-05 20:08:59 UTC (rev 7004)
@@ -3272,6 +3272,7 @@
                        break;
        } while (!dc->is_jmp && !dc->cpustate_changed
                 && gen_opc_ptr < gen_opc_end
+                 && !singlestep
                 && (dc->pc < next_page_start)
                  && num_insns < max_insns);
 

Modified: trunk/target-i386/translate.c
===================================================================
--- trunk/target-i386/translate.c       2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/target-i386/translate.c       2009-04-05 20:08:59 UTC (rev 7004)
@@ -7733,6 +7733,11 @@
             gen_eob(dc);
             break;
         }
+        if (singlestep) {
+            gen_jmp_im(pc_ptr - dc->cs_base);
+            gen_eob(dc);
+            break;
+        }
     }
     if (tb->cflags & CF_LAST_IO)
         gen_io_end();

Modified: trunk/target-m68k/translate.c
===================================================================
--- trunk/target-m68k/translate.c       2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/target-m68k/translate.c       2009-04-05 20:08:59 UTC (rev 7004)
@@ -3031,6 +3031,7 @@
         num_insns++;
     } while (!dc->is_jmp && gen_opc_ptr < gen_opc_end &&
              !env->singlestep_enabled &&
+             !singlestep &&
              (pc_offset) < (TARGET_PAGE_SIZE - 32) &&
              num_insns < max_insns);
 

Modified: trunk/target-mips/translate.c
===================================================================
--- trunk/target-mips/translate.c       2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/target-mips/translate.c       2009-04-05 20:08:59 UTC (rev 7004)
@@ -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))
@@ -8140,9 +8139,9 @@
 
         if (num_insns >= max_insns)
             break;
-#if defined (MIPS_SINGLE_STEP)
-        break;
-#endif
+
+        if (singlestep)
+            break;
     }
     if (tb->cflags & CF_LAST_IO)
         gen_io_end();

Modified: trunk/target-ppc/translate.c
===================================================================
--- trunk/target-ppc/translate.c        2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/target-ppc/translate.c        2009-04-05 20:08:59 UTC (rev 7004)
@@ -39,7 +39,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
 
@@ -8288,15 +8287,13 @@
             gen_exception(ctxp, POWERPC_EXCP_TRACE);
         } else if (unlikely(((ctx.nip & (TARGET_PAGE_SIZE - 1)) == 0) ||
                             (env->singlestep_enabled) ||
+                            singlestep ||
                             num_insns >= max_insns)) {
             /* if we reach a page boundary or are single stepping, stop
              * generation
              */
             break;
         }
-#if defined (DO_SINGLE_STEP)
-        break;
-#endif
     }
     if (tb->cflags & CF_LAST_IO)
         gen_io_end();

Modified: trunk/target-sh4/translate.c
===================================================================
--- trunk/target-sh4/translate.c        2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/target-sh4/translate.c        2009-04-05 20:08:59 UTC (rev 7004)
@@ -1967,9 +1967,8 @@
            break;
         if (num_insns >= max_insns)
             break;
-#ifdef SH4_SINGLE_STEP
-       break;
-#endif
+        if (singlestep)
+            break;
     }
     if (tb->cflags & CF_LAST_IO)
         gen_io_end();

Modified: trunk/target-sparc/translate.c
===================================================================
--- trunk/target-sparc/translate.c      2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/target-sparc/translate.c      2009-04-05 20:08:59 UTC (rev 7004)
@@ -4838,7 +4838,7 @@
             break;
         /* if single step mode, we generate only one instruction and
            generate an exception */
-        if (env->singlestep_enabled) {
+        if (env->singlestep_enabled || singlestep) {
             tcg_gen_movi_tl(cpu_pc, dc->pc);
             tcg_gen_exit_tb(0);
             break;

Modified: trunk/vl.c
===================================================================
--- trunk/vl.c  2009-04-05 20:08:50 UTC (rev 7003)
+++ trunk/vl.c  2009-04-05 20:08:59 UTC (rev 7004)
@@ -236,6 +236,7 @@
 int rtc_td_hack = 0;
 #endif
 int usb_enabled = 0;
+int singlestep = 0;
 int smp_cpus = 1;
 const char *vnc_display;
 int acpi_enabled = 1;
@@ -4660,6 +4661,9 @@
             case QEMU_OPTION_bios:
                 bios_name = optarg;
                 break;
+            case QEMU_OPTION_singlestep:
+                singlestep = 1;
+                break;
             case QEMU_OPTION_S:
                 autostart = 0;
                 break;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]