Commit 2a1486981c1317dc4f4aad568f2cc6e49dfb8c82

Authored by David Howells
Committed by Ralf Baechle
1 parent 1762c5ab7c

Fix breakage in MIPS siginfo handling

MIPS's siginfo handling has been broken since this commit:

	commit 574c4866e33d648520a8bd5bf6f573ea6e554e88
	Author: Al Viro <viro@zeniv.linux.org.uk>
	Date:   Sun Nov 25 22:24:19 2012 -0500
	consolidate kernel-side struct sigaction declarations

for 64-bit BE MIPS CPUs.

The UAPI variant looks like this:

	struct sigaction {
		unsigned int	sa_flags;
		__sighandler_t	sa_handler;
		sigset_t	sa_mask;
	};

but the core kernel's variant looks like this:

	struct sigaction {
	#ifndef __ARCH_HAS_ODD_SIGACTION
		__sighandler_t	sa_handler;
		unsigned long	sa_flags;
	#else
		unsigned long	sa_flags;
		__sighandler_t	sa_handler;
	#endif
	#ifdef __ARCH_HAS_SA_RESTORER
		__sigrestore_t sa_restorer;
	#endif
		sigset_t	sa_mask;
	};

The problem is that sa_flags has been changed from an unsigned int to an
unsigned long.

Fix this by making sa_flags unsigned int if __ARCH_HAS_ODD_SIGACTION is
defined.

Whilst we're at it, rename __ARCH_HAS_ODD_SIGACTION to
__ARCH_HAS_IRIX_SIGACTION.

Signed-off-by: David Howells <dhowells@redhat.com>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Cc: stable@vger.kernel.org
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

Showing 3 changed files with 5 additions and 5 deletions Inline Diff

arch/mips/include/asm/signal.h
1 /* 1 /*
2 * This file is subject to the terms and conditions of the GNU General Public 2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (C) 1995, 96, 97, 98, 99, 2003 by Ralf Baechle 6 * Copyright (C) 1995, 96, 97, 98, 99, 2003 by Ralf Baechle
7 * Copyright (C) 1999 Silicon Graphics, Inc. 7 * Copyright (C) 1999 Silicon Graphics, Inc.
8 */ 8 */
9 #ifndef _ASM_SIGNAL_H 9 #ifndef _ASM_SIGNAL_H
10 #define _ASM_SIGNAL_H 10 #define _ASM_SIGNAL_H
11 11
12 #include <uapi/asm/signal.h> 12 #include <uapi/asm/signal.h>
13 13
14 14
15 #ifdef CONFIG_TRAD_SIGNALS 15 #ifdef CONFIG_TRAD_SIGNALS
16 #define sig_uses_siginfo(ka) ((ka)->sa.sa_flags & SA_SIGINFO) 16 #define sig_uses_siginfo(ka) ((ka)->sa.sa_flags & SA_SIGINFO)
17 #else 17 #else
18 #define sig_uses_siginfo(ka) (1) 18 #define sig_uses_siginfo(ka) (1)
19 #endif 19 #endif
20 20
21 #include <asm/sigcontext.h> 21 #include <asm/sigcontext.h>
22 #include <asm/siginfo.h> 22 #include <asm/siginfo.h>
23 23
24 #define __ARCH_HAS_ODD_SIGACTION 24 #define __ARCH_HAS_IRIX_SIGACTION
25 25
26 #endif /* _ASM_SIGNAL_H */ 26 #endif /* _ASM_SIGNAL_H */
27 27
include/linux/compat.h
1 #ifndef _LINUX_COMPAT_H 1 #ifndef _LINUX_COMPAT_H
2 #define _LINUX_COMPAT_H 2 #define _LINUX_COMPAT_H
3 /* 3 /*
4 * These are the type definitions for the architecture specific 4 * These are the type definitions for the architecture specific
5 * syscall compatibility layer. 5 * syscall compatibility layer.
6 */ 6 */
7 7
8 #ifdef CONFIG_COMPAT 8 #ifdef CONFIG_COMPAT
9 9
10 #include <linux/stat.h> 10 #include <linux/stat.h>
11 #include <linux/param.h> /* for HZ */ 11 #include <linux/param.h> /* for HZ */
12 #include <linux/sem.h> 12 #include <linux/sem.h>
13 #include <linux/socket.h> 13 #include <linux/socket.h>
14 #include <linux/if.h> 14 #include <linux/if.h>
15 #include <linux/fs.h> 15 #include <linux/fs.h>
16 #include <linux/aio_abi.h> /* for aio_context_t */ 16 #include <linux/aio_abi.h> /* for aio_context_t */
17 17
18 #include <asm/compat.h> 18 #include <asm/compat.h>
19 #include <asm/siginfo.h> 19 #include <asm/siginfo.h>
20 #include <asm/signal.h> 20 #include <asm/signal.h>
21 21
22 #ifndef COMPAT_USE_64BIT_TIME 22 #ifndef COMPAT_USE_64BIT_TIME
23 #define COMPAT_USE_64BIT_TIME 0 23 #define COMPAT_USE_64BIT_TIME 0
24 #endif 24 #endif
25 25
26 #ifndef __SC_DELOUSE 26 #ifndef __SC_DELOUSE
27 #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v)) 27 #define __SC_DELOUSE(t,v) ((t)(unsigned long)(v))
28 #endif 28 #endif
29 29
30 #define __SC_CCAST1(t1, a1) __SC_DELOUSE(t1,a1) 30 #define __SC_CCAST1(t1, a1) __SC_DELOUSE(t1,a1)
31 #define __SC_CCAST2(t2, a2, ...) __SC_DELOUSE(t2,a2), __SC_CCAST1(__VA_ARGS__) 31 #define __SC_CCAST2(t2, a2, ...) __SC_DELOUSE(t2,a2), __SC_CCAST1(__VA_ARGS__)
32 #define __SC_CCAST3(t3, a3, ...) __SC_DELOUSE(t3,a3), __SC_CCAST2(__VA_ARGS__) 32 #define __SC_CCAST3(t3, a3, ...) __SC_DELOUSE(t3,a3), __SC_CCAST2(__VA_ARGS__)
33 #define __SC_CCAST4(t4, a4, ...) __SC_DELOUSE(t4,a4), __SC_CCAST3(__VA_ARGS__) 33 #define __SC_CCAST4(t4, a4, ...) __SC_DELOUSE(t4,a4), __SC_CCAST3(__VA_ARGS__)
34 #define __SC_CCAST5(t5, a5, ...) __SC_DELOUSE(t5,a5), __SC_CCAST4(__VA_ARGS__) 34 #define __SC_CCAST5(t5, a5, ...) __SC_DELOUSE(t5,a5), __SC_CCAST4(__VA_ARGS__)
35 #define __SC_CCAST6(t6, a6, ...) __SC_DELOUSE(t6,a6), __SC_CCAST5(__VA_ARGS__) 35 #define __SC_CCAST6(t6, a6, ...) __SC_DELOUSE(t6,a6), __SC_CCAST5(__VA_ARGS__)
36 #define COMPAT_SYSCALL_DEFINE1(name, ...) \ 36 #define COMPAT_SYSCALL_DEFINE1(name, ...) \
37 COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__) 37 COMPAT_SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
38 #define COMPAT_SYSCALL_DEFINE2(name, ...) \ 38 #define COMPAT_SYSCALL_DEFINE2(name, ...) \
39 COMPAT_SYSCALL_DEFINEx(2, _##name, __VA_ARGS__) 39 COMPAT_SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
40 #define COMPAT_SYSCALL_DEFINE3(name, ...) \ 40 #define COMPAT_SYSCALL_DEFINE3(name, ...) \
41 COMPAT_SYSCALL_DEFINEx(3, _##name, __VA_ARGS__) 41 COMPAT_SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
42 #define COMPAT_SYSCALL_DEFINE4(name, ...) \ 42 #define COMPAT_SYSCALL_DEFINE4(name, ...) \
43 COMPAT_SYSCALL_DEFINEx(4, _##name, __VA_ARGS__) 43 COMPAT_SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
44 #define COMPAT_SYSCALL_DEFINE5(name, ...) \ 44 #define COMPAT_SYSCALL_DEFINE5(name, ...) \
45 COMPAT_SYSCALL_DEFINEx(5, _##name, __VA_ARGS__) 45 COMPAT_SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
46 #define COMPAT_SYSCALL_DEFINE6(name, ...) \ 46 #define COMPAT_SYSCALL_DEFINE6(name, ...) \
47 COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__) 47 COMPAT_SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
48 48
49 #ifdef CONFIG_HAVE_SYSCALL_WRAPPERS 49 #ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
50 50
51 #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ 51 #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
52 asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__)); \ 52 asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__)); \
53 static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__)); \ 53 static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__)); \
54 asmlinkage long compat_SyS##name(__SC_LONG##x(__VA_ARGS__)) \ 54 asmlinkage long compat_SyS##name(__SC_LONG##x(__VA_ARGS__)) \
55 { \ 55 { \
56 return (long) C_SYSC##name(__SC_CCAST##x(__VA_ARGS__)); \ 56 return (long) C_SYSC##name(__SC_CCAST##x(__VA_ARGS__)); \
57 } \ 57 } \
58 SYSCALL_ALIAS(compat_sys##name, compat_SyS##name); \ 58 SYSCALL_ALIAS(compat_sys##name, compat_SyS##name); \
59 static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__)) 59 static inline long C_SYSC##name(__SC_DECL##x(__VA_ARGS__))
60 60
61 #else /* CONFIG_HAVE_SYSCALL_WRAPPERS */ 61 #else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
62 62
63 #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \ 63 #define COMPAT_SYSCALL_DEFINEx(x, name, ...) \
64 asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__)) 64 asmlinkage long compat_sys##name(__SC_DECL##x(__VA_ARGS__))
65 65
66 #endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */ 66 #endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
67 67
68 #ifndef compat_user_stack_pointer 68 #ifndef compat_user_stack_pointer
69 #define compat_user_stack_pointer() current_user_stack_pointer() 69 #define compat_user_stack_pointer() current_user_stack_pointer()
70 #endif 70 #endif
71 #ifndef compat_sigaltstack /* we'll need that for MIPS */ 71 #ifndef compat_sigaltstack /* we'll need that for MIPS */
72 typedef struct compat_sigaltstack { 72 typedef struct compat_sigaltstack {
73 compat_uptr_t ss_sp; 73 compat_uptr_t ss_sp;
74 int ss_flags; 74 int ss_flags;
75 compat_size_t ss_size; 75 compat_size_t ss_size;
76 } compat_stack_t; 76 } compat_stack_t;
77 #endif 77 #endif
78 78
79 #define compat_jiffies_to_clock_t(x) \ 79 #define compat_jiffies_to_clock_t(x) \
80 (((unsigned long)(x) * COMPAT_USER_HZ) / HZ) 80 (((unsigned long)(x) * COMPAT_USER_HZ) / HZ)
81 81
82 typedef __compat_uid32_t compat_uid_t; 82 typedef __compat_uid32_t compat_uid_t;
83 typedef __compat_gid32_t compat_gid_t; 83 typedef __compat_gid32_t compat_gid_t;
84 84
85 struct compat_sel_arg_struct; 85 struct compat_sel_arg_struct;
86 struct rusage; 86 struct rusage;
87 87
88 struct compat_itimerspec { 88 struct compat_itimerspec {
89 struct compat_timespec it_interval; 89 struct compat_timespec it_interval;
90 struct compat_timespec it_value; 90 struct compat_timespec it_value;
91 }; 91 };
92 92
93 struct compat_utimbuf { 93 struct compat_utimbuf {
94 compat_time_t actime; 94 compat_time_t actime;
95 compat_time_t modtime; 95 compat_time_t modtime;
96 }; 96 };
97 97
98 struct compat_itimerval { 98 struct compat_itimerval {
99 struct compat_timeval it_interval; 99 struct compat_timeval it_interval;
100 struct compat_timeval it_value; 100 struct compat_timeval it_value;
101 }; 101 };
102 102
103 struct compat_tms { 103 struct compat_tms {
104 compat_clock_t tms_utime; 104 compat_clock_t tms_utime;
105 compat_clock_t tms_stime; 105 compat_clock_t tms_stime;
106 compat_clock_t tms_cutime; 106 compat_clock_t tms_cutime;
107 compat_clock_t tms_cstime; 107 compat_clock_t tms_cstime;
108 }; 108 };
109 109
110 struct compat_timex { 110 struct compat_timex {
111 compat_uint_t modes; 111 compat_uint_t modes;
112 compat_long_t offset; 112 compat_long_t offset;
113 compat_long_t freq; 113 compat_long_t freq;
114 compat_long_t maxerror; 114 compat_long_t maxerror;
115 compat_long_t esterror; 115 compat_long_t esterror;
116 compat_int_t status; 116 compat_int_t status;
117 compat_long_t constant; 117 compat_long_t constant;
118 compat_long_t precision; 118 compat_long_t precision;
119 compat_long_t tolerance; 119 compat_long_t tolerance;
120 struct compat_timeval time; 120 struct compat_timeval time;
121 compat_long_t tick; 121 compat_long_t tick;
122 compat_long_t ppsfreq; 122 compat_long_t ppsfreq;
123 compat_long_t jitter; 123 compat_long_t jitter;
124 compat_int_t shift; 124 compat_int_t shift;
125 compat_long_t stabil; 125 compat_long_t stabil;
126 compat_long_t jitcnt; 126 compat_long_t jitcnt;
127 compat_long_t calcnt; 127 compat_long_t calcnt;
128 compat_long_t errcnt; 128 compat_long_t errcnt;
129 compat_long_t stbcnt; 129 compat_long_t stbcnt;
130 compat_int_t tai; 130 compat_int_t tai;
131 131
132 compat_int_t:32; compat_int_t:32; compat_int_t:32; compat_int_t:32; 132 compat_int_t:32; compat_int_t:32; compat_int_t:32; compat_int_t:32;
133 compat_int_t:32; compat_int_t:32; compat_int_t:32; compat_int_t:32; 133 compat_int_t:32; compat_int_t:32; compat_int_t:32; compat_int_t:32;
134 compat_int_t:32; compat_int_t:32; compat_int_t:32; 134 compat_int_t:32; compat_int_t:32; compat_int_t:32;
135 }; 135 };
136 136
137 #define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW) 137 #define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW)
138 138
139 typedef struct { 139 typedef struct {
140 compat_sigset_word sig[_COMPAT_NSIG_WORDS]; 140 compat_sigset_word sig[_COMPAT_NSIG_WORDS];
141 } compat_sigset_t; 141 } compat_sigset_t;
142 142
143 struct compat_sigaction { 143 struct compat_sigaction {
144 #ifndef __ARCH_HAS_ODD_SIGACTION 144 #ifndef __ARCH_HAS_IRIX_SIGACTION
145 compat_uptr_t sa_handler; 145 compat_uptr_t sa_handler;
146 compat_ulong_t sa_flags; 146 compat_ulong_t sa_flags;
147 #else 147 #else
148 compat_ulong_t sa_flags; 148 compat_uint_t sa_flags;
149 compat_uptr_t sa_handler; 149 compat_uptr_t sa_handler;
150 #endif 150 #endif
151 #ifdef __ARCH_HAS_SA_RESTORER 151 #ifdef __ARCH_HAS_SA_RESTORER
152 compat_uptr_t sa_restorer; 152 compat_uptr_t sa_restorer;
153 #endif 153 #endif
154 compat_sigset_t sa_mask __packed; 154 compat_sigset_t sa_mask __packed;
155 }; 155 };
156 156
157 /* 157 /*
158 * These functions operate strictly on struct compat_time* 158 * These functions operate strictly on struct compat_time*
159 */ 159 */
160 extern int get_compat_timespec(struct timespec *, 160 extern int get_compat_timespec(struct timespec *,
161 const struct compat_timespec __user *); 161 const struct compat_timespec __user *);
162 extern int put_compat_timespec(const struct timespec *, 162 extern int put_compat_timespec(const struct timespec *,
163 struct compat_timespec __user *); 163 struct compat_timespec __user *);
164 extern int get_compat_timeval(struct timeval *, 164 extern int get_compat_timeval(struct timeval *,
165 const struct compat_timeval __user *); 165 const struct compat_timeval __user *);
166 extern int put_compat_timeval(const struct timeval *, 166 extern int put_compat_timeval(const struct timeval *,
167 struct compat_timeval __user *); 167 struct compat_timeval __user *);
168 /* 168 /*
169 * These functions operate on 32- or 64-bit specs depending on 169 * These functions operate on 32- or 64-bit specs depending on
170 * COMPAT_USE_64BIT_TIME, hence the void user pointer arguments and the 170 * COMPAT_USE_64BIT_TIME, hence the void user pointer arguments and the
171 * naming as compat_get/put_ rather than get/put_compat_. 171 * naming as compat_get/put_ rather than get/put_compat_.
172 */ 172 */
173 extern int compat_get_timespec(struct timespec *, const void __user *); 173 extern int compat_get_timespec(struct timespec *, const void __user *);
174 extern int compat_put_timespec(const struct timespec *, void __user *); 174 extern int compat_put_timespec(const struct timespec *, void __user *);
175 extern int compat_get_timeval(struct timeval *, const void __user *); 175 extern int compat_get_timeval(struct timeval *, const void __user *);
176 extern int compat_put_timeval(const struct timeval *, void __user *); 176 extern int compat_put_timeval(const struct timeval *, void __user *);
177 177
178 struct compat_iovec { 178 struct compat_iovec {
179 compat_uptr_t iov_base; 179 compat_uptr_t iov_base;
180 compat_size_t iov_len; 180 compat_size_t iov_len;
181 }; 181 };
182 182
183 struct compat_rlimit { 183 struct compat_rlimit {
184 compat_ulong_t rlim_cur; 184 compat_ulong_t rlim_cur;
185 compat_ulong_t rlim_max; 185 compat_ulong_t rlim_max;
186 }; 186 };
187 187
188 struct compat_rusage { 188 struct compat_rusage {
189 struct compat_timeval ru_utime; 189 struct compat_timeval ru_utime;
190 struct compat_timeval ru_stime; 190 struct compat_timeval ru_stime;
191 compat_long_t ru_maxrss; 191 compat_long_t ru_maxrss;
192 compat_long_t ru_ixrss; 192 compat_long_t ru_ixrss;
193 compat_long_t ru_idrss; 193 compat_long_t ru_idrss;
194 compat_long_t ru_isrss; 194 compat_long_t ru_isrss;
195 compat_long_t ru_minflt; 195 compat_long_t ru_minflt;
196 compat_long_t ru_majflt; 196 compat_long_t ru_majflt;
197 compat_long_t ru_nswap; 197 compat_long_t ru_nswap;
198 compat_long_t ru_inblock; 198 compat_long_t ru_inblock;
199 compat_long_t ru_oublock; 199 compat_long_t ru_oublock;
200 compat_long_t ru_msgsnd; 200 compat_long_t ru_msgsnd;
201 compat_long_t ru_msgrcv; 201 compat_long_t ru_msgrcv;
202 compat_long_t ru_nsignals; 202 compat_long_t ru_nsignals;
203 compat_long_t ru_nvcsw; 203 compat_long_t ru_nvcsw;
204 compat_long_t ru_nivcsw; 204 compat_long_t ru_nivcsw;
205 }; 205 };
206 206
207 extern int put_compat_rusage(const struct rusage *, 207 extern int put_compat_rusage(const struct rusage *,
208 struct compat_rusage __user *); 208 struct compat_rusage __user *);
209 209
210 struct compat_siginfo; 210 struct compat_siginfo;
211 211
212 extern asmlinkage long compat_sys_waitid(int, compat_pid_t, 212 extern asmlinkage long compat_sys_waitid(int, compat_pid_t,
213 struct compat_siginfo __user *, int, 213 struct compat_siginfo __user *, int,
214 struct compat_rusage __user *); 214 struct compat_rusage __user *);
215 215
216 struct compat_dirent { 216 struct compat_dirent {
217 u32 d_ino; 217 u32 d_ino;
218 compat_off_t d_off; 218 compat_off_t d_off;
219 u16 d_reclen; 219 u16 d_reclen;
220 char d_name[256]; 220 char d_name[256];
221 }; 221 };
222 222
223 struct compat_ustat { 223 struct compat_ustat {
224 compat_daddr_t f_tfree; 224 compat_daddr_t f_tfree;
225 compat_ino_t f_tinode; 225 compat_ino_t f_tinode;
226 char f_fname[6]; 226 char f_fname[6];
227 char f_fpack[6]; 227 char f_fpack[6];
228 }; 228 };
229 229
230 #define COMPAT_SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 3) 230 #define COMPAT_SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 3)
231 231
232 typedef struct compat_sigevent { 232 typedef struct compat_sigevent {
233 compat_sigval_t sigev_value; 233 compat_sigval_t sigev_value;
234 compat_int_t sigev_signo; 234 compat_int_t sigev_signo;
235 compat_int_t sigev_notify; 235 compat_int_t sigev_notify;
236 union { 236 union {
237 compat_int_t _pad[COMPAT_SIGEV_PAD_SIZE]; 237 compat_int_t _pad[COMPAT_SIGEV_PAD_SIZE];
238 compat_int_t _tid; 238 compat_int_t _tid;
239 239
240 struct { 240 struct {
241 compat_uptr_t _function; 241 compat_uptr_t _function;
242 compat_uptr_t _attribute; 242 compat_uptr_t _attribute;
243 } _sigev_thread; 243 } _sigev_thread;
244 } _sigev_un; 244 } _sigev_un;
245 } compat_sigevent_t; 245 } compat_sigevent_t;
246 246
247 struct compat_ifmap { 247 struct compat_ifmap {
248 compat_ulong_t mem_start; 248 compat_ulong_t mem_start;
249 compat_ulong_t mem_end; 249 compat_ulong_t mem_end;
250 unsigned short base_addr; 250 unsigned short base_addr;
251 unsigned char irq; 251 unsigned char irq;
252 unsigned char dma; 252 unsigned char dma;
253 unsigned char port; 253 unsigned char port;
254 }; 254 };
255 255
256 struct compat_if_settings { 256 struct compat_if_settings {
257 unsigned int type; /* Type of physical device or protocol */ 257 unsigned int type; /* Type of physical device or protocol */
258 unsigned int size; /* Size of the data allocated by the caller */ 258 unsigned int size; /* Size of the data allocated by the caller */
259 compat_uptr_t ifs_ifsu; /* union of pointers */ 259 compat_uptr_t ifs_ifsu; /* union of pointers */
260 }; 260 };
261 261
262 struct compat_ifreq { 262 struct compat_ifreq {
263 union { 263 union {
264 char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 264 char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */
265 } ifr_ifrn; 265 } ifr_ifrn;
266 union { 266 union {
267 struct sockaddr ifru_addr; 267 struct sockaddr ifru_addr;
268 struct sockaddr ifru_dstaddr; 268 struct sockaddr ifru_dstaddr;
269 struct sockaddr ifru_broadaddr; 269 struct sockaddr ifru_broadaddr;
270 struct sockaddr ifru_netmask; 270 struct sockaddr ifru_netmask;
271 struct sockaddr ifru_hwaddr; 271 struct sockaddr ifru_hwaddr;
272 short ifru_flags; 272 short ifru_flags;
273 compat_int_t ifru_ivalue; 273 compat_int_t ifru_ivalue;
274 compat_int_t ifru_mtu; 274 compat_int_t ifru_mtu;
275 struct compat_ifmap ifru_map; 275 struct compat_ifmap ifru_map;
276 char ifru_slave[IFNAMSIZ]; /* Just fits the size */ 276 char ifru_slave[IFNAMSIZ]; /* Just fits the size */
277 char ifru_newname[IFNAMSIZ]; 277 char ifru_newname[IFNAMSIZ];
278 compat_caddr_t ifru_data; 278 compat_caddr_t ifru_data;
279 struct compat_if_settings ifru_settings; 279 struct compat_if_settings ifru_settings;
280 } ifr_ifru; 280 } ifr_ifru;
281 }; 281 };
282 282
283 struct compat_ifconf { 283 struct compat_ifconf {
284 compat_int_t ifc_len; /* size of buffer */ 284 compat_int_t ifc_len; /* size of buffer */
285 compat_caddr_t ifcbuf; 285 compat_caddr_t ifcbuf;
286 }; 286 };
287 287
288 struct compat_robust_list { 288 struct compat_robust_list {
289 compat_uptr_t next; 289 compat_uptr_t next;
290 }; 290 };
291 291
292 struct compat_robust_list_head { 292 struct compat_robust_list_head {
293 struct compat_robust_list list; 293 struct compat_robust_list list;
294 compat_long_t futex_offset; 294 compat_long_t futex_offset;
295 compat_uptr_t list_op_pending; 295 compat_uptr_t list_op_pending;
296 }; 296 };
297 297
298 #ifdef CONFIG_COMPAT_OLD_SIGACTION 298 #ifdef CONFIG_COMPAT_OLD_SIGACTION
299 struct compat_old_sigaction { 299 struct compat_old_sigaction {
300 compat_uptr_t sa_handler; 300 compat_uptr_t sa_handler;
301 compat_old_sigset_t sa_mask; 301 compat_old_sigset_t sa_mask;
302 compat_ulong_t sa_flags; 302 compat_ulong_t sa_flags;
303 compat_uptr_t sa_restorer; 303 compat_uptr_t sa_restorer;
304 }; 304 };
305 #endif 305 #endif
306 306
307 struct compat_statfs; 307 struct compat_statfs;
308 struct compat_statfs64; 308 struct compat_statfs64;
309 struct compat_old_linux_dirent; 309 struct compat_old_linux_dirent;
310 struct compat_linux_dirent; 310 struct compat_linux_dirent;
311 struct linux_dirent64; 311 struct linux_dirent64;
312 struct compat_msghdr; 312 struct compat_msghdr;
313 struct compat_mmsghdr; 313 struct compat_mmsghdr;
314 struct compat_sysinfo; 314 struct compat_sysinfo;
315 struct compat_sysctl_args; 315 struct compat_sysctl_args;
316 struct compat_kexec_segment; 316 struct compat_kexec_segment;
317 struct compat_mq_attr; 317 struct compat_mq_attr;
318 struct compat_msgbuf; 318 struct compat_msgbuf;
319 319
320 extern void compat_exit_robust_list(struct task_struct *curr); 320 extern void compat_exit_robust_list(struct task_struct *curr);
321 321
322 asmlinkage long 322 asmlinkage long
323 compat_sys_set_robust_list(struct compat_robust_list_head __user *head, 323 compat_sys_set_robust_list(struct compat_robust_list_head __user *head,
324 compat_size_t len); 324 compat_size_t len);
325 asmlinkage long 325 asmlinkage long
326 compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr, 326 compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr,
327 compat_size_t __user *len_ptr); 327 compat_size_t __user *len_ptr);
328 328
329 #ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC 329 #ifdef CONFIG_ARCH_WANT_OLD_COMPAT_IPC
330 long compat_sys_semctl(int first, int second, int third, void __user *uptr); 330 long compat_sys_semctl(int first, int second, int third, void __user *uptr);
331 long compat_sys_msgsnd(int first, int second, int third, void __user *uptr); 331 long compat_sys_msgsnd(int first, int second, int third, void __user *uptr);
332 long compat_sys_msgrcv(int first, int second, int msgtyp, int third, 332 long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
333 int version, void __user *uptr); 333 int version, void __user *uptr);
334 long compat_sys_shmat(int first, int second, compat_uptr_t third, int version, 334 long compat_sys_shmat(int first, int second, compat_uptr_t third, int version,
335 void __user *uptr); 335 void __user *uptr);
336 #else 336 #else
337 long compat_sys_semctl(int semid, int semnum, int cmd, int arg); 337 long compat_sys_semctl(int semid, int semnum, int cmd, int arg);
338 long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp, 338 long compat_sys_msgsnd(int msqid, struct compat_msgbuf __user *msgp,
339 compat_ssize_t msgsz, int msgflg); 339 compat_ssize_t msgsz, int msgflg);
340 long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp, 340 long compat_sys_msgrcv(int msqid, struct compat_msgbuf __user *msgp,
341 compat_ssize_t msgsz, long msgtyp, int msgflg); 341 compat_ssize_t msgsz, long msgtyp, int msgflg);
342 long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg); 342 long compat_sys_shmat(int shmid, compat_uptr_t shmaddr, int shmflg);
343 #endif 343 #endif
344 long compat_sys_msgctl(int first, int second, void __user *uptr); 344 long compat_sys_msgctl(int first, int second, void __user *uptr);
345 long compat_sys_shmctl(int first, int second, void __user *uptr); 345 long compat_sys_shmctl(int first, int second, void __user *uptr);
346 long compat_sys_semtimedop(int semid, struct sembuf __user *tsems, 346 long compat_sys_semtimedop(int semid, struct sembuf __user *tsems,
347 unsigned nsems, const struct compat_timespec __user *timeout); 347 unsigned nsems, const struct compat_timespec __user *timeout);
348 asmlinkage long compat_sys_keyctl(u32 option, 348 asmlinkage long compat_sys_keyctl(u32 option,
349 u32 arg2, u32 arg3, u32 arg4, u32 arg5); 349 u32 arg2, u32 arg3, u32 arg4, u32 arg5);
350 asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32); 350 asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u32);
351 351
352 asmlinkage ssize_t compat_sys_readv(unsigned long fd, 352 asmlinkage ssize_t compat_sys_readv(unsigned long fd,
353 const struct compat_iovec __user *vec, unsigned long vlen); 353 const struct compat_iovec __user *vec, unsigned long vlen);
354 asmlinkage ssize_t compat_sys_writev(unsigned long fd, 354 asmlinkage ssize_t compat_sys_writev(unsigned long fd,
355 const struct compat_iovec __user *vec, unsigned long vlen); 355 const struct compat_iovec __user *vec, unsigned long vlen);
356 asmlinkage ssize_t compat_sys_preadv(unsigned long fd, 356 asmlinkage ssize_t compat_sys_preadv(unsigned long fd,
357 const struct compat_iovec __user *vec, 357 const struct compat_iovec __user *vec,
358 unsigned long vlen, u32 pos_low, u32 pos_high); 358 unsigned long vlen, u32 pos_low, u32 pos_high);
359 asmlinkage ssize_t compat_sys_pwritev(unsigned long fd, 359 asmlinkage ssize_t compat_sys_pwritev(unsigned long fd,
360 const struct compat_iovec __user *vec, 360 const struct compat_iovec __user *vec,
361 unsigned long vlen, u32 pos_low, u32 pos_high); 361 unsigned long vlen, u32 pos_low, u32 pos_high);
362 asmlinkage long comat_sys_lseek(unsigned int, compat_off_t, unsigned int); 362 asmlinkage long comat_sys_lseek(unsigned int, compat_off_t, unsigned int);
363 363
364 asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv, 364 asmlinkage long compat_sys_execve(const char __user *filename, const compat_uptr_t __user *argv,
365 const compat_uptr_t __user *envp); 365 const compat_uptr_t __user *envp);
366 366
367 asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp, 367 asmlinkage long compat_sys_select(int n, compat_ulong_t __user *inp,
368 compat_ulong_t __user *outp, compat_ulong_t __user *exp, 368 compat_ulong_t __user *outp, compat_ulong_t __user *exp,
369 struct compat_timeval __user *tvp); 369 struct compat_timeval __user *tvp);
370 370
371 asmlinkage long compat_sys_old_select(struct compat_sel_arg_struct __user *arg); 371 asmlinkage long compat_sys_old_select(struct compat_sel_arg_struct __user *arg);
372 372
373 asmlinkage long compat_sys_wait4(compat_pid_t pid, 373 asmlinkage long compat_sys_wait4(compat_pid_t pid,
374 compat_uint_t __user *stat_addr, int options, 374 compat_uint_t __user *stat_addr, int options,
375 struct compat_rusage __user *ru); 375 struct compat_rusage __user *ru);
376 376
377 #define BITS_PER_COMPAT_LONG (8*sizeof(compat_long_t)) 377 #define BITS_PER_COMPAT_LONG (8*sizeof(compat_long_t))
378 378
379 #define BITS_TO_COMPAT_LONGS(bits) \ 379 #define BITS_TO_COMPAT_LONGS(bits) \
380 (((bits)+BITS_PER_COMPAT_LONG-1)/BITS_PER_COMPAT_LONG) 380 (((bits)+BITS_PER_COMPAT_LONG-1)/BITS_PER_COMPAT_LONG)
381 381
382 long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask, 382 long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask,
383 unsigned long bitmap_size); 383 unsigned long bitmap_size);
384 long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask, 384 long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
385 unsigned long bitmap_size); 385 unsigned long bitmap_size);
386 int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from); 386 int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from);
387 int copy_siginfo_to_user32(struct compat_siginfo __user *to, siginfo_t *from); 387 int copy_siginfo_to_user32(struct compat_siginfo __user *to, siginfo_t *from);
388 int get_compat_sigevent(struct sigevent *event, 388 int get_compat_sigevent(struct sigevent *event,
389 const struct compat_sigevent __user *u_event); 389 const struct compat_sigevent __user *u_event);
390 long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig, 390 long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig,
391 struct compat_siginfo __user *uinfo); 391 struct compat_siginfo __user *uinfo);
392 #ifdef CONFIG_COMPAT_OLD_SIGACTION 392 #ifdef CONFIG_COMPAT_OLD_SIGACTION
393 asmlinkage long compat_sys_sigaction(int sig, 393 asmlinkage long compat_sys_sigaction(int sig,
394 const struct compat_old_sigaction __user *act, 394 const struct compat_old_sigaction __user *act,
395 struct compat_old_sigaction __user *oact); 395 struct compat_old_sigaction __user *oact);
396 #endif 396 #endif
397 397
398 static inline int compat_timeval_compare(struct compat_timeval *lhs, 398 static inline int compat_timeval_compare(struct compat_timeval *lhs,
399 struct compat_timeval *rhs) 399 struct compat_timeval *rhs)
400 { 400 {
401 if (lhs->tv_sec < rhs->tv_sec) 401 if (lhs->tv_sec < rhs->tv_sec)
402 return -1; 402 return -1;
403 if (lhs->tv_sec > rhs->tv_sec) 403 if (lhs->tv_sec > rhs->tv_sec)
404 return 1; 404 return 1;
405 return lhs->tv_usec - rhs->tv_usec; 405 return lhs->tv_usec - rhs->tv_usec;
406 } 406 }
407 407
408 static inline int compat_timespec_compare(struct compat_timespec *lhs, 408 static inline int compat_timespec_compare(struct compat_timespec *lhs,
409 struct compat_timespec *rhs) 409 struct compat_timespec *rhs)
410 { 410 {
411 if (lhs->tv_sec < rhs->tv_sec) 411 if (lhs->tv_sec < rhs->tv_sec)
412 return -1; 412 return -1;
413 if (lhs->tv_sec > rhs->tv_sec) 413 if (lhs->tv_sec > rhs->tv_sec)
414 return 1; 414 return 1;
415 return lhs->tv_nsec - rhs->tv_nsec; 415 return lhs->tv_nsec - rhs->tv_nsec;
416 } 416 }
417 417
418 extern int get_compat_itimerspec(struct itimerspec *dst, 418 extern int get_compat_itimerspec(struct itimerspec *dst,
419 const struct compat_itimerspec __user *src); 419 const struct compat_itimerspec __user *src);
420 extern int put_compat_itimerspec(struct compat_itimerspec __user *dst, 420 extern int put_compat_itimerspec(struct compat_itimerspec __user *dst,
421 const struct itimerspec *src); 421 const struct itimerspec *src);
422 422
423 asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv, 423 asmlinkage long compat_sys_gettimeofday(struct compat_timeval __user *tv,
424 struct timezone __user *tz); 424 struct timezone __user *tz);
425 asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, 425 asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv,
426 struct timezone __user *tz); 426 struct timezone __user *tz);
427 427
428 asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); 428 asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp);
429 429
430 extern int compat_printk(const char *fmt, ...); 430 extern int compat_printk(const char *fmt, ...);
431 extern void sigset_from_compat(sigset_t *set, const compat_sigset_t *compat); 431 extern void sigset_from_compat(sigset_t *set, const compat_sigset_t *compat);
432 extern void sigset_to_compat(compat_sigset_t *compat, const sigset_t *set); 432 extern void sigset_to_compat(compat_sigset_t *compat, const sigset_t *set);
433 433
434 asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, 434 asmlinkage long compat_sys_migrate_pages(compat_pid_t pid,
435 compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes, 435 compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes,
436 const compat_ulong_t __user *new_nodes); 436 const compat_ulong_t __user *new_nodes);
437 437
438 extern int compat_ptrace_request(struct task_struct *child, 438 extern int compat_ptrace_request(struct task_struct *child,
439 compat_long_t request, 439 compat_long_t request,
440 compat_ulong_t addr, compat_ulong_t data); 440 compat_ulong_t addr, compat_ulong_t data);
441 441
442 extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request, 442 extern long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
443 compat_ulong_t addr, compat_ulong_t data); 443 compat_ulong_t addr, compat_ulong_t data);
444 asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid, 444 asmlinkage long compat_sys_ptrace(compat_long_t request, compat_long_t pid,
445 compat_long_t addr, compat_long_t data); 445 compat_long_t addr, compat_long_t data);
446 446
447 /* 447 /*
448 * epoll (fs/eventpoll.c) compat bits follow ... 448 * epoll (fs/eventpoll.c) compat bits follow ...
449 */ 449 */
450 struct epoll_event; 450 struct epoll_event;
451 #define compat_epoll_event epoll_event 451 #define compat_epoll_event epoll_event
452 asmlinkage long compat_sys_epoll_pwait(int epfd, 452 asmlinkage long compat_sys_epoll_pwait(int epfd,
453 struct compat_epoll_event __user *events, 453 struct compat_epoll_event __user *events,
454 int maxevents, int timeout, 454 int maxevents, int timeout,
455 const compat_sigset_t __user *sigmask, 455 const compat_sigset_t __user *sigmask,
456 compat_size_t sigsetsize); 456 compat_size_t sigsetsize);
457 457
458 asmlinkage long compat_sys_utime(const char __user *filename, 458 asmlinkage long compat_sys_utime(const char __user *filename,
459 struct compat_utimbuf __user *t); 459 struct compat_utimbuf __user *t);
460 asmlinkage long compat_sys_utimensat(unsigned int dfd, 460 asmlinkage long compat_sys_utimensat(unsigned int dfd,
461 const char __user *filename, 461 const char __user *filename,
462 struct compat_timespec __user *t, 462 struct compat_timespec __user *t,
463 int flags); 463 int flags);
464 464
465 asmlinkage long compat_sys_time(compat_time_t __user *tloc); 465 asmlinkage long compat_sys_time(compat_time_t __user *tloc);
466 asmlinkage long compat_sys_stime(compat_time_t __user *tptr); 466 asmlinkage long compat_sys_stime(compat_time_t __user *tptr);
467 asmlinkage long compat_sys_signalfd(int ufd, 467 asmlinkage long compat_sys_signalfd(int ufd,
468 const compat_sigset_t __user *sigmask, 468 const compat_sigset_t __user *sigmask,
469 compat_size_t sigsetsize); 469 compat_size_t sigsetsize);
470 asmlinkage long compat_sys_timerfd_settime(int ufd, int flags, 470 asmlinkage long compat_sys_timerfd_settime(int ufd, int flags,
471 const struct compat_itimerspec __user *utmr, 471 const struct compat_itimerspec __user *utmr,
472 struct compat_itimerspec __user *otmr); 472 struct compat_itimerspec __user *otmr);
473 asmlinkage long compat_sys_timerfd_gettime(int ufd, 473 asmlinkage long compat_sys_timerfd_gettime(int ufd,
474 struct compat_itimerspec __user *otmr); 474 struct compat_itimerspec __user *otmr);
475 475
476 asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page, 476 asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page,
477 __u32 __user *pages, 477 __u32 __user *pages,
478 const int __user *nodes, 478 const int __user *nodes,
479 int __user *status, 479 int __user *status,
480 int flags); 480 int flags);
481 asmlinkage long compat_sys_futimesat(unsigned int dfd, 481 asmlinkage long compat_sys_futimesat(unsigned int dfd,
482 const char __user *filename, 482 const char __user *filename,
483 struct compat_timeval __user *t); 483 struct compat_timeval __user *t);
484 asmlinkage long compat_sys_utimes(const char __user *filename, 484 asmlinkage long compat_sys_utimes(const char __user *filename,
485 struct compat_timeval __user *t); 485 struct compat_timeval __user *t);
486 asmlinkage long compat_sys_newstat(const char __user *filename, 486 asmlinkage long compat_sys_newstat(const char __user *filename,
487 struct compat_stat __user *statbuf); 487 struct compat_stat __user *statbuf);
488 asmlinkage long compat_sys_newlstat(const char __user *filename, 488 asmlinkage long compat_sys_newlstat(const char __user *filename,
489 struct compat_stat __user *statbuf); 489 struct compat_stat __user *statbuf);
490 asmlinkage long compat_sys_newfstatat(unsigned int dfd, 490 asmlinkage long compat_sys_newfstatat(unsigned int dfd,
491 const char __user *filename, 491 const char __user *filename,
492 struct compat_stat __user *statbuf, 492 struct compat_stat __user *statbuf,
493 int flag); 493 int flag);
494 asmlinkage long compat_sys_newfstat(unsigned int fd, 494 asmlinkage long compat_sys_newfstat(unsigned int fd,
495 struct compat_stat __user *statbuf); 495 struct compat_stat __user *statbuf);
496 asmlinkage long compat_sys_statfs(const char __user *pathname, 496 asmlinkage long compat_sys_statfs(const char __user *pathname,
497 struct compat_statfs __user *buf); 497 struct compat_statfs __user *buf);
498 asmlinkage long compat_sys_fstatfs(unsigned int fd, 498 asmlinkage long compat_sys_fstatfs(unsigned int fd,
499 struct compat_statfs __user *buf); 499 struct compat_statfs __user *buf);
500 asmlinkage long compat_sys_statfs64(const char __user *pathname, 500 asmlinkage long compat_sys_statfs64(const char __user *pathname,
501 compat_size_t sz, 501 compat_size_t sz,
502 struct compat_statfs64 __user *buf); 502 struct compat_statfs64 __user *buf);
503 asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz, 503 asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz,
504 struct compat_statfs64 __user *buf); 504 struct compat_statfs64 __user *buf);
505 asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd, 505 asmlinkage long compat_sys_fcntl64(unsigned int fd, unsigned int cmd,
506 unsigned long arg); 506 unsigned long arg);
507 asmlinkage long compat_sys_fcntl(unsigned int fd, unsigned int cmd, 507 asmlinkage long compat_sys_fcntl(unsigned int fd, unsigned int cmd,
508 unsigned long arg); 508 unsigned long arg);
509 asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 __user *ctx32p); 509 asmlinkage long compat_sys_io_setup(unsigned nr_reqs, u32 __user *ctx32p);
510 asmlinkage long compat_sys_io_getevents(aio_context_t ctx_id, 510 asmlinkage long compat_sys_io_getevents(aio_context_t ctx_id,
511 unsigned long min_nr, 511 unsigned long min_nr,
512 unsigned long nr, 512 unsigned long nr,
513 struct io_event __user *events, 513 struct io_event __user *events,
514 struct compat_timespec __user *timeout); 514 struct compat_timespec __user *timeout);
515 asmlinkage long compat_sys_io_submit(aio_context_t ctx_id, int nr, 515 asmlinkage long compat_sys_io_submit(aio_context_t ctx_id, int nr,
516 u32 __user *iocb); 516 u32 __user *iocb);
517 asmlinkage long compat_sys_mount(const char __user *dev_name, 517 asmlinkage long compat_sys_mount(const char __user *dev_name,
518 const char __user *dir_name, 518 const char __user *dir_name,
519 const char __user *type, unsigned long flags, 519 const char __user *type, unsigned long flags,
520 const void __user *data); 520 const void __user *data);
521 asmlinkage long compat_sys_old_readdir(unsigned int fd, 521 asmlinkage long compat_sys_old_readdir(unsigned int fd,
522 struct compat_old_linux_dirent __user *, 522 struct compat_old_linux_dirent __user *,
523 unsigned int count); 523 unsigned int count);
524 asmlinkage long compat_sys_getdents(unsigned int fd, 524 asmlinkage long compat_sys_getdents(unsigned int fd,
525 struct compat_linux_dirent __user *dirent, 525 struct compat_linux_dirent __user *dirent,
526 unsigned int count); 526 unsigned int count);
527 asmlinkage long compat_sys_getdents64(unsigned int fd, 527 asmlinkage long compat_sys_getdents64(unsigned int fd,
528 struct linux_dirent64 __user *dirent, 528 struct linux_dirent64 __user *dirent,
529 unsigned int count); 529 unsigned int count);
530 asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *, 530 asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *,
531 unsigned int nr_segs, unsigned int flags); 531 unsigned int nr_segs, unsigned int flags);
532 asmlinkage long compat_sys_open(const char __user *filename, int flags, 532 asmlinkage long compat_sys_open(const char __user *filename, int flags,
533 umode_t mode); 533 umode_t mode);
534 asmlinkage long compat_sys_openat(int dfd, const char __user *filename, 534 asmlinkage long compat_sys_openat(int dfd, const char __user *filename,
535 int flags, umode_t mode); 535 int flags, umode_t mode);
536 asmlinkage long compat_sys_open_by_handle_at(int mountdirfd, 536 asmlinkage long compat_sys_open_by_handle_at(int mountdirfd,
537 struct file_handle __user *handle, 537 struct file_handle __user *handle,
538 int flags); 538 int flags);
539 asmlinkage long compat_sys_truncate(const char __user *, compat_off_t); 539 asmlinkage long compat_sys_truncate(const char __user *, compat_off_t);
540 asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t); 540 asmlinkage long compat_sys_ftruncate(unsigned int, compat_ulong_t);
541 asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp, 541 asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,
542 compat_ulong_t __user *outp, 542 compat_ulong_t __user *outp,
543 compat_ulong_t __user *exp, 543 compat_ulong_t __user *exp,
544 struct compat_timespec __user *tsp, 544 struct compat_timespec __user *tsp,
545 void __user *sig); 545 void __user *sig);
546 asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds, 546 asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
547 unsigned int nfds, 547 unsigned int nfds,
548 struct compat_timespec __user *tsp, 548 struct compat_timespec __user *tsp,
549 const compat_sigset_t __user *sigmask, 549 const compat_sigset_t __user *sigmask,
550 compat_size_t sigsetsize); 550 compat_size_t sigsetsize);
551 asmlinkage long compat_sys_signalfd4(int ufd, 551 asmlinkage long compat_sys_signalfd4(int ufd,
552 const compat_sigset_t __user *sigmask, 552 const compat_sigset_t __user *sigmask,
553 compat_size_t sigsetsize, int flags); 553 compat_size_t sigsetsize, int flags);
554 asmlinkage long compat_sys_get_mempolicy(int __user *policy, 554 asmlinkage long compat_sys_get_mempolicy(int __user *policy,
555 compat_ulong_t __user *nmask, 555 compat_ulong_t __user *nmask,
556 compat_ulong_t maxnode, 556 compat_ulong_t maxnode,
557 compat_ulong_t addr, 557 compat_ulong_t addr,
558 compat_ulong_t flags); 558 compat_ulong_t flags);
559 asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask, 559 asmlinkage long compat_sys_set_mempolicy(int mode, compat_ulong_t __user *nmask,
560 compat_ulong_t maxnode); 560 compat_ulong_t maxnode);
561 asmlinkage long compat_sys_mbind(compat_ulong_t start, compat_ulong_t len, 561 asmlinkage long compat_sys_mbind(compat_ulong_t start, compat_ulong_t len,
562 compat_ulong_t mode, 562 compat_ulong_t mode,
563 compat_ulong_t __user *nmask, 563 compat_ulong_t __user *nmask,
564 compat_ulong_t maxnode, compat_ulong_t flags); 564 compat_ulong_t maxnode, compat_ulong_t flags);
565 565
566 asmlinkage long compat_sys_setsockopt(int fd, int level, int optname, 566 asmlinkage long compat_sys_setsockopt(int fd, int level, int optname,
567 char __user *optval, unsigned int optlen); 567 char __user *optval, unsigned int optlen);
568 asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, 568 asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg,
569 unsigned flags); 569 unsigned flags);
570 asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg, 570 asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg,
571 unsigned vlen, unsigned int flags); 571 unsigned vlen, unsigned int flags);
572 asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, 572 asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg,
573 unsigned int flags); 573 unsigned int flags);
574 asmlinkage long compat_sys_recv(int fd, void __user *buf, size_t len, 574 asmlinkage long compat_sys_recv(int fd, void __user *buf, size_t len,
575 unsigned flags); 575 unsigned flags);
576 asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, size_t len, 576 asmlinkage long compat_sys_recvfrom(int fd, void __user *buf, size_t len,
577 unsigned flags, struct sockaddr __user *addr, 577 unsigned flags, struct sockaddr __user *addr,
578 int __user *addrlen); 578 int __user *addrlen);
579 asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg, 579 asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg,
580 unsigned vlen, unsigned int flags, 580 unsigned vlen, unsigned int flags,
581 struct compat_timespec __user *timeout); 581 struct compat_timespec __user *timeout);
582 asmlinkage long compat_sys_nanosleep(struct compat_timespec __user *rqtp, 582 asmlinkage long compat_sys_nanosleep(struct compat_timespec __user *rqtp,
583 struct compat_timespec __user *rmtp); 583 struct compat_timespec __user *rmtp);
584 asmlinkage long compat_sys_getitimer(int which, 584 asmlinkage long compat_sys_getitimer(int which,
585 struct compat_itimerval __user *it); 585 struct compat_itimerval __user *it);
586 asmlinkage long compat_sys_setitimer(int which, 586 asmlinkage long compat_sys_setitimer(int which,
587 struct compat_itimerval __user *in, 587 struct compat_itimerval __user *in,
588 struct compat_itimerval __user *out); 588 struct compat_itimerval __user *out);
589 asmlinkage long compat_sys_times(struct compat_tms __user *tbuf); 589 asmlinkage long compat_sys_times(struct compat_tms __user *tbuf);
590 asmlinkage long compat_sys_setrlimit(unsigned int resource, 590 asmlinkage long compat_sys_setrlimit(unsigned int resource,
591 struct compat_rlimit __user *rlim); 591 struct compat_rlimit __user *rlim);
592 asmlinkage long compat_sys_getrlimit(unsigned int resource, 592 asmlinkage long compat_sys_getrlimit(unsigned int resource,
593 struct compat_rlimit __user *rlim); 593 struct compat_rlimit __user *rlim);
594 asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru); 594 asmlinkage long compat_sys_getrusage(int who, struct compat_rusage __user *ru);
595 asmlinkage long compat_sys_sched_setaffinity(compat_pid_t pid, 595 asmlinkage long compat_sys_sched_setaffinity(compat_pid_t pid,
596 unsigned int len, 596 unsigned int len,
597 compat_ulong_t __user *user_mask_ptr); 597 compat_ulong_t __user *user_mask_ptr);
598 asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid, 598 asmlinkage long compat_sys_sched_getaffinity(compat_pid_t pid,
599 unsigned int len, 599 unsigned int len,
600 compat_ulong_t __user *user_mask_ptr); 600 compat_ulong_t __user *user_mask_ptr);
601 asmlinkage long compat_sys_timer_create(clockid_t which_clock, 601 asmlinkage long compat_sys_timer_create(clockid_t which_clock,
602 struct compat_sigevent __user *timer_event_spec, 602 struct compat_sigevent __user *timer_event_spec,
603 timer_t __user *created_timer_id); 603 timer_t __user *created_timer_id);
604 asmlinkage long compat_sys_timer_settime(timer_t timer_id, int flags, 604 asmlinkage long compat_sys_timer_settime(timer_t timer_id, int flags,
605 struct compat_itimerspec __user *new, 605 struct compat_itimerspec __user *new,
606 struct compat_itimerspec __user *old); 606 struct compat_itimerspec __user *old);
607 asmlinkage long compat_sys_timer_gettime(timer_t timer_id, 607 asmlinkage long compat_sys_timer_gettime(timer_t timer_id,
608 struct compat_itimerspec __user *setting); 608 struct compat_itimerspec __user *setting);
609 asmlinkage long compat_sys_clock_settime(clockid_t which_clock, 609 asmlinkage long compat_sys_clock_settime(clockid_t which_clock,
610 struct compat_timespec __user *tp); 610 struct compat_timespec __user *tp);
611 asmlinkage long compat_sys_clock_gettime(clockid_t which_clock, 611 asmlinkage long compat_sys_clock_gettime(clockid_t which_clock,
612 struct compat_timespec __user *tp); 612 struct compat_timespec __user *tp);
613 asmlinkage long compat_sys_clock_adjtime(clockid_t which_clock, 613 asmlinkage long compat_sys_clock_adjtime(clockid_t which_clock,
614 struct compat_timex __user *tp); 614 struct compat_timex __user *tp);
615 asmlinkage long compat_sys_clock_getres(clockid_t which_clock, 615 asmlinkage long compat_sys_clock_getres(clockid_t which_clock,
616 struct compat_timespec __user *tp); 616 struct compat_timespec __user *tp);
617 asmlinkage long compat_sys_clock_nanosleep(clockid_t which_clock, int flags, 617 asmlinkage long compat_sys_clock_nanosleep(clockid_t which_clock, int flags,
618 struct compat_timespec __user *rqtp, 618 struct compat_timespec __user *rqtp,
619 struct compat_timespec __user *rmtp); 619 struct compat_timespec __user *rmtp);
620 asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese, 620 asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese,
621 struct compat_siginfo __user *uinfo, 621 struct compat_siginfo __user *uinfo,
622 struct compat_timespec __user *uts, compat_size_t sigsetsize); 622 struct compat_timespec __user *uts, compat_size_t sigsetsize);
623 asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, 623 asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset,
624 compat_size_t sigsetsize); 624 compat_size_t sigsetsize);
625 asmlinkage long compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set, 625 asmlinkage long compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set,
626 compat_sigset_t __user *oset, 626 compat_sigset_t __user *oset,
627 compat_size_t sigsetsize); 627 compat_size_t sigsetsize);
628 asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset, 628 asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset,
629 compat_size_t sigsetsize); 629 compat_size_t sigsetsize);
630 #ifndef CONFIG_ODD_RT_SIGACTION 630 #ifndef CONFIG_ODD_RT_SIGACTION
631 asmlinkage long compat_sys_rt_sigaction(int, 631 asmlinkage long compat_sys_rt_sigaction(int,
632 const struct compat_sigaction __user *, 632 const struct compat_sigaction __user *,
633 struct compat_sigaction __user *, 633 struct compat_sigaction __user *,
634 compat_size_t); 634 compat_size_t);
635 #endif 635 #endif
636 asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig, 636 asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig,
637 struct compat_siginfo __user *uinfo); 637 struct compat_siginfo __user *uinfo);
638 asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info); 638 asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info);
639 asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, 639 asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd,
640 unsigned long arg); 640 unsigned long arg);
641 asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val, 641 asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
642 struct compat_timespec __user *utime, u32 __user *uaddr2, 642 struct compat_timespec __user *utime, u32 __user *uaddr2,
643 u32 val3); 643 u32 val3);
644 asmlinkage long compat_sys_getsockopt(int fd, int level, int optname, 644 asmlinkage long compat_sys_getsockopt(int fd, int level, int optname,
645 char __user *optval, int __user *optlen); 645 char __user *optval, int __user *optlen);
646 asmlinkage long compat_sys_kexec_load(unsigned long entry, 646 asmlinkage long compat_sys_kexec_load(unsigned long entry,
647 unsigned long nr_segments, 647 unsigned long nr_segments,
648 struct compat_kexec_segment __user *, 648 struct compat_kexec_segment __user *,
649 unsigned long flags); 649 unsigned long flags);
650 asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes, 650 asmlinkage long compat_sys_mq_getsetattr(mqd_t mqdes,
651 const struct compat_mq_attr __user *u_mqstat, 651 const struct compat_mq_attr __user *u_mqstat,
652 struct compat_mq_attr __user *u_omqstat); 652 struct compat_mq_attr __user *u_omqstat);
653 asmlinkage long compat_sys_mq_notify(mqd_t mqdes, 653 asmlinkage long compat_sys_mq_notify(mqd_t mqdes,
654 const struct compat_sigevent __user *u_notification); 654 const struct compat_sigevent __user *u_notification);
655 asmlinkage long compat_sys_mq_open(const char __user *u_name, 655 asmlinkage long compat_sys_mq_open(const char __user *u_name,
656 int oflag, compat_mode_t mode, 656 int oflag, compat_mode_t mode,
657 struct compat_mq_attr __user *u_attr); 657 struct compat_mq_attr __user *u_attr);
658 asmlinkage long compat_sys_mq_timedsend(mqd_t mqdes, 658 asmlinkage long compat_sys_mq_timedsend(mqd_t mqdes,
659 const char __user *u_msg_ptr, 659 const char __user *u_msg_ptr,
660 size_t msg_len, unsigned int msg_prio, 660 size_t msg_len, unsigned int msg_prio,
661 const struct compat_timespec __user *u_abs_timeout); 661 const struct compat_timespec __user *u_abs_timeout);
662 asmlinkage ssize_t compat_sys_mq_timedreceive(mqd_t mqdes, 662 asmlinkage ssize_t compat_sys_mq_timedreceive(mqd_t mqdes,
663 char __user *u_msg_ptr, 663 char __user *u_msg_ptr,
664 size_t msg_len, unsigned int __user *u_msg_prio, 664 size_t msg_len, unsigned int __user *u_msg_prio,
665 const struct compat_timespec __user *u_abs_timeout); 665 const struct compat_timespec __user *u_abs_timeout);
666 asmlinkage long compat_sys_socketcall(int call, u32 __user *args); 666 asmlinkage long compat_sys_socketcall(int call, u32 __user *args);
667 asmlinkage long compat_sys_sysctl(struct compat_sysctl_args __user *args); 667 asmlinkage long compat_sys_sysctl(struct compat_sysctl_args __user *args);
668 668
669 extern ssize_t compat_rw_copy_check_uvector(int type, 669 extern ssize_t compat_rw_copy_check_uvector(int type,
670 const struct compat_iovec __user *uvector, 670 const struct compat_iovec __user *uvector,
671 unsigned long nr_segs, 671 unsigned long nr_segs,
672 unsigned long fast_segs, struct iovec *fast_pointer, 672 unsigned long fast_segs, struct iovec *fast_pointer,
673 struct iovec **ret_pointer); 673 struct iovec **ret_pointer);
674 674
675 extern void __user *compat_alloc_user_space(unsigned long len); 675 extern void __user *compat_alloc_user_space(unsigned long len);
676 676
677 asmlinkage ssize_t compat_sys_process_vm_readv(compat_pid_t pid, 677 asmlinkage ssize_t compat_sys_process_vm_readv(compat_pid_t pid,
678 const struct compat_iovec __user *lvec, 678 const struct compat_iovec __user *lvec,
679 unsigned long liovcnt, const struct compat_iovec __user *rvec, 679 unsigned long liovcnt, const struct compat_iovec __user *rvec,
680 unsigned long riovcnt, unsigned long flags); 680 unsigned long riovcnt, unsigned long flags);
681 asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid, 681 asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid,
682 const struct compat_iovec __user *lvec, 682 const struct compat_iovec __user *lvec,
683 unsigned long liovcnt, const struct compat_iovec __user *rvec, 683 unsigned long liovcnt, const struct compat_iovec __user *rvec,
684 unsigned long riovcnt, unsigned long flags); 684 unsigned long riovcnt, unsigned long flags);
685 685
686 asmlinkage long compat_sys_sendfile(int out_fd, int in_fd, 686 asmlinkage long compat_sys_sendfile(int out_fd, int in_fd,
687 compat_off_t __user *offset, compat_size_t count); 687 compat_off_t __user *offset, compat_size_t count);
688 asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr, 688 asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr,
689 compat_stack_t __user *uoss_ptr); 689 compat_stack_t __user *uoss_ptr);
690 690
691 int compat_restore_altstack(const compat_stack_t __user *uss); 691 int compat_restore_altstack(const compat_stack_t __user *uss);
692 int __compat_save_altstack(compat_stack_t __user *, unsigned long); 692 int __compat_save_altstack(compat_stack_t __user *, unsigned long);
693 693
694 asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, 694 asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid,
695 struct compat_timespec __user *interval); 695 struct compat_timespec __user *interval);
696 696
697 #else 697 #else
698 698
699 #define is_compat_task() (0) 699 #define is_compat_task() (0)
700 700
701 #endif /* CONFIG_COMPAT */ 701 #endif /* CONFIG_COMPAT */
702 #endif /* _LINUX_COMPAT_H */ 702 #endif /* _LINUX_COMPAT_H */
703 703
include/linux/signal.h
1 #ifndef _LINUX_SIGNAL_H 1 #ifndef _LINUX_SIGNAL_H
2 #define _LINUX_SIGNAL_H 2 #define _LINUX_SIGNAL_H
3 3
4 #include <linux/list.h> 4 #include <linux/list.h>
5 #include <uapi/linux/signal.h> 5 #include <uapi/linux/signal.h>
6 6
7 struct task_struct; 7 struct task_struct;
8 8
9 /* for sysctl */ 9 /* for sysctl */
10 extern int print_fatal_signals; 10 extern int print_fatal_signals;
11 /* 11 /*
12 * Real Time signals may be queued. 12 * Real Time signals may be queued.
13 */ 13 */
14 14
15 struct sigqueue { 15 struct sigqueue {
16 struct list_head list; 16 struct list_head list;
17 int flags; 17 int flags;
18 siginfo_t info; 18 siginfo_t info;
19 struct user_struct *user; 19 struct user_struct *user;
20 }; 20 };
21 21
22 /* flags values. */ 22 /* flags values. */
23 #define SIGQUEUE_PREALLOC 1 23 #define SIGQUEUE_PREALLOC 1
24 24
25 struct sigpending { 25 struct sigpending {
26 struct list_head list; 26 struct list_head list;
27 sigset_t signal; 27 sigset_t signal;
28 }; 28 };
29 29
30 /* 30 /*
31 * Define some primitives to manipulate sigset_t. 31 * Define some primitives to manipulate sigset_t.
32 */ 32 */
33 33
34 #ifndef __HAVE_ARCH_SIG_BITOPS 34 #ifndef __HAVE_ARCH_SIG_BITOPS
35 #include <linux/bitops.h> 35 #include <linux/bitops.h>
36 36
37 /* We don't use <linux/bitops.h> for these because there is no need to 37 /* We don't use <linux/bitops.h> for these because there is no need to
38 be atomic. */ 38 be atomic. */
39 static inline void sigaddset(sigset_t *set, int _sig) 39 static inline void sigaddset(sigset_t *set, int _sig)
40 { 40 {
41 unsigned long sig = _sig - 1; 41 unsigned long sig = _sig - 1;
42 if (_NSIG_WORDS == 1) 42 if (_NSIG_WORDS == 1)
43 set->sig[0] |= 1UL << sig; 43 set->sig[0] |= 1UL << sig;
44 else 44 else
45 set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW); 45 set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW);
46 } 46 }
47 47
48 static inline void sigdelset(sigset_t *set, int _sig) 48 static inline void sigdelset(sigset_t *set, int _sig)
49 { 49 {
50 unsigned long sig = _sig - 1; 50 unsigned long sig = _sig - 1;
51 if (_NSIG_WORDS == 1) 51 if (_NSIG_WORDS == 1)
52 set->sig[0] &= ~(1UL << sig); 52 set->sig[0] &= ~(1UL << sig);
53 else 53 else
54 set->sig[sig / _NSIG_BPW] &= ~(1UL << (sig % _NSIG_BPW)); 54 set->sig[sig / _NSIG_BPW] &= ~(1UL << (sig % _NSIG_BPW));
55 } 55 }
56 56
57 static inline int sigismember(sigset_t *set, int _sig) 57 static inline int sigismember(sigset_t *set, int _sig)
58 { 58 {
59 unsigned long sig = _sig - 1; 59 unsigned long sig = _sig - 1;
60 if (_NSIG_WORDS == 1) 60 if (_NSIG_WORDS == 1)
61 return 1 & (set->sig[0] >> sig); 61 return 1 & (set->sig[0] >> sig);
62 else 62 else
63 return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW)); 63 return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
64 } 64 }
65 65
66 static inline int sigfindinword(unsigned long word) 66 static inline int sigfindinword(unsigned long word)
67 { 67 {
68 return ffz(~word); 68 return ffz(~word);
69 } 69 }
70 70
71 #endif /* __HAVE_ARCH_SIG_BITOPS */ 71 #endif /* __HAVE_ARCH_SIG_BITOPS */
72 72
73 static inline int sigisemptyset(sigset_t *set) 73 static inline int sigisemptyset(sigset_t *set)
74 { 74 {
75 extern void _NSIG_WORDS_is_unsupported_size(void); 75 extern void _NSIG_WORDS_is_unsupported_size(void);
76 switch (_NSIG_WORDS) { 76 switch (_NSIG_WORDS) {
77 case 4: 77 case 4:
78 return (set->sig[3] | set->sig[2] | 78 return (set->sig[3] | set->sig[2] |
79 set->sig[1] | set->sig[0]) == 0; 79 set->sig[1] | set->sig[0]) == 0;
80 case 2: 80 case 2:
81 return (set->sig[1] | set->sig[0]) == 0; 81 return (set->sig[1] | set->sig[0]) == 0;
82 case 1: 82 case 1:
83 return set->sig[0] == 0; 83 return set->sig[0] == 0;
84 default: 84 default:
85 _NSIG_WORDS_is_unsupported_size(); 85 _NSIG_WORDS_is_unsupported_size();
86 return 0; 86 return 0;
87 } 87 }
88 } 88 }
89 89
90 #define sigmask(sig) (1UL << ((sig) - 1)) 90 #define sigmask(sig) (1UL << ((sig) - 1))
91 91
92 #ifndef __HAVE_ARCH_SIG_SETOPS 92 #ifndef __HAVE_ARCH_SIG_SETOPS
93 #include <linux/string.h> 93 #include <linux/string.h>
94 94
95 #define _SIG_SET_BINOP(name, op) \ 95 #define _SIG_SET_BINOP(name, op) \
96 static inline void name(sigset_t *r, const sigset_t *a, const sigset_t *b) \ 96 static inline void name(sigset_t *r, const sigset_t *a, const sigset_t *b) \
97 { \ 97 { \
98 extern void _NSIG_WORDS_is_unsupported_size(void); \ 98 extern void _NSIG_WORDS_is_unsupported_size(void); \
99 unsigned long a0, a1, a2, a3, b0, b1, b2, b3; \ 99 unsigned long a0, a1, a2, a3, b0, b1, b2, b3; \
100 \ 100 \
101 switch (_NSIG_WORDS) { \ 101 switch (_NSIG_WORDS) { \
102 case 4: \ 102 case 4: \
103 a3 = a->sig[3]; a2 = a->sig[2]; \ 103 a3 = a->sig[3]; a2 = a->sig[2]; \
104 b3 = b->sig[3]; b2 = b->sig[2]; \ 104 b3 = b->sig[3]; b2 = b->sig[2]; \
105 r->sig[3] = op(a3, b3); \ 105 r->sig[3] = op(a3, b3); \
106 r->sig[2] = op(a2, b2); \ 106 r->sig[2] = op(a2, b2); \
107 case 2: \ 107 case 2: \
108 a1 = a->sig[1]; b1 = b->sig[1]; \ 108 a1 = a->sig[1]; b1 = b->sig[1]; \
109 r->sig[1] = op(a1, b1); \ 109 r->sig[1] = op(a1, b1); \
110 case 1: \ 110 case 1: \
111 a0 = a->sig[0]; b0 = b->sig[0]; \ 111 a0 = a->sig[0]; b0 = b->sig[0]; \
112 r->sig[0] = op(a0, b0); \ 112 r->sig[0] = op(a0, b0); \
113 break; \ 113 break; \
114 default: \ 114 default: \
115 _NSIG_WORDS_is_unsupported_size(); \ 115 _NSIG_WORDS_is_unsupported_size(); \
116 } \ 116 } \
117 } 117 }
118 118
119 #define _sig_or(x,y) ((x) | (y)) 119 #define _sig_or(x,y) ((x) | (y))
120 _SIG_SET_BINOP(sigorsets, _sig_or) 120 _SIG_SET_BINOP(sigorsets, _sig_or)
121 121
122 #define _sig_and(x,y) ((x) & (y)) 122 #define _sig_and(x,y) ((x) & (y))
123 _SIG_SET_BINOP(sigandsets, _sig_and) 123 _SIG_SET_BINOP(sigandsets, _sig_and)
124 124
125 #define _sig_andn(x,y) ((x) & ~(y)) 125 #define _sig_andn(x,y) ((x) & ~(y))
126 _SIG_SET_BINOP(sigandnsets, _sig_andn) 126 _SIG_SET_BINOP(sigandnsets, _sig_andn)
127 127
128 #undef _SIG_SET_BINOP 128 #undef _SIG_SET_BINOP
129 #undef _sig_or 129 #undef _sig_or
130 #undef _sig_and 130 #undef _sig_and
131 #undef _sig_andn 131 #undef _sig_andn
132 132
133 #define _SIG_SET_OP(name, op) \ 133 #define _SIG_SET_OP(name, op) \
134 static inline void name(sigset_t *set) \ 134 static inline void name(sigset_t *set) \
135 { \ 135 { \
136 extern void _NSIG_WORDS_is_unsupported_size(void); \ 136 extern void _NSIG_WORDS_is_unsupported_size(void); \
137 \ 137 \
138 switch (_NSIG_WORDS) { \ 138 switch (_NSIG_WORDS) { \
139 case 4: set->sig[3] = op(set->sig[3]); \ 139 case 4: set->sig[3] = op(set->sig[3]); \
140 set->sig[2] = op(set->sig[2]); \ 140 set->sig[2] = op(set->sig[2]); \
141 case 2: set->sig[1] = op(set->sig[1]); \ 141 case 2: set->sig[1] = op(set->sig[1]); \
142 case 1: set->sig[0] = op(set->sig[0]); \ 142 case 1: set->sig[0] = op(set->sig[0]); \
143 break; \ 143 break; \
144 default: \ 144 default: \
145 _NSIG_WORDS_is_unsupported_size(); \ 145 _NSIG_WORDS_is_unsupported_size(); \
146 } \ 146 } \
147 } 147 }
148 148
149 #define _sig_not(x) (~(x)) 149 #define _sig_not(x) (~(x))
150 _SIG_SET_OP(signotset, _sig_not) 150 _SIG_SET_OP(signotset, _sig_not)
151 151
152 #undef _SIG_SET_OP 152 #undef _SIG_SET_OP
153 #undef _sig_not 153 #undef _sig_not
154 154
155 static inline void sigemptyset(sigset_t *set) 155 static inline void sigemptyset(sigset_t *set)
156 { 156 {
157 switch (_NSIG_WORDS) { 157 switch (_NSIG_WORDS) {
158 default: 158 default:
159 memset(set, 0, sizeof(sigset_t)); 159 memset(set, 0, sizeof(sigset_t));
160 break; 160 break;
161 case 2: set->sig[1] = 0; 161 case 2: set->sig[1] = 0;
162 case 1: set->sig[0] = 0; 162 case 1: set->sig[0] = 0;
163 break; 163 break;
164 } 164 }
165 } 165 }
166 166
167 static inline void sigfillset(sigset_t *set) 167 static inline void sigfillset(sigset_t *set)
168 { 168 {
169 switch (_NSIG_WORDS) { 169 switch (_NSIG_WORDS) {
170 default: 170 default:
171 memset(set, -1, sizeof(sigset_t)); 171 memset(set, -1, sizeof(sigset_t));
172 break; 172 break;
173 case 2: set->sig[1] = -1; 173 case 2: set->sig[1] = -1;
174 case 1: set->sig[0] = -1; 174 case 1: set->sig[0] = -1;
175 break; 175 break;
176 } 176 }
177 } 177 }
178 178
179 /* Some extensions for manipulating the low 32 signals in particular. */ 179 /* Some extensions for manipulating the low 32 signals in particular. */
180 180
181 static inline void sigaddsetmask(sigset_t *set, unsigned long mask) 181 static inline void sigaddsetmask(sigset_t *set, unsigned long mask)
182 { 182 {
183 set->sig[0] |= mask; 183 set->sig[0] |= mask;
184 } 184 }
185 185
186 static inline void sigdelsetmask(sigset_t *set, unsigned long mask) 186 static inline void sigdelsetmask(sigset_t *set, unsigned long mask)
187 { 187 {
188 set->sig[0] &= ~mask; 188 set->sig[0] &= ~mask;
189 } 189 }
190 190
191 static inline int sigtestsetmask(sigset_t *set, unsigned long mask) 191 static inline int sigtestsetmask(sigset_t *set, unsigned long mask)
192 { 192 {
193 return (set->sig[0] & mask) != 0; 193 return (set->sig[0] & mask) != 0;
194 } 194 }
195 195
196 static inline void siginitset(sigset_t *set, unsigned long mask) 196 static inline void siginitset(sigset_t *set, unsigned long mask)
197 { 197 {
198 set->sig[0] = mask; 198 set->sig[0] = mask;
199 switch (_NSIG_WORDS) { 199 switch (_NSIG_WORDS) {
200 default: 200 default:
201 memset(&set->sig[1], 0, sizeof(long)*(_NSIG_WORDS-1)); 201 memset(&set->sig[1], 0, sizeof(long)*(_NSIG_WORDS-1));
202 break; 202 break;
203 case 2: set->sig[1] = 0; 203 case 2: set->sig[1] = 0;
204 case 1: ; 204 case 1: ;
205 } 205 }
206 } 206 }
207 207
208 static inline void siginitsetinv(sigset_t *set, unsigned long mask) 208 static inline void siginitsetinv(sigset_t *set, unsigned long mask)
209 { 209 {
210 set->sig[0] = ~mask; 210 set->sig[0] = ~mask;
211 switch (_NSIG_WORDS) { 211 switch (_NSIG_WORDS) {
212 default: 212 default:
213 memset(&set->sig[1], -1, sizeof(long)*(_NSIG_WORDS-1)); 213 memset(&set->sig[1], -1, sizeof(long)*(_NSIG_WORDS-1));
214 break; 214 break;
215 case 2: set->sig[1] = -1; 215 case 2: set->sig[1] = -1;
216 case 1: ; 216 case 1: ;
217 } 217 }
218 } 218 }
219 219
220 #endif /* __HAVE_ARCH_SIG_SETOPS */ 220 #endif /* __HAVE_ARCH_SIG_SETOPS */
221 221
222 static inline void init_sigpending(struct sigpending *sig) 222 static inline void init_sigpending(struct sigpending *sig)
223 { 223 {
224 sigemptyset(&sig->signal); 224 sigemptyset(&sig->signal);
225 INIT_LIST_HEAD(&sig->list); 225 INIT_LIST_HEAD(&sig->list);
226 } 226 }
227 227
228 extern void flush_sigqueue(struct sigpending *queue); 228 extern void flush_sigqueue(struct sigpending *queue);
229 229
230 /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */ 230 /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */
231 static inline int valid_signal(unsigned long sig) 231 static inline int valid_signal(unsigned long sig)
232 { 232 {
233 return sig <= _NSIG ? 1 : 0; 233 return sig <= _NSIG ? 1 : 0;
234 } 234 }
235 235
236 struct timespec; 236 struct timespec;
237 struct pt_regs; 237 struct pt_regs;
238 238
239 extern int next_signal(struct sigpending *pending, sigset_t *mask); 239 extern int next_signal(struct sigpending *pending, sigset_t *mask);
240 extern int do_send_sig_info(int sig, struct siginfo *info, 240 extern int do_send_sig_info(int sig, struct siginfo *info,
241 struct task_struct *p, bool group); 241 struct task_struct *p, bool group);
242 extern int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p); 242 extern int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p);
243 extern int __group_send_sig_info(int, struct siginfo *, struct task_struct *); 243 extern int __group_send_sig_info(int, struct siginfo *, struct task_struct *);
244 extern int do_sigtimedwait(const sigset_t *, siginfo_t *, 244 extern int do_sigtimedwait(const sigset_t *, siginfo_t *,
245 const struct timespec *); 245 const struct timespec *);
246 extern int sigprocmask(int, sigset_t *, sigset_t *); 246 extern int sigprocmask(int, sigset_t *, sigset_t *);
247 extern void set_current_blocked(sigset_t *); 247 extern void set_current_blocked(sigset_t *);
248 extern void __set_current_blocked(const sigset_t *); 248 extern void __set_current_blocked(const sigset_t *);
249 extern int show_unhandled_signals; 249 extern int show_unhandled_signals;
250 extern int sigsuspend(sigset_t *); 250 extern int sigsuspend(sigset_t *);
251 251
252 struct sigaction { 252 struct sigaction {
253 #ifndef __ARCH_HAS_ODD_SIGACTION 253 #ifndef __ARCH_HAS_IRIX_SIGACTION
254 __sighandler_t sa_handler; 254 __sighandler_t sa_handler;
255 unsigned long sa_flags; 255 unsigned long sa_flags;
256 #else 256 #else
257 unsigned long sa_flags; 257 unsigned int sa_flags;
258 __sighandler_t sa_handler; 258 __sighandler_t sa_handler;
259 #endif 259 #endif
260 #ifdef __ARCH_HAS_SA_RESTORER 260 #ifdef __ARCH_HAS_SA_RESTORER
261 __sigrestore_t sa_restorer; 261 __sigrestore_t sa_restorer;
262 #endif 262 #endif
263 sigset_t sa_mask; /* mask last for extensibility */ 263 sigset_t sa_mask; /* mask last for extensibility */
264 }; 264 };
265 265
266 struct k_sigaction { 266 struct k_sigaction {
267 struct sigaction sa; 267 struct sigaction sa;
268 #ifdef __ARCH_HAS_KA_RESTORER 268 #ifdef __ARCH_HAS_KA_RESTORER
269 __sigrestore_t ka_restorer; 269 __sigrestore_t ka_restorer;
270 #endif 270 #endif
271 }; 271 };
272 272
273 #ifdef CONFIG_OLD_SIGACTION 273 #ifdef CONFIG_OLD_SIGACTION
274 struct old_sigaction { 274 struct old_sigaction {
275 __sighandler_t sa_handler; 275 __sighandler_t sa_handler;
276 old_sigset_t sa_mask; 276 old_sigset_t sa_mask;
277 unsigned long sa_flags; 277 unsigned long sa_flags;
278 __sigrestore_t sa_restorer; 278 __sigrestore_t sa_restorer;
279 }; 279 };
280 #endif 280 #endif
281 281
282 struct ksignal { 282 struct ksignal {
283 struct k_sigaction ka; 283 struct k_sigaction ka;
284 siginfo_t info; 284 siginfo_t info;
285 int sig; 285 int sig;
286 }; 286 };
287 287
288 extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie); 288 extern int get_signal_to_deliver(siginfo_t *info, struct k_sigaction *return_ka, struct pt_regs *regs, void *cookie);
289 extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping); 289 extern void signal_setup_done(int failed, struct ksignal *ksig, int stepping);
290 extern void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, struct pt_regs *regs, int stepping); 290 extern void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, struct pt_regs *regs, int stepping);
291 extern void exit_signals(struct task_struct *tsk); 291 extern void exit_signals(struct task_struct *tsk);
292 292
293 /* 293 /*
294 * Eventually that'll replace get_signal_to_deliver(); macro for now, 294 * Eventually that'll replace get_signal_to_deliver(); macro for now,
295 * to avoid nastiness with include order. 295 * to avoid nastiness with include order.
296 */ 296 */
297 #define get_signal(ksig) \ 297 #define get_signal(ksig) \
298 ({ \ 298 ({ \
299 struct ksignal *p = (ksig); \ 299 struct ksignal *p = (ksig); \
300 p->sig = get_signal_to_deliver(&p->info, &p->ka, \ 300 p->sig = get_signal_to_deliver(&p->info, &p->ka, \
301 signal_pt_regs(), NULL);\ 301 signal_pt_regs(), NULL);\
302 p->sig > 0; \ 302 p->sig > 0; \
303 }) 303 })
304 304
305 extern struct kmem_cache *sighand_cachep; 305 extern struct kmem_cache *sighand_cachep;
306 306
307 int unhandled_signal(struct task_struct *tsk, int sig); 307 int unhandled_signal(struct task_struct *tsk, int sig);
308 308
309 /* 309 /*
310 * In POSIX a signal is sent either to a specific thread (Linux task) 310 * In POSIX a signal is sent either to a specific thread (Linux task)
311 * or to the process as a whole (Linux thread group). How the signal 311 * or to the process as a whole (Linux thread group). How the signal
312 * is sent determines whether it's to one thread or the whole group, 312 * is sent determines whether it's to one thread or the whole group,
313 * which determines which signal mask(s) are involved in blocking it 313 * which determines which signal mask(s) are involved in blocking it
314 * from being delivered until later. When the signal is delivered, 314 * from being delivered until later. When the signal is delivered,
315 * either it's caught or ignored by a user handler or it has a default 315 * either it's caught or ignored by a user handler or it has a default
316 * effect that applies to the whole thread group (POSIX process). 316 * effect that applies to the whole thread group (POSIX process).
317 * 317 *
318 * The possible effects an unblocked signal set to SIG_DFL can have are: 318 * The possible effects an unblocked signal set to SIG_DFL can have are:
319 * ignore - Nothing Happens 319 * ignore - Nothing Happens
320 * terminate - kill the process, i.e. all threads in the group, 320 * terminate - kill the process, i.e. all threads in the group,
321 * similar to exit_group. The group leader (only) reports 321 * similar to exit_group. The group leader (only) reports
322 * WIFSIGNALED status to its parent. 322 * WIFSIGNALED status to its parent.
323 * coredump - write a core dump file describing all threads using 323 * coredump - write a core dump file describing all threads using
324 * the same mm and then kill all those threads 324 * the same mm and then kill all those threads
325 * stop - stop all the threads in the group, i.e. TASK_STOPPED state 325 * stop - stop all the threads in the group, i.e. TASK_STOPPED state
326 * 326 *
327 * SIGKILL and SIGSTOP cannot be caught, blocked, or ignored. 327 * SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
328 * Other signals when not blocked and set to SIG_DFL behaves as follows. 328 * Other signals when not blocked and set to SIG_DFL behaves as follows.
329 * The job control signals also have other special effects. 329 * The job control signals also have other special effects.
330 * 330 *
331 * +--------------------+------------------+ 331 * +--------------------+------------------+
332 * | POSIX signal | default action | 332 * | POSIX signal | default action |
333 * +--------------------+------------------+ 333 * +--------------------+------------------+
334 * | SIGHUP | terminate | 334 * | SIGHUP | terminate |
335 * | SIGINT | terminate | 335 * | SIGINT | terminate |
336 * | SIGQUIT | coredump | 336 * | SIGQUIT | coredump |
337 * | SIGILL | coredump | 337 * | SIGILL | coredump |
338 * | SIGTRAP | coredump | 338 * | SIGTRAP | coredump |
339 * | SIGABRT/SIGIOT | coredump | 339 * | SIGABRT/SIGIOT | coredump |
340 * | SIGBUS | coredump | 340 * | SIGBUS | coredump |
341 * | SIGFPE | coredump | 341 * | SIGFPE | coredump |
342 * | SIGKILL | terminate(+) | 342 * | SIGKILL | terminate(+) |
343 * | SIGUSR1 | terminate | 343 * | SIGUSR1 | terminate |
344 * | SIGSEGV | coredump | 344 * | SIGSEGV | coredump |
345 * | SIGUSR2 | terminate | 345 * | SIGUSR2 | terminate |
346 * | SIGPIPE | terminate | 346 * | SIGPIPE | terminate |
347 * | SIGALRM | terminate | 347 * | SIGALRM | terminate |
348 * | SIGTERM | terminate | 348 * | SIGTERM | terminate |
349 * | SIGCHLD | ignore | 349 * | SIGCHLD | ignore |
350 * | SIGCONT | ignore(*) | 350 * | SIGCONT | ignore(*) |
351 * | SIGSTOP | stop(*)(+) | 351 * | SIGSTOP | stop(*)(+) |
352 * | SIGTSTP | stop(*) | 352 * | SIGTSTP | stop(*) |
353 * | SIGTTIN | stop(*) | 353 * | SIGTTIN | stop(*) |
354 * | SIGTTOU | stop(*) | 354 * | SIGTTOU | stop(*) |
355 * | SIGURG | ignore | 355 * | SIGURG | ignore |
356 * | SIGXCPU | coredump | 356 * | SIGXCPU | coredump |
357 * | SIGXFSZ | coredump | 357 * | SIGXFSZ | coredump |
358 * | SIGVTALRM | terminate | 358 * | SIGVTALRM | terminate |
359 * | SIGPROF | terminate | 359 * | SIGPROF | terminate |
360 * | SIGPOLL/SIGIO | terminate | 360 * | SIGPOLL/SIGIO | terminate |
361 * | SIGSYS/SIGUNUSED | coredump | 361 * | SIGSYS/SIGUNUSED | coredump |
362 * | SIGSTKFLT | terminate | 362 * | SIGSTKFLT | terminate |
363 * | SIGWINCH | ignore | 363 * | SIGWINCH | ignore |
364 * | SIGPWR | terminate | 364 * | SIGPWR | terminate |
365 * | SIGRTMIN-SIGRTMAX | terminate | 365 * | SIGRTMIN-SIGRTMAX | terminate |
366 * +--------------------+------------------+ 366 * +--------------------+------------------+
367 * | non-POSIX signal | default action | 367 * | non-POSIX signal | default action |
368 * +--------------------+------------------+ 368 * +--------------------+------------------+
369 * | SIGEMT | coredump | 369 * | SIGEMT | coredump |
370 * +--------------------+------------------+ 370 * +--------------------+------------------+
371 * 371 *
372 * (+) For SIGKILL and SIGSTOP the action is "always", not just "default". 372 * (+) For SIGKILL and SIGSTOP the action is "always", not just "default".
373 * (*) Special job control effects: 373 * (*) Special job control effects:
374 * When SIGCONT is sent, it resumes the process (all threads in the group) 374 * When SIGCONT is sent, it resumes the process (all threads in the group)
375 * from TASK_STOPPED state and also clears any pending/queued stop signals 375 * from TASK_STOPPED state and also clears any pending/queued stop signals
376 * (any of those marked with "stop(*)"). This happens regardless of blocking, 376 * (any of those marked with "stop(*)"). This happens regardless of blocking,
377 * catching, or ignoring SIGCONT. When any stop signal is sent, it clears 377 * catching, or ignoring SIGCONT. When any stop signal is sent, it clears
378 * any pending/queued SIGCONT signals; this happens regardless of blocking, 378 * any pending/queued SIGCONT signals; this happens regardless of blocking,
379 * catching, or ignored the stop signal, though (except for SIGSTOP) the 379 * catching, or ignored the stop signal, though (except for SIGSTOP) the
380 * default action of stopping the process may happen later or never. 380 * default action of stopping the process may happen later or never.
381 */ 381 */
382 382
383 #ifdef SIGEMT 383 #ifdef SIGEMT
384 #define SIGEMT_MASK rt_sigmask(SIGEMT) 384 #define SIGEMT_MASK rt_sigmask(SIGEMT)
385 #else 385 #else
386 #define SIGEMT_MASK 0 386 #define SIGEMT_MASK 0
387 #endif 387 #endif
388 388
389 #if SIGRTMIN > BITS_PER_LONG 389 #if SIGRTMIN > BITS_PER_LONG
390 #define rt_sigmask(sig) (1ULL << ((sig)-1)) 390 #define rt_sigmask(sig) (1ULL << ((sig)-1))
391 #else 391 #else
392 #define rt_sigmask(sig) sigmask(sig) 392 #define rt_sigmask(sig) sigmask(sig)
393 #endif 393 #endif
394 #define siginmask(sig, mask) (rt_sigmask(sig) & (mask)) 394 #define siginmask(sig, mask) (rt_sigmask(sig) & (mask))
395 395
396 #define SIG_KERNEL_ONLY_MASK (\ 396 #define SIG_KERNEL_ONLY_MASK (\
397 rt_sigmask(SIGKILL) | rt_sigmask(SIGSTOP)) 397 rt_sigmask(SIGKILL) | rt_sigmask(SIGSTOP))
398 398
399 #define SIG_KERNEL_STOP_MASK (\ 399 #define SIG_KERNEL_STOP_MASK (\
400 rt_sigmask(SIGSTOP) | rt_sigmask(SIGTSTP) | \ 400 rt_sigmask(SIGSTOP) | rt_sigmask(SIGTSTP) | \
401 rt_sigmask(SIGTTIN) | rt_sigmask(SIGTTOU) ) 401 rt_sigmask(SIGTTIN) | rt_sigmask(SIGTTOU) )
402 402
403 #define SIG_KERNEL_COREDUMP_MASK (\ 403 #define SIG_KERNEL_COREDUMP_MASK (\
404 rt_sigmask(SIGQUIT) | rt_sigmask(SIGILL) | \ 404 rt_sigmask(SIGQUIT) | rt_sigmask(SIGILL) | \
405 rt_sigmask(SIGTRAP) | rt_sigmask(SIGABRT) | \ 405 rt_sigmask(SIGTRAP) | rt_sigmask(SIGABRT) | \
406 rt_sigmask(SIGFPE) | rt_sigmask(SIGSEGV) | \ 406 rt_sigmask(SIGFPE) | rt_sigmask(SIGSEGV) | \
407 rt_sigmask(SIGBUS) | rt_sigmask(SIGSYS) | \ 407 rt_sigmask(SIGBUS) | rt_sigmask(SIGSYS) | \
408 rt_sigmask(SIGXCPU) | rt_sigmask(SIGXFSZ) | \ 408 rt_sigmask(SIGXCPU) | rt_sigmask(SIGXFSZ) | \
409 SIGEMT_MASK ) 409 SIGEMT_MASK )
410 410
411 #define SIG_KERNEL_IGNORE_MASK (\ 411 #define SIG_KERNEL_IGNORE_MASK (\
412 rt_sigmask(SIGCONT) | rt_sigmask(SIGCHLD) | \ 412 rt_sigmask(SIGCONT) | rt_sigmask(SIGCHLD) | \
413 rt_sigmask(SIGWINCH) | rt_sigmask(SIGURG) ) 413 rt_sigmask(SIGWINCH) | rt_sigmask(SIGURG) )
414 414
415 #define sig_kernel_only(sig) \ 415 #define sig_kernel_only(sig) \
416 (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_ONLY_MASK)) 416 (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_ONLY_MASK))
417 #define sig_kernel_coredump(sig) \ 417 #define sig_kernel_coredump(sig) \
418 (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_COREDUMP_MASK)) 418 (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_COREDUMP_MASK))
419 #define sig_kernel_ignore(sig) \ 419 #define sig_kernel_ignore(sig) \
420 (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_IGNORE_MASK)) 420 (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_IGNORE_MASK))
421 #define sig_kernel_stop(sig) \ 421 #define sig_kernel_stop(sig) \
422 (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_STOP_MASK)) 422 (((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_STOP_MASK))
423 423
424 #define sig_user_defined(t, signr) \ 424 #define sig_user_defined(t, signr) \
425 (((t)->sighand->action[(signr)-1].sa.sa_handler != SIG_DFL) && \ 425 (((t)->sighand->action[(signr)-1].sa.sa_handler != SIG_DFL) && \
426 ((t)->sighand->action[(signr)-1].sa.sa_handler != SIG_IGN)) 426 ((t)->sighand->action[(signr)-1].sa.sa_handler != SIG_IGN))
427 427
428 #define sig_fatal(t, signr) \ 428 #define sig_fatal(t, signr) \
429 (!siginmask(signr, SIG_KERNEL_IGNORE_MASK|SIG_KERNEL_STOP_MASK) && \ 429 (!siginmask(signr, SIG_KERNEL_IGNORE_MASK|SIG_KERNEL_STOP_MASK) && \
430 (t)->sighand->action[(signr)-1].sa.sa_handler == SIG_DFL) 430 (t)->sighand->action[(signr)-1].sa.sa_handler == SIG_DFL)
431 431
432 void signals_init(void); 432 void signals_init(void);
433 433
434 int restore_altstack(const stack_t __user *); 434 int restore_altstack(const stack_t __user *);
435 int __save_altstack(stack_t __user *, unsigned long); 435 int __save_altstack(stack_t __user *, unsigned long);
436 436
437 #endif /* _LINUX_SIGNAL_H */ 437 #endif /* _LINUX_SIGNAL_H */
438 438