Upstream the bsd-user fork signal implementation, for the most part. This series of commits represents nearly all of the infrastructure that surround signals, except the actual system call glue (that was also reworked in the fork and needs its own series). In addition, this adds the sigsegv and sigbus code to arm. Even in the fork, we don't have good x86 signal implementation, so there's little to upstream for that at the moment.
bsd-user's signal implementation is similar to linux-user's. The full context can be found in the bsd-user's fork's 'blitz branch' at https://github.com/qemu-bsd-user/qemu-bsd-user/tree/blitz which shows how these are used to implement various system calls. Since this was built from linux-user's stack stuff, evolved for BSD with the passage of a few years, it no-doubt missed some bug fixes from linux-user (though nothing obvious stood out in the quick comparison I made). After the first round of reviews, many of these improvements have been incorporated. All the patches have been reviewed by at least one person, except these hunks: bsd-user/signal.c: implement do_sigaction bsd-user/signal.c: implement do_sigreturn though more eyes on any if these changes is quite welcome. All the patches have also been forward ported to the bsd-user 'blitz' branch and we now pass more tests there than we did before (though it's only back up to a similar number of tests to our ancient rebase-3.2 version). New in version 3: o Fixed do_sigcation to allow querying of SIGKILL or SIGSTOP. o Fixed host/target confusion for do_sigaction return codes. Also added comments about why we use sigprocmask(2) instead of pthread_sigmask(3) since a question about this came up in review. o For do_sigreturn, don't set the actual signal mask, but instead defer that to the main loop to avoid races with signals that are newly active, but blocked by the signal handler's signal mask and the main loop, as is done in linux-user. o Fixed or added a number of comments based on review feedback for typos or todo items. o bsd-user/signal-common.h: Move signal functions prototypes to here Move includes of signal-common.h to this patch hunk in */target_arch_cpu.h to fix compile issues. o Also, rebased to current tip of master and fixed a minor conflict or two (which should get rid of the does not apply warning on patchew). Patchew history: https://patchew.org/QEMU/20220125012947.14974-1-...@bsdimp.com/ Warner Losh (40): bsd-user: Complete FreeBSD siginfo bsd-user: Create setup_sigframe_arch to setup sigframe context bsd-user/arm/signal.c: Implement setup_sigframe_arch for arm bsd-user/arm/signal.c: get_mcontext should zero vfp data bsd-user: Remove vestiges of signal queueing code bsd-user: Bring in docs from linux-user for signal_pending bsd-user/arm/target_arch_cpu.h: Move EXCP_ATOMIC to match linux-user bsd-user/signal.c: implement force_sig_fault bsd-user/signal-common.h: Move signal functions prototypes to here bsd-user/signal.c: Implement cpu_loop_exit_sigsegv bsd-user/signal.c: implement cpu_loop_exit_sigbus bsd-user/arm/arget_arch_cpu.h: Move EXCP_DEBUG and EXCP_BKPT together bsd-user/arm/target_arch_cpu.h: Correct code pointer bsd-user/arm/target_arch_cpu.h: Use force_sig_fault for EXCP_UDEF bsd-user/arm/target_arch_cpu.h: Implement data faults bsd-user/signal.c: implement abstract target / host signal translation bsd-user/signal.c: Implement signal_init() bsd-user/signal.c: Add si_type argument to queue_signal bsd-user/host/arm/host-signal.h: Implement host_signal_* bsd-user/host/i386/host-signal.h: Implement host_signal_* bsd-user/host/x86_64/host-signal.h: Implement host_signal_* bsd-user: Add host signals to the build bsd-user: Add trace events for bsd-user bsd-user/signal.c: host_to_target_siginfo_noswap bsd-user/signal.c: Implement rewind_if_in_safe_syscall bsd-user/signal.c: Implement host_signal_handler bsd-user/strace.c: print_taken_signal bsd-user/signal.c: Implement dump_core_and_abort bsd-user/signal.c: Fill in queue_signal bsd-user/signal.c: sigset manipulation routines. bsd-user/signal.c: setup_frame bsd-user/signal.c: handle_pending_signal bsd-user/signal.c: tswap_siginfo bsd-user/signal.c: process_pending_signals bsd-user/signal.c: implement do_sigreturn bsd-user/signal.c: implement do_sigaction bsd-user/signal.c: do_sigaltstack MAINTAINERS: Add tests/vm/*bsd to the list to get reviews on bsd-user: Rename arg name for target_cpu_reset to env bsd-user/freebsd/target_os_ucontext.h: Prefer env as arg name for CPUArchState args MAINTAINERS | 1 + bsd-user/arm/signal.c | 59 +- bsd-user/arm/target_arch_cpu.h | 101 +-- bsd-user/freebsd/target_os_siginfo.h | 15 +- bsd-user/freebsd/target_os_signal.h | 3 + bsd-user/freebsd/target_os_ucontext.h | 6 +- bsd-user/host/arm/host-signal.h | 35 + bsd-user/host/i386/host-signal.h | 37 + bsd-user/host/x86_64/host-signal.h | 37 + bsd-user/i386/signal.c | 13 + bsd-user/i386/target_arch_cpu.h | 5 +- bsd-user/main.c | 14 +- bsd-user/qemu.h | 66 +- bsd-user/signal-common.h | 70 ++ bsd-user/signal.c | 1008 ++++++++++++++++++++++++- bsd-user/strace.c | 97 +++ bsd-user/syscall_defs.h | 1 + bsd-user/trace-events | 11 + bsd-user/trace.h | 1 + bsd-user/x86_64/signal.c | 13 + bsd-user/x86_64/target_arch_cpu.h | 5 +- meson.build | 6 +- 22 files changed, 1490 insertions(+), 114 deletions(-) create mode 100644 bsd-user/host/arm/host-signal.h create mode 100644 bsd-user/host/i386/host-signal.h create mode 100644 bsd-user/host/x86_64/host-signal.h create mode 100644 bsd-user/signal-common.h create mode 100644 bsd-user/trace-events create mode 100644 bsd-user/trace.h -- 2.33.1