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: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
@@ -97,22 +97,31 @@ typedef unsigned long sigset_t;
|
|||||||
#include <asm-generic/signal-defs.h>
|
#include <asm-generic/signal-defs.h>
|
||||||
|
|
||||||
#ifndef __KERNEL__
|
#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 {
|
struct sigaction {
|
||||||
union {
|
union {
|
||||||
__sighandler_t _sa_handler;
|
__sighandler_t _sa_handler;
|
||||||
void (*_sa_sigaction)(int, struct siginfo *, void *);
|
void (*_sa_sigaction)(int, struct siginfo *, void *);
|
||||||
} _u;
|
} _u;
|
||||||
#ifndef __s390x__ /* lovely */
|
|
||||||
sigset_t sa_mask;
|
|
||||||
unsigned long sa_flags;
|
|
||||||
void (*sa_restorer)(void);
|
|
||||||
#else /* __s390x__ */
|
|
||||||
unsigned long sa_flags;
|
unsigned long sa_flags;
|
||||||
void (*sa_restorer)(void);
|
void (*sa_restorer)(void);
|
||||||
sigset_t sa_mask;
|
sigset_t sa_mask;
|
||||||
#endif /* __s390x__ */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define sa_handler _u._sa_handler
|
#define sa_handler _u._sa_handler
|
||||||
|
Reference in New Issue
Block a user