MIPS: Clean up compat_siginfo_t
authorAmanieu d'Antras <amanieu@gmail.com>
Thu, 5 Nov 2015 00:50:24 +0000 (00:50 +0000)
committerRalf Baechle <ralf@linux-mips.org>
Thu, 12 Nov 2015 10:35:47 +0000 (11:35 +0100)
While mips can't use the generic compat_siginfo_t directly because
its si_code and si_errno are inverted, we can still make it as
close to the generic version as possible. This makes it easier
to update when new members are added to siginfo_t.

The main changes are adding a missing _sigsys union member and
eliminating the unused _irix_sigchld one.

Signed-off-by: Amanieu d'Antras <amanieu@gmail.com>
Cc: linux-kernel@vger.kernel.org
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/11455/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/compat.h

index c4bd54a7f5ce1675de61705a5b8779846e012589..a9580097cba8fe0d7db36793c8f8cf831323579e 100644 (file)
@@ -130,6 +130,8 @@ typedef union compat_sigval {
        compat_uptr_t   sival_ptr;
 } compat_sigval_t;
 
+/* Can't use the generic version because si_code and si_errno are swapped */
+
 #define SI_PAD_SIZE32  (128/sizeof(int) - 3)
 
 typedef struct compat_siginfo {
@@ -138,57 +140,61 @@ typedef struct compat_siginfo {
        int si_errno;
 
        union {
-               int _pad[SI_PAD_SIZE32];
+               int _pad[128 / sizeof(int) - 3];
 
                /* kill() */
                struct {
                        compat_pid_t _pid;      /* sender's pid */
-                       __compat_uid_t _uid;    /* sender's uid */
+                       __compat_uid32_t _uid;  /* sender's uid */
                } _kill;
 
+               /* POSIX.1b timers */
+               struct {
+                       compat_timer_t _tid;    /* timer id */
+                       int _overrun;           /* overrun count */
+                       compat_sigval_t _sigval;        /* same as below */
+               } _timer;
+
+               /* POSIX.1b signals */
+               struct {
+                       compat_pid_t _pid;      /* sender's pid */
+                       __compat_uid32_t _uid;  /* sender's uid */
+                       compat_sigval_t _sigval;
+               } _rt;
+
                /* SIGCHLD */
                struct {
                        compat_pid_t _pid;      /* which child */
-                       __compat_uid_t _uid;    /* sender's uid */
+                       __compat_uid32_t _uid;  /* sender's uid */
                        int _status;            /* exit code */
                        compat_clock_t _utime;
                        compat_clock_t _stime;
                } _sigchld;
 
-               /* IRIX SIGCHLD */
-               struct {
-                       compat_pid_t _pid;      /* which child */
-                       compat_clock_t _utime;
-                       int _status;            /* exit code */
-                       compat_clock_t _stime;
-               } _irix_sigchld;
-
                /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
                struct {
-                       s32 _addr; /* faulting insn/memory ref. */
+                       compat_uptr_t _addr;    /* faulting insn/memory ref. */
+#ifdef __ARCH_SI_TRAPNO
+                       int _trapno;    /* TRAP # which caused the signal */
+#endif
+                       short _addr_lsb; /* LSB of the reported address */
+                       struct {
+                               compat_uptr_t _lower;
+                               compat_uptr_t _upper;
+                       } _addr_bnd;
                } _sigfault;
 
-               /* SIGPOLL, SIGXFSZ (To do ...)  */
+               /* SIGPOLL */
                struct {
-                       int _band;      /* POLL_IN, POLL_OUT, POLL_MSG */
+                       compat_long_t _band; /* POLL_IN, POLL_OUT, POLL_MSG */
                        int _fd;
                } _sigpoll;
 
-               /* POSIX.1b timers */
-               struct {
-                       timer_t _tid;           /* timer id */
-                       int _overrun;           /* overrun count */
-                       compat_sigval_t _sigval;/* same as below */
-                       int _sys_private;       /* not to be passed to user */
-               } _timer;
-
-               /* POSIX.1b signals */
                struct {
-                       compat_pid_t _pid;      /* sender's pid */
-                       __compat_uid_t _uid;    /* sender's uid */
-                       compat_sigval_t _sigval;
-               } _rt;
-
+                       compat_uptr_t _call_addr; /* calling insn */
+                       int _syscall;   /* triggering system call number */
+                       compat_uint_t _arch;    /* AUDIT_ARCH_* of syscall */
+               } _sigsys;
        } _sifields;
 } compat_siginfo_t;