mirror of https://github.com/xemu-project/xemu.git
linux-user: enable tb unlinking when compiled with NPTL
Fixes receiving signals when guest code is being executed in a tight loop. For an example, try interrupting the following code with ctrl-c. http://nchipin.kos.to/test-loop.c The tight loop is ofcourse brainless, but it is also exactly how the waitpid* testcases are implemented. Signed-off-by: Riku Voipio <riku.voipio@nokia.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
parent
58faa1a6db
commit
f76cfe56d9
8
exec.c
8
exec.c
|
@ -1530,24 +1530,22 @@ void cpu_set_log_filename(const char *filename)
|
||||||
|
|
||||||
static void cpu_unlink_tb(CPUState *env)
|
static void cpu_unlink_tb(CPUState *env)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_USE_NPTL)
|
|
||||||
/* FIXME: TB unchaining isn't SMP safe. For now just ignore the
|
/* 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
|
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
|
emulation this often isn't actually as bad as it sounds. Often
|
||||||
signals are used primarily to interrupt blocking syscalls. */
|
signals are used primarily to interrupt blocking syscalls. */
|
||||||
#else
|
|
||||||
TranslationBlock *tb;
|
TranslationBlock *tb;
|
||||||
static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED;
|
static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED;
|
||||||
|
|
||||||
tb = env->current_tb;
|
tb = env->current_tb;
|
||||||
/* if the cpu is currently executing code, we must unlink it and
|
/* if the cpu is currently executing code, we must unlink it and
|
||||||
all the potentially executing TB */
|
all the potentially executing TB */
|
||||||
if (tb && !testandset(&interrupt_lock)) {
|
if (tb) {
|
||||||
|
spin_lock(&interrupt_lock);
|
||||||
env->current_tb = NULL;
|
env->current_tb = NULL;
|
||||||
tb_reset_jump_recursive(tb);
|
tb_reset_jump_recursive(tb);
|
||||||
resetlock(&interrupt_lock);
|
spin_unlock(&interrupt_lock);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mask must never be zero, except for A20 change call */
|
/* mask must never be zero, except for A20 change call */
|
||||||
|
|
Loading…
Reference in New Issue