This patch set deals with QEMU Linux user mode functionalities related to signal handling. It is composed of four sections:
A. Extend strace support (patches 1-2, 8-9): Strace support is added for getuid(), gettid(), getppid(), geteuid(), tkill(), tgkill() and rt_sigqueueinfo(), along with support for printing the uinfo structure of rt_sigqueueinfo() of rt_tgsigqueueinfo() instead of a pointer to it. Additionally, some minor fixes of inconsistent spaces in the output of print_siginfo() are added. B. Fix some signal handling issues (patches 3-5): Fix the ssetmask() system call by removing the invocation of sigorset() using the old and the new signal masks as arguments. Change the unlock_user() argument from arg1 to arg3 to match with lock_user(), since arg3 contains the pointer to the siginfo_t structure. Change the type of the first argument of rt_sigqueinfo() from int to pid_t in the syscall declaration. C. Adding support for rt_tgsigqueueinfo() (patches 6-7): Add a new system call: rt_tgsigqueueinfo(). This system call is similar to rt_sigqueueinfo(), but instead of sending the signal and data to the whole thread group with the ID equal to the argument tgid, it sends it to a single thread within that thread group. The ID of the thread is specified by the tid argument. The implementation is based on the rt_sigqueueinfo() in linux-user mode, where the tid is added as the second argument and the previous second and third argument become arguments three and four, respectively. D. Add support for larger target signal range (RFC patches 10-16): Add target signal mask tracking and multiplexing of target signals out of the host range. The patches are marked as RFC because they introduce significant new functionalities regarding signal handling in QEMU. Currently, QEMU has a copy of the host signal and suspend masks and that is usually enough, since most of the time the signal mask of the target architecture is either the same length or narrower. If however the signal mask is wider, then part of it won't be tracked. The signals that are in the target range but out of the host range were treated like faulty signals and couldn't be used. This problem is solved by enabling the usage of one of the host signals as a multiplex for all the target signals that are out of range. In order to have the target signal masks available, tracking of target signal masks is implemented. The rt_sigqueueinfo()/rt_tgsigqueueinfo() system calls multiplex target signals by setting the si_errno value to the actual value of the signal and sending the signal to a predefined host signal number. The host_signal_handler() will pull out the multiplexed signals and set their signal number to the correct value. The si_errno field is used here but this implementation can be replaced with any other unused field in the uinfo structure. Using this implementation both rt_sigqueueinfo(), rt_tgsigqueueinfo(), as well as kill() (for pid > 0) and tgkill() can be emulated. The tkill() system call and kill() with the argument pid <= 0 couldn't be implemented simply using this method because it requires acquiring information about, and sending simultaneous signals to multiple threads or processes. These functionalities are out of the scope of rt_sigqueueinfo()/rt_tgsigqueueinfo(). Miloš Stojanović (16): linux-user: add strace for getuid(), gettid(), getppid(), geteuid() linux-user: add tkill(), tgkill() and rt_sigqueueinfo() strace linux-user: fix ssetmask() system call linux-user: fix mismatch of lock/unlock_user() invocations in rt_sigqueinfo() syscall linux-user: fix argument type declaration of rt_sigqueinfo() syscall linux-user: add support for rt_tgsigqueueinfo() system call linux-user: add rt_tgsigqueueinfo() strace linux-user: fix inconsistent spaces in print_siginfo() output linux-user: add strace support for uinfo structure of rt_sigqueueinfo() and rt_tgsigqueueinfo() [RFC] linux-user: add support for tracking the target signal mask [RFC] linux-user: add target_sigdelset() and target_sigorset() [RFC] linux-user: fix sigismember() check [RFC] linux-user: add functions for working with the target signal mask [RFC] linux-user: add functionality for tracking target signal mask [RFC] linux-user: add support for multiplexing larger target signals [RFC] linux-user: add support for multiplexing signals in rt_sigqueueinfo(), rt_tgsigqueueinfo(), kill() and tgkill() syscalls. linux-user/qemu.h | 10 ++ linux-user/signal.c | 235 +++++++++++++++++++++++++++++++++++++++++++++- linux-user/strace.c | 177 ++++++++++++++++++++++++++++++++-- linux-user/strace.list | 16 ++-- linux-user/syscall.c | 208 +++++++++++++++++++++++++++++++++++++--- linux-user/syscall_defs.h | 32 +++++++ 6 files changed, 650 insertions(+), 28 deletions(-) -- 1.9.1