signal/mips: switch mips to generic siginfo
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 9 Jul 2017 21:14:25 +0000 (17:14 -0400)
committerEric W. Biederman <ebiederm@xmission.com>
Fri, 12 Jan 2018 20:34:48 +0000 (14:34 -0600)
... having taught the latter that si_errno and si_code might be
swapped.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
arch/mips/include/uapi/asm/siginfo.h
include/uapi/asm-generic/siginfo.h

index f17d8163dec6a7a49a0bd06b26ab7d563497c4b1..262504bd59a5f9c199d5843309dbdcb5ea5c7162 100644 (file)
@@ -14,8 +14,6 @@
 #define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(long) + 2*sizeof(int))
 #undef __ARCH_SI_TRAPNO /* exception code needs to fill this ...  */
 
-#define HAVE_ARCH_SIGINFO_T
-
 /*
  * Careful to keep union _sifields from shifting ...
  */
 #error _MIPS_SZLONG neither 32 nor 64
 #endif
 
-#define __ARCH_SIGSYS
+#define __ARCH_HAS_SWAPPED_SIGINFO
 
 #include <asm-generic/siginfo.h>
 
-/* We can't use generic siginfo_t, because our si_code and si_errno are swapped */
-typedef struct siginfo {
-       int si_signo;
-       int si_code;
-       int si_errno;
-       int __pad0[SI_MAX_SIZE / sizeof(int) - SI_PAD_SIZE - 3];
-
-       union {
-               int _pad[SI_PAD_SIZE];
-
-               /* kill() */
-               struct {
-                       __kernel_pid_t _pid;    /* sender's pid */
-                       __ARCH_SI_UID_T _uid;   /* sender's uid */
-               } _kill;
-
-               /* POSIX.1b timers */
-               struct {
-                       __kernel_timer_t _tid;  /* timer id */
-                       int _overrun;           /* overrun count */
-                       char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
-                       sigval_t _sigval;       /* same as below */
-                       int _sys_private;       /* not to be passed to user */
-               } _timer;
-
-               /* POSIX.1b signals */
-               struct {
-                       __kernel_pid_t _pid;    /* sender's pid */
-                       __ARCH_SI_UID_T _uid;   /* sender's uid */
-                       sigval_t _sigval;
-               } _rt;
-
-               /* SIGCHLD */
-               struct {
-                       __kernel_pid_t _pid;    /* which child */
-                       __ARCH_SI_UID_T _uid;   /* sender's uid */
-                       int _status;            /* exit code */
-                       __kernel_clock_t _utime;
-                       __kernel_clock_t _stime;
-               } _sigchld;
-
-               /* IRIX SIGCHLD */
-               struct {
-                       __kernel_pid_t _pid;    /* which child */
-                       __kernel_clock_t _utime;
-                       int _status;            /* exit code */
-                       __kernel_clock_t _stime;
-               } _irix_sigchld;
-
-               /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
-               struct {
-                       void __user *_addr; /* faulting insn/memory ref. */
-#ifdef __ARCH_SI_TRAPNO
-                       int _trapno;    /* TRAP # which caused the signal */
-#endif
-                       short _addr_lsb;
-                       union {
-                               /* used when si_code=SEGV_BNDERR */
-                               struct {
-                                       void __user *_lower;
-                                       void __user *_upper;
-                               } _addr_bnd;
-                               /* used when si_code=SEGV_PKUERR */
-                               __u32 _pkey;
-                       };
-               } _sigfault;
-
-               /* SIGPOLL, SIGXFSZ (To do ...)  */
-               struct {
-                       __ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
-                       int _fd;
-               } _sigpoll;
-
-               /* SIGSYS */
-               struct {
-                       void __user *_call_addr; /* calling user insn */
-                       int _syscall;   /* triggering system call number */
-                       unsigned int _arch;     /* AUDIT_ARCH_* of syscall */
-               } _sigsys;
-       } _sifields;
-} siginfo_t;
-
 /*
  * si_code values
  * Again these have been chosen to be IRIX compatible.
index 1555805c5ac866978c2f6ea0fa9d036d87aa58f3..00829f74dcb6c70839ece743d03d99aee6b37d30 100644 (file)
@@ -48,8 +48,13 @@ typedef union sigval {
 
 typedef struct siginfo {
        int si_signo;
+#ifndef __ARCH_HAS_SWAPPED_SIGINFO
        int si_errno;
        int si_code;
+#else
+       int si_code;
+       int si_errno;
+#endif
 
        union {
                int _pad[SI_PAD_SIZE];