qemu-thread: Don't block SEGV, ILL and FPE
If any of these signals happen on macOS, they are not delivered to other threads and signalfd_compat receives nothing. Indeed, POSIX reference and sigprocmask(2) note that an attempt to block the signals results in undefined behaviour. SEGV and FPE can't also be received by signalfd(2) on Linux. An ability to retrieve SIGBUS via signalfd(2) is used by QEMU for memory preallocation therefore we can't unblock it without consequences. But it's important to leave a remark that the signal is lost on macOS. Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
479a57475e
commit
21a43af0f1
@ -524,6 +524,11 @@ void qemu_thread_create(QemuThread *thread, const char *name,
|
|||||||
|
|
||||||
/* Leave signal handling to the iothread. */
|
/* Leave signal handling to the iothread. */
|
||||||
sigfillset(&set);
|
sigfillset(&set);
|
||||||
|
/* Blocking the signals can result in undefined behaviour. */
|
||||||
|
sigdelset(&set, SIGSEGV);
|
||||||
|
sigdelset(&set, SIGFPE);
|
||||||
|
sigdelset(&set, SIGILL);
|
||||||
|
/* TODO avoid SIGBUS loss on macOS */
|
||||||
pthread_sigmask(SIG_SETMASK, &set, &oldset);
|
pthread_sigmask(SIG_SETMASK, &set, &oldset);
|
||||||
|
|
||||||
qemu_thread_args = g_new0(QemuThreadArgs, 1);
|
qemu_thread_args = g_new0(QemuThreadArgs, 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user