From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lg44I-0003es-Tq for qemu-devel@nongnu.org; Sat, 07 Mar 2009 16:28:26 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lg44H-0003d3-U5 for qemu-devel@nongnu.org; Sat, 07 Mar 2009 16:28:26 -0500 Received: from [199.232.76.173] (port=32790 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lg44H-0003cq-Ly for qemu-devel@nongnu.org; Sat, 07 Mar 2009 16:28:25 -0500 Received: from savannah.gnu.org ([199.232.41.3]:60353 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Lg44H-0002fL-8x for qemu-devel@nongnu.org; Sat, 07 Mar 2009 16:28:25 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Lg44G-0005Xt-NS for qemu-devel@nongnu.org; Sat, 07 Mar 2009 21:28:24 +0000 Received: from aurel32 by cvs.savannah.gnu.org with local (Exim 4.69) (envelope-from ) id 1Lg44G-0005Xp-C5 for qemu-devel@nongnu.org; Sat, 07 Mar 2009 21:28:24 +0000 MIME-Version: 1.0 Errors-To: aurel32 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Aurelien Jarno Message-Id: Date: Sat, 07 Mar 2009 21:28:24 +0000 Subject: [Qemu-devel] [6762] Use a dedicated function to request exit from execution loop Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org 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 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