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 <aman...@gmail.com>
---
 arch/mips/include/asm/compat.h | 62 ++++++++++++++++++++++--------------------
 1 file changed, 33 insertions(+), 29 deletions(-)

diff --git a/arch/mips/include/asm/compat.h b/arch/mips/include/asm/compat.h
index 1e5ba38..3ccb126 100644
--- a/arch/mips/include/asm/compat.h
+++ b/arch/mips/include/asm/compat.h
@@ -130,10 +130,10 @@ typedef union compat_sigval {
        compat_uptr_t   sival_ptr;
 } compat_sigval_t;
 
+/* We can't use generic compat_siginfo_t because our si_code and si_errno are 
swapped */
 #define HAVE_ARCH_COMPAT_SIGINFO_T
 #define HAVE_ARCH_COPY_SIGINFO_TO_USER32
 #define HAVE_ARCH_COPY_SIGINFO_FROM_USER32
-#define SI_PAD_SIZE32  (128/sizeof(int) - 3)
 
 typedef struct compat_siginfo {
        int si_signo;
@@ -141,57 +141,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;
 
-- 
2.6.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to