qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [6762] Use a dedicated function to request exit from execut


From: Aurelien Jarno
Subject: [Qemu-devel] [6762] Use a dedicated function to request exit from execution loop
Date: Sat, 07 Mar 2009 21:28:24 +0000

Revision: 6762
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6762
Author:   aurel32
Date:     2009-03-07 21:28:24 +0000 (Sat, 07 Mar 2009)
Log Message:
-----------
Use a dedicated function to request exit from execution loop

Signed-off-by: Aurelien Jarno <address@hidden>

Modified Paths:
--------------
    trunk/cpu-all.h
    trunk/darwin-user/signal.c
    trunk/exec.c
    trunk/gdbstub.c
    trunk/hw/dma.c
    trunk/hw/mac_dbdma.c
    trunk/linux-user/main.c
    trunk/linux-user/signal.c
    trunk/vl.c

Modified: trunk/cpu-all.h
===================================================================
--- trunk/cpu-all.h     2009-03-07 21:28:14 UTC (rev 6761)
+++ trunk/cpu-all.h     2009-03-07 21:28:24 UTC (rev 6762)
@@ -760,7 +760,6 @@
 extern int64_t qemu_icount;
 extern int use_icount;
 
-#define CPU_INTERRUPT_EXIT   0x01 /* wants exit from main loop */
 #define CPU_INTERRUPT_HARD   0x02 /* hardware interrupt pending */
 #define CPU_INTERRUPT_EXITTB 0x04 /* exit the current TB (use for x86 a20 
case) */
 #define CPU_INTERRUPT_TIMER  0x08 /* internal timer exception pending */
@@ -774,6 +773,8 @@
 void cpu_interrupt(CPUState *s, int mask);
 void cpu_reset_interrupt(CPUState *env, int mask);
 
+void cpu_exit(CPUState *s);
+
 /* Breakpoint/watchpoint flags */
 #define BP_MEM_READ           0x01
 #define BP_MEM_WRITE          0x02

Modified: trunk/darwin-user/signal.c
===================================================================
--- trunk/darwin-user/signal.c  2009-03-07 21:28:14 UTC (rev 6761)
+++ trunk/darwin-user/signal.c  2009-03-07 21:28:24 UTC (rev 6762)
@@ -215,7 +215,7 @@
 #endif
     if (queue_signal(sig, &tinfo) == 1) {
         /* interrupt the virtual CPU as soon as possible */
-        cpu_interrupt(global_env, CPU_INTERRUPT_EXIT);
+        cpu_exit(global_env);
     }
 }
 

Modified: trunk/exec.c
===================================================================
--- trunk/exec.c        2009-03-07 21:28:14 UTC (rev 6761)
+++ trunk/exec.c        2009-03-07 21:28:24 UTC (rev 6762)
@@ -523,7 +523,9 @@
 
     qemu_get_be32s(f, &env->halted);
     qemu_get_be32s(f, &env->interrupt_request);
-    env->interrupt_request &= ~CPU_INTERRUPT_EXIT;
+    /* 0x01 was CPU_INTERRUPT_EXIT. This line can be removed when the
+       version_id is increased. */
+    env->interrupt_request &= ~0x01;
     tlb_flush(env, 1);
 
     return 0;
@@ -1499,28 +1501,36 @@
     cpu_set_log(loglevel);
 }
 
-/* mask must never be zero, except for A20 change call */
-void cpu_interrupt(CPUState *env, int mask)
+static void cpu_unlink_tb(CPUState *env)
 {
-#if !defined(USE_NPTL)
+#if defined(USE_NPTL)
+    /* FIXME: TB unchaining isn't SMP safe.  For now just ignore the
+       problem and hope the cpu will stop of its own accord.  For userspace
+       emulation this often isn't actually as bad as it sounds.  Often
+       signals are used primarily to interrupt blocking syscalls.  */
+#else
     TranslationBlock *tb;
     static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED;
+
+    tb = env->current_tb;
+    /* if the cpu is currently executing code, we must unlink it and
+       all the potentially executing TB */
+    if (tb && !testandset(&interrupt_lock)) {
+        env->current_tb = NULL;
+        tb_reset_jump_recursive(tb);
+        resetlock(&interrupt_lock);
+    }
 #endif
+}
+
+/* mask must never be zero, except for A20 change call */
+void cpu_interrupt(CPUState *env, int mask)
+{
     int old_mask;
 
-    if (mask & CPU_INTERRUPT_EXIT) {
-        env->exit_request = 1;
-        mask &= ~CPU_INTERRUPT_EXIT;
-    }
-
     old_mask = env->interrupt_request;
     env->interrupt_request |= mask;
-#if defined(USE_NPTL)
-    /* FIXME: TB unchaining isn't SMP safe.  For now just ignore the
-       problem and hope the cpu will stop of its own accord.  For userspace
-       emulation this often isn't actually as bad as it sounds.  Often
-       signals are used primarily to interrupt blocking syscalls.  */
-#else
+
     if (use_icount) {
         env->icount_decr.u16.high = 0xffff;
 #ifndef CONFIG_USER_ONLY
@@ -1530,16 +1540,8 @@
         }
 #endif
     } else {
-        tb = env->current_tb;
-        /* if the cpu is currently executing code, we must unlink it and
-           all the potentially executing TB */
-        if (tb && !testandset(&interrupt_lock)) {
-            env->current_tb = NULL;
-            tb_reset_jump_recursive(tb);
-            resetlock(&interrupt_lock);
-        }
+        cpu_unlink_tb(env);
     }
-#endif
 }
 
 void cpu_reset_interrupt(CPUState *env, int mask)
@@ -1547,6 +1549,12 @@
     env->interrupt_request &= ~mask;
 }
 
+void cpu_exit(CPUState *env)
+{
+    env->exit_request = 1;
+    cpu_unlink_tb(env);
+}
+
 const CPULogItem cpu_log_items[] = {
     { CPU_LOG_TB_OUT_ASM, "out_asm",
       "show generated host assembly code for each compiled TB" },

Modified: trunk/gdbstub.c
===================================================================
--- trunk/gdbstub.c     2009-03-07 21:28:14 UTC (rev 6761)
+++ trunk/gdbstub.c     2009-03-07 21:28:24 UTC (rev 6762)
@@ -2012,7 +2012,7 @@
 #ifdef CONFIG_USER_ONLY
     gdb_handlesig(s->c_cpu, 0);
 #else
-    cpu_interrupt(s->c_cpu, CPU_INTERRUPT_EXIT);
+    cpu_exit(s->c_cpu);
 #endif
 }
 

Modified: trunk/hw/dma.c
===================================================================
--- trunk/hw/dma.c      2009-03-07 21:28:14 UTC (rev 6761)
+++ trunk/hw/dma.c      2009-03-07 21:28:24 UTC (rev 6762)
@@ -449,7 +449,7 @@
 {
     CPUState *env = cpu_single_env;
     if (env)
-        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
+        cpu_exit(env);
 }
 
 static void dma_reset(void *opaque)

Modified: trunk/hw/mac_dbdma.c
===================================================================
--- trunk/hw/mac_dbdma.c        2009-03-07 21:28:14 UTC (rev 6761)
+++ trunk/hw/mac_dbdma.c        2009-03-07 21:28:24 UTC (rev 6762)
@@ -653,7 +653,7 @@
 {
     CPUState *env = cpu_single_env;
     if (env)
-        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
+        cpu_exit(env);
 }
 
 static void

Modified: trunk/linux-user/main.c
===================================================================
--- trunk/linux-user/main.c     2009-03-07 21:28:14 UTC (rev 6761)
+++ trunk/linux-user/main.c     2009-03-07 21:28:24 UTC (rev 6762)
@@ -200,7 +200,7 @@
     for (other = first_cpu; other; other = other->next_cpu) {
         if (other->running) {
             pending_cpus++;
-            cpu_interrupt(other, CPU_INTERRUPT_EXIT);
+            cpu_exit(other);
         }
     }
     if (pending_cpus > 1) {

Modified: trunk/linux-user/signal.c
===================================================================
--- trunk/linux-user/signal.c   2009-03-07 21:28:14 UTC (rev 6761)
+++ trunk/linux-user/signal.c   2009-03-07 21:28:24 UTC (rev 6762)
@@ -460,7 +460,7 @@
     host_to_target_siginfo_noswap(&tinfo, info);
     if (queue_signal(thread_env, sig, &tinfo) == 1) {
         /* interrupt the virtual CPU as soon as possible */
-        cpu_interrupt(thread_env, CPU_INTERRUPT_EXIT);
+        cpu_exit(thread_env);
     }
 }
 

Modified: trunk/vl.c
===================================================================
--- trunk/vl.c  2009-03-07 21:28:14 UTC (rev 6761)
+++ trunk/vl.c  2009-03-07 21:28:24 UTC (rev 6762)
@@ -1181,7 +1181,7 @@
         }
         /* Interrupt execution to force deadline recalculation.  */
         if (use_icount && cpu_single_env) {
-            cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
+            cpu_exit(cpu_single_env);
         }
     }
 }
@@ -1348,7 +1348,7 @@
 
         if (env) {
             /* stop the currently executing cpu because a timer occured */
-            cpu_interrupt(env, CPU_INTERRUPT_EXIT);
+            cpu_exit(env);
 #ifdef USE_KQEMU
             if (env->kqemu_enabled) {
                 kqemu_cpu_interrupt(env);
@@ -3326,7 +3326,7 @@
 {
     CPUState *env = cpu_single_env;
     if (env) {
-        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
+        cpu_exit(env);
 #ifdef USE_KQEMU
         if (env->kqemu_enabled) {
             kqemu_cpu_interrupt(env);
@@ -3407,7 +3407,7 @@
     bh->idle = 0;
     /* stop the currently executing CPU to execute the BH ASAP */
     if (env) {
-        cpu_interrupt(env, CPU_INTERRUPT_EXIT);
+        cpu_exit(env);
     }
 }
 
@@ -3618,21 +3618,21 @@
         reset_requested = 1;
     }
     if (cpu_single_env)
-        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
+        cpu_exit(cpu_single_env);
 }
 
 void qemu_system_shutdown_request(void)
 {
     shutdown_requested = 1;
     if (cpu_single_env)
-        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
+        cpu_exit(cpu_single_env);
 }
 
 void qemu_system_powerdown_request(void)
 {
     powerdown_requested = 1;
     if (cpu_single_env)
-        cpu_interrupt(cpu_single_env, CPU_INTERRUPT_EXIT);
+        cpu_exit(cpu_single_env);
 }
 
 #ifdef _WIN32





reply via email to

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