On 17 February 2013 00:19, Peter Maydell <peter.mayd...@linaro.org> wrote:
> [why doesn't MacOS QEMU exit on ctrl-C?]
> What seems to happen is that the other thread nips in and
> does the sigreturn/sigprocmask/sigaltstack stuff, and
> it's messing with the signal mask for the whole process.
> (dtruss also tell me 0x6f8c53 is the TCG CPU thread.)

Found it! The culprit is the setjmp/longjmp in cpu-exec.c.
On Linux these don't save and restore the process signal mask
(you use sigsetjmp/siglongjmp for that). However on BSD setjmp
and longjmp do save and restore the process signal mask, so
when we do the longjmp in the CPU thread we end up setting the
mask for every thread to the restrictive mask used by the
CPU thread. Then SIGTERM and SIGINT are blocked for every
thread and have no effect on QEMU.

So, we can fix this MacOS issue by replacing all our current
setjmp() and longjmp() with sigsetjmp(buf, 0) and siglongjmp()
[which is the POSIX mandated way to say "definitely don't
change the signal mask", avoiding the undefined effect
on the signal mask that plain longjmp has.] (I guess that
might require some compat layer for win32 builds, which
is trivial enough.)

However, having thought about this I'm now a bit dubious about
the use of longjmp in cpu_resume_from_signal() -- this is
jumping out of a signal handler, so if we do nothing with
the signal mask surely we'll end up running the CPU thread
with that signal blocked when it was not before? I don't know
why this doesn't cause issues on Linux...

-- PMM

Reply via email to