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.

Backports commit 21a43af0f18335af4abb1959aa28ee9d159a2d43 from qemu
This commit is contained in:
Roman Bolshakov 2019-01-13 19:50:21 -05:00 committed by Lioncash
parent 55bc017af4
commit 03beb4f15a
No known key found for this signature in database
GPG key ID: 4E3C3CC1031BA9C7

View file

@ -49,6 +49,11 @@ int qemu_thread_create(struct uc_struct *uc, QemuThread *thread, const char *nam
/* 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);
err = pthread_create(&thread->thread, &attr, start_routine, arg); err = pthread_create(&thread->thread, &attr, start_routine, arg);
if (err) { if (err) {