diff options
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/Kconfig | 4 | ||||
-rw-r--r-- | arch/x86/ia32/ia32_signal.c | 50 | ||||
-rw-r--r-- | arch/x86/ia32/ia32entry.S | 12 | ||||
-rw-r--r-- | arch/x86/ia32/sys_ia32.c | 171 | ||||
-rw-r--r-- | arch/x86/include/asm/fpu-internal.h | 5 | ||||
-rw-r--r-- | arch/x86/include/asm/ia32.h | 15 | ||||
-rw-r--r-- | arch/x86/include/asm/signal.h | 22 | ||||
-rw-r--r-- | arch/x86/include/asm/sys_ia32.h | 16 | ||||
-rw-r--r-- | arch/x86/include/asm/syscalls.h | 13 | ||||
-rw-r--r-- | arch/x86/include/asm/unistd.h | 2 | ||||
-rw-r--r-- | arch/x86/include/uapi/asm/signal.h | 8 | ||||
-rw-r--r-- | arch/x86/kernel/entry_32.S | 45 | ||||
-rw-r--r-- | arch/x86/kernel/entry_64.S | 34 | ||||
-rw-r--r-- | arch/x86/kernel/ioport.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/signal.c | 184 | ||||
-rw-r--r-- | arch/x86/kernel/vm86_32.c | 8 | ||||
-rw-r--r-- | arch/x86/syscalls/syscall_32.tbl | 22 | ||||
-rw-r--r-- | arch/x86/syscalls/syscall_64.tbl | 6 | ||||
-rw-r--r-- | arch/x86/um/Kconfig | 3 | ||||
-rw-r--r-- | arch/x86/um/Makefile | 4 | ||||
-rw-r--r-- | arch/x86/um/shared/sysdep/syscalls_32.h | 5 | ||||
-rw-r--r-- | arch/x86/um/signal.c | 15 | ||||
-rw-r--r-- | arch/x86/um/sys_call_table_32.c | 4 | ||||
-rw-r--r-- | arch/x86/um/syscalls_32.c | 38 |
24 files changed, 142 insertions, 547 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 4ebc7a6e6724..6a9383370311 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -115,8 +115,10 @@ config X86 | |||
115 | select MODULES_USE_ELF_REL if X86_32 | 115 | select MODULES_USE_ELF_REL if X86_32 |
116 | select MODULES_USE_ELF_RELA if X86_64 | 116 | select MODULES_USE_ELF_RELA if X86_64 |
117 | select CLONE_BACKWARDS if X86_32 | 117 | select CLONE_BACKWARDS if X86_32 |
118 | select GENERIC_SIGALTSTACK | ||
119 | select ARCH_USE_BUILTIN_BSWAP | 118 | select ARCH_USE_BUILTIN_BSWAP |
119 | select OLD_SIGSUSPEND3 if X86_32 || IA32_EMULATION | ||
120 | select OLD_SIGACTION if X86_32 | ||
121 | select COMPAT_OLD_SIGACTION if IA32_EMULATION | ||
120 | 122 | ||
121 | config INSTRUCTION_DECODER | 123 | config INSTRUCTION_DECODER |
122 | def_bool y | 124 | def_bool y |
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index a1daf4a65009..cf1a471a18a2 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
@@ -129,13 +129,6 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | |||
129 | return err; | 129 | return err; |
130 | } | 130 | } |
131 | 131 | ||
132 | asmlinkage long sys32_sigsuspend(int history0, int history1, old_sigset_t mask) | ||
133 | { | ||
134 | sigset_t blocked; | ||
135 | siginitset(&blocked, mask); | ||
136 | return sigsuspend(&blocked); | ||
137 | } | ||
138 | |||
139 | /* | 132 | /* |
140 | * Do a signal return; undo the signal stack. | 133 | * Do a signal return; undo the signal stack. |
141 | */ | 134 | */ |
@@ -215,8 +208,9 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, | |||
215 | return err; | 208 | return err; |
216 | } | 209 | } |
217 | 210 | ||
218 | asmlinkage long sys32_sigreturn(struct pt_regs *regs) | 211 | asmlinkage long sys32_sigreturn(void) |
219 | { | 212 | { |
213 | struct pt_regs *regs = current_pt_regs(); | ||
220 | struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8); | 214 | struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8); |
221 | sigset_t set; | 215 | sigset_t set; |
222 | unsigned int ax; | 216 | unsigned int ax; |
@@ -241,8 +235,9 @@ badframe: | |||
241 | return 0; | 235 | return 0; |
242 | } | 236 | } |
243 | 237 | ||
244 | asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs) | 238 | asmlinkage long sys32_rt_sigreturn(void) |
245 | { | 239 | { |
240 | struct pt_regs *regs = current_pt_regs(); | ||
246 | struct rt_sigframe_ia32 __user *frame; | 241 | struct rt_sigframe_ia32 __user *frame; |
247 | sigset_t set; | 242 | sigset_t set; |
248 | unsigned int ax; | 243 | unsigned int ax; |
@@ -314,7 +309,7 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, | |||
314 | /* | 309 | /* |
315 | * Determine which stack to use.. | 310 | * Determine which stack to use.. |
316 | */ | 311 | */ |
317 | static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | 312 | static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, |
318 | size_t frame_size, | 313 | size_t frame_size, |
319 | void __user **fpstate) | 314 | void __user **fpstate) |
320 | { | 315 | { |
@@ -324,16 +319,13 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | |||
324 | sp = regs->sp; | 319 | sp = regs->sp; |
325 | 320 | ||
326 | /* This is the X/Open sanctioned signal stack switching. */ | 321 | /* This is the X/Open sanctioned signal stack switching. */ |
327 | if (ka->sa.sa_flags & SA_ONSTACK) { | 322 | if (ksig->ka.sa.sa_flags & SA_ONSTACK) |
328 | if (sas_ss_flags(sp) == 0) | 323 | sp = sigsp(sp, ksig); |
329 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
330 | } | ||
331 | |||
332 | /* This is the legacy signal stack switching. */ | 324 | /* This is the legacy signal stack switching. */ |
333 | else if ((regs->ss & 0xffff) != __USER32_DS && | 325 | else if ((regs->ss & 0xffff) != __USER32_DS && |
334 | !(ka->sa.sa_flags & SA_RESTORER) && | 326 | !(ksig->ka.sa.sa_flags & SA_RESTORER) && |
335 | ka->sa.sa_restorer) | 327 | ksig->ka.sa.sa_restorer) |
336 | sp = (unsigned long) ka->sa.sa_restorer; | 328 | sp = (unsigned long) ksig->ka.sa.sa_restorer; |
337 | 329 | ||
338 | if (used_math()) { | 330 | if (used_math()) { |
339 | unsigned long fx_aligned, math_size; | 331 | unsigned long fx_aligned, math_size; |
@@ -352,7 +344,7 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | |||
352 | return (void __user *) sp; | 344 | return (void __user *) sp; |
353 | } | 345 | } |
354 | 346 | ||
355 | int ia32_setup_frame(int sig, struct k_sigaction *ka, | 347 | int ia32_setup_frame(int sig, struct ksignal *ksig, |
356 | compat_sigset_t *set, struct pt_regs *regs) | 348 | compat_sigset_t *set, struct pt_regs *regs) |
357 | { | 349 | { |
358 | struct sigframe_ia32 __user *frame; | 350 | struct sigframe_ia32 __user *frame; |
@@ -371,7 +363,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
371 | 0x80cd, /* int $0x80 */ | 363 | 0x80cd, /* int $0x80 */ |
372 | }; | 364 | }; |
373 | 365 | ||
374 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 366 | frame = get_sigframe(ksig, regs, sizeof(*frame), &fpstate); |
375 | 367 | ||
376 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 368 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
377 | return -EFAULT; | 369 | return -EFAULT; |
@@ -388,8 +380,8 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
388 | return -EFAULT; | 380 | return -EFAULT; |
389 | } | 381 | } |
390 | 382 | ||
391 | if (ka->sa.sa_flags & SA_RESTORER) { | 383 | if (ksig->ka.sa.sa_flags & SA_RESTORER) { |
392 | restorer = ka->sa.sa_restorer; | 384 | restorer = ksig->ka.sa.sa_restorer; |
393 | } else { | 385 | } else { |
394 | /* Return stub is in 32bit vsyscall page */ | 386 | /* Return stub is in 32bit vsyscall page */ |
395 | if (current->mm->context.vdso) | 387 | if (current->mm->context.vdso) |
@@ -414,7 +406,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
414 | 406 | ||
415 | /* Set up registers for signal handler */ | 407 | /* Set up registers for signal handler */ |
416 | regs->sp = (unsigned long) frame; | 408 | regs->sp = (unsigned long) frame; |
417 | regs->ip = (unsigned long) ka->sa.sa_handler; | 409 | regs->ip = (unsigned long) ksig->ka.sa.sa_handler; |
418 | 410 | ||
419 | /* Make -mregparm=3 work */ | 411 | /* Make -mregparm=3 work */ |
420 | regs->ax = sig; | 412 | regs->ax = sig; |
@@ -430,7 +422,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
430 | return 0; | 422 | return 0; |
431 | } | 423 | } |
432 | 424 | ||
433 | int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 425 | int ia32_setup_rt_frame(int sig, struct ksignal *ksig, |
434 | compat_sigset_t *set, struct pt_regs *regs) | 426 | compat_sigset_t *set, struct pt_regs *regs) |
435 | { | 427 | { |
436 | struct rt_sigframe_ia32 __user *frame; | 428 | struct rt_sigframe_ia32 __user *frame; |
@@ -451,7 +443,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
451 | 0, | 443 | 0, |
452 | }; | 444 | }; |
453 | 445 | ||
454 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 446 | frame = get_sigframe(ksig, regs, sizeof(*frame), &fpstate); |
455 | 447 | ||
456 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 448 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
457 | return -EFAULT; | 449 | return -EFAULT; |
@@ -469,8 +461,8 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
469 | put_user_ex(0, &frame->uc.uc_link); | 461 | put_user_ex(0, &frame->uc.uc_link); |
470 | err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); | 462 | err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); |
471 | 463 | ||
472 | if (ka->sa.sa_flags & SA_RESTORER) | 464 | if (ksig->ka.sa.sa_flags & SA_RESTORER) |
473 | restorer = ka->sa.sa_restorer; | 465 | restorer = ksig->ka.sa.sa_restorer; |
474 | else | 466 | else |
475 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, | 467 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, |
476 | rt_sigreturn); | 468 | rt_sigreturn); |
@@ -483,7 +475,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
483 | put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode); | 475 | put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode); |
484 | } put_user_catch(err); | 476 | } put_user_catch(err); |
485 | 477 | ||
486 | err |= copy_siginfo_to_user32(&frame->info, info); | 478 | err |= copy_siginfo_to_user32(&frame->info, &ksig->info); |
487 | err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate, | 479 | err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate, |
488 | regs, set->sig[0]); | 480 | regs, set->sig[0]); |
489 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 481 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
@@ -493,7 +485,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
493 | 485 | ||
494 | /* Set up registers for signal handler */ | 486 | /* Set up registers for signal handler */ |
495 | regs->sp = (unsigned long) frame; | 487 | regs->sp = (unsigned long) frame; |
496 | regs->ip = (unsigned long) ka->sa.sa_handler; | 488 | regs->ip = (unsigned long) ksig->ka.sa.sa_handler; |
497 | 489 | ||
498 | /* Make -mregparm=3 work */ | 490 | /* Make -mregparm=3 work */ |
499 | regs->ax = sig; | 491 | regs->ax = sig; |
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 142c4ceff112..474dc1b59f72 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
@@ -456,18 +456,16 @@ ia32_badsys: | |||
456 | ALIGN | 456 | ALIGN |
457 | GLOBAL(\label) | 457 | GLOBAL(\label) |
458 | leaq \func(%rip),%rax | 458 | leaq \func(%rip),%rax |
459 | leaq -ARGOFFSET+8(%rsp),\arg /* 8 for return address */ | ||
460 | jmp ia32_ptregs_common | 459 | jmp ia32_ptregs_common |
461 | .endm | 460 | .endm |
462 | 461 | ||
463 | CFI_STARTPROC32 | 462 | CFI_STARTPROC32 |
464 | 463 | ||
465 | PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi | 464 | PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn |
466 | PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi | 465 | PTREGSCALL stub32_sigreturn, sys32_sigreturn |
467 | PTREGSCALL stub32_execve, compat_sys_execve, %rcx | 466 | PTREGSCALL stub32_execve, compat_sys_execve |
468 | PTREGSCALL stub32_fork, sys_fork, %rdi | 467 | PTREGSCALL stub32_fork, sys_fork |
469 | PTREGSCALL stub32_vfork, sys_vfork, %rdi | 468 | PTREGSCALL stub32_vfork, sys_vfork |
470 | PTREGSCALL stub32_iopl, sys_iopl, %rsi | ||
471 | 469 | ||
472 | ALIGN | 470 | ALIGN |
473 | GLOBAL(stub32_clone) | 471 | GLOBAL(stub32_clone) |
diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c index d0b689ba7be2..592f5a9a9c0e 100644 --- a/arch/x86/ia32/sys_ia32.c +++ b/arch/x86/ia32/sys_ia32.c | |||
@@ -172,183 +172,12 @@ asmlinkage long sys32_mprotect(unsigned long start, size_t len, | |||
172 | return sys_mprotect(start, len, prot); | 172 | return sys_mprotect(start, len, prot); |
173 | } | 173 | } |
174 | 174 | ||
175 | asmlinkage long sys32_rt_sigaction(int sig, struct sigaction32 __user *act, | ||
176 | struct sigaction32 __user *oact, | ||
177 | unsigned int sigsetsize) | ||
178 | { | ||
179 | struct k_sigaction new_ka, old_ka; | ||
180 | int ret; | ||
181 | compat_sigset_t set32; | ||
182 | |||
183 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
184 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
185 | return -EINVAL; | ||
186 | |||
187 | if (act) { | ||
188 | compat_uptr_t handler, restorer; | ||
189 | |||
190 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
191 | __get_user(handler, &act->sa_handler) || | ||
192 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
193 | __get_user(restorer, &act->sa_restorer) || | ||
194 | __copy_from_user(&set32, &act->sa_mask, | ||
195 | sizeof(compat_sigset_t))) | ||
196 | return -EFAULT; | ||
197 | new_ka.sa.sa_handler = compat_ptr(handler); | ||
198 | new_ka.sa.sa_restorer = compat_ptr(restorer); | ||
199 | |||
200 | /* | ||
201 | * FIXME: here we rely on _COMPAT_NSIG_WORS to be >= | ||
202 | * than _NSIG_WORDS << 1 | ||
203 | */ | ||
204 | switch (_NSIG_WORDS) { | ||
205 | case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6] | ||
206 | | (((long)set32.sig[7]) << 32); | ||
207 | case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4] | ||
208 | | (((long)set32.sig[5]) << 32); | ||
209 | case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2] | ||
210 | | (((long)set32.sig[3]) << 32); | ||
211 | case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0] | ||
212 | | (((long)set32.sig[1]) << 32); | ||
213 | } | ||
214 | } | ||
215 | |||
216 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
217 | |||
218 | if (!ret && oact) { | ||
219 | /* | ||
220 | * FIXME: here we rely on _COMPAT_NSIG_WORS to be >= | ||
221 | * than _NSIG_WORDS << 1 | ||
222 | */ | ||
223 | switch (_NSIG_WORDS) { | ||
224 | case 4: | ||
225 | set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32); | ||
226 | set32.sig[6] = old_ka.sa.sa_mask.sig[3]; | ||
227 | case 3: | ||
228 | set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32); | ||
229 | set32.sig[4] = old_ka.sa.sa_mask.sig[2]; | ||
230 | case 2: | ||
231 | set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32); | ||
232 | set32.sig[2] = old_ka.sa.sa_mask.sig[1]; | ||
233 | case 1: | ||
234 | set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32); | ||
235 | set32.sig[0] = old_ka.sa.sa_mask.sig[0]; | ||
236 | } | ||
237 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
238 | __put_user(ptr_to_compat(old_ka.sa.sa_handler), | ||
239 | &oact->sa_handler) || | ||
240 | __put_user(ptr_to_compat(old_ka.sa.sa_restorer), | ||
241 | &oact->sa_restorer) || | ||
242 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
243 | __copy_to_user(&oact->sa_mask, &set32, | ||
244 | sizeof(compat_sigset_t))) | ||
245 | return -EFAULT; | ||
246 | } | ||
247 | |||
248 | return ret; | ||
249 | } | ||
250 | |||
251 | asmlinkage long sys32_sigaction(int sig, struct old_sigaction32 __user *act, | ||
252 | struct old_sigaction32 __user *oact) | ||
253 | { | ||
254 | struct k_sigaction new_ka, old_ka; | ||
255 | int ret; | ||
256 | |||
257 | if (act) { | ||
258 | compat_old_sigset_t mask; | ||
259 | compat_uptr_t handler, restorer; | ||
260 | |||
261 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
262 | __get_user(handler, &act->sa_handler) || | ||
263 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
264 | __get_user(restorer, &act->sa_restorer) || | ||
265 | __get_user(mask, &act->sa_mask)) | ||
266 | return -EFAULT; | ||
267 | |||
268 | new_ka.sa.sa_handler = compat_ptr(handler); | ||
269 | new_ka.sa.sa_restorer = compat_ptr(restorer); | ||
270 | |||
271 | siginitset(&new_ka.sa.sa_mask, mask); | ||
272 | } | ||
273 | |||
274 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
275 | |||
276 | if (!ret && oact) { | ||
277 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
278 | __put_user(ptr_to_compat(old_ka.sa.sa_handler), | ||
279 | &oact->sa_handler) || | ||
280 | __put_user(ptr_to_compat(old_ka.sa.sa_restorer), | ||
281 | &oact->sa_restorer) || | ||
282 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
283 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
284 | return -EFAULT; | ||
285 | } | ||
286 | |||
287 | return ret; | ||
288 | } | ||
289 | |||
290 | asmlinkage long sys32_waitpid(compat_pid_t pid, unsigned int __user *stat_addr, | 175 | asmlinkage long sys32_waitpid(compat_pid_t pid, unsigned int __user *stat_addr, |
291 | int options) | 176 | int options) |
292 | { | 177 | { |
293 | return compat_sys_wait4(pid, stat_addr, options, NULL); | 178 | return compat_sys_wait4(pid, stat_addr, options, NULL); |
294 | } | 179 | } |
295 | 180 | ||
296 | /* 32-bit timeval and related flotsam. */ | ||
297 | |||
298 | asmlinkage long sys32_sched_rr_get_interval(compat_pid_t pid, | ||
299 | struct compat_timespec __user *interval) | ||
300 | { | ||
301 | struct timespec t; | ||
302 | int ret; | ||
303 | mm_segment_t old_fs = get_fs(); | ||
304 | |||
305 | set_fs(KERNEL_DS); | ||
306 | ret = sys_sched_rr_get_interval(pid, (struct timespec __user *)&t); | ||
307 | set_fs(old_fs); | ||
308 | if (put_compat_timespec(&t, interval)) | ||
309 | return -EFAULT; | ||
310 | return ret; | ||
311 | } | ||
312 | |||
313 | asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *set, | ||
314 | compat_size_t sigsetsize) | ||
315 | { | ||
316 | sigset_t s; | ||
317 | compat_sigset_t s32; | ||
318 | int ret; | ||
319 | mm_segment_t old_fs = get_fs(); | ||
320 | |||
321 | set_fs(KERNEL_DS); | ||
322 | ret = sys_rt_sigpending((sigset_t __user *)&s, sigsetsize); | ||
323 | set_fs(old_fs); | ||
324 | if (!ret) { | ||
325 | switch (_NSIG_WORDS) { | ||
326 | case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3]; | ||
327 | case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2]; | ||
328 | case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1]; | ||
329 | case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0]; | ||
330 | } | ||
331 | if (copy_to_user(set, &s32, sizeof(compat_sigset_t))) | ||
332 | return -EFAULT; | ||
333 | } | ||
334 | return ret; | ||
335 | } | ||
336 | |||
337 | asmlinkage long sys32_rt_sigqueueinfo(int pid, int sig, | ||
338 | compat_siginfo_t __user *uinfo) | ||
339 | { | ||
340 | siginfo_t info; | ||
341 | int ret; | ||
342 | mm_segment_t old_fs = get_fs(); | ||
343 | |||
344 | if (copy_siginfo_from_user32(&info, uinfo)) | ||
345 | return -EFAULT; | ||
346 | set_fs(KERNEL_DS); | ||
347 | ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info); | ||
348 | set_fs(old_fs); | ||
349 | return ret; | ||
350 | } | ||
351 | |||
352 | /* warning: next two assume little endian */ | 181 | /* warning: next two assume little endian */ |
353 | asmlinkage long sys32_pread(unsigned int fd, char __user *ubuf, u32 count, | 182 | asmlinkage long sys32_pread(unsigned int fd, char __user *ubuf, u32 count, |
354 | u32 poslo, u32 poshi) | 183 | u32 poslo, u32 poshi) |
diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h index 41ab26ea6564..e25cc33ec54d 100644 --- a/arch/x86/include/asm/fpu-internal.h +++ b/arch/x86/include/asm/fpu-internal.h | |||
@@ -26,9 +26,10 @@ | |||
26 | #ifdef CONFIG_X86_64 | 26 | #ifdef CONFIG_X86_64 |
27 | # include <asm/sigcontext32.h> | 27 | # include <asm/sigcontext32.h> |
28 | # include <asm/user32.h> | 28 | # include <asm/user32.h> |
29 | int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 29 | struct ksignal; |
30 | int ia32_setup_rt_frame(int sig, struct ksignal *ksig, | ||
30 | compat_sigset_t *set, struct pt_regs *regs); | 31 | compat_sigset_t *set, struct pt_regs *regs); |
31 | int ia32_setup_frame(int sig, struct k_sigaction *ka, | 32 | int ia32_setup_frame(int sig, struct ksignal *ksig, |
32 | compat_sigset_t *set, struct pt_regs *regs); | 33 | compat_sigset_t *set, struct pt_regs *regs); |
33 | #else | 34 | #else |
34 | # define user_i387_ia32_struct user_i387_struct | 35 | # define user_i387_ia32_struct user_i387_struct |
diff --git a/arch/x86/include/asm/ia32.h b/arch/x86/include/asm/ia32.h index 4c6da2e4bb1d..d0e8e0141041 100644 --- a/arch/x86/include/asm/ia32.h +++ b/arch/x86/include/asm/ia32.h | |||
@@ -13,21 +13,6 @@ | |||
13 | #include <asm/sigcontext32.h> | 13 | #include <asm/sigcontext32.h> |
14 | 14 | ||
15 | /* signal.h */ | 15 | /* signal.h */ |
16 | struct sigaction32 { | ||
17 | unsigned int sa_handler; /* Really a pointer, but need to deal | ||
18 | with 32 bits */ | ||
19 | unsigned int sa_flags; | ||
20 | unsigned int sa_restorer; /* Another 32 bit pointer */ | ||
21 | compat_sigset_t sa_mask; /* A 32 bit mask */ | ||
22 | }; | ||
23 | |||
24 | struct old_sigaction32 { | ||
25 | unsigned int sa_handler; /* Really a pointer, but need to deal | ||
26 | with 32 bits */ | ||
27 | compat_old_sigset_t sa_mask; /* A 32 bit mask */ | ||
28 | unsigned int sa_flags; | ||
29 | unsigned int sa_restorer; /* Another 32 bit pointer */ | ||
30 | }; | ||
31 | 16 | ||
32 | struct ucontext_ia32 { | 17 | struct ucontext_ia32 { |
33 | unsigned int uc_flags; | 18 | unsigned int uc_flags; |
diff --git a/arch/x86/include/asm/signal.h b/arch/x86/include/asm/signal.h index 216bf364a7e7..35e67a457182 100644 --- a/arch/x86/include/asm/signal.h +++ b/arch/x86/include/asm/signal.h | |||
@@ -31,27 +31,9 @@ typedef sigset_t compat_sigset_t; | |||
31 | #include <uapi/asm/signal.h> | 31 | #include <uapi/asm/signal.h> |
32 | #ifndef __ASSEMBLY__ | 32 | #ifndef __ASSEMBLY__ |
33 | extern void do_notify_resume(struct pt_regs *, void *, __u32); | 33 | extern void do_notify_resume(struct pt_regs *, void *, __u32); |
34 | #ifdef __i386__ | ||
35 | struct old_sigaction { | ||
36 | __sighandler_t sa_handler; | ||
37 | old_sigset_t sa_mask; | ||
38 | unsigned long sa_flags; | ||
39 | __sigrestore_t sa_restorer; | ||
40 | }; | ||
41 | |||
42 | struct sigaction { | ||
43 | __sighandler_t sa_handler; | ||
44 | unsigned long sa_flags; | ||
45 | __sigrestore_t sa_restorer; | ||
46 | sigset_t sa_mask; /* mask last for extensibility */ | ||
47 | }; | ||
48 | |||
49 | struct k_sigaction { | ||
50 | struct sigaction sa; | ||
51 | }; | ||
52 | 34 | ||
53 | #else /* __i386__ */ | 35 | #define __ARCH_HAS_SA_RESTORER |
54 | #endif /* !__i386__ */ | 36 | |
55 | #include <asm/sigcontext.h> | 37 | #include <asm/sigcontext.h> |
56 | 38 | ||
57 | #ifdef __i386__ | 39 | #ifdef __i386__ |
diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h index 31f61f96e0fb..0218d917f509 100644 --- a/arch/x86/include/asm/sys_ia32.h +++ b/arch/x86/include/asm/sys_ia32.h | |||
@@ -32,22 +32,11 @@ struct mmap_arg_struct32; | |||
32 | asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *); | 32 | asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *); |
33 | asmlinkage long sys32_mprotect(unsigned long, size_t, unsigned long); | 33 | asmlinkage long sys32_mprotect(unsigned long, size_t, unsigned long); |
34 | 34 | ||
35 | struct sigaction32; | ||
36 | struct old_sigaction32; | ||
37 | asmlinkage long sys32_rt_sigaction(int, struct sigaction32 __user *, | ||
38 | struct sigaction32 __user *, unsigned int); | ||
39 | asmlinkage long sys32_sigaction(int, struct old_sigaction32 __user *, | ||
40 | struct old_sigaction32 __user *); | ||
41 | asmlinkage long sys32_alarm(unsigned int); | 35 | asmlinkage long sys32_alarm(unsigned int); |
42 | 36 | ||
43 | asmlinkage long sys32_waitpid(compat_pid_t, unsigned int __user *, int); | 37 | asmlinkage long sys32_waitpid(compat_pid_t, unsigned int __user *, int); |
44 | asmlinkage long sys32_sysfs(int, u32, u32); | 38 | asmlinkage long sys32_sysfs(int, u32, u32); |
45 | 39 | ||
46 | asmlinkage long sys32_sched_rr_get_interval(compat_pid_t, | ||
47 | struct compat_timespec __user *); | ||
48 | asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *, compat_size_t); | ||
49 | asmlinkage long sys32_rt_sigqueueinfo(int, int, compat_siginfo_t __user *); | ||
50 | |||
51 | asmlinkage long sys32_pread(unsigned int, char __user *, u32, u32, u32); | 40 | asmlinkage long sys32_pread(unsigned int, char __user *, u32, u32, u32); |
52 | asmlinkage long sys32_pwrite(unsigned int, const char __user *, u32, u32, u32); | 41 | asmlinkage long sys32_pwrite(unsigned int, const char __user *, u32, u32, u32); |
53 | 42 | ||
@@ -68,9 +57,8 @@ asmlinkage long sys32_fallocate(int, int, unsigned, | |||
68 | unsigned, unsigned, unsigned); | 57 | unsigned, unsigned, unsigned); |
69 | 58 | ||
70 | /* ia32/ia32_signal.c */ | 59 | /* ia32/ia32_signal.c */ |
71 | asmlinkage long sys32_sigsuspend(int, int, old_sigset_t); | 60 | asmlinkage long sys32_sigreturn(void); |
72 | asmlinkage long sys32_sigreturn(struct pt_regs *); | 61 | asmlinkage long sys32_rt_sigreturn(void); |
73 | asmlinkage long sys32_rt_sigreturn(struct pt_regs *); | ||
74 | 62 | ||
75 | /* ia32/ipc32.c */ | 63 | /* ia32/ipc32.c */ |
76 | asmlinkage long sys32_ipc(u32, int, int, int, compat_uptr_t, u32); | 64 | asmlinkage long sys32_ipc(u32, int, int, int, compat_uptr_t, u32); |
diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h index 58b7e3eac0ae..6cf0a9cc60cd 100644 --- a/arch/x86/include/asm/syscalls.h +++ b/arch/x86/include/asm/syscalls.h | |||
@@ -18,13 +18,13 @@ | |||
18 | /* Common in X86_32 and X86_64 */ | 18 | /* Common in X86_32 and X86_64 */ |
19 | /* kernel/ioport.c */ | 19 | /* kernel/ioport.c */ |
20 | asmlinkage long sys_ioperm(unsigned long, unsigned long, int); | 20 | asmlinkage long sys_ioperm(unsigned long, unsigned long, int); |
21 | long sys_iopl(unsigned int, struct pt_regs *); | 21 | asmlinkage long sys_iopl(unsigned int); |
22 | 22 | ||
23 | /* kernel/ldt.c */ | 23 | /* kernel/ldt.c */ |
24 | asmlinkage int sys_modify_ldt(int, void __user *, unsigned long); | 24 | asmlinkage int sys_modify_ldt(int, void __user *, unsigned long); |
25 | 25 | ||
26 | /* kernel/signal.c */ | 26 | /* kernel/signal.c */ |
27 | long sys_rt_sigreturn(struct pt_regs *); | 27 | long sys_rt_sigreturn(void); |
28 | 28 | ||
29 | /* kernel/tls.c */ | 29 | /* kernel/tls.c */ |
30 | asmlinkage int sys_set_thread_area(struct user_desc __user *); | 30 | asmlinkage int sys_set_thread_area(struct user_desc __user *); |
@@ -34,14 +34,11 @@ asmlinkage int sys_get_thread_area(struct user_desc __user *); | |||
34 | #ifdef CONFIG_X86_32 | 34 | #ifdef CONFIG_X86_32 |
35 | 35 | ||
36 | /* kernel/signal.c */ | 36 | /* kernel/signal.c */ |
37 | asmlinkage int sys_sigsuspend(int, int, old_sigset_t); | 37 | unsigned long sys_sigreturn(void); |
38 | asmlinkage int sys_sigaction(int, const struct old_sigaction __user *, | ||
39 | struct old_sigaction __user *); | ||
40 | unsigned long sys_sigreturn(struct pt_regs *); | ||
41 | 38 | ||
42 | /* kernel/vm86_32.c */ | 39 | /* kernel/vm86_32.c */ |
43 | int sys_vm86old(struct vm86_struct __user *, struct pt_regs *); | 40 | int sys_vm86old(struct vm86_struct __user *); |
44 | int sys_vm86(unsigned long, unsigned long, struct pt_regs *); | 41 | int sys_vm86(unsigned long, unsigned long); |
45 | 42 | ||
46 | #else /* CONFIG_X86_32 */ | 43 | #else /* CONFIG_X86_32 */ |
47 | 44 | ||
diff --git a/arch/x86/include/asm/unistd.h b/arch/x86/include/asm/unistd.h index a0790e07ba65..3d5df1c4447f 100644 --- a/arch/x86/include/asm/unistd.h +++ b/arch/x86/include/asm/unistd.h | |||
@@ -38,8 +38,6 @@ | |||
38 | # define __ARCH_WANT_SYS_OLD_GETRLIMIT | 38 | # define __ARCH_WANT_SYS_OLD_GETRLIMIT |
39 | # define __ARCH_WANT_SYS_OLD_UNAME | 39 | # define __ARCH_WANT_SYS_OLD_UNAME |
40 | # define __ARCH_WANT_SYS_PAUSE | 40 | # define __ARCH_WANT_SYS_PAUSE |
41 | # define __ARCH_WANT_SYS_RT_SIGACTION | ||
42 | # define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
43 | # define __ARCH_WANT_SYS_SGETMASK | 41 | # define __ARCH_WANT_SYS_SGETMASK |
44 | # define __ARCH_WANT_SYS_SIGNAL | 42 | # define __ARCH_WANT_SYS_SIGNAL |
45 | # define __ARCH_WANT_SYS_SIGPENDING | 43 | # define __ARCH_WANT_SYS_SIGPENDING |
diff --git a/arch/x86/include/uapi/asm/signal.h b/arch/x86/include/uapi/asm/signal.h index aa7d6ae39e0e..8264f47cf53e 100644 --- a/arch/x86/include/uapi/asm/signal.h +++ b/arch/x86/include/uapi/asm/signal.h | |||
@@ -95,9 +95,9 @@ typedef unsigned long sigset_t; | |||
95 | #ifndef __ASSEMBLY__ | 95 | #ifndef __ASSEMBLY__ |
96 | 96 | ||
97 | 97 | ||
98 | #ifdef __i386__ | ||
99 | # ifndef __KERNEL__ | 98 | # ifndef __KERNEL__ |
100 | /* Here we must cater to libcs that poke about in kernel headers. */ | 99 | /* Here we must cater to libcs that poke about in kernel headers. */ |
100 | #ifdef __i386__ | ||
101 | 101 | ||
102 | struct sigaction { | 102 | struct sigaction { |
103 | union { | 103 | union { |
@@ -112,7 +112,6 @@ struct sigaction { | |||
112 | #define sa_handler _u._sa_handler | 112 | #define sa_handler _u._sa_handler |
113 | #define sa_sigaction _u._sa_sigaction | 113 | #define sa_sigaction _u._sa_sigaction |
114 | 114 | ||
115 | # endif /* ! __KERNEL__ */ | ||
116 | #else /* __i386__ */ | 115 | #else /* __i386__ */ |
117 | 116 | ||
118 | struct sigaction { | 117 | struct sigaction { |
@@ -122,11 +121,8 @@ struct sigaction { | |||
122 | sigset_t sa_mask; /* mask last for extensibility */ | 121 | sigset_t sa_mask; /* mask last for extensibility */ |
123 | }; | 122 | }; |
124 | 123 | ||
125 | struct k_sigaction { | ||
126 | struct sigaction sa; | ||
127 | }; | ||
128 | |||
129 | #endif /* !__i386__ */ | 124 | #endif /* !__i386__ */ |
125 | # endif /* ! __KERNEL__ */ | ||
130 | 126 | ||
131 | typedef struct sigaltstack { | 127 | typedef struct sigaltstack { |
132 | void __user *ss_sp; | 128 | void __user *ss_sp; |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 8831176aa5ef..8f3e2dec1df3 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -699,51 +699,6 @@ END(syscall_badsys) | |||
699 | */ | 699 | */ |
700 | .popsection | 700 | .popsection |
701 | 701 | ||
702 | /* | ||
703 | * System calls that need a pt_regs pointer. | ||
704 | */ | ||
705 | #define PTREGSCALL0(name) \ | ||
706 | ENTRY(ptregs_##name) ; \ | ||
707 | leal 4(%esp),%eax; \ | ||
708 | jmp sys_##name; \ | ||
709 | ENDPROC(ptregs_##name) | ||
710 | |||
711 | #define PTREGSCALL1(name) \ | ||
712 | ENTRY(ptregs_##name) ; \ | ||
713 | leal 4(%esp),%edx; \ | ||
714 | movl (PT_EBX+4)(%esp),%eax; \ | ||
715 | jmp sys_##name; \ | ||
716 | ENDPROC(ptregs_##name) | ||
717 | |||
718 | #define PTREGSCALL2(name) \ | ||
719 | ENTRY(ptregs_##name) ; \ | ||
720 | leal 4(%esp),%ecx; \ | ||
721 | movl (PT_ECX+4)(%esp),%edx; \ | ||
722 | movl (PT_EBX+4)(%esp),%eax; \ | ||
723 | jmp sys_##name; \ | ||
724 | ENDPROC(ptregs_##name) | ||
725 | |||
726 | #define PTREGSCALL3(name) \ | ||
727 | ENTRY(ptregs_##name) ; \ | ||
728 | CFI_STARTPROC; \ | ||
729 | leal 4(%esp),%eax; \ | ||
730 | pushl_cfi %eax; \ | ||
731 | movl PT_EDX(%eax),%ecx; \ | ||
732 | movl PT_ECX(%eax),%edx; \ | ||
733 | movl PT_EBX(%eax),%eax; \ | ||
734 | call sys_##name; \ | ||
735 | addl $4,%esp; \ | ||
736 | CFI_ADJUST_CFA_OFFSET -4; \ | ||
737 | ret; \ | ||
738 | CFI_ENDPROC; \ | ||
739 | ENDPROC(ptregs_##name) | ||
740 | |||
741 | PTREGSCALL1(iopl) | ||
742 | PTREGSCALL0(sigreturn) | ||
743 | PTREGSCALL0(rt_sigreturn) | ||
744 | PTREGSCALL2(vm86) | ||
745 | PTREGSCALL1(vm86old) | ||
746 | |||
747 | .macro FIXUP_ESPFIX_STACK | 702 | .macro FIXUP_ESPFIX_STACK |
748 | /* | 703 | /* |
749 | * Switch back for ESPFIX stack to the normal zerobased stack | 704 | * Switch back for ESPFIX stack to the normal zerobased stack |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 048f2240f8e6..c1d01e6ca790 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -828,23 +828,6 @@ int_restore_rest: | |||
828 | CFI_ENDPROC | 828 | CFI_ENDPROC |
829 | END(system_call) | 829 | END(system_call) |
830 | 830 | ||
831 | /* | ||
832 | * Certain special system calls that need to save a complete full stack frame. | ||
833 | */ | ||
834 | .macro PTREGSCALL label,func,arg | ||
835 | ENTRY(\label) | ||
836 | PARTIAL_FRAME 1 8 /* offset 8: return address */ | ||
837 | subq $REST_SKIP, %rsp | ||
838 | CFI_ADJUST_CFA_OFFSET REST_SKIP | ||
839 | call save_rest | ||
840 | DEFAULT_FRAME 0 8 /* offset 8: return address */ | ||
841 | leaq 8(%rsp), \arg /* pt_regs pointer */ | ||
842 | call \func | ||
843 | jmp ptregscall_common | ||
844 | CFI_ENDPROC | ||
845 | END(\label) | ||
846 | .endm | ||
847 | |||
848 | .macro FORK_LIKE func | 831 | .macro FORK_LIKE func |
849 | ENTRY(stub_\func) | 832 | ENTRY(stub_\func) |
850 | CFI_STARTPROC | 833 | CFI_STARTPROC |
@@ -861,10 +844,22 @@ ENTRY(stub_\func) | |||
861 | END(stub_\func) | 844 | END(stub_\func) |
862 | .endm | 845 | .endm |
863 | 846 | ||
847 | .macro FIXED_FRAME label,func | ||
848 | ENTRY(\label) | ||
849 | CFI_STARTPROC | ||
850 | PARTIAL_FRAME 0 8 /* offset 8: return address */ | ||
851 | FIXUP_TOP_OF_STACK %r11, 8-ARGOFFSET | ||
852 | call \func | ||
853 | RESTORE_TOP_OF_STACK %r11, 8-ARGOFFSET | ||
854 | ret | ||
855 | CFI_ENDPROC | ||
856 | END(\label) | ||
857 | .endm | ||
858 | |||
864 | FORK_LIKE clone | 859 | FORK_LIKE clone |
865 | FORK_LIKE fork | 860 | FORK_LIKE fork |
866 | FORK_LIKE vfork | 861 | FORK_LIKE vfork |
867 | PTREGSCALL stub_iopl, sys_iopl, %rsi | 862 | FIXED_FRAME stub_iopl, sys_iopl |
868 | 863 | ||
869 | ENTRY(ptregscall_common) | 864 | ENTRY(ptregscall_common) |
870 | DEFAULT_FRAME 1 8 /* offset 8: return address */ | 865 | DEFAULT_FRAME 1 8 /* offset 8: return address */ |
@@ -886,7 +881,6 @@ ENTRY(stub_execve) | |||
886 | SAVE_REST | 881 | SAVE_REST |
887 | FIXUP_TOP_OF_STACK %r11 | 882 | FIXUP_TOP_OF_STACK %r11 |
888 | call sys_execve | 883 | call sys_execve |
889 | RESTORE_TOP_OF_STACK %r11 | ||
890 | movq %rax,RAX(%rsp) | 884 | movq %rax,RAX(%rsp) |
891 | RESTORE_REST | 885 | RESTORE_REST |
892 | jmp int_ret_from_sys_call | 886 | jmp int_ret_from_sys_call |
@@ -902,7 +896,6 @@ ENTRY(stub_rt_sigreturn) | |||
902 | addq $8, %rsp | 896 | addq $8, %rsp |
903 | PARTIAL_FRAME 0 | 897 | PARTIAL_FRAME 0 |
904 | SAVE_REST | 898 | SAVE_REST |
905 | movq %rsp,%rdi | ||
906 | FIXUP_TOP_OF_STACK %r11 | 899 | FIXUP_TOP_OF_STACK %r11 |
907 | call sys_rt_sigreturn | 900 | call sys_rt_sigreturn |
908 | movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer | 901 | movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer |
@@ -917,7 +910,6 @@ ENTRY(stub_x32_rt_sigreturn) | |||
917 | addq $8, %rsp | 910 | addq $8, %rsp |
918 | PARTIAL_FRAME 0 | 911 | PARTIAL_FRAME 0 |
919 | SAVE_REST | 912 | SAVE_REST |
920 | movq %rsp,%rdi | ||
921 | FIXUP_TOP_OF_STACK %r11 | 913 | FIXUP_TOP_OF_STACK %r11 |
922 | call sys32_x32_rt_sigreturn | 914 | call sys32_x32_rt_sigreturn |
923 | movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer | 915 | movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer |
diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c index 8c968974253d..4ddaf66ea35f 100644 --- a/arch/x86/kernel/ioport.c +++ b/arch/x86/kernel/ioport.c | |||
@@ -93,8 +93,9 @@ asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on) | |||
93 | * on system-call entry - see also fork() and the signal handling | 93 | * on system-call entry - see also fork() and the signal handling |
94 | * code. | 94 | * code. |
95 | */ | 95 | */ |
96 | long sys_iopl(unsigned int level, struct pt_regs *regs) | 96 | SYSCALL_DEFINE1(iopl, unsigned int, level) |
97 | { | 97 | { |
98 | struct pt_regs *regs = current_pt_regs(); | ||
98 | unsigned int old = (regs->flags >> 12) & 3; | 99 | unsigned int old = (regs->flags >> 12) & 3; |
99 | struct thread_struct *t = ¤t->thread; | 100 | struct thread_struct *t = ¤t->thread; |
100 | 101 | ||
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index d6bf1f34a6e9..69562992e457 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c | |||
@@ -278,7 +278,7 @@ static const struct { | |||
278 | }; | 278 | }; |
279 | 279 | ||
280 | static int | 280 | static int |
281 | __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | 281 | __setup_frame(int sig, struct ksignal *ksig, sigset_t *set, |
282 | struct pt_regs *regs) | 282 | struct pt_regs *regs) |
283 | { | 283 | { |
284 | struct sigframe __user *frame; | 284 | struct sigframe __user *frame; |
@@ -286,7 +286,7 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
286 | int err = 0; | 286 | int err = 0; |
287 | void __user *fpstate = NULL; | 287 | void __user *fpstate = NULL; |
288 | 288 | ||
289 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 289 | frame = get_sigframe(&ksig->ka, regs, sizeof(*frame), &fpstate); |
290 | 290 | ||
291 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 291 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
292 | return -EFAULT; | 292 | return -EFAULT; |
@@ -307,8 +307,8 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
307 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, sigreturn); | 307 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, sigreturn); |
308 | else | 308 | else |
309 | restorer = &frame->retcode; | 309 | restorer = &frame->retcode; |
310 | if (ka->sa.sa_flags & SA_RESTORER) | 310 | if (ksig->ka.sa.sa_flags & SA_RESTORER) |
311 | restorer = ka->sa.sa_restorer; | 311 | restorer = ksig->ka.sa.sa_restorer; |
312 | 312 | ||
313 | /* Set up to return from userspace. */ | 313 | /* Set up to return from userspace. */ |
314 | err |= __put_user(restorer, &frame->pretcode); | 314 | err |= __put_user(restorer, &frame->pretcode); |
@@ -327,7 +327,7 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
327 | 327 | ||
328 | /* Set up registers for signal handler */ | 328 | /* Set up registers for signal handler */ |
329 | regs->sp = (unsigned long)frame; | 329 | regs->sp = (unsigned long)frame; |
330 | regs->ip = (unsigned long)ka->sa.sa_handler; | 330 | regs->ip = (unsigned long)ksig->ka.sa.sa_handler; |
331 | regs->ax = (unsigned long)sig; | 331 | regs->ax = (unsigned long)sig; |
332 | regs->dx = 0; | 332 | regs->dx = 0; |
333 | regs->cx = 0; | 333 | regs->cx = 0; |
@@ -340,7 +340,7 @@ __setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
340 | return 0; | 340 | return 0; |
341 | } | 341 | } |
342 | 342 | ||
343 | static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 343 | static int __setup_rt_frame(int sig, struct ksignal *ksig, |
344 | sigset_t *set, struct pt_regs *regs) | 344 | sigset_t *set, struct pt_regs *regs) |
345 | { | 345 | { |
346 | struct rt_sigframe __user *frame; | 346 | struct rt_sigframe __user *frame; |
@@ -348,7 +348,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
348 | int err = 0; | 348 | int err = 0; |
349 | void __user *fpstate = NULL; | 349 | void __user *fpstate = NULL; |
350 | 350 | ||
351 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 351 | frame = get_sigframe(&ksig->ka, regs, sizeof(*frame), &fpstate); |
352 | 352 | ||
353 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 353 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
354 | return -EFAULT; | 354 | return -EFAULT; |
@@ -368,8 +368,8 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
368 | 368 | ||
369 | /* Set up to return from userspace. */ | 369 | /* Set up to return from userspace. */ |
370 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); | 370 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); |
371 | if (ka->sa.sa_flags & SA_RESTORER) | 371 | if (ksig->ka.sa.sa_flags & SA_RESTORER) |
372 | restorer = ka->sa.sa_restorer; | 372 | restorer = ksig->ka.sa.sa_restorer; |
373 | put_user_ex(restorer, &frame->pretcode); | 373 | put_user_ex(restorer, &frame->pretcode); |
374 | 374 | ||
375 | /* | 375 | /* |
@@ -382,7 +382,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
382 | put_user_ex(*((u64 *)&rt_retcode), (u64 *)frame->retcode); | 382 | put_user_ex(*((u64 *)&rt_retcode), (u64 *)frame->retcode); |
383 | } put_user_catch(err); | 383 | } put_user_catch(err); |
384 | 384 | ||
385 | err |= copy_siginfo_to_user(&frame->info, info); | 385 | err |= copy_siginfo_to_user(&frame->info, &ksig->info); |
386 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, | 386 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, |
387 | regs, set->sig[0]); | 387 | regs, set->sig[0]); |
388 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 388 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
@@ -392,7 +392,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
392 | 392 | ||
393 | /* Set up registers for signal handler */ | 393 | /* Set up registers for signal handler */ |
394 | regs->sp = (unsigned long)frame; | 394 | regs->sp = (unsigned long)frame; |
395 | regs->ip = (unsigned long)ka->sa.sa_handler; | 395 | regs->ip = (unsigned long)ksig->ka.sa.sa_handler; |
396 | regs->ax = (unsigned long)sig; | 396 | regs->ax = (unsigned long)sig; |
397 | regs->dx = (unsigned long)&frame->info; | 397 | regs->dx = (unsigned long)&frame->info; |
398 | regs->cx = (unsigned long)&frame->uc; | 398 | regs->cx = (unsigned long)&frame->uc; |
@@ -405,20 +405,20 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
405 | return 0; | 405 | return 0; |
406 | } | 406 | } |
407 | #else /* !CONFIG_X86_32 */ | 407 | #else /* !CONFIG_X86_32 */ |
408 | static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 408 | static int __setup_rt_frame(int sig, struct ksignal *ksig, |
409 | sigset_t *set, struct pt_regs *regs) | 409 | sigset_t *set, struct pt_regs *regs) |
410 | { | 410 | { |
411 | struct rt_sigframe __user *frame; | 411 | struct rt_sigframe __user *frame; |
412 | void __user *fp = NULL; | 412 | void __user *fp = NULL; |
413 | int err = 0; | 413 | int err = 0; |
414 | 414 | ||
415 | frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp); | 415 | frame = get_sigframe(&ksig->ka, regs, sizeof(struct rt_sigframe), &fp); |
416 | 416 | ||
417 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 417 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
418 | return -EFAULT; | 418 | return -EFAULT; |
419 | 419 | ||
420 | if (ka->sa.sa_flags & SA_SIGINFO) { | 420 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) { |
421 | if (copy_siginfo_to_user(&frame->info, info)) | 421 | if (copy_siginfo_to_user(&frame->info, &ksig->info)) |
422 | return -EFAULT; | 422 | return -EFAULT; |
423 | } | 423 | } |
424 | 424 | ||
@@ -434,8 +434,8 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
434 | /* Set up to return from userspace. If provided, use a stub | 434 | /* Set up to return from userspace. If provided, use a stub |
435 | already in userspace. */ | 435 | already in userspace. */ |
436 | /* x86-64 should always use SA_RESTORER. */ | 436 | /* x86-64 should always use SA_RESTORER. */ |
437 | if (ka->sa.sa_flags & SA_RESTORER) { | 437 | if (ksig->ka.sa.sa_flags & SA_RESTORER) { |
438 | put_user_ex(ka->sa.sa_restorer, &frame->pretcode); | 438 | put_user_ex(ksig->ka.sa.sa_restorer, &frame->pretcode); |
439 | } else { | 439 | } else { |
440 | /* could use a vstub here */ | 440 | /* could use a vstub here */ |
441 | err |= -EFAULT; | 441 | err |= -EFAULT; |
@@ -457,7 +457,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
457 | next argument after the signal number on the stack. */ | 457 | next argument after the signal number on the stack. */ |
458 | regs->si = (unsigned long)&frame->info; | 458 | regs->si = (unsigned long)&frame->info; |
459 | regs->dx = (unsigned long)&frame->uc; | 459 | regs->dx = (unsigned long)&frame->uc; |
460 | regs->ip = (unsigned long) ka->sa.sa_handler; | 460 | regs->ip = (unsigned long) ksig->ka.sa.sa_handler; |
461 | 461 | ||
462 | regs->sp = (unsigned long)frame; | 462 | regs->sp = (unsigned long)frame; |
463 | 463 | ||
@@ -469,8 +469,8 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
469 | } | 469 | } |
470 | #endif /* CONFIG_X86_32 */ | 470 | #endif /* CONFIG_X86_32 */ |
471 | 471 | ||
472 | static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | 472 | static int x32_setup_rt_frame(struct ksignal *ksig, |
473 | siginfo_t *info, compat_sigset_t *set, | 473 | compat_sigset_t *set, |
474 | struct pt_regs *regs) | 474 | struct pt_regs *regs) |
475 | { | 475 | { |
476 | #ifdef CONFIG_X86_X32_ABI | 476 | #ifdef CONFIG_X86_X32_ABI |
@@ -479,13 +479,13 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | |||
479 | int err = 0; | 479 | int err = 0; |
480 | void __user *fpstate = NULL; | 480 | void __user *fpstate = NULL; |
481 | 481 | ||
482 | frame = get_sigframe(ka, regs, sizeof(*frame), &fpstate); | 482 | frame = get_sigframe(&ksig->ka, regs, sizeof(*frame), &fpstate); |
483 | 483 | ||
484 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 484 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
485 | return -EFAULT; | 485 | return -EFAULT; |
486 | 486 | ||
487 | if (ka->sa.sa_flags & SA_SIGINFO) { | 487 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) { |
488 | if (copy_siginfo_to_user32(&frame->info, info)) | 488 | if (copy_siginfo_to_user32(&frame->info, &ksig->info)) |
489 | return -EFAULT; | 489 | return -EFAULT; |
490 | } | 490 | } |
491 | 491 | ||
@@ -499,8 +499,8 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | |||
499 | err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); | 499 | err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); |
500 | put_user_ex(0, &frame->uc.uc__pad0); | 500 | put_user_ex(0, &frame->uc.uc__pad0); |
501 | 501 | ||
502 | if (ka->sa.sa_flags & SA_RESTORER) { | 502 | if (ksig->ka.sa.sa_flags & SA_RESTORER) { |
503 | restorer = ka->sa.sa_restorer; | 503 | restorer = ksig->ka.sa.sa_restorer; |
504 | } else { | 504 | } else { |
505 | /* could use a vstub here */ | 505 | /* could use a vstub here */ |
506 | restorer = NULL; | 506 | restorer = NULL; |
@@ -518,10 +518,10 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | |||
518 | 518 | ||
519 | /* Set up registers for signal handler */ | 519 | /* Set up registers for signal handler */ |
520 | regs->sp = (unsigned long) frame; | 520 | regs->sp = (unsigned long) frame; |
521 | regs->ip = (unsigned long) ka->sa.sa_handler; | 521 | regs->ip = (unsigned long) ksig->ka.sa.sa_handler; |
522 | 522 | ||
523 | /* We use the x32 calling convention here... */ | 523 | /* We use the x32 calling convention here... */ |
524 | regs->di = sig; | 524 | regs->di = ksig->sig; |
525 | regs->si = (unsigned long) &frame->info; | 525 | regs->si = (unsigned long) &frame->info; |
526 | regs->dx = (unsigned long) &frame->uc; | 526 | regs->dx = (unsigned long) &frame->uc; |
527 | 527 | ||
@@ -535,70 +535,13 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | |||
535 | return 0; | 535 | return 0; |
536 | } | 536 | } |
537 | 537 | ||
538 | #ifdef CONFIG_X86_32 | ||
539 | /* | ||
540 | * Atomically swap in the new signal mask, and wait for a signal. | ||
541 | */ | ||
542 | asmlinkage int | ||
543 | sys_sigsuspend(int history0, int history1, old_sigset_t mask) | ||
544 | { | ||
545 | sigset_t blocked; | ||
546 | siginitset(&blocked, mask); | ||
547 | return sigsuspend(&blocked); | ||
548 | } | ||
549 | |||
550 | asmlinkage int | ||
551 | sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
552 | struct old_sigaction __user *oact) | ||
553 | { | ||
554 | struct k_sigaction new_ka, old_ka; | ||
555 | int ret = 0; | ||
556 | |||
557 | if (act) { | ||
558 | old_sigset_t mask; | ||
559 | |||
560 | if (!access_ok(VERIFY_READ, act, sizeof(*act))) | ||
561 | return -EFAULT; | ||
562 | |||
563 | get_user_try { | ||
564 | get_user_ex(new_ka.sa.sa_handler, &act->sa_handler); | ||
565 | get_user_ex(new_ka.sa.sa_flags, &act->sa_flags); | ||
566 | get_user_ex(mask, &act->sa_mask); | ||
567 | get_user_ex(new_ka.sa.sa_restorer, &act->sa_restorer); | ||
568 | } get_user_catch(ret); | ||
569 | |||
570 | if (ret) | ||
571 | return -EFAULT; | ||
572 | siginitset(&new_ka.sa.sa_mask, mask); | ||
573 | } | ||
574 | |||
575 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
576 | |||
577 | if (!ret && oact) { | ||
578 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact))) | ||
579 | return -EFAULT; | ||
580 | |||
581 | put_user_try { | ||
582 | put_user_ex(old_ka.sa.sa_handler, &oact->sa_handler); | ||
583 | put_user_ex(old_ka.sa.sa_flags, &oact->sa_flags); | ||
584 | put_user_ex(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
585 | put_user_ex(old_ka.sa.sa_restorer, &oact->sa_restorer); | ||
586 | } put_user_catch(ret); | ||
587 | |||
588 | if (ret) | ||
589 | return -EFAULT; | ||
590 | } | ||
591 | |||
592 | return ret; | ||
593 | } | ||
594 | #endif /* CONFIG_X86_32 */ | ||
595 | |||
596 | /* | 538 | /* |
597 | * Do a signal return; undo the signal stack. | 539 | * Do a signal return; undo the signal stack. |
598 | */ | 540 | */ |
599 | #ifdef CONFIG_X86_32 | 541 | #ifdef CONFIG_X86_32 |
600 | unsigned long sys_sigreturn(struct pt_regs *regs) | 542 | unsigned long sys_sigreturn(void) |
601 | { | 543 | { |
544 | struct pt_regs *regs = current_pt_regs(); | ||
602 | struct sigframe __user *frame; | 545 | struct sigframe __user *frame; |
603 | unsigned long ax; | 546 | unsigned long ax; |
604 | sigset_t set; | 547 | sigset_t set; |
@@ -625,8 +568,9 @@ badframe: | |||
625 | } | 568 | } |
626 | #endif /* CONFIG_X86_32 */ | 569 | #endif /* CONFIG_X86_32 */ |
627 | 570 | ||
628 | long sys_rt_sigreturn(struct pt_regs *regs) | 571 | long sys_rt_sigreturn(void) |
629 | { | 572 | { |
573 | struct pt_regs *regs = current_pt_regs(); | ||
630 | struct rt_sigframe __user *frame; | 574 | struct rt_sigframe __user *frame; |
631 | unsigned long ax; | 575 | unsigned long ax; |
632 | sigset_t set; | 576 | sigset_t set; |
@@ -667,30 +611,29 @@ static int signr_convert(int sig) | |||
667 | } | 611 | } |
668 | 612 | ||
669 | static int | 613 | static int |
670 | setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 614 | setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) |
671 | struct pt_regs *regs) | ||
672 | { | 615 | { |
673 | int usig = signr_convert(sig); | 616 | int usig = signr_convert(ksig->sig); |
674 | sigset_t *set = sigmask_to_save(); | 617 | sigset_t *set = sigmask_to_save(); |
675 | compat_sigset_t *cset = (compat_sigset_t *) set; | 618 | compat_sigset_t *cset = (compat_sigset_t *) set; |
676 | 619 | ||
677 | /* Set up the stack frame */ | 620 | /* Set up the stack frame */ |
678 | if (is_ia32_frame()) { | 621 | if (is_ia32_frame()) { |
679 | if (ka->sa.sa_flags & SA_SIGINFO) | 622 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
680 | return ia32_setup_rt_frame(usig, ka, info, cset, regs); | 623 | return ia32_setup_rt_frame(usig, ksig, cset, regs); |
681 | else | 624 | else |
682 | return ia32_setup_frame(usig, ka, cset, regs); | 625 | return ia32_setup_frame(usig, ksig, cset, regs); |
683 | } else if (is_x32_frame()) { | 626 | } else if (is_x32_frame()) { |
684 | return x32_setup_rt_frame(usig, ka, info, cset, regs); | 627 | return x32_setup_rt_frame(ksig, cset, regs); |
685 | } else { | 628 | } else { |
686 | return __setup_rt_frame(sig, ka, info, set, regs); | 629 | return __setup_rt_frame(ksig->sig, ksig, set, regs); |
687 | } | 630 | } |
688 | } | 631 | } |
689 | 632 | ||
690 | static void | 633 | static void |
691 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 634 | handle_signal(struct ksignal *ksig, struct pt_regs *regs) |
692 | struct pt_regs *regs) | ||
693 | { | 635 | { |
636 | bool failed; | ||
694 | /* Are we from a system call? */ | 637 | /* Are we from a system call? */ |
695 | if (syscall_get_nr(current, regs) >= 0) { | 638 | if (syscall_get_nr(current, regs) >= 0) { |
696 | /* If so, check system call restarting.. */ | 639 | /* If so, check system call restarting.. */ |
@@ -701,7 +644,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
701 | break; | 644 | break; |
702 | 645 | ||
703 | case -ERESTARTSYS: | 646 | case -ERESTARTSYS: |
704 | if (!(ka->sa.sa_flags & SA_RESTART)) { | 647 | if (!(ksig->ka.sa.sa_flags & SA_RESTART)) { |
705 | regs->ax = -EINTR; | 648 | regs->ax = -EINTR; |
706 | break; | 649 | break; |
707 | } | 650 | } |
@@ -721,26 +664,21 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
721 | likely(test_and_clear_thread_flag(TIF_FORCED_TF))) | 664 | likely(test_and_clear_thread_flag(TIF_FORCED_TF))) |
722 | regs->flags &= ~X86_EFLAGS_TF; | 665 | regs->flags &= ~X86_EFLAGS_TF; |
723 | 666 | ||
724 | if (setup_rt_frame(sig, ka, info, regs) < 0) { | 667 | failed = (setup_rt_frame(ksig, regs) < 0); |
725 | force_sigsegv(sig, current); | 668 | if (!failed) { |
726 | return; | 669 | /* |
670 | * Clear the direction flag as per the ABI for function entry. | ||
671 | */ | ||
672 | regs->flags &= ~X86_EFLAGS_DF; | ||
673 | /* | ||
674 | * Clear TF when entering the signal handler, but | ||
675 | * notify any tracer that was single-stepping it. | ||
676 | * The tracer may want to single-step inside the | ||
677 | * handler too. | ||
678 | */ | ||
679 | regs->flags &= ~X86_EFLAGS_TF; | ||
727 | } | 680 | } |
728 | 681 | signal_setup_done(failed, ksig, test_thread_flag(TIF_SINGLESTEP)); | |
729 | /* | ||
730 | * Clear the direction flag as per the ABI for function entry. | ||
731 | */ | ||
732 | regs->flags &= ~X86_EFLAGS_DF; | ||
733 | |||
734 | /* | ||
735 | * Clear TF when entering the signal handler, but | ||
736 | * notify any tracer that was single-stepping it. | ||
737 | * The tracer may want to single-step inside the | ||
738 | * handler too. | ||
739 | */ | ||
740 | regs->flags &= ~X86_EFLAGS_TF; | ||
741 | |||
742 | signal_delivered(sig, info, ka, regs, | ||
743 | test_thread_flag(TIF_SINGLESTEP)); | ||
744 | } | 682 | } |
745 | 683 | ||
746 | #ifdef CONFIG_X86_32 | 684 | #ifdef CONFIG_X86_32 |
@@ -757,14 +695,11 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
757 | */ | 695 | */ |
758 | static void do_signal(struct pt_regs *regs) | 696 | static void do_signal(struct pt_regs *regs) |
759 | { | 697 | { |
760 | struct k_sigaction ka; | 698 | struct ksignal ksig; |
761 | siginfo_t info; | ||
762 | int signr; | ||
763 | 699 | ||
764 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 700 | if (get_signal(&ksig)) { |
765 | if (signr > 0) { | ||
766 | /* Whee! Actually deliver the signal. */ | 701 | /* Whee! Actually deliver the signal. */ |
767 | handle_signal(signr, &info, &ka, regs); | 702 | handle_signal(&ksig, regs); |
768 | return; | 703 | return; |
769 | } | 704 | } |
770 | 705 | ||
@@ -843,8 +778,9 @@ void signal_fault(struct pt_regs *regs, void __user *frame, char *where) | |||
843 | } | 778 | } |
844 | 779 | ||
845 | #ifdef CONFIG_X86_X32_ABI | 780 | #ifdef CONFIG_X86_X32_ABI |
846 | asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs) | 781 | asmlinkage long sys32_x32_rt_sigreturn(void) |
847 | { | 782 | { |
783 | struct pt_regs *regs = current_pt_regs(); | ||
848 | struct rt_sigframe_x32 __user *frame; | 784 | struct rt_sigframe_x32 __user *frame; |
849 | sigset_t set; | 785 | sigset_t set; |
850 | unsigned long ax; | 786 | unsigned long ax; |
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c index 1dfe69cc78a8..1cf5766dde16 100644 --- a/arch/x86/kernel/vm86_32.c +++ b/arch/x86/kernel/vm86_32.c | |||
@@ -202,7 +202,7 @@ out: | |||
202 | static int do_vm86_irq_handling(int subfunction, int irqnumber); | 202 | static int do_vm86_irq_handling(int subfunction, int irqnumber); |
203 | static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk); | 203 | static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk); |
204 | 204 | ||
205 | int sys_vm86old(struct vm86_struct __user *v86, struct pt_regs *regs) | 205 | int sys_vm86old(struct vm86_struct __user *v86) |
206 | { | 206 | { |
207 | struct kernel_vm86_struct info; /* declare this _on top_, | 207 | struct kernel_vm86_struct info; /* declare this _on top_, |
208 | * this avoids wasting of stack space. | 208 | * this avoids wasting of stack space. |
@@ -222,7 +222,7 @@ int sys_vm86old(struct vm86_struct __user *v86, struct pt_regs *regs) | |||
222 | if (tmp) | 222 | if (tmp) |
223 | goto out; | 223 | goto out; |
224 | memset(&info.vm86plus, 0, (int)&info.regs32 - (int)&info.vm86plus); | 224 | memset(&info.vm86plus, 0, (int)&info.regs32 - (int)&info.vm86plus); |
225 | info.regs32 = regs; | 225 | info.regs32 = current_pt_regs(); |
226 | tsk->thread.vm86_info = v86; | 226 | tsk->thread.vm86_info = v86; |
227 | do_sys_vm86(&info, tsk); | 227 | do_sys_vm86(&info, tsk); |
228 | ret = 0; /* we never return here */ | 228 | ret = 0; /* we never return here */ |
@@ -231,7 +231,7 @@ out: | |||
231 | } | 231 | } |
232 | 232 | ||
233 | 233 | ||
234 | int sys_vm86(unsigned long cmd, unsigned long arg, struct pt_regs *regs) | 234 | int sys_vm86(unsigned long cmd, unsigned long arg) |
235 | { | 235 | { |
236 | struct kernel_vm86_struct info; /* declare this _on top_, | 236 | struct kernel_vm86_struct info; /* declare this _on top_, |
237 | * this avoids wasting of stack space. | 237 | * this avoids wasting of stack space. |
@@ -272,7 +272,7 @@ int sys_vm86(unsigned long cmd, unsigned long arg, struct pt_regs *regs) | |||
272 | ret = -EFAULT; | 272 | ret = -EFAULT; |
273 | if (tmp) | 273 | if (tmp) |
274 | goto out; | 274 | goto out; |
275 | info.regs32 = regs; | 275 | info.regs32 = current_pt_regs(); |
276 | info.vm86plus.is_vm86pus = 1; | 276 | info.vm86plus.is_vm86pus = 1; |
277 | tsk->thread.vm86_info = (struct vm86_struct __user *)v86; | 277 | tsk->thread.vm86_info = (struct vm86_struct __user *)v86; |
278 | do_sys_vm86(&info, tsk); | 278 | do_sys_vm86(&info, tsk); |
diff --git a/arch/x86/syscalls/syscall_32.tbl b/arch/x86/syscalls/syscall_32.tbl index 28e3fa9056ea..f2fe78ff22cc 100644 --- a/arch/x86/syscalls/syscall_32.tbl +++ b/arch/x86/syscalls/syscall_32.tbl | |||
@@ -73,12 +73,12 @@ | |||
73 | 64 i386 getppid sys_getppid | 73 | 64 i386 getppid sys_getppid |
74 | 65 i386 getpgrp sys_getpgrp | 74 | 65 i386 getpgrp sys_getpgrp |
75 | 66 i386 setsid sys_setsid | 75 | 66 i386 setsid sys_setsid |
76 | 67 i386 sigaction sys_sigaction sys32_sigaction | 76 | 67 i386 sigaction sys_sigaction compat_sys_sigaction |
77 | 68 i386 sgetmask sys_sgetmask | 77 | 68 i386 sgetmask sys_sgetmask |
78 | 69 i386 ssetmask sys_ssetmask | 78 | 69 i386 ssetmask sys_ssetmask |
79 | 70 i386 setreuid sys_setreuid16 | 79 | 70 i386 setreuid sys_setreuid16 |
80 | 71 i386 setregid sys_setregid16 | 80 | 71 i386 setregid sys_setregid16 |
81 | 72 i386 sigsuspend sys_sigsuspend sys32_sigsuspend | 81 | 72 i386 sigsuspend sys_sigsuspend sys_sigsuspend |
82 | 73 i386 sigpending sys_sigpending compat_sys_sigpending | 82 | 73 i386 sigpending sys_sigpending compat_sys_sigpending |
83 | 74 i386 sethostname sys_sethostname | 83 | 74 i386 sethostname sys_sethostname |
84 | 75 i386 setrlimit sys_setrlimit compat_sys_setrlimit | 84 | 75 i386 setrlimit sys_setrlimit compat_sys_setrlimit |
@@ -116,16 +116,16 @@ | |||
116 | 107 i386 lstat sys_newlstat compat_sys_newlstat | 116 | 107 i386 lstat sys_newlstat compat_sys_newlstat |
117 | 108 i386 fstat sys_newfstat compat_sys_newfstat | 117 | 108 i386 fstat sys_newfstat compat_sys_newfstat |
118 | 109 i386 olduname sys_uname | 118 | 109 i386 olduname sys_uname |
119 | 110 i386 iopl ptregs_iopl stub32_iopl | 119 | 110 i386 iopl sys_iopl |
120 | 111 i386 vhangup sys_vhangup | 120 | 111 i386 vhangup sys_vhangup |
121 | 112 i386 idle | 121 | 112 i386 idle |
122 | 113 i386 vm86old ptregs_vm86old sys32_vm86_warning | 122 | 113 i386 vm86old sys_vm86old sys32_vm86_warning |
123 | 114 i386 wait4 sys_wait4 compat_sys_wait4 | 123 | 114 i386 wait4 sys_wait4 compat_sys_wait4 |
124 | 115 i386 swapoff sys_swapoff | 124 | 115 i386 swapoff sys_swapoff |
125 | 116 i386 sysinfo sys_sysinfo compat_sys_sysinfo | 125 | 116 i386 sysinfo sys_sysinfo compat_sys_sysinfo |
126 | 117 i386 ipc sys_ipc sys32_ipc | 126 | 117 i386 ipc sys_ipc sys32_ipc |
127 | 118 i386 fsync sys_fsync | 127 | 118 i386 fsync sys_fsync |
128 | 119 i386 sigreturn ptregs_sigreturn stub32_sigreturn | 128 | 119 i386 sigreturn sys_sigreturn stub32_sigreturn |
129 | 120 i386 clone sys_clone stub32_clone | 129 | 120 i386 clone sys_clone stub32_clone |
130 | 121 i386 setdomainname sys_setdomainname | 130 | 121 i386 setdomainname sys_setdomainname |
131 | 122 i386 uname sys_newuname | 131 | 122 i386 uname sys_newuname |
@@ -167,24 +167,24 @@ | |||
167 | 158 i386 sched_yield sys_sched_yield | 167 | 158 i386 sched_yield sys_sched_yield |
168 | 159 i386 sched_get_priority_max sys_sched_get_priority_max | 168 | 159 i386 sched_get_priority_max sys_sched_get_priority_max |
169 | 160 i386 sched_get_priority_min sys_sched_get_priority_min | 169 | 160 i386 sched_get_priority_min sys_sched_get_priority_min |
170 | 161 i386 sched_rr_get_interval sys_sched_rr_get_interval sys32_sched_rr_get_interval | 170 | 161 i386 sched_rr_get_interval sys_sched_rr_get_interval compat_sys_sched_rr_get_interval |
171 | 162 i386 nanosleep sys_nanosleep compat_sys_nanosleep | 171 | 162 i386 nanosleep sys_nanosleep compat_sys_nanosleep |
172 | 163 i386 mremap sys_mremap | 172 | 163 i386 mremap sys_mremap |
173 | 164 i386 setresuid sys_setresuid16 | 173 | 164 i386 setresuid sys_setresuid16 |
174 | 165 i386 getresuid sys_getresuid16 | 174 | 165 i386 getresuid sys_getresuid16 |
175 | 166 i386 vm86 ptregs_vm86 sys32_vm86_warning | 175 | 166 i386 vm86 sys_vm86 sys32_vm86_warning |
176 | 167 i386 query_module | 176 | 167 i386 query_module |
177 | 168 i386 poll sys_poll | 177 | 168 i386 poll sys_poll |
178 | 169 i386 nfsservctl | 178 | 169 i386 nfsservctl |
179 | 170 i386 setresgid sys_setresgid16 | 179 | 170 i386 setresgid sys_setresgid16 |
180 | 171 i386 getresgid sys_getresgid16 | 180 | 171 i386 getresgid sys_getresgid16 |
181 | 172 i386 prctl sys_prctl | 181 | 172 i386 prctl sys_prctl |
182 | 173 i386 rt_sigreturn ptregs_rt_sigreturn stub32_rt_sigreturn | 182 | 173 i386 rt_sigreturn sys_rt_sigreturn stub32_rt_sigreturn |
183 | 174 i386 rt_sigaction sys_rt_sigaction sys32_rt_sigaction | 183 | 174 i386 rt_sigaction sys_rt_sigaction compat_sys_rt_sigaction |
184 | 175 i386 rt_sigprocmask sys_rt_sigprocmask | 184 | 175 i386 rt_sigprocmask sys_rt_sigprocmask |
185 | 176 i386 rt_sigpending sys_rt_sigpending sys32_rt_sigpending | 185 | 176 i386 rt_sigpending sys_rt_sigpending compat_sys_rt_sigpending |
186 | 177 i386 rt_sigtimedwait sys_rt_sigtimedwait compat_sys_rt_sigtimedwait | 186 | 177 i386 rt_sigtimedwait sys_rt_sigtimedwait compat_sys_rt_sigtimedwait |
187 | 178 i386 rt_sigqueueinfo sys_rt_sigqueueinfo sys32_rt_sigqueueinfo | 187 | 178 i386 rt_sigqueueinfo sys_rt_sigqueueinfo compat_sys_rt_sigqueueinfo |
188 | 179 i386 rt_sigsuspend sys_rt_sigsuspend | 188 | 179 i386 rt_sigsuspend sys_rt_sigsuspend |
189 | 180 i386 pread64 sys_pread64 sys32_pread | 189 | 180 i386 pread64 sys_pread64 sys32_pread |
190 | 181 i386 pwrite64 sys_pwrite64 sys32_pwrite | 190 | 181 i386 pwrite64 sys_pwrite64 sys32_pwrite |
diff --git a/arch/x86/syscalls/syscall_64.tbl b/arch/x86/syscalls/syscall_64.tbl index dc97328bd90a..38ae65dfd14f 100644 --- a/arch/x86/syscalls/syscall_64.tbl +++ b/arch/x86/syscalls/syscall_64.tbl | |||
@@ -325,7 +325,7 @@ | |||
325 | # x32-specific system call numbers start at 512 to avoid cache impact | 325 | # x32-specific system call numbers start at 512 to avoid cache impact |
326 | # for native 64-bit operation. | 326 | # for native 64-bit operation. |
327 | # | 327 | # |
328 | 512 x32 rt_sigaction sys32_rt_sigaction | 328 | 512 x32 rt_sigaction compat_sys_rt_sigaction |
329 | 513 x32 rt_sigreturn stub_x32_rt_sigreturn | 329 | 513 x32 rt_sigreturn stub_x32_rt_sigreturn |
330 | 514 x32 ioctl compat_sys_ioctl | 330 | 514 x32 ioctl compat_sys_ioctl |
331 | 515 x32 readv compat_sys_readv | 331 | 515 x32 readv compat_sys_readv |
@@ -335,9 +335,9 @@ | |||
335 | 519 x32 recvmsg compat_sys_recvmsg | 335 | 519 x32 recvmsg compat_sys_recvmsg |
336 | 520 x32 execve stub_x32_execve | 336 | 520 x32 execve stub_x32_execve |
337 | 521 x32 ptrace compat_sys_ptrace | 337 | 521 x32 ptrace compat_sys_ptrace |
338 | 522 x32 rt_sigpending sys32_rt_sigpending | 338 | 522 x32 rt_sigpending compat_sys_rt_sigpending |
339 | 523 x32 rt_sigtimedwait compat_sys_rt_sigtimedwait | 339 | 523 x32 rt_sigtimedwait compat_sys_rt_sigtimedwait |
340 | 524 x32 rt_sigqueueinfo sys32_rt_sigqueueinfo | 340 | 524 x32 rt_sigqueueinfo compat_sys_rt_sigqueueinfo |
341 | 525 x32 sigaltstack compat_sys_sigaltstack | 341 | 525 x32 sigaltstack compat_sys_sigaltstack |
342 | 526 x32 timer_create compat_sys_timer_create | 342 | 526 x32 timer_create compat_sys_timer_create |
343 | 527 x32 mq_notify compat_sys_mq_notify | 343 | 527 x32 mq_notify compat_sys_mq_notify |
diff --git a/arch/x86/um/Kconfig b/arch/x86/um/Kconfig index 21a13ce1d751..14ef8d1dbc33 100644 --- a/arch/x86/um/Kconfig +++ b/arch/x86/um/Kconfig | |||
@@ -13,7 +13,6 @@ endmenu | |||
13 | config UML_X86 | 13 | config UML_X86 |
14 | def_bool y | 14 | def_bool y |
15 | select GENERIC_FIND_FIRST_BIT | 15 | select GENERIC_FIND_FIRST_BIT |
16 | select GENERIC_SIGALTSTACK | ||
17 | 16 | ||
18 | config 64BIT | 17 | config 64BIT |
19 | bool "64-bit kernel" if SUBARCH = "x86" | 18 | bool "64-bit kernel" if SUBARCH = "x86" |
@@ -25,6 +24,8 @@ config X86_32 | |||
25 | select ARCH_WANT_IPC_PARSE_VERSION | 24 | select ARCH_WANT_IPC_PARSE_VERSION |
26 | select MODULES_USE_ELF_REL | 25 | select MODULES_USE_ELF_REL |
27 | select CLONE_BACKWARDS | 26 | select CLONE_BACKWARDS |
27 | select OLD_SIGSUSPEND3 | ||
28 | select OLD_SIGACTION | ||
28 | 29 | ||
29 | config X86_64 | 30 | config X86_64 |
30 | def_bool 64BIT | 31 | def_bool 64BIT |
diff --git a/arch/x86/um/Makefile b/arch/x86/um/Makefile index 5d065b2222d3..eafa324eb7a5 100644 --- a/arch/x86/um/Makefile +++ b/arch/x86/um/Makefile | |||
@@ -10,7 +10,7 @@ endif | |||
10 | 10 | ||
11 | obj-y = bug.o bugs_$(BITS).o delay.o fault.o ksyms.o ldt.o \ | 11 | obj-y = bug.o bugs_$(BITS).o delay.o fault.o ksyms.o ldt.o \ |
12 | ptrace_$(BITS).o ptrace_user.o setjmp_$(BITS).o signal.o \ | 12 | ptrace_$(BITS).o ptrace_user.o setjmp_$(BITS).o signal.o \ |
13 | stub_$(BITS).o stub_segv.o syscalls_$(BITS).o \ | 13 | stub_$(BITS).o stub_segv.o \ |
14 | sys_call_table_$(BITS).o sysrq_$(BITS).o tls_$(BITS).o \ | 14 | sys_call_table_$(BITS).o sysrq_$(BITS).o tls_$(BITS).o \ |
15 | mem_$(BITS).o subarch.o os-$(OS)/ | 15 | mem_$(BITS).o subarch.o os-$(OS)/ |
16 | 16 | ||
@@ -25,7 +25,7 @@ subarch-$(CONFIG_HIGHMEM) += ../mm/highmem_32.o | |||
25 | 25 | ||
26 | else | 26 | else |
27 | 27 | ||
28 | obj-y += vdso/ | 28 | obj-y += syscalls_64.o vdso/ |
29 | 29 | ||
30 | subarch-y = ../lib/csum-partial_64.o ../lib/memcpy_64.o ../lib/thunk_64.o \ | 30 | subarch-y = ../lib/csum-partial_64.o ../lib/memcpy_64.o ../lib/thunk_64.o \ |
31 | ../lib/rwsem.o | 31 | ../lib/rwsem.o |
diff --git a/arch/x86/um/shared/sysdep/syscalls_32.h b/arch/x86/um/shared/sysdep/syscalls_32.h index 8436079be914..68fd2cf526fd 100644 --- a/arch/x86/um/shared/sysdep/syscalls_32.h +++ b/arch/x86/um/shared/sysdep/syscalls_32.h | |||
@@ -8,11 +8,6 @@ | |||
8 | 8 | ||
9 | typedef long syscall_handler_t(struct pt_regs); | 9 | typedef long syscall_handler_t(struct pt_regs); |
10 | 10 | ||
11 | /* Not declared on x86, incompatible declarations on x86_64, so these have | ||
12 | * to go here rather than in sys_call_table.c | ||
13 | */ | ||
14 | extern syscall_handler_t sys_rt_sigaction; | ||
15 | |||
16 | extern syscall_handler_t *sys_call_table[]; | 11 | extern syscall_handler_t *sys_call_table[]; |
17 | 12 | ||
18 | #define EXECUTE_SYSCALL(syscall, regs) \ | 13 | #define EXECUTE_SYSCALL(syscall, regs) \ |
diff --git a/arch/x86/um/signal.c b/arch/x86/um/signal.c index 71cef48ea5cd..ae7319db18ee 100644 --- a/arch/x86/um/signal.c +++ b/arch/x86/um/signal.c | |||
@@ -464,7 +464,7 @@ int setup_signal_stack_si(unsigned long stack_top, int sig, | |||
464 | return 0; | 464 | return 0; |
465 | } | 465 | } |
466 | 466 | ||
467 | long sys_sigreturn(struct pt_regs *regs) | 467 | long sys_sigreturn(void) |
468 | { | 468 | { |
469 | unsigned long sp = PT_REGS_SP(¤t->thread.regs); | 469 | unsigned long sp = PT_REGS_SP(¤t->thread.regs); |
470 | struct sigframe __user *frame = (struct sigframe __user *)(sp - 8); | 470 | struct sigframe __user *frame = (struct sigframe __user *)(sp - 8); |
@@ -577,7 +577,7 @@ int setup_signal_stack_si(unsigned long stack_top, int sig, | |||
577 | } | 577 | } |
578 | #endif | 578 | #endif |
579 | 579 | ||
580 | long sys_rt_sigreturn(struct pt_regs *regs) | 580 | long sys_rt_sigreturn(void) |
581 | { | 581 | { |
582 | unsigned long sp = PT_REGS_SP(¤t->thread.regs); | 582 | unsigned long sp = PT_REGS_SP(¤t->thread.regs); |
583 | struct rt_sigframe __user *frame = | 583 | struct rt_sigframe __user *frame = |
@@ -601,14 +601,3 @@ long sys_rt_sigreturn(struct pt_regs *regs) | |||
601 | force_sig(SIGSEGV, current); | 601 | force_sig(SIGSEGV, current); |
602 | return 0; | 602 | return 0; |
603 | } | 603 | } |
604 | |||
605 | #ifdef CONFIG_X86_32 | ||
606 | long ptregs_sigreturn(void) | ||
607 | { | ||
608 | return sys_sigreturn(NULL); | ||
609 | } | ||
610 | long ptregs_rt_sigreturn(void) | ||
611 | { | ||
612 | return sys_rt_sigreturn(NULL); | ||
613 | } | ||
614 | #endif | ||
diff --git a/arch/x86/um/sys_call_table_32.c b/arch/x86/um/sys_call_table_32.c index a0c3b0d1a122..531d4269e2e3 100644 --- a/arch/x86/um/sys_call_table_32.c +++ b/arch/x86/um/sys_call_table_32.c | |||
@@ -24,10 +24,6 @@ | |||
24 | 24 | ||
25 | #define old_mmap sys_old_mmap | 25 | #define old_mmap sys_old_mmap |
26 | 26 | ||
27 | #define ptregs_iopl sys_iopl | ||
28 | #define ptregs_vm86old sys_vm86old | ||
29 | #define ptregs_vm86 sys_vm86 | ||
30 | |||
31 | #define __SYSCALL_I386(nr, sym, compat) extern asmlinkage void sym(void) ; | 27 | #define __SYSCALL_I386(nr, sym, compat) extern asmlinkage void sym(void) ; |
32 | #include <asm/syscalls_32.h> | 28 | #include <asm/syscalls_32.h> |
33 | 29 | ||
diff --git a/arch/x86/um/syscalls_32.c b/arch/x86/um/syscalls_32.c deleted file mode 100644 index e8bcea99acdb..000000000000 --- a/arch/x86/um/syscalls_32.c +++ /dev/null | |||
@@ -1,38 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) | ||
3 | * Licensed under the GPL | ||
4 | */ | ||
5 | |||
6 | #include <linux/syscalls.h> | ||
7 | #include <sysdep/syscalls.h> | ||
8 | |||
9 | long sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
10 | struct old_sigaction __user *oact) | ||
11 | { | ||
12 | struct k_sigaction new_ka, old_ka; | ||
13 | int ret; | ||
14 | |||
15 | if (act) { | ||
16 | old_sigset_t mask; | ||
17 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
18 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
19 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
20 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
21 | __get_user(mask, &act->sa_mask)) | ||
22 | return -EFAULT; | ||
23 | siginitset(&new_ka.sa.sa_mask, mask); | ||
24 | } | ||
25 | |||
26 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
27 | |||
28 | if (!ret && oact) { | ||
29 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
30 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
31 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
32 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
33 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
34 | return -EFAULT; | ||
35 | } | ||
36 | |||
37 | return ret; | ||
38 | } | ||