Commit fae76491 authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

s390/signal: cleanup uapi struct sigaction



The struct sigaction for user space in arch/s390/include/uapi/asm/signal.h
is ill defined. The kernel uses two structures 'struct sigaction' and
'struct old_sigaction', the correlation in the kernel for both 31 and
64 bit is as follows

    sys_sigaction -> struct old_sigaction
    sys_rt_sigaction -> struct sigaction

The correlation of the (single) uapi definition for 'struct sigaction'
under '#ifndef __KERNEL__':

    31-bit: sys_sigaction -> uapi struct sigaction
    31-bit: sys_rt_sigaction -> no structure available

    64-bit: sys_sigaction -> no structure available
    64-bit: sys_rt_sigaction -> uapi struct sigaction

This is quite confusing. To make it a bit less confusing make the
uapi definition of 'struct sigaction' usable for sys_rt_sigaction for
both 31-bit and 64-bit.

Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 49d23a85
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -97,22 +97,31 @@ typedef unsigned long sigset_t;
#include <asm-generic/signal-defs.h>

#ifndef __KERNEL__
/* Here we must cater to libcs that poke about in kernel headers.  */

/*
 * There are two system calls in regard to sigaction, sys_rt_sigaction
 * and sys_sigaction. Internally the kernel uses the struct old_sigaction
 * for the older sys_sigaction system call, and the kernel version of the
 * struct sigaction for the newer sys_rt_sigaction.
 *
 * The uapi definition for struct sigaction has made a strange distinction
 * between 31-bit and 64-bit in the past. For 64-bit the uapi structure
 * looks like the kernel struct sigaction, but for 31-bit it used to
 * look like the kernel struct old_sigaction. That practically made the
 * structure unusable for either system call. To get around this problem
 * the glibc always had its own definitions for the sigaction structures.
 *
 * The current struct sigaction uapi definition below is suitable for the
 * sys_rt_sigaction system call only.
 */
struct sigaction {
        union {
          __sighandler_t _sa_handler;
          void (*_sa_sigaction)(int, struct siginfo *, void *);
        } _u;
#ifndef __s390x__ /* lovely */
        sigset_t sa_mask;
        unsigned long sa_flags;
        void (*sa_restorer)(void);
#else  /* __s390x__ */
        unsigned long sa_flags;
        void (*sa_restorer)(void);
	sigset_t sa_mask;
#endif /* __s390x__ */
};

#define sa_handler      _u._sa_handler