aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2017-07-16 23:36:59 -0400
committerEric W. Biederman <ebiederm@xmission.com>2017-07-24 15:30:28 -0400
commitcc731525f26af85a1c3537da41e0abd1d35e0bdb (patch)
tree5badfc64a4a161cc6bc869ca376b019aaa937d2f
parentd08477aa975e97f1dc64c0ae59cebf98520456ce (diff)
signal: Remove kernel interal si_code magic
struct siginfo is a union and the kernel since 2.4 has been hiding a union tag in the high 16bits of si_code using the values: __SI_KILL __SI_TIMER __SI_POLL __SI_FAULT __SI_CHLD __SI_RT __SI_MESGQ __SI_SYS While this looks plausible on the surface, in practice this situation has not worked well. - Injected positive signals are not copied to user space properly unless they have these magic high bits set. - Injected positive signals are not reported properly by signalfd unless they have these magic high bits set. - These kernel internal values leaked to userspace via ptrace_peek_siginfo - It was possible to inject these kernel internal values and cause the the kernel to misbehave. - Kernel developers got confused and expected these kernel internal values in userspace in kernel self tests. - Kernel developers got confused and set si_code to __SI_FAULT which is SI_USER in userspace which causes userspace to think an ordinary user sent the signal and that it was not kernel generated. - The values make it impossible to reorganize the code to transform siginfo_copy_to_user into a plain copy_to_user. As si_code must be massaged before being passed to userspace. So remove these kernel internal si codes and make the kernel code simpler and more maintainable. To replace these kernel internal magic si_codes introduce the helper function siginfo_layout, that takes a signal number and an si_code and computes which union member of siginfo is being used. Have siginfo_layout return an enumeration so that gcc will have enough information to warn if a switch statement does not handle all of union members. A couple of architectures have a messed up ABI that defines signal specific duplications of SI_USER which causes more special cases in siginfo_layout than I would like. The good news is only problem architectures pay the cost. Update all of the code that used the previous magic __SI_ values to use the new SIL_ values and to call siginfo_layout to get those values. Escept where not all of the cases are handled remove the defaults in the switch statements so that if a new case is missed in the future the lack will show up at compile time. Modify the code that copies siginfo si_code to userspace to just copy the value and not cast si_code to a short first. The high bits are no longer used to hold a magic union member. Fixup the siginfo header files to stop including the __SI_ values in their constants and for the headers that were missing it to properly update the number of si_codes for each signal type. The fixes to copy_siginfo_from_user32 implementations has the interesting property that several of them perviously should never have worked as the __SI_ values they depended up where kernel internal. With that dependency gone those implementations should work much better. The idea of not passing the __SI_ values out to userspace and then not reinserting them has been tested with criu and criu worked without changes. Ref: 2.4.0-test1 Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
-rw-r--r--arch/alpha/include/uapi/asm/siginfo.h4
-rw-r--r--arch/arm64/kernel/signal32.c23
-rw-r--r--arch/blackfin/include/uapi/asm/siginfo.h30
-rw-r--r--arch/frv/include/uapi/asm/siginfo.h2
-rw-r--r--arch/ia64/include/uapi/asm/siginfo.h20
-rw-r--r--arch/ia64/kernel/signal.c17
-rw-r--r--arch/mips/include/uapi/asm/siginfo.h6
-rw-r--r--arch/mips/kernel/signal32.c19
-rw-r--r--arch/parisc/kernel/signal32.c31
-rw-r--r--arch/powerpc/kernel/signal_32.c20
-rw-r--r--arch/s390/kernel/compat_signal.c32
-rw-r--r--arch/sparc/include/uapi/asm/siginfo.h4
-rw-r--r--arch/sparc/kernel/signal32.c16
-rw-r--r--arch/tile/include/uapi/asm/siginfo.h4
-rw-r--r--arch/tile/kernel/compat_signal.c18
-rw-r--r--arch/tile/kernel/traps.c2
-rw-r--r--arch/x86/kernel/signal_compat.c21
-rw-r--r--fs/signalfd.c22
-rw-r--r--include/linux/signal.h14
-rw-r--r--include/uapi/asm-generic/siginfo.h115
-rw-r--r--kernel/exit.c4
-rw-r--r--kernel/ptrace.c6
-rw-r--r--kernel/signal.c72
23 files changed, 257 insertions, 245 deletions
diff --git a/arch/alpha/include/uapi/asm/siginfo.h b/arch/alpha/include/uapi/asm/siginfo.h
index 972f547d9e41..70494d1d8f29 100644
--- a/arch/alpha/include/uapi/asm/siginfo.h
+++ b/arch/alpha/include/uapi/asm/siginfo.h
@@ -10,14 +10,14 @@
10 * SIGFPE si_codes 10 * SIGFPE si_codes
11 */ 11 */
12#ifdef __KERNEL__ 12#ifdef __KERNEL__
13#define FPE_FIXME (__SI_FAULT|0) /* Broken dup of SI_USER */ 13#define FPE_FIXME 0 /* Broken dup of SI_USER */
14#endif /* __KERNEL__ */ 14#endif /* __KERNEL__ */
15 15
16/* 16/*
17 * SIGTRAP si_codes 17 * SIGTRAP si_codes
18 */ 18 */
19#ifdef __KERNEL__ 19#ifdef __KERNEL__
20#define TRAP_FIXME (__SI_FAULT|0) /* Broken dup of SI_USER */ 20#define TRAP_FIXME 0 /* Broken dup of SI_USER */
21#endif /* __KERNEL__ */ 21#endif /* __KERNEL__ */
22 22
23#endif 23#endif
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c
index c747a0fc5d7d..9b95a935c21d 100644
--- a/arch/arm64/kernel/signal32.c
+++ b/arch/arm64/kernel/signal32.c
@@ -142,25 +142,25 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
142 */ 142 */
143 err = __put_user(from->si_signo, &to->si_signo); 143 err = __put_user(from->si_signo, &to->si_signo);
144 err |= __put_user(from->si_errno, &to->si_errno); 144 err |= __put_user(from->si_errno, &to->si_errno);
145 err |= __put_user((short)from->si_code, &to->si_code); 145 err |= __put_user(from->si_code, &to->si_code);
146 if (from->si_code < 0) 146 if (from->si_code < 0)
147 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, 147 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad,
148 SI_PAD_SIZE); 148 SI_PAD_SIZE);
149 else switch (from->si_code & __SI_MASK) { 149 else switch (siginfo_layout(from->si_signo, from->si_code)) {
150 case __SI_KILL: 150 case SIL_KILL:
151 err |= __put_user(from->si_pid, &to->si_pid); 151 err |= __put_user(from->si_pid, &to->si_pid);
152 err |= __put_user(from->si_uid, &to->si_uid); 152 err |= __put_user(from->si_uid, &to->si_uid);
153 break; 153 break;
154 case __SI_TIMER: 154 case SIL_TIMER:
155 err |= __put_user(from->si_tid, &to->si_tid); 155 err |= __put_user(from->si_tid, &to->si_tid);
156 err |= __put_user(from->si_overrun, &to->si_overrun); 156 err |= __put_user(from->si_overrun, &to->si_overrun);
157 err |= __put_user(from->si_int, &to->si_int); 157 err |= __put_user(from->si_int, &to->si_int);
158 break; 158 break;
159 case __SI_POLL: 159 case SIL_POLL:
160 err |= __put_user(from->si_band, &to->si_band); 160 err |= __put_user(from->si_band, &to->si_band);
161 err |= __put_user(from->si_fd, &to->si_fd); 161 err |= __put_user(from->si_fd, &to->si_fd);
162 break; 162 break;
163 case __SI_FAULT: 163 case SIL_FAULT:
164 err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr, 164 err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr,
165 &to->si_addr); 165 &to->si_addr);
166#ifdef BUS_MCEERR_AO 166#ifdef BUS_MCEERR_AO
@@ -173,29 +173,24 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
173 err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb); 173 err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb);
174#endif 174#endif
175 break; 175 break;
176 case __SI_CHLD: 176 case SIL_CHLD:
177 err |= __put_user(from->si_pid, &to->si_pid); 177 err |= __put_user(from->si_pid, &to->si_pid);
178 err |= __put_user(from->si_uid, &to->si_uid); 178 err |= __put_user(from->si_uid, &to->si_uid);
179 err |= __put_user(from->si_status, &to->si_status); 179 err |= __put_user(from->si_status, &to->si_status);
180 err |= __put_user(from->si_utime, &to->si_utime); 180 err |= __put_user(from->si_utime, &to->si_utime);
181 err |= __put_user(from->si_stime, &to->si_stime); 181 err |= __put_user(from->si_stime, &to->si_stime);
182 break; 182 break;
183 case __SI_RT: /* This is not generated by the kernel as of now. */ 183 case SIL_RT:
184 case __SI_MESGQ: /* But this is */
185 err |= __put_user(from->si_pid, &to->si_pid); 184 err |= __put_user(from->si_pid, &to->si_pid);
186 err |= __put_user(from->si_uid, &to->si_uid); 185 err |= __put_user(from->si_uid, &to->si_uid);
187 err |= __put_user(from->si_int, &to->si_int); 186 err |= __put_user(from->si_int, &to->si_int);
188 break; 187 break;
189 case __SI_SYS: 188 case SIL_SYS:
190 err |= __put_user((compat_uptr_t)(unsigned long) 189 err |= __put_user((compat_uptr_t)(unsigned long)
191 from->si_call_addr, &to->si_call_addr); 190 from->si_call_addr, &to->si_call_addr);
192 err |= __put_user(from->si_syscall, &to->si_syscall); 191 err |= __put_user(from->si_syscall, &to->si_syscall);
193 err |= __put_user(from->si_arch, &to->si_arch); 192 err |= __put_user(from->si_arch, &to->si_arch);
194 break; 193 break;
195 default: /* this is just in case for now ... */
196 err |= __put_user(from->si_pid, &to->si_pid);
197 err |= __put_user(from->si_uid, &to->si_uid);
198 break;
199 } 194 }
200 return err; 195 return err;
201} 196}
diff --git a/arch/blackfin/include/uapi/asm/siginfo.h b/arch/blackfin/include/uapi/asm/siginfo.h
index c72f4e6e386f..79dfe3979123 100644
--- a/arch/blackfin/include/uapi/asm/siginfo.h
+++ b/arch/blackfin/include/uapi/asm/siginfo.h
@@ -14,28 +14,36 @@
14 14
15#define si_uid16 _sifields._kill._uid 15#define si_uid16 _sifields._kill._uid
16 16
17#define ILL_ILLPARAOP (__SI_FAULT|2) /* illegal opcode combine ********** */ 17#define ILL_ILLPARAOP 2 /* illegal opcode combine ********** */
18#define ILL_ILLEXCPT (__SI_FAULT|4) /* unrecoverable exception ********** */ 18#define ILL_ILLEXCPT 4 /* unrecoverable exception ********** */
19#define ILL_CPLB_VI (__SI_FAULT|9) /* D/I CPLB protect violation ******** */ 19#define ILL_CPLB_VI 9 /* D/I CPLB protect violation ******** */
20#define ILL_CPLB_MISS (__SI_FAULT|10) /* D/I CPLB miss ******** */ 20#define ILL_CPLB_MISS 10 /* D/I CPLB miss ******** */
21#define ILL_CPLB_MULHIT (__SI_FAULT|11) /* D/I CPLB multiple hit ******** */ 21#define ILL_CPLB_MULHIT 11 /* D/I CPLB multiple hit ******** */
22#undef NSIGILL
23#define NSIGILL 11
22 24
23/* 25/*
24 * SIGBUS si_codes 26 * SIGBUS si_codes
25 */ 27 */
26#define BUS_OPFETCH (__SI_FAULT|4) /* error from instruction fetch ******** */ 28#define BUS_OPFETCH 4 /* error from instruction fetch ******** */
29#undef NSIGBUS
30#define NSIGBUS 4
27 31
28/* 32/*
29 * SIGTRAP si_codes 33 * SIGTRAP si_codes
30 */ 34 */
31#define TRAP_STEP (__SI_FAULT|1) /* single-step breakpoint************* */ 35#define TRAP_STEP 1 /* single-step breakpoint************* */
32#define TRAP_TRACEFLOW (__SI_FAULT|2) /* trace buffer overflow ************* */ 36#define TRAP_TRACEFLOW 2 /* trace buffer overflow ************* */
33#define TRAP_WATCHPT (__SI_FAULT|3) /* watchpoint match ************* */ 37#define TRAP_WATCHPT 3 /* watchpoint match ************* */
34#define TRAP_ILLTRAP (__SI_FAULT|4) /* illegal trap ************* */ 38#define TRAP_ILLTRAP 4 /* illegal trap ************* */
39#undef NSIGTRAP
40#define NSIGTRAP 4
35 41
36/* 42/*
37 * SIGSEGV si_codes 43 * SIGSEGV si_codes
38 */ 44 */
39#define SEGV_STACKFLOW (__SI_FAULT|3) /* stack overflow */ 45#define SEGV_STACKFLOW 3 /* stack overflow */
46#undef NSIGSEGV
47#define NSIGSEGV 3
40 48
41#endif /* _UAPI_BFIN_SIGINFO_H */ 49#endif /* _UAPI_BFIN_SIGINFO_H */
diff --git a/arch/frv/include/uapi/asm/siginfo.h b/arch/frv/include/uapi/asm/siginfo.h
index d3fd1ca45653..f55d9e0e9068 100644
--- a/arch/frv/include/uapi/asm/siginfo.h
+++ b/arch/frv/include/uapi/asm/siginfo.h
@@ -4,7 +4,7 @@
4#include <linux/types.h> 4#include <linux/types.h>
5#include <asm-generic/siginfo.h> 5#include <asm-generic/siginfo.h>
6 6
7#define FPE_MDAOVF (__SI_FAULT|9) /* media overflow */ 7#define FPE_MDAOVF 9 /* media overflow */
8#undef NSIGFPE 8#undef NSIGFPE
9#define NSIGFPE 9 9#define NSIGFPE 9
10 10
diff --git a/arch/ia64/include/uapi/asm/siginfo.h b/arch/ia64/include/uapi/asm/siginfo.h
index 3282f8b992fc..33389fc36f23 100644
--- a/arch/ia64/include/uapi/asm/siginfo.h
+++ b/arch/ia64/include/uapi/asm/siginfo.h
@@ -98,9 +98,9 @@ typedef struct siginfo {
98/* 98/*
99 * SIGILL si_codes 99 * SIGILL si_codes
100 */ 100 */
101#define ILL_BADIADDR (__SI_FAULT|9) /* unimplemented instruction address */ 101#define ILL_BADIADDR 9 /* unimplemented instruction address */
102#define __ILL_BREAK (__SI_FAULT|10) /* illegal break */ 102#define __ILL_BREAK 10 /* illegal break */
103#define __ILL_BNDMOD (__SI_FAULT|11) /* bundle-update (modification) in progress */ 103#define __ILL_BNDMOD 11 /* bundle-update (modification) in progress */
104#undef NSIGILL 104#undef NSIGILL
105#define NSIGILL 11 105#define NSIGILL 11
106 106
@@ -108,20 +108,20 @@ typedef struct siginfo {
108 * SIGFPE si_codes 108 * SIGFPE si_codes
109 */ 109 */
110#ifdef __KERNEL__ 110#ifdef __KERNEL__
111#define FPE_FIXME (__SI_FAULT|0) /* Broken dup of SI_USER */ 111#define FPE_FIXME 0 /* Broken dup of SI_USER */
112#endif /* __KERNEL__ */ 112#endif /* __KERNEL__ */
113#define __FPE_DECOVF (__SI_FAULT|9) /* decimal overflow */ 113#define __FPE_DECOVF 9 /* decimal overflow */
114#define __FPE_DECDIV (__SI_FAULT|10) /* decimal division by zero */ 114#define __FPE_DECDIV 10 /* decimal division by zero */
115#define __FPE_DECERR (__SI_FAULT|11) /* packed decimal error */ 115#define __FPE_DECERR 11 /* packed decimal error */
116#define __FPE_INVASC (__SI_FAULT|12) /* invalid ASCII digit */ 116#define __FPE_INVASC 12 /* invalid ASCII digit */
117#define __FPE_INVDEC (__SI_FAULT|13) /* invalid decimal digit */ 117#define __FPE_INVDEC 13 /* invalid decimal digit */
118#undef NSIGFPE 118#undef NSIGFPE
119#define NSIGFPE 13 119#define NSIGFPE 13
120 120
121/* 121/*
122 * SIGSEGV si_codes 122 * SIGSEGV si_codes
123 */ 123 */
124#define __SEGV_PSTKOVF (__SI_FAULT|4) /* paragraph stack overflow */ 124#define __SEGV_PSTKOVF 4 /* paragraph stack overflow */
125#undef NSIGSEGV 125#undef NSIGSEGV
126#define NSIGSEGV 4 126#define NSIGSEGV 4
127 127
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
index 5db52c6813c4..6146d53b6ad7 100644
--- a/arch/ia64/kernel/signal.c
+++ b/arch/ia64/kernel/signal.c
@@ -124,31 +124,30 @@ copy_siginfo_to_user (siginfo_t __user *to, const siginfo_t *from)
124 */ 124 */
125 err = __put_user(from->si_signo, &to->si_signo); 125 err = __put_user(from->si_signo, &to->si_signo);
126 err |= __put_user(from->si_errno, &to->si_errno); 126 err |= __put_user(from->si_errno, &to->si_errno);
127 err |= __put_user((short)from->si_code, &to->si_code); 127 err |= __put_user(from->si_code, &to->si_code);
128 switch (from->si_code >> 16) { 128 switch (siginfo_layout(from->si_signo, from->si_code)) {
129 case __SI_FAULT >> 16: 129 case SIL_FAULT:
130 err |= __put_user(from->si_flags, &to->si_flags); 130 err |= __put_user(from->si_flags, &to->si_flags);
131 err |= __put_user(from->si_isr, &to->si_isr); 131 err |= __put_user(from->si_isr, &to->si_isr);
132 case __SI_POLL >> 16: 132 case SIL_POLL:
133 err |= __put_user(from->si_addr, &to->si_addr); 133 err |= __put_user(from->si_addr, &to->si_addr);
134 err |= __put_user(from->si_imm, &to->si_imm); 134 err |= __put_user(from->si_imm, &to->si_imm);
135 break; 135 break;
136 case __SI_TIMER >> 16: 136 case SIL_TIMER:
137 err |= __put_user(from->si_tid, &to->si_tid); 137 err |= __put_user(from->si_tid, &to->si_tid);
138 err |= __put_user(from->si_overrun, &to->si_overrun); 138 err |= __put_user(from->si_overrun, &to->si_overrun);
139 err |= __put_user(from->si_ptr, &to->si_ptr); 139 err |= __put_user(from->si_ptr, &to->si_ptr);
140 break; 140 break;
141 case __SI_RT >> 16: /* Not generated by the kernel as of now. */ 141 case SIL_RT:
142 case __SI_MESGQ >> 16:
143 err |= __put_user(from->si_uid, &to->si_uid); 142 err |= __put_user(from->si_uid, &to->si_uid);
144 err |= __put_user(from->si_pid, &to->si_pid); 143 err |= __put_user(from->si_pid, &to->si_pid);
145 err |= __put_user(from->si_ptr, &to->si_ptr); 144 err |= __put_user(from->si_ptr, &to->si_ptr);
146 break; 145 break;
147 case __SI_CHLD >> 16: 146 case SIL_CHLD:
148 err |= __put_user(from->si_utime, &to->si_utime); 147 err |= __put_user(from->si_utime, &to->si_utime);
149 err |= __put_user(from->si_stime, &to->si_stime); 148 err |= __put_user(from->si_stime, &to->si_stime);
150 err |= __put_user(from->si_status, &to->si_status); 149 err |= __put_user(from->si_status, &to->si_status);
151 default: 150 case SIL_KILL:
152 err |= __put_user(from->si_uid, &to->si_uid); 151 err |= __put_user(from->si_uid, &to->si_uid);
153 err |= __put_user(from->si_pid, &to->si_pid); 152 err |= __put_user(from->si_pid, &to->si_pid);
154 break; 153 break;
diff --git a/arch/mips/include/uapi/asm/siginfo.h b/arch/mips/include/uapi/asm/siginfo.h
index 9becfd102132..22a86d84a504 100644
--- a/arch/mips/include/uapi/asm/siginfo.h
+++ b/arch/mips/include/uapi/asm/siginfo.h
@@ -120,14 +120,14 @@ typedef struct siginfo {
120#undef SI_TIMER 120#undef SI_TIMER
121#undef SI_MESGQ 121#undef SI_MESGQ
122#define SI_ASYNCIO -2 /* sent by AIO completion */ 122#define SI_ASYNCIO -2 /* sent by AIO completion */
123#define SI_TIMER __SI_CODE(__SI_TIMER, -3) /* sent by timer expiration */ 123#define SI_TIMER -3 /* sent by timer expiration */
124#define SI_MESGQ __SI_CODE(__SI_MESGQ, -4) /* sent by real time mesq state change */ 124#define SI_MESGQ -4 /* sent by real time mesq state change */
125 125
126/* 126/*
127 * SIGFPE si_codes 127 * SIGFPE si_codes
128 */ 128 */
129#ifdef __KERNEL__ 129#ifdef __KERNEL__
130#define FPE_FIXME (__SI_FAULT|0) /* Broken dup of SI_USER */ 130#define FPE_FIXME 0 /* Broken dup of SI_USER */
131#endif /* __KERNEL__ */ 131#endif /* __KERNEL__ */
132 132
133#endif /* _UAPI_ASM_SIGINFO_H */ 133#endif /* _UAPI_ASM_SIGINFO_H */
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c
index 84165f2b31ff..cf5c7c05e5a3 100644
--- a/arch/mips/kernel/signal32.c
+++ b/arch/mips/kernel/signal32.c
@@ -93,38 +93,37 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
93 at the same time. */ 93 at the same time. */
94 err = __put_user(from->si_signo, &to->si_signo); 94 err = __put_user(from->si_signo, &to->si_signo);
95 err |= __put_user(from->si_errno, &to->si_errno); 95 err |= __put_user(from->si_errno, &to->si_errno);
96 err |= __put_user((short)from->si_code, &to->si_code); 96 err |= __put_user(from->si_code, &to->si_code);
97 if (from->si_code < 0) 97 if (from->si_code < 0)
98 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE); 98 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
99 else { 99 else {
100 switch (from->si_code >> 16) { 100 switch (siginfo_layout(from->si_signo, from->si_code)) {
101 case __SI_TIMER >> 16: 101 case SIL_TIMER:
102 err |= __put_user(from->si_tid, &to->si_tid); 102 err |= __put_user(from->si_tid, &to->si_tid);
103 err |= __put_user(from->si_overrun, &to->si_overrun); 103 err |= __put_user(from->si_overrun, &to->si_overrun);
104 err |= __put_user(from->si_int, &to->si_int); 104 err |= __put_user(from->si_int, &to->si_int);
105 break; 105 break;
106 case __SI_CHLD >> 16: 106 case SIL_CHLD:
107 err |= __put_user(from->si_utime, &to->si_utime); 107 err |= __put_user(from->si_utime, &to->si_utime);
108 err |= __put_user(from->si_stime, &to->si_stime); 108 err |= __put_user(from->si_stime, &to->si_stime);
109 err |= __put_user(from->si_status, &to->si_status); 109 err |= __put_user(from->si_status, &to->si_status);
110 default: 110 case SIL_KILL:
111 err |= __put_user(from->si_pid, &to->si_pid); 111 err |= __put_user(from->si_pid, &to->si_pid);
112 err |= __put_user(from->si_uid, &to->si_uid); 112 err |= __put_user(from->si_uid, &to->si_uid);
113 break; 113 break;
114 case __SI_FAULT >> 16: 114 case SIL_FAULT:
115 err |= __put_user((unsigned long)from->si_addr, &to->si_addr); 115 err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
116 break; 116 break;
117 case __SI_POLL >> 16: 117 case SIL_POLL:
118 err |= __put_user(from->si_band, &to->si_band); 118 err |= __put_user(from->si_band, &to->si_band);
119 err |= __put_user(from->si_fd, &to->si_fd); 119 err |= __put_user(from->si_fd, &to->si_fd);
120 break; 120 break;
121 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */ 121 case SIL_RT:
122 case __SI_MESGQ >> 16:
123 err |= __put_user(from->si_pid, &to->si_pid); 122 err |= __put_user(from->si_pid, &to->si_pid);
124 err |= __put_user(from->si_uid, &to->si_uid); 123 err |= __put_user(from->si_uid, &to->si_uid);
125 err |= __put_user(from->si_int, &to->si_int); 124 err |= __put_user(from->si_int, &to->si_int);
126 break; 125 break;
127 case __SI_SYS >> 16: 126 case SIL_SYS:
128 err |= __copy_to_user(&to->si_call_addr, &from->si_call_addr, 127 err |= __copy_to_user(&to->si_call_addr, &from->si_call_addr,
129 sizeof(compat_uptr_t)); 128 sizeof(compat_uptr_t));
130 err |= __put_user(from->si_syscall, &to->si_syscall); 129 err |= __put_user(from->si_syscall, &to->si_syscall);
diff --git a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c
index 70aaabb8b3cb..9e0cb6a577d6 100644
--- a/arch/parisc/kernel/signal32.c
+++ b/arch/parisc/kernel/signal32.c
@@ -290,25 +290,25 @@ copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from)
290 if (to->si_code < 0) 290 if (to->si_code < 0)
291 err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE); 291 err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
292 else { 292 else {
293 switch (to->si_code >> 16) { 293 switch (siginfo_layout(to->si_signo, to->si_code)) {
294 case __SI_CHLD >> 16: 294 case SIL_CHLD:
295 err |= __get_user(to->si_utime, &from->si_utime); 295 err |= __get_user(to->si_utime, &from->si_utime);
296 err |= __get_user(to->si_stime, &from->si_stime); 296 err |= __get_user(to->si_stime, &from->si_stime);
297 err |= __get_user(to->si_status, &from->si_status); 297 err |= __get_user(to->si_status, &from->si_status);
298 default: 298 default:
299 case SIL_KILL:
299 err |= __get_user(to->si_pid, &from->si_pid); 300 err |= __get_user(to->si_pid, &from->si_pid);
300 err |= __get_user(to->si_uid, &from->si_uid); 301 err |= __get_user(to->si_uid, &from->si_uid);
301 break; 302 break;
302 case __SI_FAULT >> 16: 303 case SIL_FAULT:
303 err |= __get_user(addr, &from->si_addr); 304 err |= __get_user(addr, &from->si_addr);
304 to->si_addr = compat_ptr(addr); 305 to->si_addr = compat_ptr(addr);
305 break; 306 break;
306 case __SI_POLL >> 16: 307 case SIL_POLL:
307 err |= __get_user(to->si_band, &from->si_band); 308 err |= __get_user(to->si_band, &from->si_band);
308 err |= __get_user(to->si_fd, &from->si_fd); 309 err |= __get_user(to->si_fd, &from->si_fd);
309 break; 310 break;
310 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */ 311 case SIL_RT:
311 case __SI_MESGQ >> 16:
312 err |= __get_user(to->si_pid, &from->si_pid); 312 err |= __get_user(to->si_pid, &from->si_pid);
313 err |= __get_user(to->si_uid, &from->si_uid); 313 err |= __get_user(to->si_uid, &from->si_uid);
314 err |= __get_user(to->si_int, &from->si_int); 314 err |= __get_user(to->si_int, &from->si_int);
@@ -337,41 +337,40 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, const siginfo_t *from)
337 at the same time. */ 337 at the same time. */
338 err = __put_user(from->si_signo, &to->si_signo); 338 err = __put_user(from->si_signo, &to->si_signo);
339 err |= __put_user(from->si_errno, &to->si_errno); 339 err |= __put_user(from->si_errno, &to->si_errno);
340 err |= __put_user((short)from->si_code, &to->si_code); 340 err |= __put_user(from->si_code, &to->si_code);
341 if (from->si_code < 0) 341 if (from->si_code < 0)
342 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE); 342 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
343 else { 343 else {
344 switch (from->si_code >> 16) { 344 switch (siginfo_layout(from->si_signo, from->si_code)) {
345 case __SI_CHLD >> 16: 345 case SIL_CHLD:
346 err |= __put_user(from->si_utime, &to->si_utime); 346 err |= __put_user(from->si_utime, &to->si_utime);
347 err |= __put_user(from->si_stime, &to->si_stime); 347 err |= __put_user(from->si_stime, &to->si_stime);
348 err |= __put_user(from->si_status, &to->si_status); 348 err |= __put_user(from->si_status, &to->si_status);
349 default: 349 case SIL_KILL:
350 err |= __put_user(from->si_pid, &to->si_pid); 350 err |= __put_user(from->si_pid, &to->si_pid);
351 err |= __put_user(from->si_uid, &to->si_uid); 351 err |= __put_user(from->si_uid, &to->si_uid);
352 break; 352 break;
353 case __SI_FAULT >> 16: 353 case SIL_FAULT:
354 addr = ptr_to_compat(from->si_addr); 354 addr = ptr_to_compat(from->si_addr);
355 err |= __put_user(addr, &to->si_addr); 355 err |= __put_user(addr, &to->si_addr);
356 break; 356 break;
357 case __SI_POLL >> 16: 357 case SIL_POLL:
358 err |= __put_user(from->si_band, &to->si_band); 358 err |= __put_user(from->si_band, &to->si_band);
359 err |= __put_user(from->si_fd, &to->si_fd); 359 err |= __put_user(from->si_fd, &to->si_fd);
360 break; 360 break;
361 case __SI_TIMER >> 16: 361 case SIL_TIMER:
362 err |= __put_user(from->si_tid, &to->si_tid); 362 err |= __put_user(from->si_tid, &to->si_tid);
363 err |= __put_user(from->si_overrun, &to->si_overrun); 363 err |= __put_user(from->si_overrun, &to->si_overrun);
364 val = (compat_int_t)from->si_int; 364 val = (compat_int_t)from->si_int;
365 err |= __put_user(val, &to->si_int); 365 err |= __put_user(val, &to->si_int);
366 break; 366 break;
367 case __SI_RT >> 16: /* Not generated by the kernel as of now. */ 367 case SIL_RT:
368 case __SI_MESGQ >> 16:
369 err |= __put_user(from->si_uid, &to->si_uid); 368 err |= __put_user(from->si_uid, &to->si_uid);
370 err |= __put_user(from->si_pid, &to->si_pid); 369 err |= __put_user(from->si_pid, &to->si_pid);
371 val = (compat_int_t)from->si_int; 370 val = (compat_int_t)from->si_int;
372 err |= __put_user(val, &to->si_int); 371 err |= __put_user(val, &to->si_int);
373 break; 372 break;
374 case __SI_SYS >> 16: 373 case SIL_SYS:
375 err |= __put_user(ptr_to_compat(from->si_call_addr), &to->si_call_addr); 374 err |= __put_user(ptr_to_compat(from->si_call_addr), &to->si_call_addr);
376 err |= __put_user(from->si_syscall, &to->si_syscall); 375 err |= __put_user(from->si_syscall, &to->si_syscall);
377 err |= __put_user(from->si_arch, &to->si_arch); 376 err |= __put_user(from->si_arch, &to->si_arch);
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 97bb1385e771..92fb1c8dbbd8 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -913,42 +913,40 @@ int copy_siginfo_to_user32(struct compat_siginfo __user *d, const siginfo_t *s)
913 */ 913 */
914 err = __put_user(s->si_signo, &d->si_signo); 914 err = __put_user(s->si_signo, &d->si_signo);
915 err |= __put_user(s->si_errno, &d->si_errno); 915 err |= __put_user(s->si_errno, &d->si_errno);
916 err |= __put_user((short)s->si_code, &d->si_code); 916 err |= __put_user(s->si_code, &d->si_code);
917 if (s->si_code < 0) 917 if (s->si_code < 0)
918 err |= __copy_to_user(&d->_sifields._pad, &s->_sifields._pad, 918 err |= __copy_to_user(&d->_sifields._pad, &s->_sifields._pad,
919 SI_PAD_SIZE32); 919 SI_PAD_SIZE32);
920 else switch(s->si_code >> 16) { 920 else switch(siginfo_layout(s->si_signo, s->si_code)) {
921 case __SI_CHLD >> 16: 921 case SIL_CHLD:
922 err |= __put_user(s->si_pid, &d->si_pid); 922 err |= __put_user(s->si_pid, &d->si_pid);
923 err |= __put_user(s->si_uid, &d->si_uid); 923 err |= __put_user(s->si_uid, &d->si_uid);
924 err |= __put_user(s->si_utime, &d->si_utime); 924 err |= __put_user(s->si_utime, &d->si_utime);
925 err |= __put_user(s->si_stime, &d->si_stime); 925 err |= __put_user(s->si_stime, &d->si_stime);
926 err |= __put_user(s->si_status, &d->si_status); 926 err |= __put_user(s->si_status, &d->si_status);
927 break; 927 break;
928 case __SI_FAULT >> 16: 928 case SIL_FAULT:
929 err |= __put_user((unsigned int)(unsigned long)s->si_addr, 929 err |= __put_user((unsigned int)(unsigned long)s->si_addr,
930 &d->si_addr); 930 &d->si_addr);
931 break; 931 break;
932 case __SI_POLL >> 16: 932 case SIL_POLL:
933 err |= __put_user(s->si_band, &d->si_band); 933 err |= __put_user(s->si_band, &d->si_band);
934 err |= __put_user(s->si_fd, &d->si_fd); 934 err |= __put_user(s->si_fd, &d->si_fd);
935 break; 935 break;
936 case __SI_TIMER >> 16: 936 case SIL_TIMER:
937 err |= __put_user(s->si_tid, &d->si_tid); 937 err |= __put_user(s->si_tid, &d->si_tid);
938 err |= __put_user(s->si_overrun, &d->si_overrun); 938 err |= __put_user(s->si_overrun, &d->si_overrun);
939 err |= __put_user(s->si_int, &d->si_int); 939 err |= __put_user(s->si_int, &d->si_int);
940 break; 940 break;
941 case __SI_SYS >> 16: 941 case SIL_SYS:
942 err |= __put_user(ptr_to_compat(s->si_call_addr), &d->si_call_addr); 942 err |= __put_user(ptr_to_compat(s->si_call_addr), &d->si_call_addr);
943 err |= __put_user(s->si_syscall, &d->si_syscall); 943 err |= __put_user(s->si_syscall, &d->si_syscall);
944 err |= __put_user(s->si_arch, &d->si_arch); 944 err |= __put_user(s->si_arch, &d->si_arch);
945 break; 945 break;
946 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */ 946 case SIL_RT:
947 case __SI_MESGQ >> 16:
948 err |= __put_user(s->si_int, &d->si_int); 947 err |= __put_user(s->si_int, &d->si_int);
949 /* fallthrough */ 948 /* fallthrough */
950 case __SI_KILL >> 16: 949 case SIL_KILL:
951 default:
952 err |= __put_user(s->si_pid, &d->si_pid); 950 err |= __put_user(s->si_pid, &d->si_pid);
953 err |= __put_user(s->si_uid, &d->si_uid); 951 err |= __put_user(s->si_uid, &d->si_uid);
954 break; 952 break;
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c
index c620049c61f2..f549c4657376 100644
--- a/arch/s390/kernel/compat_signal.c
+++ b/arch/s390/kernel/compat_signal.c
@@ -75,35 +75,34 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
75 at the same time. */ 75 at the same time. */
76 err = __put_user(from->si_signo, &to->si_signo); 76 err = __put_user(from->si_signo, &to->si_signo);
77 err |= __put_user(from->si_errno, &to->si_errno); 77 err |= __put_user(from->si_errno, &to->si_errno);
78 err |= __put_user((short)from->si_code, &to->si_code); 78 err |= __put_user(from->si_code, &to->si_code);
79 if (from->si_code < 0) 79 if (from->si_code < 0)
80 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE); 80 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
81 else { 81 else {
82 switch (from->si_code >> 16) { 82 switch (siginfo_layout(from->si_signo, from->si_code)) {
83 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */ 83 case SIL_RT:
84 case __SI_MESGQ >> 16:
85 err |= __put_user(from->si_int, &to->si_int); 84 err |= __put_user(from->si_int, &to->si_int);
86 /* fallthrough */ 85 /* fallthrough */
87 case __SI_KILL >> 16: 86 case SIL_KILL:
88 err |= __put_user(from->si_pid, &to->si_pid); 87 err |= __put_user(from->si_pid, &to->si_pid);
89 err |= __put_user(from->si_uid, &to->si_uid); 88 err |= __put_user(from->si_uid, &to->si_uid);
90 break; 89 break;
91 case __SI_CHLD >> 16: 90 case SIL_CHLD:
92 err |= __put_user(from->si_pid, &to->si_pid); 91 err |= __put_user(from->si_pid, &to->si_pid);
93 err |= __put_user(from->si_uid, &to->si_uid); 92 err |= __put_user(from->si_uid, &to->si_uid);
94 err |= __put_user(from->si_utime, &to->si_utime); 93 err |= __put_user(from->si_utime, &to->si_utime);
95 err |= __put_user(from->si_stime, &to->si_stime); 94 err |= __put_user(from->si_stime, &to->si_stime);
96 err |= __put_user(from->si_status, &to->si_status); 95 err |= __put_user(from->si_status, &to->si_status);
97 break; 96 break;
98 case __SI_FAULT >> 16: 97 case SIL_FAULT:
99 err |= __put_user((unsigned long) from->si_addr, 98 err |= __put_user((unsigned long) from->si_addr,
100 &to->si_addr); 99 &to->si_addr);
101 break; 100 break;
102 case __SI_POLL >> 16: 101 case SIL_POLL:
103 err |= __put_user(from->si_band, &to->si_band); 102 err |= __put_user(from->si_band, &to->si_band);
104 err |= __put_user(from->si_fd, &to->si_fd); 103 err |= __put_user(from->si_fd, &to->si_fd);
105 break; 104 break;
106 case __SI_TIMER >> 16: 105 case SIL_TIMER:
107 err |= __put_user(from->si_tid, &to->si_tid); 106 err |= __put_user(from->si_tid, &to->si_tid);
108 err |= __put_user(from->si_overrun, &to->si_overrun); 107 err |= __put_user(from->si_overrun, &to->si_overrun);
109 err |= __put_user(from->si_int, &to->si_int); 108 err |= __put_user(from->si_int, &to->si_int);
@@ -127,32 +126,31 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
127 if (to->si_code < 0) 126 if (to->si_code < 0)
128 err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE); 127 err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
129 else { 128 else {
130 switch (to->si_code >> 16) { 129 switch (siginfo_layout(to->si_signo, to->si_code)) {
131 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */ 130 case SIL_RT:
132 case __SI_MESGQ >> 16:
133 err |= __get_user(to->si_int, &from->si_int); 131 err |= __get_user(to->si_int, &from->si_int);
134 /* fallthrough */ 132 /* fallthrough */
135 case __SI_KILL >> 16: 133 case SIL_KILL:
136 err |= __get_user(to->si_pid, &from->si_pid); 134 err |= __get_user(to->si_pid, &from->si_pid);
137 err |= __get_user(to->si_uid, &from->si_uid); 135 err |= __get_user(to->si_uid, &from->si_uid);
138 break; 136 break;
139 case __SI_CHLD >> 16: 137 case SIL_CHLD:
140 err |= __get_user(to->si_pid, &from->si_pid); 138 err |= __get_user(to->si_pid, &from->si_pid);
141 err |= __get_user(to->si_uid, &from->si_uid); 139 err |= __get_user(to->si_uid, &from->si_uid);
142 err |= __get_user(to->si_utime, &from->si_utime); 140 err |= __get_user(to->si_utime, &from->si_utime);
143 err |= __get_user(to->si_stime, &from->si_stime); 141 err |= __get_user(to->si_stime, &from->si_stime);
144 err |= __get_user(to->si_status, &from->si_status); 142 err |= __get_user(to->si_status, &from->si_status);
145 break; 143 break;
146 case __SI_FAULT >> 16: 144 case SIL_FAULT:
147 err |= __get_user(tmp, &from->si_addr); 145 err |= __get_user(tmp, &from->si_addr);
148 to->si_addr = (void __force __user *) 146 to->si_addr = (void __force __user *)
149 (u64) (tmp & PSW32_ADDR_INSN); 147 (u64) (tmp & PSW32_ADDR_INSN);
150 break; 148 break;
151 case __SI_POLL >> 16: 149 case SIL_POLL:
152 err |= __get_user(to->si_band, &from->si_band); 150 err |= __get_user(to->si_band, &from->si_band);
153 err |= __get_user(to->si_fd, &from->si_fd); 151 err |= __get_user(to->si_fd, &from->si_fd);
154 break; 152 break;
155 case __SI_TIMER >> 16: 153 case SIL_TIMER:
156 err |= __get_user(to->si_tid, &from->si_tid); 154 err |= __get_user(to->si_tid, &from->si_tid);
157 err |= __get_user(to->si_overrun, &from->si_overrun); 155 err |= __get_user(to->si_overrun, &from->si_overrun);
158 err |= __get_user(to->si_int, &from->si_int); 156 err |= __get_user(to->si_int, &from->si_int);
diff --git a/arch/sparc/include/uapi/asm/siginfo.h b/arch/sparc/include/uapi/asm/siginfo.h
index da2126e0c536..157f46fe374f 100644
--- a/arch/sparc/include/uapi/asm/siginfo.h
+++ b/arch/sparc/include/uapi/asm/siginfo.h
@@ -20,13 +20,13 @@
20 * SIGFPE si_codes 20 * SIGFPE si_codes
21 */ 21 */
22#ifdef __KERNEL__ 22#ifdef __KERNEL__
23#define FPE_FIXME (__SI_FAULT|0) /* Broken dup of SI_USER */ 23#define FPE_FIXME 0 /* Broken dup of SI_USER */
24#endif /* __KERNEL__ */ 24#endif /* __KERNEL__ */
25 25
26/* 26/*
27 * SIGEMT si_codes 27 * SIGEMT si_codes
28 */ 28 */
29#define EMT_TAGOVF (__SI_FAULT|1) /* tag overflow */ 29#define EMT_TAGOVF 1 /* tag overflow */
30#define NSIGEMT 1 30#define NSIGEMT 1
31 31
32#endif /* _UAPI__SPARC_SIGINFO_H */ 32#endif /* _UAPI__SPARC_SIGINFO_H */
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c
index b4096bb665b2..0e4c08c45a37 100644
--- a/arch/sparc/kernel/signal32.c
+++ b/arch/sparc/kernel/signal32.c
@@ -85,34 +85,34 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
85 at the same time. */ 85 at the same time. */
86 err = __put_user(from->si_signo, &to->si_signo); 86 err = __put_user(from->si_signo, &to->si_signo);
87 err |= __put_user(from->si_errno, &to->si_errno); 87 err |= __put_user(from->si_errno, &to->si_errno);
88 err |= __put_user((short)from->si_code, &to->si_code); 88 err |= __put_user(from->si_code, &to->si_code);
89 if (from->si_code < 0) 89 if (from->si_code < 0)
90 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE); 90 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
91 else { 91 else {
92 switch (from->si_code >> 16) { 92 switch (siginfo_layout(from->si_signo, from->si_code)) {
93 case __SI_TIMER >> 16: 93 case SIL_TIMER:
94 err |= __put_user(from->si_tid, &to->si_tid); 94 err |= __put_user(from->si_tid, &to->si_tid);
95 err |= __put_user(from->si_overrun, &to->si_overrun); 95 err |= __put_user(from->si_overrun, &to->si_overrun);
96 err |= __put_user(from->si_int, &to->si_int); 96 err |= __put_user(from->si_int, &to->si_int);
97 break; 97 break;
98 case __SI_CHLD >> 16: 98 case SIL_CHLD:
99 err |= __put_user(from->si_utime, &to->si_utime); 99 err |= __put_user(from->si_utime, &to->si_utime);
100 err |= __put_user(from->si_stime, &to->si_stime); 100 err |= __put_user(from->si_stime, &to->si_stime);
101 err |= __put_user(from->si_status, &to->si_status); 101 err |= __put_user(from->si_status, &to->si_status);
102 default: 102 default:
103 case SIL_KILL:
103 err |= __put_user(from->si_pid, &to->si_pid); 104 err |= __put_user(from->si_pid, &to->si_pid);
104 err |= __put_user(from->si_uid, &to->si_uid); 105 err |= __put_user(from->si_uid, &to->si_uid);
105 break; 106 break;
106 case __SI_FAULT >> 16: 107 case SIL_FAULT:
107 err |= __put_user(from->si_trapno, &to->si_trapno); 108 err |= __put_user(from->si_trapno, &to->si_trapno);
108 err |= __put_user((unsigned long)from->si_addr, &to->si_addr); 109 err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
109 break; 110 break;
110 case __SI_POLL >> 16: 111 case SIL_POLL:
111 err |= __put_user(from->si_band, &to->si_band); 112 err |= __put_user(from->si_band, &to->si_band);
112 err |= __put_user(from->si_fd, &to->si_fd); 113 err |= __put_user(from->si_fd, &to->si_fd);
113 break; 114 break;
114 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */ 115 case SIL_RT:
115 case __SI_MESGQ >> 16:
116 err |= __put_user(from->si_pid, &to->si_pid); 116 err |= __put_user(from->si_pid, &to->si_pid);
117 err |= __put_user(from->si_uid, &to->si_uid); 117 err |= __put_user(from->si_uid, &to->si_uid);
118 err |= __put_user(from->si_int, &to->si_int); 118 err |= __put_user(from->si_int, &to->si_int);
diff --git a/arch/tile/include/uapi/asm/siginfo.h b/arch/tile/include/uapi/asm/siginfo.h
index 56d661bb010b..e83f931aa1f0 100644
--- a/arch/tile/include/uapi/asm/siginfo.h
+++ b/arch/tile/include/uapi/asm/siginfo.h
@@ -26,8 +26,8 @@
26/* 26/*
27 * Additional Tile-specific SIGILL si_codes 27 * Additional Tile-specific SIGILL si_codes
28 */ 28 */
29#define ILL_DBLFLT (__SI_FAULT|9) /* double fault */ 29#define ILL_DBLFLT 9 /* double fault */
30#define ILL_HARDWALL (__SI_FAULT|10) /* user networks hardwall violation */ 30#define ILL_HARDWALL 10 /* user networks hardwall violation */
31#undef NSIGILL 31#undef NSIGILL
32#define NSIGILL 10 32#define NSIGILL 10
33 33
diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c
index 0e863f1ee08c..971d87a1d8cf 100644
--- a/arch/tile/kernel/compat_signal.c
+++ b/arch/tile/kernel/compat_signal.c
@@ -64,7 +64,7 @@ int copy_siginfo_to_user32(struct compat_siginfo __user *to, const siginfo_t *fr
64 3 ints plus the relevant union member. */ 64 3 ints plus the relevant union member. */
65 err = __put_user(from->si_signo, &to->si_signo); 65 err = __put_user(from->si_signo, &to->si_signo);
66 err |= __put_user(from->si_errno, &to->si_errno); 66 err |= __put_user(from->si_errno, &to->si_errno);
67 err |= __put_user((short)from->si_code, &to->si_code); 67 err |= __put_user(from->si_code, &to->si_code);
68 68
69 if (from->si_code < 0) { 69 if (from->si_code < 0) {
70 err |= __put_user(from->si_pid, &to->si_pid); 70 err |= __put_user(from->si_pid, &to->si_pid);
@@ -77,28 +77,26 @@ int copy_siginfo_to_user32(struct compat_siginfo __user *to, const siginfo_t *fr
77 */ 77 */
78 err |= __put_user(from->_sifields._pad[0], 78 err |= __put_user(from->_sifields._pad[0],
79 &to->_sifields._pad[0]); 79 &to->_sifields._pad[0]);
80 switch (from->si_code >> 16) { 80 switch (siginfo_layout(from->si_signo, from->si_code)) {
81 case __SI_FAULT >> 16: 81 case SIL_FAULT:
82 break; 82 break;
83 case __SI_CHLD >> 16: 83 case SIL_CHLD:
84 err |= __put_user(from->si_utime, &to->si_utime); 84 err |= __put_user(from->si_utime, &to->si_utime);
85 err |= __put_user(from->si_stime, &to->si_stime); 85 err |= __put_user(from->si_stime, &to->si_stime);
86 err |= __put_user(from->si_status, &to->si_status); 86 err |= __put_user(from->si_status, &to->si_status);
87 /* FALL THROUGH */ 87 /* FALL THROUGH */
88 default: 88 default:
89 case __SI_KILL >> 16: 89 case SIL_KILL:
90 err |= __put_user(from->si_uid, &to->si_uid); 90 err |= __put_user(from->si_uid, &to->si_uid);
91 break; 91 break;
92 case __SI_POLL >> 16: 92 case SIL_POLL:
93 err |= __put_user(from->si_fd, &to->si_fd); 93 err |= __put_user(from->si_fd, &to->si_fd);
94 break; 94 break;
95 case __SI_TIMER >> 16: 95 case SIL_TIMER:
96 err |= __put_user(from->si_overrun, &to->si_overrun); 96 err |= __put_user(from->si_overrun, &to->si_overrun);
97 err |= __put_user(from->si_int, &to->si_int); 97 err |= __put_user(from->si_int, &to->si_int);
98 break; 98 break;
99 /* This is not generated by the kernel as of now. */ 99 case SIL_RT:
100 case __SI_RT >> 16:
101 case __SI_MESGQ >> 16:
102 err |= __put_user(from->si_uid, &to->si_uid); 100 err |= __put_user(from->si_uid, &to->si_uid);
103 err |= __put_user(from->si_int, &to->si_int); 101 err |= __put_user(from->si_int, &to->si_int);
104 break; 102 break;
diff --git a/arch/tile/kernel/traps.c b/arch/tile/kernel/traps.c
index 54804866f238..9b08c6055f15 100644
--- a/arch/tile/kernel/traps.c
+++ b/arch/tile/kernel/traps.c
@@ -188,7 +188,7 @@ static int special_ill(tile_bundle_bits bundle, int *sigp, int *codep)
188 188
189 /* Make it the requested signal. */ 189 /* Make it the requested signal. */
190 *sigp = sig; 190 *sigp = sig;
191 *codep = code | __SI_FAULT; 191 *codep = code;
192 return 1; 192 return 1;
193} 193}
194 194
diff --git a/arch/x86/kernel/signal_compat.c b/arch/x86/kernel/signal_compat.c
index 71beb28600d4..ab9feb5887b1 100644
--- a/arch/x86/kernel/signal_compat.c
+++ b/arch/x86/kernel/signal_compat.c
@@ -129,7 +129,7 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from,
129 3 ints plus the relevant union member. */ 129 3 ints plus the relevant union member. */
130 put_user_ex(from->si_signo, &to->si_signo); 130 put_user_ex(from->si_signo, &to->si_signo);
131 put_user_ex(from->si_errno, &to->si_errno); 131 put_user_ex(from->si_errno, &to->si_errno);
132 put_user_ex((short)from->si_code, &to->si_code); 132 put_user_ex(from->si_code, &to->si_code);
133 133
134 if (from->si_code < 0) { 134 if (from->si_code < 0) {
135 put_user_ex(from->si_pid, &to->si_pid); 135 put_user_ex(from->si_pid, &to->si_pid);
@@ -142,8 +142,8 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from,
142 */ 142 */
143 put_user_ex(from->_sifields._pad[0], 143 put_user_ex(from->_sifields._pad[0],
144 &to->_sifields._pad[0]); 144 &to->_sifields._pad[0]);
145 switch (from->si_code >> 16) { 145 switch (siginfo_layout(from->si_signo, from->si_code)) {
146 case __SI_FAULT >> 16: 146 case SIL_FAULT:
147 if (from->si_signo == SIGBUS && 147 if (from->si_signo == SIGBUS &&
148 (from->si_code == BUS_MCEERR_AR || 148 (from->si_code == BUS_MCEERR_AR ||
149 from->si_code == BUS_MCEERR_AO)) 149 from->si_code == BUS_MCEERR_AO))
@@ -160,11 +160,11 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from,
160 put_user_ex(from->si_pkey, &to->si_pkey); 160 put_user_ex(from->si_pkey, &to->si_pkey);
161 } 161 }
162 break; 162 break;
163 case __SI_SYS >> 16: 163 case SIL_SYS:
164 put_user_ex(from->si_syscall, &to->si_syscall); 164 put_user_ex(from->si_syscall, &to->si_syscall);
165 put_user_ex(from->si_arch, &to->si_arch); 165 put_user_ex(from->si_arch, &to->si_arch);
166 break; 166 break;
167 case __SI_CHLD >> 16: 167 case SIL_CHLD:
168 if (!x32_ABI) { 168 if (!x32_ABI) {
169 put_user_ex(from->si_utime, &to->si_utime); 169 put_user_ex(from->si_utime, &to->si_utime);
170 put_user_ex(from->si_stime, &to->si_stime); 170 put_user_ex(from->si_stime, &to->si_stime);
@@ -174,21 +174,18 @@ int __copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from,
174 } 174 }
175 put_user_ex(from->si_status, &to->si_status); 175 put_user_ex(from->si_status, &to->si_status);
176 /* FALL THROUGH */ 176 /* FALL THROUGH */
177 default: 177 case SIL_KILL:
178 case __SI_KILL >> 16:
179 put_user_ex(from->si_uid, &to->si_uid); 178 put_user_ex(from->si_uid, &to->si_uid);
180 break; 179 break;
181 case __SI_POLL >> 16: 180 case SIL_POLL:
182 put_user_ex(from->si_fd, &to->si_fd); 181 put_user_ex(from->si_fd, &to->si_fd);
183 break; 182 break;
184 case __SI_TIMER >> 16: 183 case SIL_TIMER:
185 put_user_ex(from->si_overrun, &to->si_overrun); 184 put_user_ex(from->si_overrun, &to->si_overrun);
186 put_user_ex(ptr_to_compat(from->si_ptr), 185 put_user_ex(ptr_to_compat(from->si_ptr),
187 &to->si_ptr); 186 &to->si_ptr);
188 break; 187 break;
189 /* This is not generated by the kernel as of now. */ 188 case SIL_RT:
190 case __SI_RT >> 16:
191 case __SI_MESGQ >> 16:
192 put_user_ex(from->si_uid, &to->si_uid); 189 put_user_ex(from->si_uid, &to->si_uid);
193 put_user_ex(from->si_int, &to->si_int); 190 put_user_ex(from->si_int, &to->si_int);
194 break; 191 break;
diff --git a/fs/signalfd.c b/fs/signalfd.c
index 593b022ac11b..d2c434112f42 100644
--- a/fs/signalfd.c
+++ b/fs/signalfd.c
@@ -95,23 +95,23 @@ static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
95 */ 95 */
96 err |= __put_user(kinfo->si_signo, &uinfo->ssi_signo); 96 err |= __put_user(kinfo->si_signo, &uinfo->ssi_signo);
97 err |= __put_user(kinfo->si_errno, &uinfo->ssi_errno); 97 err |= __put_user(kinfo->si_errno, &uinfo->ssi_errno);
98 err |= __put_user((short) kinfo->si_code, &uinfo->ssi_code); 98 err |= __put_user(kinfo->si_code, &uinfo->ssi_code);
99 switch (kinfo->si_code & __SI_MASK) { 99 switch (siginfo_layout(kinfo->si_signo, kinfo->si_code)) {
100 case __SI_KILL: 100 case SIL_KILL:
101 err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid); 101 err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid);
102 err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid); 102 err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid);
103 break; 103 break;
104 case __SI_TIMER: 104 case SIL_TIMER:
105 err |= __put_user(kinfo->si_tid, &uinfo->ssi_tid); 105 err |= __put_user(kinfo->si_tid, &uinfo->ssi_tid);
106 err |= __put_user(kinfo->si_overrun, &uinfo->ssi_overrun); 106 err |= __put_user(kinfo->si_overrun, &uinfo->ssi_overrun);
107 err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr); 107 err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr);
108 err |= __put_user(kinfo->si_int, &uinfo->ssi_int); 108 err |= __put_user(kinfo->si_int, &uinfo->ssi_int);
109 break; 109 break;
110 case __SI_POLL: 110 case SIL_POLL:
111 err |= __put_user(kinfo->si_band, &uinfo->ssi_band); 111 err |= __put_user(kinfo->si_band, &uinfo->ssi_band);
112 err |= __put_user(kinfo->si_fd, &uinfo->ssi_fd); 112 err |= __put_user(kinfo->si_fd, &uinfo->ssi_fd);
113 break; 113 break;
114 case __SI_FAULT: 114 case SIL_FAULT:
115 err |= __put_user((long) kinfo->si_addr, &uinfo->ssi_addr); 115 err |= __put_user((long) kinfo->si_addr, &uinfo->ssi_addr);
116#ifdef __ARCH_SI_TRAPNO 116#ifdef __ARCH_SI_TRAPNO
117 err |= __put_user(kinfo->si_trapno, &uinfo->ssi_trapno); 117 err |= __put_user(kinfo->si_trapno, &uinfo->ssi_trapno);
@@ -128,20 +128,14 @@ static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo,
128 &uinfo->ssi_addr_lsb); 128 &uinfo->ssi_addr_lsb);
129#endif 129#endif
130 break; 130 break;
131 case __SI_CHLD: 131 case SIL_CHLD:
132 err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid); 132 err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid);
133 err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid); 133 err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid);
134 err |= __put_user(kinfo->si_status, &uinfo->ssi_status); 134 err |= __put_user(kinfo->si_status, &uinfo->ssi_status);
135 err |= __put_user(kinfo->si_utime, &uinfo->ssi_utime); 135 err |= __put_user(kinfo->si_utime, &uinfo->ssi_utime);
136 err |= __put_user(kinfo->si_stime, &uinfo->ssi_stime); 136 err |= __put_user(kinfo->si_stime, &uinfo->ssi_stime);
137 break; 137 break;
138 case __SI_RT: /* This is not generated by the kernel as of now. */ 138 case SIL_RT:
139 case __SI_MESGQ: /* But this is */
140 err |= __put_user(kinfo->si_pid, &uinfo->ssi_pid);
141 err |= __put_user(kinfo->si_uid, &uinfo->ssi_uid);
142 err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr);
143 err |= __put_user(kinfo->si_int, &uinfo->ssi_int);
144 break;
145 default: 139 default:
146 /* 140 /*
147 * This case catches also the signals queued by sigqueue(). 141 * This case catches also the signals queued by sigqueue().
diff --git a/include/linux/signal.h b/include/linux/signal.h
index c97cc20369c0..38564e3e54c7 100644
--- a/include/linux/signal.h
+++ b/include/linux/signal.h
@@ -21,6 +21,20 @@ static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
21 21
22int copy_siginfo_to_user(struct siginfo __user *to, const struct siginfo *from); 22int copy_siginfo_to_user(struct siginfo __user *to, const struct siginfo *from);
23 23
24enum siginfo_layout {
25 SIL_KILL,
26 SIL_TIMER,
27 SIL_POLL,
28 SIL_FAULT,
29 SIL_CHLD,
30 SIL_RT,
31#ifdef __ARCH_SIGSYS
32 SIL_SYS,
33#endif
34};
35
36enum siginfo_layout siginfo_layout(int sig, int si_code);
37
24/* 38/*
25 * Define some primitives to manipulate sigset_t. 39 * Define some primitives to manipulate sigset_t.
26 */ 40 */
diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/siginfo.h
index 9e956ea94d57..e5aa6794cea4 100644
--- a/include/uapi/asm-generic/siginfo.h
+++ b/include/uapi/asm-generic/siginfo.h
@@ -151,29 +151,6 @@ typedef struct siginfo {
151#define si_arch _sifields._sigsys._arch 151#define si_arch _sifields._sigsys._arch
152#endif 152#endif
153 153
154#ifdef __KERNEL__
155#define __SI_MASK 0xffff0000u
156#define __SI_KILL (0 << 16)
157#define __SI_TIMER (1 << 16)
158#define __SI_POLL (2 << 16)
159#define __SI_FAULT (3 << 16)
160#define __SI_CHLD (4 << 16)
161#define __SI_RT (5 << 16)
162#define __SI_MESGQ (6 << 16)
163#define __SI_SYS (7 << 16)
164#define __SI_CODE(T,N) ((T) | ((N) & 0xffff))
165#else /* __KERNEL__ */
166#define __SI_KILL 0
167#define __SI_TIMER 0
168#define __SI_POLL 0
169#define __SI_FAULT 0
170#define __SI_CHLD 0
171#define __SI_RT 0
172#define __SI_MESGQ 0
173#define __SI_SYS 0
174#define __SI_CODE(T,N) (N)
175#endif /* __KERNEL__ */
176
177/* 154/*
178 * si_code values 155 * si_code values
179 * Digital reserves positive values for kernel-generated signals. 156 * Digital reserves positive values for kernel-generated signals.
@@ -181,10 +158,10 @@ typedef struct siginfo {
181#define SI_USER 0 /* sent by kill, sigsend, raise */ 158#define SI_USER 0 /* sent by kill, sigsend, raise */
182#define SI_KERNEL 0x80 /* sent by the kernel from somewhere */ 159#define SI_KERNEL 0x80 /* sent by the kernel from somewhere */
183#define SI_QUEUE -1 /* sent by sigqueue */ 160#define SI_QUEUE -1 /* sent by sigqueue */
184#define SI_TIMER __SI_CODE(__SI_TIMER,-2) /* sent by timer expiration */ 161#define SI_TIMER -2 /* sent by timer expiration */
185#define SI_MESGQ __SI_CODE(__SI_MESGQ,-3) /* sent by real time mesq state change */ 162#define SI_MESGQ -3 /* sent by real time mesq state change */
186#define SI_ASYNCIO -4 /* sent by AIO completion */ 163#define SI_ASYNCIO -4 /* sent by AIO completion */
187#define SI_SIGIO __SI_CODE(__SI_POLL,-5) /* sent by queued SIGIO */ 164#define SI_SIGIO -5 /* sent by queued SIGIO */
188#define SI_TKILL -6 /* sent by tkill system call */ 165#define SI_TKILL -6 /* sent by tkill system call */
189#define SI_DETHREAD -7 /* sent by execve() killing subsidiary threads */ 166#define SI_DETHREAD -7 /* sent by execve() killing subsidiary threads */
190 167
@@ -194,86 +171,86 @@ typedef struct siginfo {
194/* 171/*
195 * SIGILL si_codes 172 * SIGILL si_codes
196 */ 173 */
197#define ILL_ILLOPC (__SI_FAULT|1) /* illegal opcode */ 174#define ILL_ILLOPC 1 /* illegal opcode */
198#define ILL_ILLOPN (__SI_FAULT|2) /* illegal operand */ 175#define ILL_ILLOPN 2 /* illegal operand */
199#define ILL_ILLADR (__SI_FAULT|3) /* illegal addressing mode */ 176#define ILL_ILLADR 3 /* illegal addressing mode */
200#define ILL_ILLTRP (__SI_FAULT|4) /* illegal trap */ 177#define ILL_ILLTRP 4 /* illegal trap */
201#define ILL_PRVOPC (__SI_FAULT|5) /* privileged opcode */ 178#define ILL_PRVOPC 5 /* privileged opcode */
202#define ILL_PRVREG (__SI_FAULT|6) /* privileged register */ 179#define ILL_PRVREG 6 /* privileged register */
203#define ILL_COPROC (__SI_FAULT|7) /* coprocessor error */ 180#define ILL_COPROC 7 /* coprocessor error */
204#define ILL_BADSTK (__SI_FAULT|8) /* internal stack error */ 181#define ILL_BADSTK 8 /* internal stack error */
205#define NSIGILL 8 182#define NSIGILL 8
206 183
207/* 184/*
208 * SIGFPE si_codes 185 * SIGFPE si_codes
209 */ 186 */
210#define FPE_INTDIV (__SI_FAULT|1) /* integer divide by zero */ 187#define FPE_INTDIV 1 /* integer divide by zero */
211#define FPE_INTOVF (__SI_FAULT|2) /* integer overflow */ 188#define FPE_INTOVF 2 /* integer overflow */
212#define FPE_FLTDIV (__SI_FAULT|3) /* floating point divide by zero */ 189#define FPE_FLTDIV 3 /* floating point divide by zero */
213#define FPE_FLTOVF (__SI_FAULT|4) /* floating point overflow */ 190#define FPE_FLTOVF 4 /* floating point overflow */
214#define FPE_FLTUND (__SI_FAULT|5) /* floating point underflow */ 191#define FPE_FLTUND 5 /* floating point underflow */
215#define FPE_FLTRES (__SI_FAULT|6) /* floating point inexact result */ 192#define FPE_FLTRES 6 /* floating point inexact result */
216#define FPE_FLTINV (__SI_FAULT|7) /* floating point invalid operation */ 193#define FPE_FLTINV 7 /* floating point invalid operation */
217#define FPE_FLTSUB (__SI_FAULT|8) /* subscript out of range */ 194#define FPE_FLTSUB 8 /* subscript out of range */
218#define NSIGFPE 8 195#define NSIGFPE 8
219 196
220/* 197/*
221 * SIGSEGV si_codes 198 * SIGSEGV si_codes
222 */ 199 */
223#define SEGV_MAPERR (__SI_FAULT|1) /* address not mapped to object */ 200#define SEGV_MAPERR 1 /* address not mapped to object */
224#define SEGV_ACCERR (__SI_FAULT|2) /* invalid permissions for mapped object */ 201#define SEGV_ACCERR 2 /* invalid permissions for mapped object */
225#define SEGV_BNDERR (__SI_FAULT|3) /* failed address bound checks */ 202#define SEGV_BNDERR 3 /* failed address bound checks */
226#define SEGV_PKUERR (__SI_FAULT|4) /* failed protection key checks */ 203#define SEGV_PKUERR 4 /* failed protection key checks */
227#define NSIGSEGV 4 204#define NSIGSEGV 4
228 205
229/* 206/*
230 * SIGBUS si_codes 207 * SIGBUS si_codes
231 */ 208 */
232#define BUS_ADRALN (__SI_FAULT|1) /* invalid address alignment */ 209#define BUS_ADRALN 1 /* invalid address alignment */
233#define BUS_ADRERR (__SI_FAULT|2) /* non-existent physical address */ 210#define BUS_ADRERR 2 /* non-existent physical address */
234#define BUS_OBJERR (__SI_FAULT|3) /* object specific hardware error */ 211#define BUS_OBJERR 3 /* object specific hardware error */
235/* hardware memory error consumed on a machine check: action required */ 212/* hardware memory error consumed on a machine check: action required */
236#define BUS_MCEERR_AR (__SI_FAULT|4) 213#define BUS_MCEERR_AR 4
237/* hardware memory error detected in process but not consumed: action optional*/ 214/* hardware memory error detected in process but not consumed: action optional*/
238#define BUS_MCEERR_AO (__SI_FAULT|5) 215#define BUS_MCEERR_AO 5
239#define NSIGBUS 5 216#define NSIGBUS 5
240 217
241/* 218/*
242 * SIGTRAP si_codes 219 * SIGTRAP si_codes
243 */ 220 */
244#define TRAP_BRKPT (__SI_FAULT|1) /* process breakpoint */ 221#define TRAP_BRKPT 1 /* process breakpoint */
245#define TRAP_TRACE (__SI_FAULT|2) /* process trace trap */ 222#define TRAP_TRACE 2 /* process trace trap */
246#define TRAP_BRANCH (__SI_FAULT|3) /* process taken branch trap */ 223#define TRAP_BRANCH 3 /* process taken branch trap */
247#define TRAP_HWBKPT (__SI_FAULT|4) /* hardware breakpoint/watchpoint */ 224#define TRAP_HWBKPT 4 /* hardware breakpoint/watchpoint */
248#define NSIGTRAP 4 225#define NSIGTRAP 4
249 226
250/* 227/*
251 * SIGCHLD si_codes 228 * SIGCHLD si_codes
252 */ 229 */
253#define CLD_EXITED (__SI_CHLD|1) /* child has exited */ 230#define CLD_EXITED 1 /* child has exited */
254#define CLD_KILLED (__SI_CHLD|2) /* child was killed */ 231#define CLD_KILLED 2 /* child was killed */
255#define CLD_DUMPED (__SI_CHLD|3) /* child terminated abnormally */ 232#define CLD_DUMPED 3 /* child terminated abnormally */
256#define CLD_TRAPPED (__SI_CHLD|4) /* traced child has trapped */ 233#define CLD_TRAPPED 4 /* traced child has trapped */
257#define CLD_STOPPED (__SI_CHLD|5) /* child has stopped */ 234#define CLD_STOPPED 5 /* child has stopped */
258#define CLD_CONTINUED (__SI_CHLD|6) /* stopped child has continued */ 235#define CLD_CONTINUED 6 /* stopped child has continued */
259#define NSIGCHLD 6 236#define NSIGCHLD 6
260 237
261/* 238/*
262 * SIGPOLL (or any other signal without signal specific si_codes) si_codes 239 * SIGPOLL (or any other signal without signal specific si_codes) si_codes
263 */ 240 */
264#define POLL_IN (__SI_POLL|1) /* data input available */ 241#define POLL_IN 1 /* data input available */
265#define POLL_OUT (__SI_POLL|2) /* output buffers available */ 242#define POLL_OUT 2 /* output buffers available */
266#define POLL_MSG (__SI_POLL|3) /* input message available */ 243#define POLL_MSG 3 /* input message available */
267#define POLL_ERR (__SI_POLL|4) /* i/o error */ 244#define POLL_ERR 4 /* i/o error */
268#define POLL_PRI (__SI_POLL|5) /* high priority input available */ 245#define POLL_PRI 5 /* high priority input available */
269#define POLL_HUP (__SI_POLL|6) /* device disconnected */ 246#define POLL_HUP 6 /* device disconnected */
270#define NSIGPOLL 6 247#define NSIGPOLL 6
271 248
272/* 249/*
273 * SIGSYS si_codes 250 * SIGSYS si_codes
274 */ 251 */
275#define SYS_SECCOMP (__SI_SYS|1) /* seccomp triggered */ 252#define SYS_SECCOMP 1 /* seccomp triggered */
276#define NSIGSYS 1 253#define NSIGSYS 1
277 254
278/* 255/*
279 * sigevent definitions 256 * sigevent definitions
diff --git a/kernel/exit.c b/kernel/exit.c
index c5548faa9f37..c8f23613df5b 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -1616,7 +1616,7 @@ SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
1616 user_access_begin(); 1616 user_access_begin();
1617 unsafe_put_user(signo, &infop->si_signo, Efault); 1617 unsafe_put_user(signo, &infop->si_signo, Efault);
1618 unsafe_put_user(0, &infop->si_errno, Efault); 1618 unsafe_put_user(0, &infop->si_errno, Efault);
1619 unsafe_put_user((short)info.cause, &infop->si_code, Efault); 1619 unsafe_put_user(info.cause, &infop->si_code, Efault);
1620 unsafe_put_user(info.pid, &infop->si_pid, Efault); 1620 unsafe_put_user(info.pid, &infop->si_pid, Efault);
1621 unsafe_put_user(info.uid, &infop->si_uid, Efault); 1621 unsafe_put_user(info.uid, &infop->si_uid, Efault);
1622 unsafe_put_user(info.status, &infop->si_status, Efault); 1622 unsafe_put_user(info.status, &infop->si_status, Efault);
@@ -1742,7 +1742,7 @@ COMPAT_SYSCALL_DEFINE5(waitid,
1742 user_access_begin(); 1742 user_access_begin();
1743 unsafe_put_user(signo, &infop->si_signo, Efault); 1743 unsafe_put_user(signo, &infop->si_signo, Efault);
1744 unsafe_put_user(0, &infop->si_errno, Efault); 1744 unsafe_put_user(0, &infop->si_errno, Efault);
1745 unsafe_put_user((short)info.cause, &infop->si_code, Efault); 1745 unsafe_put_user(info.cause, &infop->si_code, Efault);
1746 unsafe_put_user(info.pid, &infop->si_pid, Efault); 1746 unsafe_put_user(info.pid, &infop->si_pid, Efault);
1747 unsafe_put_user(info.uid, &infop->si_uid, Efault); 1747 unsafe_put_user(info.uid, &infop->si_uid, Efault);
1748 unsafe_put_user(info.status, &infop->si_status, Efault); 1748 unsafe_put_user(info.status, &infop->si_status, Efault);
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index 60f356d91060..84b1367935e4 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -728,8 +728,7 @@ static int ptrace_peek_siginfo(struct task_struct *child,
728 if (unlikely(in_compat_syscall())) { 728 if (unlikely(in_compat_syscall())) {
729 compat_siginfo_t __user *uinfo = compat_ptr(data); 729 compat_siginfo_t __user *uinfo = compat_ptr(data);
730 730
731 if (copy_siginfo_to_user32(uinfo, &info) || 731 if (copy_siginfo_to_user32(uinfo, &info)) {
732 __put_user(info.si_code, &uinfo->si_code)) {
733 ret = -EFAULT; 732 ret = -EFAULT;
734 break; 733 break;
735 } 734 }
@@ -739,8 +738,7 @@ static int ptrace_peek_siginfo(struct task_struct *child,
739 { 738 {
740 siginfo_t __user *uinfo = (siginfo_t __user *) data; 739 siginfo_t __user *uinfo = (siginfo_t __user *) data;
741 740
742 if (copy_siginfo_to_user(uinfo, &info) || 741 if (copy_siginfo_to_user(uinfo, &info)) {
743 __put_user(info.si_code, &uinfo->si_code)) {
744 ret = -EFAULT; 742 ret = -EFAULT;
745 break; 743 break;
746 } 744 }
diff --git a/kernel/signal.c b/kernel/signal.c
index caed9133ae52..6bd53c8189f0 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -2682,6 +2682,51 @@ COMPAT_SYSCALL_DEFINE2(rt_sigpending, compat_sigset_t __user *, uset,
2682} 2682}
2683#endif 2683#endif
2684 2684
2685enum siginfo_layout siginfo_layout(int sig, int si_code)
2686{
2687 enum siginfo_layout layout = SIL_KILL;
2688 if ((si_code > SI_USER) && (si_code < SI_KERNEL)) {
2689 static const struct {
2690 unsigned char limit, layout;
2691 } filter[] = {
2692 [SIGILL] = { NSIGILL, SIL_FAULT },
2693 [SIGFPE] = { NSIGFPE, SIL_FAULT },
2694 [SIGSEGV] = { NSIGSEGV, SIL_FAULT },
2695 [SIGBUS] = { NSIGBUS, SIL_FAULT },
2696 [SIGTRAP] = { NSIGTRAP, SIL_FAULT },
2697#if defined(SIGMET) && defined(NSIGEMT)
2698 [SIGEMT] = { NSIGEMT, SIL_FAULT },
2699#endif
2700 [SIGCHLD] = { NSIGCHLD, SIL_CHLD },
2701 [SIGPOLL] = { NSIGPOLL, SIL_POLL },
2702#ifdef __ARCH_SIGSYS
2703 [SIGSYS] = { NSIGSYS, SIL_SYS },
2704#endif
2705 };
2706 if ((sig < ARRAY_SIZE(filter)) && (si_code <= filter[sig].limit))
2707 layout = filter[sig].layout;
2708 else if (si_code <= NSIGPOLL)
2709 layout = SIL_POLL;
2710 } else {
2711 if (si_code == SI_TIMER)
2712 layout = SIL_TIMER;
2713 else if (si_code == SI_SIGIO)
2714 layout = SIL_POLL;
2715 else if (si_code < 0)
2716 layout = SIL_RT;
2717 /* Tests to support buggy kernel ABIs */
2718#ifdef TRAP_FIXME
2719 if ((sig == SIGTRAP) && (si_code == TRAP_FIXME))
2720 layout = SIL_FAULT;
2721#endif
2722#ifdef FPE_FIXME
2723 if ((sig == SIGFPE) && (si_code == FPE_FIXME))
2724 layout = SIL_FAULT;
2725#endif
2726 }
2727 return layout;
2728}
2729
2685#ifndef HAVE_ARCH_COPY_SIGINFO_TO_USER 2730#ifndef HAVE_ARCH_COPY_SIGINFO_TO_USER
2686 2731
2687int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from) 2732int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
@@ -2704,22 +2749,20 @@ int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
2704 */ 2749 */
2705 err = __put_user(from->si_signo, &to->si_signo); 2750 err = __put_user(from->si_signo, &to->si_signo);
2706 err |= __put_user(from->si_errno, &to->si_errno); 2751 err |= __put_user(from->si_errno, &to->si_errno);
2707 err |= __put_user((short)from->si_code, &to->si_code); 2752 err |= __put_user(from->si_code, &to->si_code);
2708 switch (from->si_code & __SI_MASK) { 2753 switch (siginfo_layout(from->si_signo, from->si_code)) {
2709 case __SI_KILL: 2754 case SIL_KILL:
2710 err |= __put_user(from->si_pid, &to->si_pid); 2755 err |= __put_user(from->si_pid, &to->si_pid);
2711 err |= __put_user(from->si_uid, &to->si_uid); 2756 err |= __put_user(from->si_uid, &to->si_uid);
2712 break; 2757 break;
2713 case __SI_TIMER: 2758 case SIL_TIMER:
2714 err |= __put_user(from->si_tid, &to->si_tid); 2759 /* Unreached SI_TIMER is negative */
2715 err |= __put_user(from->si_overrun, &to->si_overrun);
2716 err |= __put_user(from->si_ptr, &to->si_ptr);
2717 break; 2760 break;
2718 case __SI_POLL: 2761 case SIL_POLL:
2719 err |= __put_user(from->si_band, &to->si_band); 2762 err |= __put_user(from->si_band, &to->si_band);
2720 err |= __put_user(from->si_fd, &to->si_fd); 2763 err |= __put_user(from->si_fd, &to->si_fd);
2721 break; 2764 break;
2722 case __SI_FAULT: 2765 case SIL_FAULT:
2723 err |= __put_user(from->si_addr, &to->si_addr); 2766 err |= __put_user(from->si_addr, &to->si_addr);
2724#ifdef __ARCH_SI_TRAPNO 2767#ifdef __ARCH_SI_TRAPNO
2725 err |= __put_user(from->si_trapno, &to->si_trapno); 2768 err |= __put_user(from->si_trapno, &to->si_trapno);
@@ -2744,30 +2787,25 @@ int copy_siginfo_to_user(siginfo_t __user *to, const siginfo_t *from)
2744 err |= __put_user(from->si_pkey, &to->si_pkey); 2787 err |= __put_user(from->si_pkey, &to->si_pkey);
2745#endif 2788#endif
2746 break; 2789 break;
2747 case __SI_CHLD: 2790 case SIL_CHLD:
2748 err |= __put_user(from->si_pid, &to->si_pid); 2791 err |= __put_user(from->si_pid, &to->si_pid);
2749 err |= __put_user(from->si_uid, &to->si_uid); 2792 err |= __put_user(from->si_uid, &to->si_uid);
2750 err |= __put_user(from->si_status, &to->si_status); 2793 err |= __put_user(from->si_status, &to->si_status);
2751 err |= __put_user(from->si_utime, &to->si_utime); 2794 err |= __put_user(from->si_utime, &to->si_utime);
2752 err |= __put_user(from->si_stime, &to->si_stime); 2795 err |= __put_user(from->si_stime, &to->si_stime);
2753 break; 2796 break;
2754 case __SI_RT: /* This is not generated by the kernel as of now. */ 2797 case SIL_RT:
2755 case __SI_MESGQ: /* But this is */
2756 err |= __put_user(from->si_pid, &to->si_pid); 2798 err |= __put_user(from->si_pid, &to->si_pid);
2757 err |= __put_user(from->si_uid, &to->si_uid); 2799 err |= __put_user(from->si_uid, &to->si_uid);
2758 err |= __put_user(from->si_ptr, &to->si_ptr); 2800 err |= __put_user(from->si_ptr, &to->si_ptr);
2759 break; 2801 break;
2760#ifdef __ARCH_SIGSYS 2802#ifdef __ARCH_SIGSYS
2761 case __SI_SYS: 2803 case SIL_SYS:
2762 err |= __put_user(from->si_call_addr, &to->si_call_addr); 2804 err |= __put_user(from->si_call_addr, &to->si_call_addr);
2763 err |= __put_user(from->si_syscall, &to->si_syscall); 2805 err |= __put_user(from->si_syscall, &to->si_syscall);
2764 err |= __put_user(from->si_arch, &to->si_arch); 2806 err |= __put_user(from->si_arch, &to->si_arch);
2765 break; 2807 break;
2766#endif 2808#endif
2767 default: /* this is just in case for now ... */
2768 err |= __put_user(from->si_pid, &to->si_pid);
2769 err |= __put_user(from->si_uid, &to->si_uid);
2770 break;
2771 } 2809 }
2772 return err; 2810 return err;
2773} 2811}