diff options
185 files changed, 1363 insertions, 4825 deletions
diff --git a/arch/Kconfig b/arch/Kconfig index 97fb7d0365d1..40e2b12c7916 100644 --- a/arch/Kconfig +++ b/arch/Kconfig | |||
| @@ -368,9 +368,6 @@ config MODULES_USE_ELF_REL | |||
| 368 | Modules only use ELF REL relocations. Modules with ELF RELA | 368 | Modules only use ELF REL relocations. Modules with ELF RELA |
| 369 | relocations will give an error. | 369 | relocations will give an error. |
| 370 | 370 | ||
| 371 | config GENERIC_SIGALTSTACK | ||
| 372 | bool | ||
| 373 | |||
| 374 | # | 371 | # |
| 375 | # ABI hall of shame | 372 | # ABI hall of shame |
| 376 | # | 373 | # |
| @@ -385,4 +382,30 @@ config CLONE_BACKWARDS2 | |||
| 385 | help | 382 | help |
| 386 | Architecture has the first two arguments of clone(2) swapped. | 383 | Architecture has the first two arguments of clone(2) swapped. |
| 387 | 384 | ||
| 385 | config ODD_RT_SIGACTION | ||
| 386 | bool | ||
| 387 | help | ||
| 388 | Architecture has unusual rt_sigaction(2) arguments | ||
| 389 | |||
| 390 | config OLD_SIGSUSPEND | ||
| 391 | bool | ||
| 392 | help | ||
| 393 | Architecture has old sigsuspend(2) syscall, of one-argument variety | ||
| 394 | |||
| 395 | config OLD_SIGSUSPEND3 | ||
| 396 | bool | ||
| 397 | help | ||
| 398 | Even weirder antique ABI - three-argument sigsuspend(2) | ||
| 399 | |||
| 400 | config OLD_SIGACTION | ||
| 401 | bool | ||
| 402 | help | ||
| 403 | Architecture has old sigaction(2) syscall. Nope, not the same | ||
| 404 | as OLD_SIGSUSPEND | OLD_SIGSUSPEND3 - alpha has sigsuspend(2), | ||
| 405 | but fairly different variant of sigaction(2), thanks to OSF/1 | ||
| 406 | compatibility... | ||
| 407 | |||
| 408 | config COMPAT_OLD_SIGACTION | ||
| 409 | bool | ||
| 410 | |||
| 388 | source "kernel/gcov/Kconfig" | 411 | source "kernel/gcov/Kconfig" |
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index dabc93649495..1ecbf7a1b677 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig | |||
| @@ -21,7 +21,8 @@ config ALPHA | |||
| 21 | select GENERIC_STRNLEN_USER | 21 | select GENERIC_STRNLEN_USER |
| 22 | select HAVE_MOD_ARCH_SPECIFIC | 22 | select HAVE_MOD_ARCH_SPECIFIC |
| 23 | select MODULES_USE_ELF_RELA | 23 | select MODULES_USE_ELF_RELA |
| 24 | select GENERIC_SIGALTSTACK | 24 | select ODD_RT_SIGACTION |
| 25 | select OLD_SIGSUSPEND | ||
| 25 | help | 26 | help |
| 26 | The Alpha is a 64-bit general-purpose processor designed and | 27 | The Alpha is a 64-bit general-purpose processor designed and |
| 27 | marketed by the Digital Equipment Corporation of blessed memory, | 28 | marketed by the Digital Equipment Corporation of blessed memory, |
diff --git a/arch/alpha/include/asm/signal.h b/arch/alpha/include/asm/signal.h index 8a1ac28cd562..963f0494dca7 100644 --- a/arch/alpha/include/asm/signal.h +++ b/arch/alpha/include/asm/signal.h | |||
| @@ -22,15 +22,6 @@ struct osf_sigaction { | |||
| 22 | int sa_flags; | 22 | int sa_flags; |
| 23 | }; | 23 | }; |
| 24 | 24 | ||
| 25 | struct sigaction { | 25 | #define __ARCH_HAS_KA_RESTORER |
| 26 | __sighandler_t sa_handler; | ||
| 27 | unsigned long sa_flags; | ||
| 28 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 29 | }; | ||
| 30 | |||
| 31 | struct k_sigaction { | ||
| 32 | struct sigaction sa; | ||
| 33 | __sigrestore_t ka_restorer; | ||
| 34 | }; | ||
| 35 | #include <asm/sigcontext.h> | 26 | #include <asm/sigcontext.h> |
| 36 | #endif | 27 | #endif |
diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h index b3396ee039b7..6d6fe7ab5473 100644 --- a/arch/alpha/include/asm/unistd.h +++ b/arch/alpha/include/asm/unistd.h | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT | 14 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT |
| 15 | #define __ARCH_WANT_SYS_OLDUMOUNT | 15 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 16 | #define __ARCH_WANT_SYS_SIGPENDING | 16 | #define __ARCH_WANT_SYS_SIGPENDING |
| 17 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 18 | #define __ARCH_WANT_SYS_FORK | 17 | #define __ARCH_WANT_SYS_FORK |
| 19 | #define __ARCH_WANT_SYS_VFORK | 18 | #define __ARCH_WANT_SYS_VFORK |
| 20 | #define __ARCH_WANT_SYS_CLONE | 19 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c index b5d0d0923699..63d27fb9b023 100644 --- a/arch/alpha/kernel/process.c +++ b/arch/alpha/kernel/process.c | |||
| @@ -250,7 +250,6 @@ copy_thread(unsigned long clone_flags, unsigned long usp, | |||
| 250 | struct pt_regs *childregs = task_pt_regs(p); | 250 | struct pt_regs *childregs = task_pt_regs(p); |
| 251 | struct pt_regs *regs = current_pt_regs(); | 251 | struct pt_regs *regs = current_pt_regs(); |
| 252 | struct switch_stack *childstack, *stack; | 252 | struct switch_stack *childstack, *stack; |
| 253 | unsigned long settls; | ||
| 254 | 253 | ||
| 255 | childstack = ((struct switch_stack *) childregs) - 1; | 254 | childstack = ((struct switch_stack *) childregs) - 1; |
| 256 | childti->pcb.ksp = (unsigned long) childstack; | 255 | childti->pcb.ksp = (unsigned long) childstack; |
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c index 02d02c047f17..6cec2881acbf 100644 --- a/arch/alpha/kernel/signal.c +++ b/arch/alpha/kernel/signal.c | |||
| @@ -113,16 +113,6 @@ SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act, | |||
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | /* | 115 | /* |
| 116 | * Atomically swap in the new signal mask, and wait for a signal. | ||
| 117 | */ | ||
| 118 | SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask) | ||
| 119 | { | ||
| 120 | sigset_t blocked; | ||
| 121 | siginitset(&blocked, mask); | ||
| 122 | return sigsuspend(&blocked); | ||
| 123 | } | ||
| 124 | |||
| 125 | /* | ||
| 126 | * Do a signal return; undo the signal stack. | 116 | * Do a signal return; undo the signal stack. |
| 127 | */ | 117 | */ |
| 128 | 118 | ||
| @@ -282,12 +272,9 @@ give_sigsegv: | |||
| 282 | */ | 272 | */ |
| 283 | 273 | ||
| 284 | static inline void __user * | 274 | static inline void __user * |
| 285 | get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size) | 275 | get_sigframe(struct ksignal *ksig, unsigned long sp, size_t frame_size) |
| 286 | { | 276 | { |
| 287 | if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp)) | 277 | return (void __user *)((sigsp(sp, ksig) - frame_size) & -32ul); |
| 288 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
| 289 | |||
| 290 | return (void __user *)((sp - frame_size) & -32ul); | ||
| 291 | } | 278 | } |
| 292 | 279 | ||
| 293 | static long | 280 | static long |
| @@ -348,14 +335,13 @@ setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | |||
| 348 | } | 335 | } |
| 349 | 336 | ||
| 350 | static int | 337 | static int |
| 351 | setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | 338 | setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) |
| 352 | struct pt_regs *regs) | ||
| 353 | { | 339 | { |
| 354 | unsigned long oldsp, r26, err = 0; | 340 | unsigned long oldsp, r26, err = 0; |
| 355 | struct sigframe __user *frame; | 341 | struct sigframe __user *frame; |
| 356 | 342 | ||
| 357 | oldsp = rdusp(); | 343 | oldsp = rdusp(); |
| 358 | frame = get_sigframe(ka, oldsp, sizeof(*frame)); | 344 | frame = get_sigframe(ksig, oldsp, sizeof(*frame)); |
| 359 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 345 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
| 360 | return -EFAULT; | 346 | return -EFAULT; |
| 361 | 347 | ||
| @@ -365,9 +351,8 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
| 365 | 351 | ||
| 366 | /* Set up to return from userspace. If provided, use a stub | 352 | /* Set up to return from userspace. If provided, use a stub |
| 367 | already in userspace. */ | 353 | already in userspace. */ |
| 368 | if (ka->ka_restorer) { | 354 | r26 = (unsigned long) ksig->ka.ka_restorer; |
| 369 | r26 = (unsigned long) ka->ka_restorer; | 355 | if (!r26) { |
| 370 | } else { | ||
| 371 | err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0); | 356 | err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0); |
| 372 | err |= __put_user(INSN_LDI_R0+__NR_sigreturn, frame->retcode+1); | 357 | err |= __put_user(INSN_LDI_R0+__NR_sigreturn, frame->retcode+1); |
| 373 | err |= __put_user(INSN_CALLSYS, frame->retcode+2); | 358 | err |= __put_user(INSN_CALLSYS, frame->retcode+2); |
| @@ -381,8 +366,8 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
| 381 | 366 | ||
| 382 | /* "Return" to the handler */ | 367 | /* "Return" to the handler */ |
| 383 | regs->r26 = r26; | 368 | regs->r26 = r26; |
| 384 | regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler; | 369 | regs->r27 = regs->pc = (unsigned long) ksig->ka.sa.sa_handler; |
| 385 | regs->r16 = sig; /* a0: signal number */ | 370 | regs->r16 = ksig->sig; /* a0: signal number */ |
| 386 | regs->r17 = 0; /* a1: exception code */ | 371 | regs->r17 = 0; /* a1: exception code */ |
| 387 | regs->r18 = (unsigned long) &frame->sc; /* a2: sigcontext pointer */ | 372 | regs->r18 = (unsigned long) &frame->sc; /* a2: sigcontext pointer */ |
| 388 | wrusp((unsigned long) frame); | 373 | wrusp((unsigned long) frame); |
| @@ -395,18 +380,17 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set, | |||
| 395 | } | 380 | } |
| 396 | 381 | ||
| 397 | static int | 382 | static int |
| 398 | setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 383 | setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) |
| 399 | sigset_t *set, struct pt_regs *regs) | ||
| 400 | { | 384 | { |
| 401 | unsigned long oldsp, r26, err = 0; | 385 | unsigned long oldsp, r26, err = 0; |
| 402 | struct rt_sigframe __user *frame; | 386 | struct rt_sigframe __user *frame; |
| 403 | 387 | ||
| 404 | oldsp = rdusp(); | 388 | oldsp = rdusp(); |
| 405 | frame = get_sigframe(ka, oldsp, sizeof(*frame)); | 389 | frame = get_sigframe(ksig, oldsp, sizeof(*frame)); |
| 406 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 390 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
| 407 | return -EFAULT; | 391 | return -EFAULT; |
| 408 | 392 | ||
| 409 | err |= copy_siginfo_to_user(&frame->info, info); | 393 | err |= copy_siginfo_to_user(&frame->info, &ksig->info); |
| 410 | 394 | ||
| 411 | /* Create the ucontext. */ | 395 | /* Create the ucontext. */ |
| 412 | err |= __put_user(0, &frame->uc.uc_flags); | 396 | err |= __put_user(0, &frame->uc.uc_flags); |
| @@ -421,9 +405,8 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 421 | 405 | ||
| 422 | /* Set up to return from userspace. If provided, use a stub | 406 | /* Set up to return from userspace. If provided, use a stub |
| 423 | already in userspace. */ | 407 | already in userspace. */ |
| 424 | if (ka->ka_restorer) { | 408 | r26 = (unsigned long) ksig->ka.ka_restorer; |
| 425 | r26 = (unsigned long) ka->ka_restorer; | 409 | if (!r26) { |
| 426 | } else { | ||
| 427 | err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0); | 410 | err |= __put_user(INSN_MOV_R30_R16, frame->retcode+0); |
| 428 | err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn, | 411 | err |= __put_user(INSN_LDI_R0+__NR_rt_sigreturn, |
| 429 | frame->retcode+1); | 412 | frame->retcode+1); |
| @@ -437,8 +420,8 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 437 | 420 | ||
| 438 | /* "Return" to the handler */ | 421 | /* "Return" to the handler */ |
| 439 | regs->r26 = r26; | 422 | regs->r26 = r26; |
| 440 | regs->r27 = regs->pc = (unsigned long) ka->sa.sa_handler; | 423 | regs->r27 = regs->pc = (unsigned long) ksig->ka.sa.sa_handler; |
| 441 | regs->r16 = sig; /* a0: signal number */ | 424 | regs->r16 = ksig->sig; /* a0: signal number */ |
| 442 | regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */ | 425 | regs->r17 = (unsigned long) &frame->info; /* a1: siginfo pointer */ |
| 443 | regs->r18 = (unsigned long) &frame->uc; /* a2: ucontext pointer */ | 426 | regs->r18 = (unsigned long) &frame->uc; /* a2: ucontext pointer */ |
| 444 | wrusp((unsigned long) frame); | 427 | wrusp((unsigned long) frame); |
| @@ -456,22 +439,17 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 456 | * OK, we're invoking a handler. | 439 | * OK, we're invoking a handler. |
| 457 | */ | 440 | */ |
| 458 | static inline void | 441 | static inline void |
| 459 | handle_signal(int sig, struct k_sigaction *ka, siginfo_t *info, | 442 | handle_signal(struct ksignal *ksig, struct pt_regs *regs) |
| 460 | struct pt_regs * regs) | ||
| 461 | { | 443 | { |
| 462 | sigset_t *oldset = sigmask_to_save(); | 444 | sigset_t *oldset = sigmask_to_save(); |
| 463 | int ret; | 445 | int ret; |
| 464 | 446 | ||
| 465 | if (ka->sa.sa_flags & SA_SIGINFO) | 447 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
| 466 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 448 | ret = setup_rt_frame(ksig, oldset, regs); |
| 467 | else | 449 | else |
| 468 | ret = setup_frame(sig, ka, oldset, regs); | 450 | ret = setup_frame(ksig, oldset, regs); |
| 469 | 451 | ||
| 470 | if (ret) { | 452 | signal_setup_done(ret, ksig, 0); |
| 471 | force_sigsegv(sig, current); | ||
| 472 | return; | ||
| 473 | } | ||
| 474 | signal_delivered(sig, info, ka, regs, 0); | ||
| 475 | } | 453 | } |
| 476 | 454 | ||
| 477 | static inline void | 455 | static inline void |
| @@ -514,47 +492,38 @@ syscall_restart(unsigned long r0, unsigned long r19, | |||
| 514 | static void | 492 | static void |
| 515 | do_signal(struct pt_regs *regs, unsigned long r0, unsigned long r19) | 493 | do_signal(struct pt_regs *regs, unsigned long r0, unsigned long r19) |
| 516 | { | 494 | { |
| 517 | siginfo_t info; | ||
| 518 | int signr; | ||
| 519 | unsigned long single_stepping = ptrace_cancel_bpt(current); | 495 | unsigned long single_stepping = ptrace_cancel_bpt(current); |
| 520 | struct k_sigaction ka; | 496 | struct ksignal ksig; |
| 521 | 497 | ||
| 522 | /* This lets the debugger run, ... */ | 498 | /* This lets the debugger run, ... */ |
| 523 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 499 | if (get_signal(&ksig)) { |
| 524 | 500 | /* ... so re-check the single stepping. */ | |
| 525 | /* ... so re-check the single stepping. */ | 501 | single_stepping |= ptrace_cancel_bpt(current); |
| 526 | single_stepping |= ptrace_cancel_bpt(current); | ||
| 527 | |||
| 528 | if (signr > 0) { | ||
| 529 | /* Whee! Actually deliver the signal. */ | 502 | /* Whee! Actually deliver the signal. */ |
| 530 | if (r0) | 503 | if (r0) |
| 531 | syscall_restart(r0, r19, regs, &ka); | 504 | syscall_restart(r0, r19, regs, &ksig.ka); |
| 532 | handle_signal(signr, &ka, &info, regs); | 505 | handle_signal(&ksig, regs); |
| 533 | if (single_stepping) | 506 | } else { |
| 534 | ptrace_set_bpt(current); /* re-set bpt */ | 507 | single_stepping |= ptrace_cancel_bpt(current); |
| 535 | return; | 508 | if (r0) { |
| 536 | } | 509 | switch (regs->r0) { |
| 537 | 510 | case ERESTARTNOHAND: | |
| 538 | if (r0) { | 511 | case ERESTARTSYS: |
| 539 | switch (regs->r0) { | 512 | case ERESTARTNOINTR: |
| 540 | case ERESTARTNOHAND: | 513 | /* Reset v0 and a3 and replay syscall. */ |
| 541 | case ERESTARTSYS: | 514 | regs->r0 = r0; |
| 542 | case ERESTARTNOINTR: | 515 | regs->r19 = r19; |
| 543 | /* Reset v0 and a3 and replay syscall. */ | 516 | regs->pc -= 4; |
| 544 | regs->r0 = r0; | 517 | break; |
| 545 | regs->r19 = r19; | 518 | case ERESTART_RESTARTBLOCK: |
| 546 | regs->pc -= 4; | 519 | /* Set v0 to the restart_syscall and replay */ |
| 547 | break; | 520 | regs->r0 = __NR_restart_syscall; |
| 548 | case ERESTART_RESTARTBLOCK: | 521 | regs->pc -= 4; |
| 549 | /* Force v0 to the restart syscall and reply. */ | 522 | break; |
| 550 | regs->r0 = __NR_restart_syscall; | 523 | } |
| 551 | regs->pc -= 4; | ||
| 552 | break; | ||
| 553 | } | 524 | } |
| 525 | restore_saved_sigmask(); | ||
| 554 | } | 526 | } |
| 555 | |||
| 556 | /* If there's no signal to deliver, we just restore the saved mask. */ | ||
| 557 | restore_saved_sigmask(); | ||
| 558 | if (single_stepping) | 527 | if (single_stepping) |
| 559 | ptrace_set_bpt(current); /* re-set breakpoint */ | 528 | ptrace_set_bpt(current); /* re-set breakpoint */ |
| 560 | } | 529 | } |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 38ec1f8df5a8..a955d89ed836 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -56,6 +56,8 @@ config ARM | |||
| 56 | select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND | 56 | select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND |
| 57 | select MODULES_USE_ELF_REL | 57 | select MODULES_USE_ELF_REL |
| 58 | select CLONE_BACKWARDS | 58 | select CLONE_BACKWARDS |
| 59 | select OLD_SIGSUSPEND3 | ||
| 60 | select OLD_SIGACTION | ||
| 59 | help | 61 | help |
| 60 | The ARM series is a line of low-power-consumption RISC chip designs | 62 | The ARM series is a line of low-power-consumption RISC chip designs |
| 61 | licensed by ARM Ltd and targeted at embedded applications and | 63 | licensed by ARM Ltd and targeted at embedded applications and |
diff --git a/arch/arm/include/asm/signal.h b/arch/arm/include/asm/signal.h index 9a0ea6ab988f..c0eb412aff04 100644 --- a/arch/arm/include/asm/signal.h +++ b/arch/arm/include/asm/signal.h | |||
| @@ -16,23 +16,7 @@ typedef struct { | |||
| 16 | unsigned long sig[_NSIG_WORDS]; | 16 | unsigned long sig[_NSIG_WORDS]; |
| 17 | } sigset_t; | 17 | } sigset_t; |
| 18 | 18 | ||
| 19 | struct old_sigaction { | 19 | #define __ARCH_HAS_SA_RESTORER |
| 20 | __sighandler_t sa_handler; | ||
| 21 | old_sigset_t sa_mask; | ||
| 22 | unsigned long sa_flags; | ||
| 23 | __sigrestore_t sa_restorer; | ||
| 24 | }; | ||
| 25 | |||
| 26 | struct sigaction { | ||
| 27 | __sighandler_t sa_handler; | ||
| 28 | unsigned long sa_flags; | ||
| 29 | __sigrestore_t sa_restorer; | ||
| 30 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 31 | }; | ||
| 32 | |||
| 33 | struct k_sigaction { | ||
| 34 | struct sigaction sa; | ||
| 35 | }; | ||
| 36 | 20 | ||
| 37 | #include <asm/sigcontext.h> | 21 | #include <asm/sigcontext.h> |
| 38 | #endif | 22 | #endif |
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index 21a2700d2957..e4ddfb39ca34 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
| @@ -26,8 +26,6 @@ | |||
| 26 | #define __ARCH_WANT_SYS_NICE | 26 | #define __ARCH_WANT_SYS_NICE |
| 27 | #define __ARCH_WANT_SYS_SIGPENDING | 27 | #define __ARCH_WANT_SYS_SIGPENDING |
| 28 | #define __ARCH_WANT_SYS_SIGPROCMASK | 28 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 29 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 30 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 31 | #define __ARCH_WANT_SYS_OLD_MMAP | 29 | #define __ARCH_WANT_SYS_OLD_MMAP |
| 32 | #define __ARCH_WANT_SYS_OLD_SELECT | 30 | #define __ARCH_WANT_SYS_OLD_SELECT |
| 33 | 31 | ||
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index a4fda4e7a372..0cc57611fc4f 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
| @@ -195,7 +195,7 @@ | |||
| 195 | CALL(sys_getcwd) | 195 | CALL(sys_getcwd) |
| 196 | CALL(sys_capget) | 196 | CALL(sys_capget) |
| 197 | /* 185 */ CALL(sys_capset) | 197 | /* 185 */ CALL(sys_capset) |
| 198 | CALL(sys_sigaltstack_wrapper) | 198 | CALL(sys_sigaltstack) |
| 199 | CALL(sys_sendfile) | 199 | CALL(sys_sendfile) |
| 200 | CALL(sys_ni_syscall) /* getpmsg */ | 200 | CALL(sys_ni_syscall) /* getpmsg */ |
| 201 | CALL(sys_ni_syscall) /* putpmsg */ | 201 | CALL(sys_ni_syscall) /* putpmsg */ |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index a6c301e90a3b..3248cde504ed 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -514,11 +514,6 @@ sys_rt_sigreturn_wrapper: | |||
| 514 | b sys_rt_sigreturn | 514 | b sys_rt_sigreturn |
| 515 | ENDPROC(sys_rt_sigreturn_wrapper) | 515 | ENDPROC(sys_rt_sigreturn_wrapper) |
| 516 | 516 | ||
| 517 | sys_sigaltstack_wrapper: | ||
| 518 | ldr r2, [sp, #S_OFF + S_SP] | ||
| 519 | b do_sigaltstack | ||
| 520 | ENDPROC(sys_sigaltstack_wrapper) | ||
| 521 | |||
| 522 | sys_statfs64_wrapper: | 517 | sys_statfs64_wrapper: |
| 523 | teq r1, #88 | 518 | teq r1, #88 |
| 524 | moveq r1, #84 | 519 | moveq r1, #84 |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 56f72d257ebd..296786bdbb73 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
| @@ -45,48 +45,6 @@ const unsigned long sigreturn_codes[7] = { | |||
| 45 | MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN, | 45 | MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN, |
| 46 | }; | 46 | }; |
| 47 | 47 | ||
| 48 | /* | ||
| 49 | * atomically swap in the new signal mask, and wait for a signal. | ||
| 50 | */ | ||
| 51 | asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask) | ||
| 52 | { | ||
| 53 | sigset_t blocked; | ||
| 54 | siginitset(&blocked, mask); | ||
| 55 | return sigsuspend(&blocked); | ||
| 56 | } | ||
| 57 | |||
| 58 | asmlinkage int | ||
| 59 | sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
| 60 | struct old_sigaction __user *oact) | ||
| 61 | { | ||
| 62 | struct k_sigaction new_ka, old_ka; | ||
| 63 | int ret; | ||
| 64 | |||
| 65 | if (act) { | ||
| 66 | old_sigset_t mask; | ||
| 67 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 68 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 69 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 70 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 71 | __get_user(mask, &act->sa_mask)) | ||
| 72 | return -EFAULT; | ||
| 73 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 74 | } | ||
| 75 | |||
| 76 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 77 | |||
| 78 | if (!ret && oact) { | ||
| 79 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 80 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 81 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 82 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 83 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 84 | return -EFAULT; | ||
| 85 | } | ||
| 86 | |||
| 87 | return ret; | ||
| 88 | } | ||
| 89 | |||
| 90 | #ifdef CONFIG_CRUNCH | 48 | #ifdef CONFIG_CRUNCH |
| 91 | static int preserve_crunch_context(struct crunch_sigframe __user *frame) | 49 | static int preserve_crunch_context(struct crunch_sigframe __user *frame) |
| 92 | { | 50 | { |
| @@ -300,7 +258,7 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) | |||
| 300 | if (restore_sigframe(regs, &frame->sig)) | 258 | if (restore_sigframe(regs, &frame->sig)) |
| 301 | goto badframe; | 259 | goto badframe; |
| 302 | 260 | ||
| 303 | if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT) | 261 | if (restore_altstack(&frame->sig.uc.uc_stack)) |
| 304 | goto badframe; | 262 | goto badframe; |
| 305 | 263 | ||
| 306 | return regs->ARM_r0; | 264 | return regs->ARM_r0; |
| @@ -360,18 +318,12 @@ setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set) | |||
| 360 | } | 318 | } |
| 361 | 319 | ||
| 362 | static inline void __user * | 320 | static inline void __user * |
| 363 | get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize) | 321 | get_sigframe(struct ksignal *ksig, struct pt_regs *regs, int framesize) |
| 364 | { | 322 | { |
| 365 | unsigned long sp = regs->ARM_sp; | 323 | unsigned long sp = sigsp(regs->ARM_sp, ksig); |
| 366 | void __user *frame; | 324 | void __user *frame; |
| 367 | 325 | ||
| 368 | /* | 326 | /* |
| 369 | * This is the X/Open sanctioned signal stack switching. | ||
| 370 | */ | ||
| 371 | if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp)) | ||
| 372 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
| 373 | |||
| 374 | /* | ||
| 375 | * ATPCS B01 mandates 8-byte alignment | 327 | * ATPCS B01 mandates 8-byte alignment |
| 376 | */ | 328 | */ |
| 377 | frame = (void __user *)((sp - framesize) & ~7); | 329 | frame = (void __user *)((sp - framesize) & ~7); |
| @@ -385,11 +337,22 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize) | |||
| 385 | return frame; | 337 | return frame; |
| 386 | } | 338 | } |
| 387 | 339 | ||
| 340 | /* | ||
| 341 | * translate the signal | ||
| 342 | */ | ||
| 343 | static inline int map_sig(int sig) | ||
| 344 | { | ||
| 345 | struct thread_info *thread = current_thread_info(); | ||
| 346 | if (sig < 32 && thread->exec_domain && thread->exec_domain->signal_invmap) | ||
| 347 | sig = thread->exec_domain->signal_invmap[sig]; | ||
| 348 | return sig; | ||
| 349 | } | ||
| 350 | |||
| 388 | static int | 351 | static int |
| 389 | setup_return(struct pt_regs *regs, struct k_sigaction *ka, | 352 | setup_return(struct pt_regs *regs, struct ksignal *ksig, |
| 390 | unsigned long __user *rc, void __user *frame, int usig) | 353 | unsigned long __user *rc, void __user *frame) |
| 391 | { | 354 | { |
| 392 | unsigned long handler = (unsigned long)ka->sa.sa_handler; | 355 | unsigned long handler = (unsigned long)ksig->ka.sa.sa_handler; |
| 393 | unsigned long retcode; | 356 | unsigned long retcode; |
| 394 | int thumb = 0; | 357 | int thumb = 0; |
| 395 | unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT); | 358 | unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT); |
| @@ -399,7 +362,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka, | |||
| 399 | /* | 362 | /* |
| 400 | * Maybe we need to deliver a 32-bit signal to a 26-bit task. | 363 | * Maybe we need to deliver a 32-bit signal to a 26-bit task. |
| 401 | */ | 364 | */ |
| 402 | if (ka->sa.sa_flags & SA_THIRTYTWO) | 365 | if (ksig->ka.sa.sa_flags & SA_THIRTYTWO) |
| 403 | cpsr = (cpsr & ~MODE_MASK) | USR_MODE; | 366 | cpsr = (cpsr & ~MODE_MASK) | USR_MODE; |
| 404 | 367 | ||
| 405 | #ifdef CONFIG_ARM_THUMB | 368 | #ifdef CONFIG_ARM_THUMB |
| @@ -421,12 +384,12 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka, | |||
| 421 | } | 384 | } |
| 422 | #endif | 385 | #endif |
| 423 | 386 | ||
| 424 | if (ka->sa.sa_flags & SA_RESTORER) { | 387 | if (ksig->ka.sa.sa_flags & SA_RESTORER) { |
| 425 | retcode = (unsigned long)ka->sa.sa_restorer; | 388 | retcode = (unsigned long)ksig->ka.sa.sa_restorer; |
| 426 | } else { | 389 | } else { |
| 427 | unsigned int idx = thumb << 1; | 390 | unsigned int idx = thumb << 1; |
| 428 | 391 | ||
| 429 | if (ka->sa.sa_flags & SA_SIGINFO) | 392 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
| 430 | idx += 3; | 393 | idx += 3; |
| 431 | 394 | ||
| 432 | if (__put_user(sigreturn_codes[idx], rc) || | 395 | if (__put_user(sigreturn_codes[idx], rc) || |
| @@ -451,7 +414,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka, | |||
| 451 | } | 414 | } |
| 452 | } | 415 | } |
| 453 | 416 | ||
| 454 | regs->ARM_r0 = usig; | 417 | regs->ARM_r0 = map_sig(ksig->sig); |
| 455 | regs->ARM_sp = (unsigned long)frame; | 418 | regs->ARM_sp = (unsigned long)frame; |
| 456 | regs->ARM_lr = retcode; | 419 | regs->ARM_lr = retcode; |
| 457 | regs->ARM_pc = handler; | 420 | regs->ARM_pc = handler; |
| @@ -461,9 +424,9 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka, | |||
| 461 | } | 424 | } |
| 462 | 425 | ||
| 463 | static int | 426 | static int |
| 464 | setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs) | 427 | setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) |
| 465 | { | 428 | { |
| 466 | struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); | 429 | struct sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame)); |
| 467 | int err = 0; | 430 | int err = 0; |
| 468 | 431 | ||
| 469 | if (!frame) | 432 | if (!frame) |
| @@ -476,36 +439,29 @@ setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *reg | |||
| 476 | 439 | ||
| 477 | err |= setup_sigframe(frame, regs, set); | 440 | err |= setup_sigframe(frame, regs, set); |
| 478 | if (err == 0) | 441 | if (err == 0) |
| 479 | err = setup_return(regs, ka, frame->retcode, frame, usig); | 442 | err = setup_return(regs, ksig, frame->retcode, frame); |
| 480 | 443 | ||
| 481 | return err; | 444 | return err; |
| 482 | } | 445 | } |
| 483 | 446 | ||
| 484 | static int | 447 | static int |
| 485 | setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, | 448 | setup_rt_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs) |
| 486 | sigset_t *set, struct pt_regs *regs) | ||
| 487 | { | 449 | { |
| 488 | struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame)); | 450 | struct rt_sigframe __user *frame = get_sigframe(ksig, regs, sizeof(*frame)); |
| 489 | stack_t stack; | ||
| 490 | int err = 0; | 451 | int err = 0; |
| 491 | 452 | ||
| 492 | if (!frame) | 453 | if (!frame) |
| 493 | return 1; | 454 | return 1; |
| 494 | 455 | ||
| 495 | err |= copy_siginfo_to_user(&frame->info, info); | 456 | err |= copy_siginfo_to_user(&frame->info, &ksig->info); |
| 496 | 457 | ||
| 497 | __put_user_error(0, &frame->sig.uc.uc_flags, err); | 458 | __put_user_error(0, &frame->sig.uc.uc_flags, err); |
| 498 | __put_user_error(NULL, &frame->sig.uc.uc_link, err); | 459 | __put_user_error(NULL, &frame->sig.uc.uc_link, err); |
| 499 | 460 | ||
| 500 | memset(&stack, 0, sizeof(stack)); | 461 | err |= __save_altstack(&frame->sig.uc.uc_stack, regs->ARM_sp); |
| 501 | stack.ss_sp = (void __user *)current->sas_ss_sp; | ||
| 502 | stack.ss_flags = sas_ss_flags(regs->ARM_sp); | ||
| 503 | stack.ss_size = current->sas_ss_size; | ||
| 504 | err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); | ||
| 505 | |||
| 506 | err |= setup_sigframe(&frame->sig, regs, set); | 462 | err |= setup_sigframe(&frame->sig, regs, set); |
| 507 | if (err == 0) | 463 | if (err == 0) |
| 508 | err = setup_return(regs, ka, frame->sig.retcode, frame, usig); | 464 | err = setup_return(regs, ksig, frame->sig.retcode, frame); |
| 509 | 465 | ||
| 510 | if (err == 0) { | 466 | if (err == 0) { |
| 511 | /* | 467 | /* |
| @@ -523,40 +479,25 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, | |||
| 523 | /* | 479 | /* |
| 524 | * OK, we're invoking a handler | 480 | * OK, we're invoking a handler |
| 525 | */ | 481 | */ |
| 526 | static void | 482 | static void handle_signal(struct ksignal *ksig, struct pt_regs *regs) |
| 527 | handle_signal(unsigned long sig, struct k_sigaction *ka, | ||
| 528 | siginfo_t *info, struct pt_regs *regs) | ||
| 529 | { | 483 | { |
| 530 | struct thread_info *thread = current_thread_info(); | ||
| 531 | struct task_struct *tsk = current; | ||
| 532 | sigset_t *oldset = sigmask_to_save(); | 484 | sigset_t *oldset = sigmask_to_save(); |
| 533 | int usig = sig; | ||
| 534 | int ret; | 485 | int ret; |
| 535 | 486 | ||
| 536 | /* | 487 | /* |
| 537 | * translate the signal | ||
| 538 | */ | ||
| 539 | if (usig < 32 && thread->exec_domain && thread->exec_domain->signal_invmap) | ||
| 540 | usig = thread->exec_domain->signal_invmap[usig]; | ||
| 541 | |||
| 542 | /* | ||
| 543 | * Set up the stack frame | 488 | * Set up the stack frame |
| 544 | */ | 489 | */ |
| 545 | if (ka->sa.sa_flags & SA_SIGINFO) | 490 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
| 546 | ret = setup_rt_frame(usig, ka, info, oldset, regs); | 491 | ret = setup_rt_frame(ksig, oldset, regs); |
| 547 | else | 492 | else |
| 548 | ret = setup_frame(usig, ka, oldset, regs); | 493 | ret = setup_frame(ksig, oldset, regs); |
| 549 | 494 | ||
| 550 | /* | 495 | /* |
| 551 | * Check that the resulting registers are actually sane. | 496 | * Check that the resulting registers are actually sane. |
| 552 | */ | 497 | */ |
| 553 | ret |= !valid_user_regs(regs); | 498 | ret |= !valid_user_regs(regs); |
| 554 | 499 | ||
| 555 | if (ret != 0) { | 500 | signal_setup_done(ret, ksig, 0); |
| 556 | force_sigsegv(sig, tsk); | ||
| 557 | return; | ||
| 558 | } | ||
| 559 | signal_delivered(sig, info, ka, regs, 0); | ||
| 560 | } | 501 | } |
| 561 | 502 | ||
| 562 | /* | 503 | /* |
| @@ -571,9 +512,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, | |||
| 571 | static int do_signal(struct pt_regs *regs, int syscall) | 512 | static int do_signal(struct pt_regs *regs, int syscall) |
| 572 | { | 513 | { |
| 573 | unsigned int retval = 0, continue_addr = 0, restart_addr = 0; | 514 | unsigned int retval = 0, continue_addr = 0, restart_addr = 0; |
| 574 | struct k_sigaction ka; | 515 | struct ksignal ksig; |
| 575 | siginfo_t info; | ||
| 576 | int signr; | ||
| 577 | int restart = 0; | 516 | int restart = 0; |
| 578 | 517 | ||
| 579 | /* | 518 | /* |
| @@ -605,33 +544,32 @@ static int do_signal(struct pt_regs *regs, int syscall) | |||
| 605 | * Get the signal to deliver. When running under ptrace, at this | 544 | * Get the signal to deliver. When running under ptrace, at this |
| 606 | * point the debugger may change all our registers ... | 545 | * point the debugger may change all our registers ... |
| 607 | */ | 546 | */ |
| 608 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | ||
| 609 | /* | 547 | /* |
| 610 | * Depending on the signal settings we may need to revert the | 548 | * Depending on the signal settings we may need to revert the |
| 611 | * decision to restart the system call. But skip this if a | 549 | * decision to restart the system call. But skip this if a |
| 612 | * debugger has chosen to restart at a different PC. | 550 | * debugger has chosen to restart at a different PC. |
| 613 | */ | 551 | */ |
| 614 | if (regs->ARM_pc != restart_addr) | 552 | if (get_signal(&ksig)) { |
| 615 | restart = 0; | 553 | /* handler */ |
| 616 | if (signr > 0) { | 554 | if (unlikely(restart) && regs->ARM_pc == restart_addr) { |
| 617 | if (unlikely(restart)) { | ||
| 618 | if (retval == -ERESTARTNOHAND || | 555 | if (retval == -ERESTARTNOHAND || |
| 619 | retval == -ERESTART_RESTARTBLOCK | 556 | retval == -ERESTART_RESTARTBLOCK |
| 620 | || (retval == -ERESTARTSYS | 557 | || (retval == -ERESTARTSYS |
| 621 | && !(ka.sa.sa_flags & SA_RESTART))) { | 558 | && !(ksig.ka.sa.sa_flags & SA_RESTART))) { |
| 622 | regs->ARM_r0 = -EINTR; | 559 | regs->ARM_r0 = -EINTR; |
| 623 | regs->ARM_pc = continue_addr; | 560 | regs->ARM_pc = continue_addr; |
| 624 | } | 561 | } |
| 625 | } | 562 | } |
| 626 | 563 | handle_signal(&ksig, regs); | |
| 627 | handle_signal(signr, &ka, &info, regs); | 564 | } else { |
| 628 | return 0; | 565 | /* no handler */ |
| 566 | restore_saved_sigmask(); | ||
| 567 | if (unlikely(restart) && regs->ARM_pc == restart_addr) { | ||
| 568 | regs->ARM_pc = continue_addr; | ||
| 569 | return restart; | ||
| 570 | } | ||
| 629 | } | 571 | } |
| 630 | 572 | return 0; | |
| 631 | restore_saved_sigmask(); | ||
| 632 | if (unlikely(restart)) | ||
| 633 | regs->ARM_pc = continue_addr; | ||
| 634 | return restart; | ||
| 635 | } | 573 | } |
| 636 | 574 | ||
| 637 | asmlinkage int | 575 | asmlinkage int |
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index ab4aa54b36ef..f532ce5f3c5b 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig | |||
| @@ -205,6 +205,8 @@ config COMPAT | |||
| 205 | depends on !ARM64_64K_PAGES | 205 | depends on !ARM64_64K_PAGES |
| 206 | select COMPAT_BINFMT_ELF | 206 | select COMPAT_BINFMT_ELF |
| 207 | select HAVE_UID16 | 207 | select HAVE_UID16 |
| 208 | select OLD_SIGSUSPEND3 | ||
| 209 | select COMPAT_OLD_SIGACTION | ||
| 208 | help | 210 | help |
| 209 | This option enables support for a 32-bit EL0 running under a 64-bit | 211 | This option enables support for a 32-bit EL0 running under a 64-bit |
| 210 | kernel at EL1. AArch32-specific components such as system calls, | 212 | kernel at EL1. AArch32-specific components such as system calls, |
diff --git a/arch/arm64/include/asm/syscalls.h b/arch/arm64/include/asm/syscalls.h index 20d63b290665..48fe7c600e98 100644 --- a/arch/arm64/include/asm/syscalls.h +++ b/arch/arm64/include/asm/syscalls.h | |||
| @@ -24,8 +24,6 @@ | |||
| 24 | * System call wrappers implemented in kernel/entry.S. | 24 | * System call wrappers implemented in kernel/entry.S. |
| 25 | */ | 25 | */ |
| 26 | asmlinkage long sys_rt_sigreturn_wrapper(void); | 26 | asmlinkage long sys_rt_sigreturn_wrapper(void); |
| 27 | asmlinkage long sys_sigaltstack_wrapper(const stack_t __user *uss, | ||
| 28 | stack_t __user *uoss); | ||
| 29 | 27 | ||
| 30 | #include <asm-generic/syscalls.h> | 28 | #include <asm-generic/syscalls.h> |
| 31 | 29 | ||
diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index 744087fb521c..82ce217e94cf 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h | |||
| @@ -20,10 +20,8 @@ | |||
| 20 | #define __ARCH_WANT_SYS_GETPGRP | 20 | #define __ARCH_WANT_SYS_GETPGRP |
| 21 | #define __ARCH_WANT_SYS_LLSEEK | 21 | #define __ARCH_WANT_SYS_LLSEEK |
| 22 | #define __ARCH_WANT_SYS_NICE | 22 | #define __ARCH_WANT_SYS_NICE |
| 23 | #define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL | ||
| 24 | #define __ARCH_WANT_SYS_SIGPENDING | 23 | #define __ARCH_WANT_SYS_SIGPENDING |
| 25 | #define __ARCH_WANT_SYS_SIGPROCMASK | 24 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 26 | #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | ||
| 27 | #define __ARCH_WANT_COMPAT_SYS_SENDFILE | 25 | #define __ARCH_WANT_COMPAT_SYS_SENDFILE |
| 28 | #define __ARCH_WANT_SYS_FORK | 26 | #define __ARCH_WANT_SYS_FORK |
| 29 | #define __ARCH_WANT_SYS_VFORK | 27 | #define __ARCH_WANT_SYS_VFORK |
diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 5ef47ba3ed45..e60e386178d1 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h | |||
| @@ -93,7 +93,7 @@ __SYSCALL(68, sys_ni_syscall) /* 68 was sys_sgetmask */ | |||
| 93 | __SYSCALL(69, sys_ni_syscall) /* 69 was sys_ssetmask */ | 93 | __SYSCALL(69, sys_ni_syscall) /* 69 was sys_ssetmask */ |
| 94 | __SYSCALL(70, sys_setreuid16) | 94 | __SYSCALL(70, sys_setreuid16) |
| 95 | __SYSCALL(71, sys_setregid16) | 95 | __SYSCALL(71, sys_setregid16) |
| 96 | __SYSCALL(72, compat_sys_sigsuspend) | 96 | __SYSCALL(72, sys_sigsuspend) |
| 97 | __SYSCALL(73, compat_sys_sigpending) | 97 | __SYSCALL(73, compat_sys_sigpending) |
| 98 | __SYSCALL(74, sys_sethostname) | 98 | __SYSCALL(74, sys_sethostname) |
| 99 | __SYSCALL(75, compat_sys_setrlimit) | 99 | __SYSCALL(75, compat_sys_setrlimit) |
| @@ -207,7 +207,7 @@ __SYSCALL(182, sys_chown16) | |||
| 207 | __SYSCALL(183, sys_getcwd) | 207 | __SYSCALL(183, sys_getcwd) |
| 208 | __SYSCALL(184, sys_capget) | 208 | __SYSCALL(184, sys_capget) |
| 209 | __SYSCALL(185, sys_capset) | 209 | __SYSCALL(185, sys_capset) |
| 210 | __SYSCALL(186, compat_sys_sigaltstack_wrapper) | 210 | __SYSCALL(186, compat_sys_sigaltstack) |
| 211 | __SYSCALL(187, compat_sys_sendfile) | 211 | __SYSCALL(187, compat_sys_sendfile) |
| 212 | __SYSCALL(188, sys_ni_syscall) /* 188 reserved */ | 212 | __SYSCALL(188, sys_ni_syscall) /* 188 reserved */ |
| 213 | __SYSCALL(189, sys_ni_syscall) /* 189 reserved */ | 213 | __SYSCALL(189, sys_ni_syscall) /* 189 reserved */ |
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S index 9c94f404ded6..514d6098dbee 100644 --- a/arch/arm64/kernel/entry.S +++ b/arch/arm64/kernel/entry.S | |||
| @@ -677,10 +677,5 @@ ENTRY(sys_rt_sigreturn_wrapper) | |||
| 677 | b sys_rt_sigreturn | 677 | b sys_rt_sigreturn |
| 678 | ENDPROC(sys_rt_sigreturn_wrapper) | 678 | ENDPROC(sys_rt_sigreturn_wrapper) |
| 679 | 679 | ||
| 680 | ENTRY(sys_sigaltstack_wrapper) | ||
| 681 | ldr x2, [sp, #S_SP] | ||
| 682 | b sys_sigaltstack | ||
| 683 | ENDPROC(sys_sigaltstack_wrapper) | ||
| 684 | |||
| 685 | ENTRY(handle_arch_irq) | 680 | ENTRY(handle_arch_irq) |
| 686 | .quad 0 | 681 | .quad 0 |
diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index abd756315cb5..890a591f75dd 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c | |||
| @@ -149,8 +149,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) | |||
| 149 | if (restore_sigframe(regs, frame)) | 149 | if (restore_sigframe(regs, frame)) |
| 150 | goto badframe; | 150 | goto badframe; |
| 151 | 151 | ||
| 152 | if (do_sigaltstack(&frame->uc.uc_stack, | 152 | if (restore_altstack(&frame->uc.uc_stack)) |
| 153 | NULL, regs->sp) == -EFAULT) | ||
| 154 | goto badframe; | 153 | goto badframe; |
| 155 | 154 | ||
| 156 | return regs->regs[0]; | 155 | return regs->regs[0]; |
| @@ -164,12 +163,6 @@ badframe: | |||
| 164 | return 0; | 163 | return 0; |
| 165 | } | 164 | } |
| 166 | 165 | ||
| 167 | asmlinkage long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
| 168 | unsigned long sp) | ||
| 169 | { | ||
| 170 | return do_sigaltstack(uss, uoss, sp); | ||
| 171 | } | ||
| 172 | |||
| 173 | static int setup_sigframe(struct rt_sigframe __user *sf, | 166 | static int setup_sigframe(struct rt_sigframe __user *sf, |
| 174 | struct pt_regs *regs, sigset_t *set) | 167 | struct pt_regs *regs, sigset_t *set) |
| 175 | { | 168 | { |
| @@ -250,7 +243,6 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, | |||
| 250 | sigset_t *set, struct pt_regs *regs) | 243 | sigset_t *set, struct pt_regs *regs) |
| 251 | { | 244 | { |
| 252 | struct rt_sigframe __user *frame; | 245 | struct rt_sigframe __user *frame; |
| 253 | stack_t stack; | ||
| 254 | int err = 0; | 246 | int err = 0; |
| 255 | 247 | ||
| 256 | frame = get_sigframe(ka, regs); | 248 | frame = get_sigframe(ka, regs); |
| @@ -260,12 +252,7 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, | |||
| 260 | __put_user_error(0, &frame->uc.uc_flags, err); | 252 | __put_user_error(0, &frame->uc.uc_flags, err); |
| 261 | __put_user_error(NULL, &frame->uc.uc_link, err); | 253 | __put_user_error(NULL, &frame->uc.uc_link, err); |
| 262 | 254 | ||
| 263 | memset(&stack, 0, sizeof(stack)); | 255 | err |= __save_altstack(&frame->uc.uc_stack, regs->sp); |
| 264 | stack.ss_sp = (void __user *)current->sas_ss_sp; | ||
| 265 | stack.ss_flags = sas_ss_flags(regs->sp); | ||
| 266 | stack.ss_size = current->sas_ss_size; | ||
| 267 | err |= __copy_to_user(&frame->uc.uc_stack, &stack, sizeof(stack)); | ||
| 268 | |||
| 269 | err |= setup_sigframe(frame, regs, set); | 256 | err |= setup_sigframe(frame, regs, set); |
| 270 | if (err == 0) { | 257 | if (err == 0) { |
| 271 | setup_return(regs, ka, frame, usig); | 258 | setup_return(regs, ka, frame, usig); |
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index 41db148a7eb9..7f4f3673f2bc 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c | |||
| @@ -28,26 +28,6 @@ | |||
| 28 | #include <asm/uaccess.h> | 28 | #include <asm/uaccess.h> |
| 29 | #include <asm/unistd32.h> | 29 | #include <asm/unistd32.h> |
| 30 | 30 | ||
| 31 | struct compat_sigaction { | ||
| 32 | compat_uptr_t sa_handler; | ||
| 33 | compat_ulong_t sa_flags; | ||
| 34 | compat_uptr_t sa_restorer; | ||
| 35 | compat_sigset_t sa_mask; | ||
| 36 | }; | ||
| 37 | |||
| 38 | struct compat_old_sigaction { | ||
| 39 | compat_uptr_t sa_handler; | ||
| 40 | compat_old_sigset_t sa_mask; | ||
| 41 | compat_ulong_t sa_flags; | ||
| 42 | compat_uptr_t sa_restorer; | ||
| 43 | }; | ||
| 44 | |||
| 45 | typedef struct compat_sigaltstack { | ||
| 46 | compat_uptr_t ss_sp; | ||
| 47 | int ss_flags; | ||
| 48 | compat_size_t ss_size; | ||
| 49 | } compat_stack_t; | ||
| 50 | |||
| 51 | struct compat_sigcontext { | 31 | struct compat_sigcontext { |
| 52 | /* We always set these two fields to 0 */ | 32 | /* We always set these two fields to 0 */ |
| 53 | compat_ulong_t trap_no; | 33 | compat_ulong_t trap_no; |
| @@ -339,127 +319,6 @@ static int compat_restore_vfp_context(struct compat_vfp_sigframe __user *frame) | |||
| 339 | return err ? -EFAULT : 0; | 319 | return err ? -EFAULT : 0; |
| 340 | } | 320 | } |
| 341 | 321 | ||
| 342 | /* | ||
| 343 | * atomically swap in the new signal mask, and wait for a signal. | ||
| 344 | */ | ||
| 345 | asmlinkage int compat_sys_sigsuspend(int restart, compat_ulong_t oldmask, | ||
| 346 | compat_old_sigset_t mask) | ||
| 347 | { | ||
| 348 | sigset_t blocked; | ||
| 349 | |||
| 350 | siginitset(¤t->blocked, mask); | ||
| 351 | return sigsuspend(&blocked); | ||
| 352 | } | ||
| 353 | |||
| 354 | asmlinkage int compat_sys_sigaction(int sig, | ||
| 355 | const struct compat_old_sigaction __user *act, | ||
| 356 | struct compat_old_sigaction __user *oact) | ||
| 357 | { | ||
| 358 | struct k_sigaction new_ka, old_ka; | ||
| 359 | int ret; | ||
| 360 | compat_old_sigset_t mask; | ||
| 361 | compat_uptr_t handler, restorer; | ||
| 362 | |||
| 363 | if (act) { | ||
| 364 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 365 | __get_user(handler, &act->sa_handler) || | ||
| 366 | __get_user(restorer, &act->sa_restorer) || | ||
| 367 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 368 | __get_user(mask, &act->sa_mask)) | ||
| 369 | return -EFAULT; | ||
| 370 | |||
| 371 | new_ka.sa.sa_handler = compat_ptr(handler); | ||
| 372 | new_ka.sa.sa_restorer = compat_ptr(restorer); | ||
| 373 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 374 | } | ||
| 375 | |||
| 376 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 377 | |||
| 378 | if (!ret && oact) { | ||
| 379 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 380 | __put_user(ptr_to_compat(old_ka.sa.sa_handler), | ||
| 381 | &oact->sa_handler) || | ||
| 382 | __put_user(ptr_to_compat(old_ka.sa.sa_restorer), | ||
| 383 | &oact->sa_restorer) || | ||
| 384 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 385 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 386 | return -EFAULT; | ||
| 387 | } | ||
| 388 | |||
| 389 | return ret; | ||
| 390 | } | ||
| 391 | |||
| 392 | asmlinkage int compat_sys_rt_sigaction(int sig, | ||
| 393 | const struct compat_sigaction __user *act, | ||
| 394 | struct compat_sigaction __user *oact, | ||
| 395 | compat_size_t sigsetsize) | ||
| 396 | { | ||
| 397 | struct k_sigaction new_ka, old_ka; | ||
| 398 | int ret; | ||
| 399 | |||
| 400 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 401 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
| 402 | return -EINVAL; | ||
| 403 | |||
| 404 | if (act) { | ||
| 405 | compat_uptr_t handler, restorer; | ||
| 406 | |||
| 407 | ret = get_user(handler, &act->sa_handler); | ||
| 408 | new_ka.sa.sa_handler = compat_ptr(handler); | ||
| 409 | ret |= get_user(restorer, &act->sa_restorer); | ||
| 410 | new_ka.sa.sa_restorer = compat_ptr(restorer); | ||
| 411 | ret |= get_sigset_t(&new_ka.sa.sa_mask, &act->sa_mask); | ||
| 412 | ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 413 | if (ret) | ||
| 414 | return -EFAULT; | ||
| 415 | } | ||
| 416 | |||
| 417 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 418 | if (!ret && oact) { | ||
| 419 | ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); | ||
| 420 | ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask); | ||
| 421 | ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 422 | } | ||
| 423 | return ret; | ||
| 424 | } | ||
| 425 | |||
| 426 | int compat_do_sigaltstack(compat_uptr_t compat_uss, compat_uptr_t compat_uoss, | ||
| 427 | compat_ulong_t sp) | ||
| 428 | { | ||
| 429 | compat_stack_t __user *newstack = compat_ptr(compat_uss); | ||
| 430 | compat_stack_t __user *oldstack = compat_ptr(compat_uoss); | ||
| 431 | compat_uptr_t ss_sp; | ||
| 432 | int ret; | ||
| 433 | mm_segment_t old_fs; | ||
| 434 | stack_t uss, uoss; | ||
| 435 | |||
| 436 | /* Marshall the compat new stack into a stack_t */ | ||
| 437 | if (newstack) { | ||
| 438 | if (get_user(ss_sp, &newstack->ss_sp) || | ||
| 439 | __get_user(uss.ss_flags, &newstack->ss_flags) || | ||
| 440 | __get_user(uss.ss_size, &newstack->ss_size)) | ||
| 441 | return -EFAULT; | ||
| 442 | uss.ss_sp = compat_ptr(ss_sp); | ||
| 443 | } | ||
| 444 | |||
| 445 | old_fs = get_fs(); | ||
| 446 | set_fs(KERNEL_DS); | ||
| 447 | /* The __user pointer casts are valid because of the set_fs() */ | ||
| 448 | ret = do_sigaltstack( | ||
| 449 | newstack ? (stack_t __user *) &uss : NULL, | ||
| 450 | oldstack ? (stack_t __user *) &uoss : NULL, | ||
| 451 | (unsigned long)sp); | ||
| 452 | set_fs(old_fs); | ||
| 453 | |||
| 454 | /* Convert the old stack_t into a compat stack. */ | ||
| 455 | if (!ret && oldstack && | ||
| 456 | (put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) || | ||
| 457 | __put_user(uoss.ss_flags, &oldstack->ss_flags) || | ||
| 458 | __put_user(uoss.ss_size, &oldstack->ss_size))) | ||
| 459 | return -EFAULT; | ||
| 460 | return ret; | ||
| 461 | } | ||
| 462 | |||
| 463 | static int compat_restore_sigframe(struct pt_regs *regs, | 322 | static int compat_restore_sigframe(struct pt_regs *regs, |
| 464 | struct compat_sigframe __user *sf) | 323 | struct compat_sigframe __user *sf) |
| 465 | { | 324 | { |
| @@ -562,9 +421,7 @@ asmlinkage int compat_sys_rt_sigreturn(struct pt_regs *regs) | |||
| 562 | if (compat_restore_sigframe(regs, &frame->sig)) | 421 | if (compat_restore_sigframe(regs, &frame->sig)) |
| 563 | goto badframe; | 422 | goto badframe; |
| 564 | 423 | ||
| 565 | if (compat_do_sigaltstack(ptr_to_compat(&frame->sig.uc.uc_stack), | 424 | if (compat_restore_altstack(&frame->sig.uc.uc_stack)) |
| 566 | ptr_to_compat((void __user *)NULL), | ||
| 567 | regs->compat_sp) == -EFAULT) | ||
| 568 | goto badframe; | 425 | goto badframe; |
| 569 | 426 | ||
| 570 | return regs->regs[0]; | 427 | return regs->regs[0]; |
| @@ -705,11 +562,7 @@ int compat_setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, | |||
| 705 | __put_user_error(0, &frame->sig.uc.uc_flags, err); | 562 | __put_user_error(0, &frame->sig.uc.uc_flags, err); |
| 706 | __put_user_error(0, &frame->sig.uc.uc_link, err); | 563 | __put_user_error(0, &frame->sig.uc.uc_link, err); |
| 707 | 564 | ||
| 708 | memset(&stack, 0, sizeof(stack)); | 565 | err |= __compat_save_altstack(&frame->sig.uc.uc_stack, regs->compat_sp); |
| 709 | stack.ss_sp = (compat_uptr_t)current->sas_ss_sp; | ||
| 710 | stack.ss_flags = sas_ss_flags(regs->compat_sp); | ||
| 711 | stack.ss_size = current->sas_ss_size; | ||
| 712 | err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); | ||
| 713 | 566 | ||
| 714 | err |= compat_setup_sigframe(&frame->sig, regs, set); | 567 | err |= compat_setup_sigframe(&frame->sig, regs, set); |
| 715 | 568 | ||
| @@ -742,75 +595,6 @@ int compat_setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, | |||
| 742 | return err; | 595 | return err; |
| 743 | } | 596 | } |
| 744 | 597 | ||
| 745 | /* | ||
| 746 | * RT signals don't have generic compat wrappers. | ||
| 747 | * See arch/powerpc/kernel/signal_32.c | ||
| 748 | */ | ||
| 749 | asmlinkage int compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set, | ||
| 750 | compat_sigset_t __user *oset, | ||
| 751 | compat_size_t sigsetsize) | ||
| 752 | { | ||
| 753 | sigset_t s; | ||
| 754 | sigset_t __user *up; | ||
| 755 | int ret; | ||
| 756 | mm_segment_t old_fs = get_fs(); | ||
| 757 | |||
| 758 | if (set) { | ||
| 759 | if (get_sigset_t(&s, set)) | ||
| 760 | return -EFAULT; | ||
| 761 | } | ||
| 762 | |||
| 763 | set_fs(KERNEL_DS); | ||
| 764 | /* This is valid because of the set_fs() */ | ||
| 765 | up = (sigset_t __user *) &s; | ||
| 766 | ret = sys_rt_sigprocmask(how, set ? up : NULL, oset ? up : NULL, | ||
| 767 | sigsetsize); | ||
| 768 | set_fs(old_fs); | ||
| 769 | if (ret) | ||
| 770 | return ret; | ||
| 771 | if (oset) { | ||
| 772 | if (put_sigset_t(oset, &s)) | ||
| 773 | return -EFAULT; | ||
| 774 | } | ||
| 775 | return 0; | ||
| 776 | } | ||
| 777 | |||
| 778 | asmlinkage int compat_sys_rt_sigpending(compat_sigset_t __user *set, | ||
| 779 | compat_size_t sigsetsize) | ||
| 780 | { | ||
| 781 | sigset_t s; | ||
| 782 | int ret; | ||
| 783 | mm_segment_t old_fs = get_fs(); | ||
| 784 | |||
| 785 | set_fs(KERNEL_DS); | ||
| 786 | /* The __user pointer cast is valid because of the set_fs() */ | ||
| 787 | ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize); | ||
| 788 | set_fs(old_fs); | ||
| 789 | if (!ret) { | ||
| 790 | if (put_sigset_t(set, &s)) | ||
| 791 | return -EFAULT; | ||
| 792 | } | ||
| 793 | return ret; | ||
| 794 | } | ||
| 795 | |||
| 796 | asmlinkage int compat_sys_rt_sigqueueinfo(int pid, int sig, | ||
| 797 | compat_siginfo_t __user *uinfo) | ||
| 798 | { | ||
| 799 | siginfo_t info; | ||
| 800 | int ret; | ||
| 801 | mm_segment_t old_fs = get_fs(); | ||
| 802 | |||
| 803 | ret = copy_siginfo_from_user32(&info, uinfo); | ||
| 804 | if (unlikely(ret)) | ||
| 805 | return ret; | ||
| 806 | |||
| 807 | set_fs (KERNEL_DS); | ||
| 808 | /* The __user pointer cast is valid because of the set_fs() */ | ||
| 809 | ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *) &info); | ||
| 810 | set_fs (old_fs); | ||
| 811 | return ret; | ||
| 812 | } | ||
| 813 | |||
| 814 | void compat_setup_restart_syscall(struct pt_regs *regs) | 598 | void compat_setup_restart_syscall(struct pt_regs *regs) |
| 815 | { | 599 | { |
| 816 | regs->regs[7] = __NR_compat_restart_syscall; | 600 | regs->regs[7] = __NR_compat_restart_syscall; |
diff --git a/arch/arm64/kernel/sys.c b/arch/arm64/kernel/sys.c index 8292a9b090f8..3fa98ff14f0e 100644 --- a/arch/arm64/kernel/sys.c +++ b/arch/arm64/kernel/sys.c | |||
| @@ -40,7 +40,6 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len, | |||
| 40 | * Wrappers to pass the pt_regs argument. | 40 | * Wrappers to pass the pt_regs argument. |
| 41 | */ | 41 | */ |
| 42 | #define sys_rt_sigreturn sys_rt_sigreturn_wrapper | 42 | #define sys_rt_sigreturn sys_rt_sigreturn_wrapper |
| 43 | #define sys_sigaltstack sys_sigaltstack_wrapper | ||
| 44 | 43 | ||
| 45 | #include <asm/syscalls.h> | 44 | #include <asm/syscalls.h> |
| 46 | 45 | ||
diff --git a/arch/arm64/kernel/sys32.S b/arch/arm64/kernel/sys32.S index 7ef59e9245ef..6abb05721614 100644 --- a/arch/arm64/kernel/sys32.S +++ b/arch/arm64/kernel/sys32.S | |||
| @@ -39,11 +39,6 @@ compat_sys_rt_sigreturn_wrapper: | |||
| 39 | b compat_sys_rt_sigreturn | 39 | b compat_sys_rt_sigreturn |
| 40 | ENDPROC(compat_sys_rt_sigreturn_wrapper) | 40 | ENDPROC(compat_sys_rt_sigreturn_wrapper) |
| 41 | 41 | ||
| 42 | compat_sys_sigaltstack_wrapper: | ||
| 43 | ldr x2, [sp, #S_COMPAT_SP] | ||
| 44 | b compat_do_sigaltstack | ||
| 45 | ENDPROC(compat_sys_sigaltstack_wrapper) | ||
| 46 | |||
| 47 | compat_sys_statfs64_wrapper: | 42 | compat_sys_statfs64_wrapper: |
| 48 | mov w3, #84 | 43 | mov w3, #84 |
| 49 | cmp w1, #88 | 44 | cmp w1, #88 |
diff --git a/arch/avr32/include/asm/signal.h b/arch/avr32/include/asm/signal.h index 9326d182e9e5..d875eb6a3f3c 100644 --- a/arch/avr32/include/asm/signal.h +++ b/arch/avr32/include/asm/signal.h | |||
| @@ -23,16 +23,7 @@ typedef struct { | |||
| 23 | unsigned long sig[_NSIG_WORDS]; | 23 | unsigned long sig[_NSIG_WORDS]; |
| 24 | } sigset_t; | 24 | } sigset_t; |
| 25 | 25 | ||
| 26 | struct sigaction { | 26 | #define __ARCH_HAS_SA_RESTORER |
| 27 | __sighandler_t sa_handler; | ||
| 28 | unsigned long sa_flags; | ||
| 29 | __sigrestore_t sa_restorer; | ||
| 30 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 31 | }; | ||
| 32 | |||
| 33 | struct k_sigaction { | ||
| 34 | struct sigaction sa; | ||
| 35 | }; | ||
| 36 | 27 | ||
| 37 | #include <asm/sigcontext.h> | 28 | #include <asm/sigcontext.h> |
| 38 | #undef __HAVE_ARCH_SIG_BITOPS | 29 | #undef __HAVE_ARCH_SIG_BITOPS |
diff --git a/arch/avr32/include/asm/unistd.h b/arch/avr32/include/asm/unistd.h index 0bdf6371574e..dc4d5a931112 100644 --- a/arch/avr32/include/asm/unistd.h +++ b/arch/avr32/include/asm/unistd.h | |||
| @@ -37,8 +37,6 @@ | |||
| 37 | #define __ARCH_WANT_SYS_GETPGRP | 37 | #define __ARCH_WANT_SYS_GETPGRP |
| 38 | #define __ARCH_WANT_SYS_LLSEEK | 38 | #define __ARCH_WANT_SYS_LLSEEK |
| 39 | #define __ARCH_WANT_SYS_GETPGRP | 39 | #define __ARCH_WANT_SYS_GETPGRP |
| 40 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 41 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 42 | #define __ARCH_WANT_SYS_FORK | 40 | #define __ARCH_WANT_SYS_FORK |
| 43 | #define __ARCH_WANT_SYS_VFORK | 41 | #define __ARCH_WANT_SYS_VFORK |
| 44 | #define __ARCH_WANT_SYS_CLONE | 42 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/avr32/kernel/signal.c b/arch/avr32/kernel/signal.c index 5e01c3a40ced..b80c0b3d2bab 100644 --- a/arch/avr32/kernel/signal.c +++ b/arch/avr32/kernel/signal.c | |||
| @@ -21,12 +21,6 @@ | |||
| 21 | #include <asm/ucontext.h> | 21 | #include <asm/ucontext.h> |
| 22 | #include <asm/syscalls.h> | 22 | #include <asm/syscalls.h> |
| 23 | 23 | ||
| 24 | asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
| 25 | struct pt_regs *regs) | ||
| 26 | { | ||
| 27 | return do_sigaltstack(uss, uoss, regs->sp); | ||
| 28 | } | ||
| 29 | |||
| 30 | struct rt_sigframe | 24 | struct rt_sigframe |
| 31 | { | 25 | { |
| 32 | struct siginfo info; | 26 | struct siginfo info; |
| @@ -91,7 +85,7 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) | |||
| 91 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) | 85 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) |
| 92 | goto badframe; | 86 | goto badframe; |
| 93 | 87 | ||
| 94 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) | 88 | if (restore_altstack(&frame->uc.uc_stack)) |
| 95 | goto badframe; | 89 | goto badframe; |
| 96 | 90 | ||
| 97 | pr_debug("Context restored: pc = %08lx, lr = %08lx, sp = %08lx\n", | 91 | pr_debug("Context restored: pc = %08lx, lr = %08lx, sp = %08lx\n", |
| @@ -175,12 +169,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 175 | /* Set up the ucontext */ | 169 | /* Set up the ucontext */ |
| 176 | err |= __put_user(0, &frame->uc.uc_flags); | 170 | err |= __put_user(0, &frame->uc.uc_flags); |
| 177 | err |= __put_user(NULL, &frame->uc.uc_link); | 171 | err |= __put_user(NULL, &frame->uc.uc_link); |
| 178 | err |= __put_user((void __user *)current->sas_ss_sp, | 172 | err |= __save_altstack(&frame->uc.uc_stack, regs->sp); |
| 179 | &frame->uc.uc_stack.ss_sp); | ||
| 180 | err |= __put_user(sas_ss_flags(regs->sp), | ||
| 181 | &frame->uc.uc_stack.ss_flags); | ||
| 182 | err |= __put_user(current->sas_ss_size, | ||
| 183 | &frame->uc.uc_stack.ss_size); | ||
| 184 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs); | 173 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs); |
| 185 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 174 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 186 | 175 | ||
diff --git a/arch/avr32/kernel/syscall-stubs.S b/arch/avr32/kernel/syscall-stubs.S index 275aab9731fd..b5fc927cd398 100644 --- a/arch/avr32/kernel/syscall-stubs.S +++ b/arch/avr32/kernel/syscall-stubs.S | |||
| @@ -20,12 +20,6 @@ __sys_rt_sigsuspend: | |||
| 20 | mov r10, sp | 20 | mov r10, sp |
| 21 | rjmp sys_rt_sigsuspend | 21 | rjmp sys_rt_sigsuspend |
| 22 | 22 | ||
| 23 | .global __sys_sigaltstack | ||
| 24 | .type __sys_sigaltstack,@function | ||
| 25 | __sys_sigaltstack: | ||
| 26 | mov r10, sp | ||
| 27 | rjmp sys_sigaltstack | ||
| 28 | |||
| 29 | .global __sys_rt_sigreturn | 23 | .global __sys_rt_sigreturn |
| 30 | .type __sys_rt_sigreturn,@function | 24 | .type __sys_rt_sigreturn,@function |
| 31 | __sys_rt_sigreturn: | 25 | __sys_rt_sigreturn: |
diff --git a/arch/avr32/kernel/syscall_table.S b/arch/avr32/kernel/syscall_table.S index f27bb878da6b..017a904180c8 100644 --- a/arch/avr32/kernel/syscall_table.S +++ b/arch/avr32/kernel/syscall_table.S | |||
| @@ -115,7 +115,7 @@ sys_call_table: | |||
| 115 | .long sys_statfs | 115 | .long sys_statfs |
| 116 | .long sys_fstatfs /* 100 */ | 116 | .long sys_fstatfs /* 100 */ |
| 117 | .long sys_vhangup | 117 | .long sys_vhangup |
| 118 | .long __sys_sigaltstack | 118 | .long sys_sigaltstack |
| 119 | .long sys_syslog | 119 | .long sys_syslog |
| 120 | .long sys_setitimer | 120 | .long sys_setitimer |
| 121 | .long sys_getitimer /* 105 */ | 121 | .long sys_getitimer /* 105 */ |
diff --git a/arch/blackfin/include/asm/unistd.h b/arch/blackfin/include/asm/unistd.h index e943cb130048..04e83ea8d5cc 100644 --- a/arch/blackfin/include/asm/unistd.h +++ b/arch/blackfin/include/asm/unistd.h | |||
| @@ -18,8 +18,6 @@ | |||
| 18 | #define __ARCH_WANT_SYS_GETPGRP | 18 | #define __ARCH_WANT_SYS_GETPGRP |
| 19 | #define __ARCH_WANT_SYS_LLSEEK | 19 | #define __ARCH_WANT_SYS_LLSEEK |
| 20 | #define __ARCH_WANT_SYS_NICE | 20 | #define __ARCH_WANT_SYS_NICE |
| 21 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 22 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 23 | #define __ARCH_WANT_SYS_VFORK | 21 | #define __ARCH_WANT_SYS_VFORK |
| 24 | 22 | ||
| 25 | /* | 23 | /* |
diff --git a/arch/blackfin/kernel/signal.c b/arch/blackfin/kernel/signal.c index 84b4be05840c..b022af6c48f8 100644 --- a/arch/blackfin/kernel/signal.c +++ b/arch/blackfin/kernel/signal.c | |||
| @@ -37,11 +37,6 @@ struct rt_sigframe { | |||
| 37 | struct ucontext uc; | 37 | struct ucontext uc; |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) | ||
| 41 | { | ||
| 42 | return do_sigaltstack(uss, uoss, rdusp()); | ||
| 43 | } | ||
| 44 | |||
| 45 | static inline int | 40 | static inline int |
| 46 | rt_restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *pr0) | 41 | rt_restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *pr0) |
| 47 | { | 42 | { |
| @@ -100,7 +95,7 @@ asmlinkage int sys_rt_sigreturn(void) | |||
| 100 | if (rt_restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) | 95 | if (rt_restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) |
| 101 | goto badframe; | 96 | goto badframe; |
| 102 | 97 | ||
| 103 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->usp) == -EFAULT) | 98 | if (restore_altstack(&frame->uc.uc_stack)) |
| 104 | goto badframe; | 99 | goto badframe; |
| 105 | 100 | ||
| 106 | return r0; | 101 | return r0; |
| @@ -178,10 +173,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t * info, | |||
| 178 | /* Create the ucontext. */ | 173 | /* Create the ucontext. */ |
| 179 | err |= __put_user(0, &frame->uc.uc_flags); | 174 | err |= __put_user(0, &frame->uc.uc_flags); |
| 180 | err |= __put_user(0, &frame->uc.uc_link); | 175 | err |= __put_user(0, &frame->uc.uc_link); |
| 181 | err |= | 176 | err |= __save_altstack(&frame->uc.uc_stack, rdusp()); |
| 182 | __put_user((void *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | ||
| 183 | err |= __put_user(sas_ss_flags(rdusp()), &frame->uc.uc_stack.ss_flags); | ||
| 184 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 185 | err |= rt_setup_sigcontext(&frame->uc.uc_mcontext, regs); | 177 | err |= rt_setup_sigcontext(&frame->uc.uc_mcontext, regs); |
| 186 | err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 178 | err |= copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 187 | 179 | ||
diff --git a/arch/c6x/kernel/entry.S b/arch/c6x/kernel/entry.S index 5239057de4c4..2721c90b0121 100644 --- a/arch/c6x/kernel/entry.S +++ b/arch/c6x/kernel/entry.S | |||
| @@ -598,18 +598,6 @@ ENTRY(enable_exception) | |||
| 598 | NOP 5 | 598 | NOP 5 |
| 599 | ENDPROC(enable_exception) | 599 | ENDPROC(enable_exception) |
| 600 | 600 | ||
| 601 | ENTRY(sys_sigaltstack) | ||
| 602 | #ifdef CONFIG_C6X_BIG_KERNEL | ||
| 603 | MVKL .S1 do_sigaltstack,A0 ; branch to do_sigaltstack | ||
| 604 | MVKH .S1 do_sigaltstack,A0 | ||
| 605 | B .S2X A0 | ||
| 606 | #else | ||
| 607 | B .S2 do_sigaltstack | ||
| 608 | #endif | ||
| 609 | LDW .D2T1 *+SP(REGS_SP+8),A6 | ||
| 610 | NOP 4 | ||
| 611 | ENDPROC(sys_sigaltstack) | ||
| 612 | |||
| 613 | ;; | 601 | ;; |
| 614 | ;; Special system calls | 602 | ;; Special system calls |
| 615 | ;; return address is in B3 | 603 | ;; return address is in B3 |
diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig index c59a01dd9c0c..0e5c187ac7d2 100644 --- a/arch/cris/Kconfig +++ b/arch/cris/Kconfig | |||
| @@ -50,6 +50,8 @@ config CRIS | |||
| 50 | select GENERIC_CMOS_UPDATE | 50 | select GENERIC_CMOS_UPDATE |
| 51 | select MODULES_USE_ELF_RELA | 51 | select MODULES_USE_ELF_RELA |
| 52 | select CLONE_BACKWARDS2 | 52 | select CLONE_BACKWARDS2 |
| 53 | select OLD_SIGSUSPEND | ||
| 54 | select OLD_SIGACTION | ||
| 53 | 55 | ||
| 54 | config HZ | 56 | config HZ |
| 55 | int | 57 | int |
diff --git a/arch/cris/arch-v10/kernel/signal.c b/arch/cris/arch-v10/kernel/signal.c index 0bb477c13a4e..61ce6273a895 100644 --- a/arch/cris/arch-v10/kernel/signal.c +++ b/arch/cris/arch-v10/kernel/signal.c | |||
| @@ -42,55 +42,6 @@ | |||
| 42 | void do_signal(int canrestart, struct pt_regs *regs); | 42 | void do_signal(int canrestart, struct pt_regs *regs); |
| 43 | 43 | ||
| 44 | /* | 44 | /* |
| 45 | * Atomically swap in the new signal mask, and wait for a signal. Define | ||
| 46 | * dummy arguments to be able to reach the regs argument. (Note that this | ||
| 47 | * arrangement relies on old_sigset_t occupying one register.) | ||
| 48 | */ | ||
| 49 | int sys_sigsuspend(old_sigset_t mask) | ||
| 50 | { | ||
| 51 | sigset_t blocked; | ||
| 52 | siginitset(&blocked, mask); | ||
| 53 | return sigsuspend(&blocked); | ||
| 54 | } | ||
| 55 | |||
| 56 | int sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
| 57 | struct old_sigaction *oact) | ||
| 58 | { | ||
| 59 | struct k_sigaction new_ka, old_ka; | ||
| 60 | int ret; | ||
| 61 | |||
| 62 | if (act) { | ||
| 63 | old_sigset_t mask; | ||
| 64 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 65 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 66 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 67 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 68 | __get_user(mask, &act->sa_mask)) | ||
| 69 | return -EFAULT; | ||
| 70 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 71 | } | ||
| 72 | |||
| 73 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 74 | |||
| 75 | if (!ret && oact) { | ||
| 76 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 77 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 78 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 79 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 80 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 81 | return -EFAULT; | ||
| 82 | } | ||
| 83 | |||
| 84 | return ret; | ||
| 85 | } | ||
| 86 | |||
| 87 | int sys_sigaltstack(const stack_t *uss, stack_t __user *uoss) | ||
| 88 | { | ||
| 89 | return do_sigaltstack(uss, uoss, rdusp()); | ||
| 90 | } | ||
| 91 | |||
| 92 | |||
| 93 | /* | ||
| 94 | * Do a signal return; undo the signal stack. | 45 | * Do a signal return; undo the signal stack. |
| 95 | */ | 46 | */ |
| 96 | 47 | ||
| @@ -150,11 +101,9 @@ badframe: | |||
| 150 | return 1; | 101 | return 1; |
| 151 | } | 102 | } |
| 152 | 103 | ||
| 153 | /* Define dummy arguments to be able to reach the regs argument. */ | 104 | asmlinkage int sys_sigreturn(void) |
| 154 | |||
| 155 | asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof, | ||
| 156 | long srp, struct pt_regs *regs) | ||
| 157 | { | 105 | { |
| 106 | struct pt_regs *regs = current_pt_regs(); | ||
| 158 | struct sigframe __user *frame = (struct sigframe *)rdusp(); | 107 | struct sigframe __user *frame = (struct sigframe *)rdusp(); |
| 159 | sigset_t set; | 108 | sigset_t set; |
| 160 | 109 | ||
| @@ -188,11 +137,9 @@ badframe: | |||
| 188 | return 0; | 137 | return 0; |
| 189 | } | 138 | } |
| 190 | 139 | ||
| 191 | /* Define dummy arguments to be able to reach the regs argument. */ | 140 | asmlinkage int sys_rt_sigreturn(void) |
| 192 | |||
| 193 | asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13, | ||
| 194 | long mof, long srp, struct pt_regs *regs) | ||
| 195 | { | 141 | { |
| 142 | struct pt_regs *regs = current_pt_regs(); | ||
| 196 | struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp(); | 143 | struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp(); |
| 197 | sigset_t set; | 144 | sigset_t set; |
| 198 | 145 | ||
| @@ -214,7 +161,7 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13, | |||
| 214 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) | 161 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) |
| 215 | goto badframe; | 162 | goto badframe; |
| 216 | 163 | ||
| 217 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, rdusp()) == -EFAULT) | 164 | if (restore_altstack(&frame->uc.uc_stack)) |
| 218 | goto badframe; | 165 | goto badframe; |
| 219 | 166 | ||
| 220 | return regs->r10; | 167 | return regs->r10; |
| @@ -362,6 +309,8 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 362 | 309 | ||
| 363 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 310 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 364 | 311 | ||
| 312 | err |= __save_altstack(&frame->uc.uc_stack, rdusp()); | ||
| 313 | |||
| 365 | if (err) | 314 | if (err) |
| 366 | goto give_sigsegv; | 315 | goto give_sigsegv; |
| 367 | 316 | ||
diff --git a/arch/cris/arch-v32/kernel/signal.c b/arch/cris/arch-v32/kernel/signal.c index b60d1b65a426..01d1375c9004 100644 --- a/arch/cris/arch-v32/kernel/signal.c +++ b/arch/cris/arch-v32/kernel/signal.c | |||
| @@ -51,59 +51,6 @@ struct rt_signal_frame { | |||
| 51 | void do_signal(int restart, struct pt_regs *regs); | 51 | void do_signal(int restart, struct pt_regs *regs); |
| 52 | void keep_debug_flags(unsigned long oldccs, unsigned long oldspc, | 52 | void keep_debug_flags(unsigned long oldccs, unsigned long oldspc, |
| 53 | struct pt_regs *regs); | 53 | struct pt_regs *regs); |
| 54 | /* | ||
| 55 | * Swap in the new signal mask, and wait for a signal. Define some | ||
| 56 | * dummy arguments to be able to reach the regs argument. | ||
| 57 | */ | ||
| 58 | int | ||
| 59 | sys_sigsuspend(old_sigset_t mask) | ||
| 60 | { | ||
| 61 | sigset_t blocked; | ||
| 62 | siginitset(&blocked, mask); | ||
| 63 | return sigsuspend(&blocked); | ||
| 64 | } | ||
| 65 | |||
| 66 | int | ||
| 67 | sys_sigaction(int signal, const struct old_sigaction *act, | ||
| 68 | struct old_sigaction *oact) | ||
| 69 | { | ||
| 70 | int retval; | ||
| 71 | struct k_sigaction newk; | ||
| 72 | struct k_sigaction oldk; | ||
| 73 | |||
| 74 | if (act) { | ||
| 75 | old_sigset_t mask; | ||
| 76 | |||
| 77 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 78 | __get_user(newk.sa.sa_handler, &act->sa_handler) || | ||
| 79 | __get_user(newk.sa.sa_restorer, &act->sa_restorer) || | ||
| 80 | __get_user(newk.sa.sa_flags, &act->sa_flags) || | ||
| 81 | __get_user(mask, &act->sa_mask)) | ||
| 82 | return -EFAULT; | ||
| 83 | |||
| 84 | siginitset(&newk.sa.sa_mask, mask); | ||
| 85 | } | ||
| 86 | |||
| 87 | retval = do_sigaction(signal, act ? &newk : NULL, oact ? &oldk : NULL); | ||
| 88 | |||
| 89 | if (!retval && oact) { | ||
| 90 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 91 | __put_user(oldk.sa.sa_handler, &oact->sa_handler) || | ||
| 92 | __put_user(oldk.sa.sa_restorer, &oact->sa_restorer) || | ||
| 93 | __put_user(oldk.sa.sa_flags, &oact->sa_flags) || | ||
| 94 | __put_user(oldk.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 95 | return -EFAULT; | ||
| 96 | |||
| 97 | } | ||
| 98 | |||
| 99 | return retval; | ||
| 100 | } | ||
| 101 | |||
| 102 | int | ||
| 103 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) | ||
| 104 | { | ||
| 105 | return do_sigaltstack(uss, uoss, rdusp()); | ||
| 106 | } | ||
| 107 | 54 | ||
| 108 | static int | 55 | static int |
| 109 | restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) | 56 | restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc) |
| @@ -135,11 +82,9 @@ badframe: | |||
| 135 | return 1; | 82 | return 1; |
| 136 | } | 83 | } |
| 137 | 84 | ||
| 138 | /* Define some dummy arguments to be able to reach the regs argument. */ | 85 | asmlinkage int sys_sigreturn(void) |
| 139 | asmlinkage int | ||
| 140 | sys_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp, | ||
| 141 | struct pt_regs *regs) | ||
| 142 | { | 86 | { |
| 87 | struct pt_regs *regs = current_pt_regs(); | ||
| 143 | sigset_t set; | 88 | sigset_t set; |
| 144 | struct signal_frame __user *frame; | 89 | struct signal_frame __user *frame; |
| 145 | unsigned long oldspc = regs->spc; | 90 | unsigned long oldspc = regs->spc; |
| @@ -178,11 +123,9 @@ badframe: | |||
| 178 | return 0; | 123 | return 0; |
| 179 | } | 124 | } |
| 180 | 125 | ||
| 181 | /* Define some dummy variables to be able to reach the regs argument. */ | 126 | asmlinkage int sys_rt_sigreturn(void) |
| 182 | asmlinkage int | ||
| 183 | sys_rt_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp, | ||
| 184 | struct pt_regs *regs) | ||
| 185 | { | 127 | { |
| 128 | struct pt_regs *regs = current_pt_regs(); | ||
| 186 | sigset_t set; | 129 | sigset_t set; |
| 187 | struct rt_signal_frame __user *frame; | 130 | struct rt_signal_frame __user *frame; |
| 188 | unsigned long oldspc = regs->spc; | 131 | unsigned long oldspc = regs->spc; |
| @@ -209,7 +152,7 @@ sys_rt_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp, | |||
| 209 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) | 152 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) |
| 210 | goto badframe; | 153 | goto badframe; |
| 211 | 154 | ||
| 212 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, rdusp()) == -EFAULT) | 155 | if (restore_altstack(&frame->uc.uc_stack)) |
| 213 | goto badframe; | 156 | goto badframe; |
| 214 | 157 | ||
| 215 | keep_debug_flags(oldccs, oldspc, regs); | 158 | keep_debug_flags(oldccs, oldspc, regs); |
| @@ -371,6 +314,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 371 | err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); | 314 | err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); |
| 372 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); | 315 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); |
| 373 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 316 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 317 | err |= __save_altstack(&frame->uc.uc_stack, rdusp()); | ||
| 374 | 318 | ||
| 375 | if (err) | 319 | if (err) |
| 376 | goto give_sigsegv; | 320 | goto give_sigsegv; |
diff --git a/arch/cris/include/asm/signal.h b/arch/cris/include/asm/signal.h index c0cb1fd4644c..c11b8745cece 100644 --- a/arch/cris/include/asm/signal.h +++ b/arch/cris/include/asm/signal.h | |||
| @@ -16,23 +16,8 @@ typedef struct { | |||
| 16 | unsigned long sig[_NSIG_WORDS]; | 16 | unsigned long sig[_NSIG_WORDS]; |
| 17 | } sigset_t; | 17 | } sigset_t; |
| 18 | 18 | ||
| 19 | struct old_sigaction { | 19 | #define __ARCH_HAS_SA_RESTORER |
| 20 | __sighandler_t sa_handler; | 20 | |
| 21 | old_sigset_t sa_mask; | ||
| 22 | unsigned long sa_flags; | ||
| 23 | void (*sa_restorer)(void); | ||
| 24 | }; | ||
| 25 | |||
| 26 | struct sigaction { | ||
| 27 | __sighandler_t sa_handler; | ||
| 28 | unsigned long sa_flags; | ||
| 29 | void (*sa_restorer)(void); | ||
| 30 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 31 | }; | ||
| 32 | |||
| 33 | struct k_sigaction { | ||
| 34 | struct sigaction sa; | ||
| 35 | }; | ||
| 36 | #include <asm/sigcontext.h> | 21 | #include <asm/sigcontext.h> |
| 37 | 22 | ||
| 38 | #endif | 23 | #endif |
diff --git a/arch/cris/include/asm/unistd.h b/arch/cris/include/asm/unistd.h index 6d062bdf92d4..be57a988bfb9 100644 --- a/arch/cris/include/asm/unistd.h +++ b/arch/cris/include/asm/unistd.h | |||
| @@ -30,8 +30,6 @@ | |||
| 30 | #define __ARCH_WANT_SYS_OLDUMOUNT | 30 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 31 | #define __ARCH_WANT_SYS_SIGPENDING | 31 | #define __ARCH_WANT_SYS_SIGPENDING |
| 32 | #define __ARCH_WANT_SYS_SIGPROCMASK | 32 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 33 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 34 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 35 | #define __ARCH_WANT_SYS_FORK | 33 | #define __ARCH_WANT_SYS_FORK |
| 36 | #define __ARCH_WANT_SYS_VFORK | 34 | #define __ARCH_WANT_SYS_VFORK |
| 37 | #define __ARCH_WANT_SYS_CLONE | 35 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig index 17df48fc8f44..2d0509d4cfee 100644 --- a/arch/frv/Kconfig +++ b/arch/frv/Kconfig | |||
| @@ -11,6 +11,8 @@ config FRV | |||
| 11 | select ARCH_HAVE_NMI_SAFE_CMPXCHG | 11 | select ARCH_HAVE_NMI_SAFE_CMPXCHG |
| 12 | select GENERIC_CPU_DEVICES | 12 | select GENERIC_CPU_DEVICES |
| 13 | select ARCH_WANT_IPC_PARSE_VERSION | 13 | select ARCH_WANT_IPC_PARSE_VERSION |
| 14 | select OLD_SIGSUSPEND3 | ||
| 15 | select OLD_SIGACTION | ||
| 14 | 16 | ||
| 15 | config ZONE_DMA | 17 | config ZONE_DMA |
| 16 | bool | 18 | bool |
diff --git a/arch/frv/include/asm/signal.h b/arch/frv/include/asm/signal.h index 599500a31025..eca0abcb79d6 100644 --- a/arch/frv/include/asm/signal.h +++ b/arch/frv/include/asm/signal.h | |||
| @@ -3,11 +3,4 @@ | |||
| 3 | 3 | ||
| 4 | #include <uapi/asm/signal.h> | 4 | #include <uapi/asm/signal.h> |
| 5 | 5 | ||
| 6 | struct old_sigaction { | ||
| 7 | __sighandler_t sa_handler; | ||
| 8 | old_sigset_t sa_mask; | ||
| 9 | unsigned long sa_flags; | ||
| 10 | __sigrestore_t sa_restorer; | ||
| 11 | }; | ||
| 12 | |||
| 13 | #endif /* _ASM_SIGNAL_H */ | 6 | #endif /* _ASM_SIGNAL_H */ |
diff --git a/arch/frv/include/asm/unistd.h b/arch/frv/include/asm/unistd.h index d685da17f5fb..4cfcc7bba25a 100644 --- a/arch/frv/include/asm/unistd.h +++ b/arch/frv/include/asm/unistd.h | |||
| @@ -27,8 +27,6 @@ | |||
| 27 | #define __ARCH_WANT_SYS_OLDUMOUNT | 27 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 28 | /* #define __ARCH_WANT_SYS_SIGPENDING */ | 28 | /* #define __ARCH_WANT_SYS_SIGPENDING */ |
| 29 | #define __ARCH_WANT_SYS_SIGPROCMASK | 29 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 30 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 31 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 32 | #define __ARCH_WANT_SYS_FORK | 30 | #define __ARCH_WANT_SYS_FORK |
| 33 | #define __ARCH_WANT_SYS_VFORK | 31 | #define __ARCH_WANT_SYS_VFORK |
| 34 | #define __ARCH_WANT_SYS_CLONE | 32 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/frv/kernel/signal.c b/arch/frv/kernel/signal.c index 535810a3217a..d822700d4f15 100644 --- a/arch/frv/kernel/signal.c +++ b/arch/frv/kernel/signal.c | |||
| @@ -33,55 +33,6 @@ struct fdpic_func_descriptor { | |||
| 33 | }; | 33 | }; |
| 34 | 34 | ||
| 35 | /* | 35 | /* |
| 36 | * Atomically swap in the new signal mask, and wait for a signal. | ||
| 37 | */ | ||
| 38 | asmlinkage int sys_sigsuspend(int history0, int history1, old_sigset_t mask) | ||
| 39 | { | ||
| 40 | sigset_t blocked; | ||
| 41 | siginitset(&blocked, mask); | ||
| 42 | return sigsuspend(&blocked); | ||
| 43 | } | ||
| 44 | |||
| 45 | asmlinkage int sys_sigaction(int sig, | ||
| 46 | const struct old_sigaction __user *act, | ||
| 47 | struct old_sigaction __user *oact) | ||
| 48 | { | ||
| 49 | struct k_sigaction new_ka, old_ka; | ||
| 50 | int ret; | ||
| 51 | |||
| 52 | if (act) { | ||
| 53 | old_sigset_t mask; | ||
| 54 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 55 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 56 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 57 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 58 | __get_user(mask, &act->sa_mask)) | ||
| 59 | return -EFAULT; | ||
| 60 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 61 | } | ||
| 62 | |||
| 63 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 64 | |||
| 65 | if (!ret && oact) { | ||
| 66 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 67 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 68 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 69 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 70 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 71 | return -EFAULT; | ||
| 72 | } | ||
| 73 | |||
| 74 | return ret; | ||
| 75 | } | ||
| 76 | |||
| 77 | asmlinkage | ||
| 78 | int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) | ||
| 79 | { | ||
| 80 | return do_sigaltstack(uss, uoss, __frame->sp); | ||
| 81 | } | ||
| 82 | |||
| 83 | |||
| 84 | /* | ||
| 85 | * Do a signal return; undo the signal stack. | 36 | * Do a signal return; undo the signal stack. |
| 86 | */ | 37 | */ |
| 87 | 38 | ||
| @@ -173,7 +124,7 @@ asmlinkage int sys_rt_sigreturn(void) | |||
| 173 | if (restore_sigcontext(&frame->uc.uc_mcontext, &gr8)) | 124 | if (restore_sigcontext(&frame->uc.uc_mcontext, &gr8)) |
| 174 | goto badframe; | 125 | goto badframe; |
| 175 | 126 | ||
| 176 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, __frame->sp) == -EFAULT) | 127 | if (restore_altstack(&frame->uc.uc_stack)) |
| 177 | goto badframe; | 128 | goto badframe; |
| 178 | 129 | ||
| 179 | return gr8; | 130 | return gr8; |
| @@ -345,9 +296,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 345 | /* Create the ucontext. */ | 296 | /* Create the ucontext. */ |
| 346 | if (__put_user(0, &frame->uc.uc_flags) || | 297 | if (__put_user(0, &frame->uc.uc_flags) || |
| 347 | __put_user(NULL, &frame->uc.uc_link) || | 298 | __put_user(NULL, &frame->uc.uc_link) || |
| 348 | __put_user((void __user *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp) || | 299 | __save_altstack(&frame->uc.uc_stack, __frame->sp)) |
| 349 | __put_user(sas_ss_flags(__frame->sp), &frame->uc.uc_stack.ss_flags) || | ||
| 350 | __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size)) | ||
| 351 | goto give_sigsegv; | 300 | goto give_sigsegv; |
| 352 | 301 | ||
| 353 | if (setup_sigcontext(&frame->uc.uc_mcontext, set->sig[0])) | 302 | if (setup_sigcontext(&frame->uc.uc_mcontext, set->sig[0])) |
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig index 2d2efb653ee0..05b613af223a 100644 --- a/arch/h8300/Kconfig +++ b/arch/h8300/Kconfig | |||
| @@ -9,6 +9,8 @@ config H8300 | |||
| 9 | select GENERIC_IRQ_SHOW | 9 | select GENERIC_IRQ_SHOW |
| 10 | select GENERIC_CPU_DEVICES | 10 | select GENERIC_CPU_DEVICES |
| 11 | select MODULES_USE_ELF_RELA | 11 | select MODULES_USE_ELF_RELA |
| 12 | select OLD_SIGSUSPEND3 | ||
| 13 | select OLD_SIGACTION | ||
| 12 | 14 | ||
| 13 | config SYMBOL_PREFIX | 15 | config SYMBOL_PREFIX |
| 14 | string | 16 | string |
diff --git a/arch/h8300/include/asm/signal.h b/arch/h8300/include/asm/signal.h index 66c81c67e55d..6341e36386f8 100644 --- a/arch/h8300/include/asm/signal.h +++ b/arch/h8300/include/asm/signal.h | |||
| @@ -16,23 +16,7 @@ typedef struct { | |||
| 16 | unsigned long sig[_NSIG_WORDS]; | 16 | unsigned long sig[_NSIG_WORDS]; |
| 17 | } sigset_t; | 17 | } sigset_t; |
| 18 | 18 | ||
| 19 | struct old_sigaction { | 19 | #define __ARCH_HAS_SA_RESTORER |
| 20 | __sighandler_t sa_handler; | ||
| 21 | old_sigset_t sa_mask; | ||
| 22 | unsigned long sa_flags; | ||
| 23 | void (*sa_restorer)(void); | ||
| 24 | }; | ||
| 25 | |||
| 26 | struct sigaction { | ||
| 27 | __sighandler_t sa_handler; | ||
| 28 | unsigned long sa_flags; | ||
| 29 | void (*sa_restorer)(void); | ||
| 30 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 31 | }; | ||
| 32 | |||
| 33 | struct k_sigaction { | ||
| 34 | struct sigaction sa; | ||
| 35 | }; | ||
| 36 | 20 | ||
| 37 | #include <asm/sigcontext.h> | 21 | #include <asm/sigcontext.h> |
| 38 | #undef __HAVE_ARCH_SIG_BITOPS | 22 | #undef __HAVE_ARCH_SIG_BITOPS |
diff --git a/arch/h8300/include/asm/unistd.h b/arch/h8300/include/asm/unistd.h index aa38105959fb..6721856d841b 100644 --- a/arch/h8300/include/asm/unistd.h +++ b/arch/h8300/include/asm/unistd.h | |||
| @@ -29,8 +29,6 @@ | |||
| 29 | #define __ARCH_WANT_SYS_OLDUMOUNT | 29 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 30 | #define __ARCH_WANT_SYS_SIGPENDING | 30 | #define __ARCH_WANT_SYS_SIGPENDING |
| 31 | #define __ARCH_WANT_SYS_SIGPROCMASK | 31 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 32 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 33 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 34 | #define __ARCH_WANT_SYS_FORK | 32 | #define __ARCH_WANT_SYS_FORK |
| 35 | #define __ARCH_WANT_SYS_VFORK | 33 | #define __ARCH_WANT_SYS_VFORK |
| 36 | #define __ARCH_WANT_SYS_CLONE | 34 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/h8300/kernel/signal.c b/arch/h8300/kernel/signal.c index 0e81b96c642f..a65ff3b76326 100644 --- a/arch/h8300/kernel/signal.c +++ b/arch/h8300/kernel/signal.c | |||
| @@ -47,56 +47,6 @@ | |||
| 47 | #include <asm/ucontext.h> | 47 | #include <asm/ucontext.h> |
| 48 | 48 | ||
| 49 | /* | 49 | /* |
| 50 | * Atomically swap in the new signal mask, and wait for a signal. | ||
| 51 | */ | ||
| 52 | asmlinkage int | ||
| 53 | sys_sigsuspend(int unused1, int unused2, old_sigset_t mask) | ||
| 54 | { | ||
| 55 | sigset_t blocked; | ||
| 56 | siginitset(&blocked, mask); | ||
| 57 | return sigsuspend(&blocked); | ||
| 58 | } | ||
| 59 | |||
| 60 | asmlinkage int | ||
| 61 | sys_sigaction(int sig, const struct old_sigaction *act, | ||
| 62 | struct old_sigaction *oact) | ||
| 63 | { | ||
| 64 | struct k_sigaction new_ka, old_ka; | ||
| 65 | int ret; | ||
| 66 | |||
| 67 | if (act) { | ||
| 68 | old_sigset_t mask; | ||
| 69 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 70 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 71 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 72 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 73 | __get_user(mask, &act->sa_mask)) | ||
| 74 | return -EFAULT; | ||
| 75 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 76 | } | ||
| 77 | |||
| 78 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 79 | |||
| 80 | if (!ret && oact) { | ||
| 81 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 82 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 83 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 84 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 85 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 86 | return -EFAULT; | ||
| 87 | } | ||
| 88 | |||
| 89 | return ret; | ||
| 90 | } | ||
| 91 | |||
| 92 | asmlinkage int | ||
| 93 | sys_sigaltstack(const stack_t *uss, stack_t *uoss) | ||
| 94 | { | ||
| 95 | return do_sigaltstack(uss, uoss, rdusp()); | ||
| 96 | } | ||
| 97 | |||
| 98 | |||
| 99 | /* | ||
| 100 | * Do a signal return; undo the signal stack. | 50 | * Do a signal return; undo the signal stack. |
| 101 | * | 51 | * |
| 102 | * Keep the return code on the stack quadword aligned! | 52 | * Keep the return code on the stack quadword aligned! |
| @@ -136,9 +86,9 @@ struct rt_sigframe | |||
| 136 | } __attribute__((aligned(2),packed)); | 86 | } __attribute__((aligned(2),packed)); |
| 137 | 87 | ||
| 138 | static inline int | 88 | static inline int |
| 139 | restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc, | 89 | restore_sigcontext(struct sigcontext *usc, int *pd0) |
| 140 | int *pd0) | ||
| 141 | { | 90 | { |
| 91 | struct pt_regs *regs = current_pt_regs(); | ||
| 142 | int err = 0; | 92 | int err = 0; |
| 143 | unsigned int ccr; | 93 | unsigned int ccr; |
| 144 | unsigned int usp; | 94 | unsigned int usp; |
| @@ -167,9 +117,8 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *usc, | |||
| 167 | return err; | 117 | return err; |
| 168 | } | 118 | } |
| 169 | 119 | ||
| 170 | asmlinkage int do_sigreturn(unsigned long __unused,...) | 120 | asmlinkage int sys_sigreturn(void) |
| 171 | { | 121 | { |
| 172 | struct pt_regs *regs = (struct pt_regs *) (&__unused - 1); | ||
| 173 | unsigned long usp = rdusp(); | 122 | unsigned long usp = rdusp(); |
| 174 | struct sigframe *frame = (struct sigframe *)(usp - 4); | 123 | struct sigframe *frame = (struct sigframe *)(usp - 4); |
| 175 | sigset_t set; | 124 | sigset_t set; |
| @@ -185,7 +134,7 @@ asmlinkage int do_sigreturn(unsigned long __unused,...) | |||
| 185 | 134 | ||
| 186 | set_current_blocked(&set); | 135 | set_current_blocked(&set); |
| 187 | 136 | ||
| 188 | if (restore_sigcontext(regs, &frame->sc, &er0)) | 137 | if (restore_sigcontext(&frame->sc, &er0)) |
| 189 | goto badframe; | 138 | goto badframe; |
| 190 | return er0; | 139 | return er0; |
| 191 | 140 | ||
| @@ -194,9 +143,8 @@ badframe: | |||
| 194 | return 0; | 143 | return 0; |
| 195 | } | 144 | } |
| 196 | 145 | ||
| 197 | asmlinkage int do_rt_sigreturn(unsigned long __unused,...) | 146 | asmlinkage int sys_rt_sigreturn(void) |
| 198 | { | 147 | { |
| 199 | struct pt_regs *regs = (struct pt_regs *) &__unused; | ||
| 200 | unsigned long usp = rdusp(); | 148 | unsigned long usp = rdusp(); |
| 201 | struct rt_sigframe *frame = (struct rt_sigframe *)(usp - 4); | 149 | struct rt_sigframe *frame = (struct rt_sigframe *)(usp - 4); |
| 202 | sigset_t set; | 150 | sigset_t set; |
| @@ -209,10 +157,10 @@ asmlinkage int do_rt_sigreturn(unsigned long __unused,...) | |||
| 209 | 157 | ||
| 210 | set_current_blocked(&set); | 158 | set_current_blocked(&set); |
| 211 | 159 | ||
| 212 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &er0)) | 160 | if (restore_sigcontext(&frame->uc.uc_mcontext, &er0)) |
| 213 | goto badframe; | 161 | goto badframe; |
| 214 | 162 | ||
| 215 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT) | 163 | if (restore_altstack(&frame->uc.uc_stack)) |
| 216 | goto badframe; | 164 | goto badframe; |
| 217 | 165 | ||
| 218 | return er0; | 166 | return er0; |
| @@ -358,11 +306,7 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 358 | /* Create the ucontext. */ | 306 | /* Create the ucontext. */ |
| 359 | err |= __put_user(0, &frame->uc.uc_flags); | 307 | err |= __put_user(0, &frame->uc.uc_flags); |
| 360 | err |= __put_user(0, &frame->uc.uc_link); | 308 | err |= __put_user(0, &frame->uc.uc_link); |
| 361 | err |= __put_user((void *)current->sas_ss_sp, | 309 | err |= __save_altstack(&frame->uc.uc_stack, rdusp()); |
| 362 | &frame->uc.uc_stack.ss_sp); | ||
| 363 | err |= __put_user(sas_ss_flags(rdusp()), | ||
| 364 | &frame->uc.uc_stack.ss_flags); | ||
| 365 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 366 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); | 310 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); |
| 367 | err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set)); | 311 | err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 368 | if (err) | 312 | if (err) |
diff --git a/arch/h8300/kernel/syscalls.S b/arch/h8300/kernel/syscalls.S index b74dd0ade58d..5c2168fb9b9e 100644 --- a/arch/h8300/kernel/syscalls.S +++ b/arch/h8300/kernel/syscalls.S | |||
| @@ -334,18 +334,3 @@ SYMBOL_NAME_LABEL(sys_call_table) | |||
| 334 | .long SYMBOL_NAME(sys_getcpu) | 334 | .long SYMBOL_NAME(sys_getcpu) |
| 335 | .long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_pwait */ | 335 | .long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_pwait */ |
| 336 | .long SYMBOL_NAME(sys_setns) /* 320 */ | 336 | .long SYMBOL_NAME(sys_setns) /* 320 */ |
| 337 | |||
| 338 | .macro call_sp addr | ||
| 339 | mov.l #SYMBOL_NAME(\addr),er6 | ||
| 340 | bra SYMBOL_NAME(syscall_trampoline):8 | ||
| 341 | .endm | ||
| 342 | |||
| 343 | SYMBOL_NAME_LABEL(sys_sigreturn) | ||
| 344 | call_sp do_sigreturn | ||
| 345 | |||
| 346 | SYMBOL_NAME_LABEL(sys_rt_sigreturn) | ||
| 347 | call_sp do_rt_sigreturn | ||
| 348 | |||
| 349 | SYMBOL_NAME_LABEL(syscall_trampoline) | ||
| 350 | mov.l sp,er0 | ||
| 351 | jmp @er6 | ||
diff --git a/arch/hexagon/kernel/signal.c b/arch/hexagon/kernel/signal.c index fe0d1373165d..60fa2ca3202b 100644 --- a/arch/hexagon/kernel/signal.c +++ b/arch/hexagon/kernel/signal.c | |||
| @@ -125,6 +125,7 @@ static int setup_rt_frame(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
| 125 | err |= __put_user(0x5400c004, &frame->tramp[1]); | 125 | err |= __put_user(0x5400c004, &frame->tramp[1]); |
| 126 | err |= setup_sigcontext(regs, &frame->uc.uc_mcontext); | 126 | err |= setup_sigcontext(regs, &frame->uc.uc_mcontext); |
| 127 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 127 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 128 | err |= __save_altstack(&frame->uc.uc_stack, user_stack_pointer(regs)); | ||
| 128 | if (err) | 129 | if (err) |
| 129 | goto sigsegv; | 130 | goto sigsegv; |
| 130 | 131 | ||
| @@ -247,12 +248,6 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) | |||
| 247 | /* | 248 | /* |
| 248 | * Architecture-specific wrappers for signal-related system calls | 249 | * Architecture-specific wrappers for signal-related system calls |
| 249 | */ | 250 | */ |
| 250 | asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) | ||
| 251 | { | ||
| 252 | struct pt_regs *regs = current_pt_regs(); | ||
| 253 | |||
| 254 | return do_sigaltstack(uss, uoss, regs->r29); | ||
| 255 | } | ||
| 256 | 251 | ||
| 257 | asmlinkage int sys_rt_sigreturn(void) | 252 | asmlinkage int sys_rt_sigreturn(void) |
| 258 | { | 253 | { |
| @@ -288,14 +283,7 @@ asmlinkage int sys_rt_sigreturn(void) | |||
| 288 | */ | 283 | */ |
| 289 | regs->syscall_nr = __NR_rt_sigreturn; | 284 | regs->syscall_nr = __NR_rt_sigreturn; |
| 290 | 285 | ||
| 291 | /* | 286 | if (restore_altstack(&frame->uc.uc_stack)) |
| 292 | * If we were meticulous, we'd only call this if we knew that | ||
| 293 | * we were actually going to use an alternate stack, and we'd | ||
| 294 | * consider any error to be fatal. What we do here, in common | ||
| 295 | * with many other architectures, is call it blindly and only | ||
| 296 | * consider the -EFAULT return case to be proof of a problem. | ||
| 297 | */ | ||
| 298 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, pt_psp(regs)) == -EFAULT) | ||
| 299 | goto badframe; | 287 | goto badframe; |
| 300 | 288 | ||
| 301 | return 0; | 289 | return 0; |
diff --git a/arch/ia64/include/asm/signal.h b/arch/ia64/include/asm/signal.h index 3a1b20e74c5c..c62afa4a0dc2 100644 --- a/arch/ia64/include/asm/signal.h +++ b/arch/ia64/include/asm/signal.h | |||
| @@ -26,16 +26,6 @@ typedef struct { | |||
| 26 | unsigned long sig[_NSIG_WORDS]; | 26 | unsigned long sig[_NSIG_WORDS]; |
| 27 | } sigset_t; | 27 | } sigset_t; |
| 28 | 28 | ||
| 29 | struct sigaction { | ||
| 30 | __sighandler_t sa_handler; | ||
| 31 | unsigned long sa_flags; | ||
| 32 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 33 | }; | ||
| 34 | |||
| 35 | struct k_sigaction { | ||
| 36 | struct sigaction sa; | ||
| 37 | }; | ||
| 38 | |||
| 39 | # include <asm/sigcontext.h> | 29 | # include <asm/sigcontext.h> |
| 40 | 30 | ||
| 41 | # endif /* !__ASSEMBLY__ */ | 31 | # endif /* !__ASSEMBLY__ */ |
diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h index c3cc42a15af1..096373800f73 100644 --- a/arch/ia64/include/asm/unistd.h +++ b/arch/ia64/include/asm/unistd.h | |||
| @@ -27,9 +27,6 @@ | |||
| 27 | #define __IGNORE_vfork /* clone() */ | 27 | #define __IGNORE_vfork /* clone() */ |
| 28 | #define __IGNORE_umount2 /* umount() */ | 28 | #define __IGNORE_umount2 /* umount() */ |
| 29 | 29 | ||
| 30 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 31 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 32 | |||
| 33 | #if !defined(__ASSEMBLY__) && !defined(ASSEMBLER) | 30 | #if !defined(__ASSEMBLY__) && !defined(ASSEMBLER) |
| 34 | 31 | ||
| 35 | #include <linux/types.h> | 32 | #include <linux/types.h> |
| @@ -47,12 +44,7 @@ asmlinkage unsigned long sys_mmap2( | |||
| 47 | int prot, int flags, | 44 | int prot, int flags, |
| 48 | int fd, long pgoff); | 45 | int fd, long pgoff); |
| 49 | struct pt_regs; | 46 | struct pt_regs; |
| 50 | struct sigaction; | ||
| 51 | asmlinkage long sys_ia64_pipe(void); | 47 | asmlinkage long sys_ia64_pipe(void); |
| 52 | asmlinkage long sys_rt_sigaction(int sig, | ||
| 53 | const struct sigaction __user *act, | ||
| 54 | struct sigaction __user *oact, | ||
| 55 | size_t sigsetsize); | ||
| 56 | 48 | ||
| 57 | /* | 49 | /* |
| 58 | * "Conditional" syscalls | 50 | * "Conditional" syscalls |
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c index 680b73786be8..3637e03d2282 100644 --- a/arch/ia64/kernel/signal.c +++ b/arch/ia64/kernel/signal.c | |||
| @@ -39,14 +39,6 @@ | |||
| 39 | # define GET_SIGSET(k,u) __get_user((k)->sig[0], &(u)->sig[0]) | 39 | # define GET_SIGSET(k,u) __get_user((k)->sig[0], &(u)->sig[0]) |
| 40 | #endif | 40 | #endif |
| 41 | 41 | ||
| 42 | asmlinkage long | ||
| 43 | sys_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, long arg2, | ||
| 44 | long arg3, long arg4, long arg5, long arg6, long arg7, | ||
| 45 | struct pt_regs regs) | ||
| 46 | { | ||
| 47 | return do_sigaltstack(uss, uoss, regs.r12); | ||
| 48 | } | ||
| 49 | |||
| 50 | static long | 42 | static long |
| 51 | restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr) | 43 | restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr) |
| 52 | { | 44 | { |
| @@ -208,11 +200,8 @@ ia64_rt_sigreturn (struct sigscratch *scr) | |||
| 208 | printk("SIG return (%s:%d): sp=%lx ip=%lx\n", | 200 | printk("SIG return (%s:%d): sp=%lx ip=%lx\n", |
| 209 | current->comm, current->pid, scr->pt.r12, scr->pt.cr_iip); | 201 | current->comm, current->pid, scr->pt.r12, scr->pt.cr_iip); |
| 210 | #endif | 202 | #endif |
| 211 | /* | 203 | if (restore_altstack(&sc->sc_stack)) |
| 212 | * It is more difficult to avoid calling this function than to | 204 | goto give_sigsegv; |
| 213 | * call it and ignore errors. | ||
| 214 | */ | ||
| 215 | do_sigaltstack(&sc->sc_stack, NULL, scr->pt.r12); | ||
| 216 | return retval; | 205 | return retval; |
| 217 | 206 | ||
| 218 | give_sigsegv: | 207 | give_sigsegv: |
| @@ -376,9 +365,7 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set, | |||
| 376 | 365 | ||
| 377 | err |= copy_siginfo_to_user(&frame->info, info); | 366 | err |= copy_siginfo_to_user(&frame->info, info); |
| 378 | 367 | ||
| 379 | err |= __put_user(current->sas_ss_sp, &frame->sc.sc_stack.ss_sp); | 368 | err |= __save_altstack(&frame->sc.sc_stack, scr->pt.r12); |
| 380 | err |= __put_user(current->sas_ss_size, &frame->sc.sc_stack.ss_size); | ||
| 381 | err |= __put_user(sas_ss_flags(scr->pt.r12), &frame->sc.sc_stack.ss_flags); | ||
| 382 | err |= setup_sigcontext(&frame->sc, set, scr); | 369 | err |= setup_sigcontext(&frame->sc, set, scr); |
| 383 | 370 | ||
| 384 | if (unlikely(err)) | 371 | if (unlikely(err)) |
diff --git a/arch/m32r/include/asm/signal.h b/arch/m32r/include/asm/signal.h index a5ba4a217fb9..ed3ded6601e8 100644 --- a/arch/m32r/include/asm/signal.h +++ b/arch/m32r/include/asm/signal.h | |||
| @@ -16,16 +16,7 @@ typedef struct { | |||
| 16 | unsigned long sig[_NSIG_WORDS]; | 16 | unsigned long sig[_NSIG_WORDS]; |
| 17 | } sigset_t; | 17 | } sigset_t; |
| 18 | 18 | ||
| 19 | struct sigaction { | 19 | #define __ARCH_HAS_SA_RESTORER |
| 20 | __sighandler_t sa_handler; | ||
| 21 | unsigned long sa_flags; | ||
| 22 | __sigrestore_t sa_restorer; | ||
| 23 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 24 | }; | ||
| 25 | |||
| 26 | struct k_sigaction { | ||
| 27 | struct sigaction sa; | ||
| 28 | }; | ||
| 29 | #include <asm/sigcontext.h> | 20 | #include <asm/sigcontext.h> |
| 30 | 21 | ||
| 31 | #undef __HAVE_ARCH_SIG_BITOPS | 22 | #undef __HAVE_ARCH_SIG_BITOPS |
diff --git a/arch/m32r/include/asm/unistd.h b/arch/m32r/include/asm/unistd.h index 79b063caec85..555629b05267 100644 --- a/arch/m32r/include/asm/unistd.h +++ b/arch/m32r/include/asm/unistd.h | |||
| @@ -20,8 +20,6 @@ | |||
| 20 | #define __ARCH_WANT_SYS_LLSEEK | 20 | #define __ARCH_WANT_SYS_LLSEEK |
| 21 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/ | 21 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT /*will be unused*/ |
| 22 | #define __ARCH_WANT_SYS_OLDUMOUNT | 22 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 23 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 24 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 25 | #define __ARCH_WANT_SYS_CLONE | 23 | #define __ARCH_WANT_SYS_CLONE |
| 26 | #define __ARCH_WANT_SYS_FORK | 24 | #define __ARCH_WANT_SYS_FORK |
| 27 | #define __ARCH_WANT_SYS_VFORK | 25 | #define __ARCH_WANT_SYS_VFORK |
diff --git a/arch/m32r/kernel/signal.c b/arch/m32r/kernel/signal.c index 6e3c26a1607c..d503568cb753 100644 --- a/arch/m32r/kernel/signal.c +++ b/arch/m32r/kernel/signal.c | |||
| @@ -27,15 +27,6 @@ | |||
| 27 | 27 | ||
| 28 | #define DEBUG_SIG 0 | 28 | #define DEBUG_SIG 0 |
| 29 | 29 | ||
| 30 | asmlinkage int | ||
| 31 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
| 32 | unsigned long r2, unsigned long r3, unsigned long r4, | ||
| 33 | unsigned long r5, unsigned long r6, struct pt_regs *regs) | ||
| 34 | { | ||
| 35 | return do_sigaltstack(uss, uoss, regs->spu); | ||
| 36 | } | ||
| 37 | |||
| 38 | |||
| 39 | /* | 30 | /* |
| 40 | * Do a signal return; undo the signal stack. | 31 | * Do a signal return; undo the signal stack. |
| 41 | */ | 32 | */ |
| @@ -113,7 +104,7 @@ sys_rt_sigreturn(unsigned long r0, unsigned long r1, | |||
| 113 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &result)) | 104 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &result)) |
| 114 | goto badframe; | 105 | goto badframe; |
| 115 | 106 | ||
| 116 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->spu) == -EFAULT) | 107 | if (restore_altstack(&frame->uc.uc_stack)) |
| 117 | goto badframe; | 108 | goto badframe; |
| 118 | 109 | ||
| 119 | return result; | 110 | return result; |
| @@ -213,10 +204,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 213 | /* Create the ucontext. */ | 204 | /* Create the ucontext. */ |
| 214 | err |= __put_user(0, &frame->uc.uc_flags); | 205 | err |= __put_user(0, &frame->uc.uc_flags); |
| 215 | err |= __put_user(0, &frame->uc.uc_link); | 206 | err |= __put_user(0, &frame->uc.uc_link); |
| 216 | err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 207 | err |= __save_altstack(&frame->uc.uc_stack, regs->spu); |
| 217 | err |= __put_user(sas_ss_flags(regs->spu), | ||
| 218 | &frame->uc.uc_stack.ss_flags); | ||
| 219 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 220 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); | 208 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); |
| 221 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 209 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 222 | if (err) | 210 | if (err) |
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index 6710084e072a..efb1ce1f14a3 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig | |||
| @@ -18,6 +18,8 @@ config M68K | |||
| 18 | select HAVE_MOD_ARCH_SPECIFIC | 18 | select HAVE_MOD_ARCH_SPECIFIC |
| 19 | select MODULES_USE_ELF_REL | 19 | select MODULES_USE_ELF_REL |
| 20 | select MODULES_USE_ELF_RELA | 20 | select MODULES_USE_ELF_RELA |
| 21 | select OLD_SIGSUSPEND3 | ||
| 22 | select OLD_SIGACTION | ||
| 21 | 23 | ||
| 22 | config RWSEM_GENERIC_SPINLOCK | 24 | config RWSEM_GENERIC_SPINLOCK |
| 23 | bool | 25 | bool |
diff --git a/arch/m68k/include/asm/signal.h b/arch/m68k/include/asm/signal.h index 9c8c46b06b0c..214320b50384 100644 --- a/arch/m68k/include/asm/signal.h +++ b/arch/m68k/include/asm/signal.h | |||
| @@ -16,23 +16,8 @@ typedef struct { | |||
| 16 | unsigned long sig[_NSIG_WORDS]; | 16 | unsigned long sig[_NSIG_WORDS]; |
| 17 | } sigset_t; | 17 | } sigset_t; |
| 18 | 18 | ||
| 19 | struct old_sigaction { | 19 | #define __ARCH_HAS_SA_RESTORER |
| 20 | __sighandler_t sa_handler; | 20 | |
| 21 | old_sigset_t sa_mask; | ||
| 22 | unsigned long sa_flags; | ||
| 23 | __sigrestore_t sa_restorer; | ||
| 24 | }; | ||
| 25 | |||
| 26 | struct sigaction { | ||
| 27 | __sighandler_t sa_handler; | ||
| 28 | unsigned long sa_flags; | ||
| 29 | __sigrestore_t sa_restorer; | ||
| 30 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 31 | }; | ||
| 32 | |||
| 33 | struct k_sigaction { | ||
| 34 | struct sigaction sa; | ||
| 35 | }; | ||
| 36 | #include <asm/sigcontext.h> | 21 | #include <asm/sigcontext.h> |
| 37 | 22 | ||
| 38 | #ifndef CONFIG_CPU_HAS_NO_BITFIELDS | 23 | #ifndef CONFIG_CPU_HAS_NO_BITFIELDS |
diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index f9337f614660..6cd92671ca5e 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h | |||
| @@ -29,8 +29,6 @@ | |||
| 29 | #define __ARCH_WANT_SYS_OLDUMOUNT | 29 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 30 | #define __ARCH_WANT_SYS_SIGPENDING | 30 | #define __ARCH_WANT_SYS_SIGPENDING |
| 31 | #define __ARCH_WANT_SYS_SIGPROCMASK | 31 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 32 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 33 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 34 | #define __ARCH_WANT_SYS_FORK | 32 | #define __ARCH_WANT_SYS_FORK |
| 35 | #define __ARCH_WANT_SYS_VFORK | 33 | #define __ARCH_WANT_SYS_VFORK |
| 36 | 34 | ||
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c index 9a396cda3147..2a16df3d9312 100644 --- a/arch/m68k/kernel/signal.c +++ b/arch/m68k/kernel/signal.c | |||
| @@ -225,56 +225,6 @@ static inline void push_cache(unsigned long vaddr) | |||
| 225 | #endif /* CONFIG_MMU */ | 225 | #endif /* CONFIG_MMU */ |
| 226 | 226 | ||
| 227 | /* | 227 | /* |
| 228 | * Atomically swap in the new signal mask, and wait for a signal. | ||
| 229 | */ | ||
| 230 | asmlinkage int | ||
| 231 | sys_sigsuspend(int unused0, int unused1, old_sigset_t mask) | ||
| 232 | { | ||
| 233 | sigset_t blocked; | ||
| 234 | siginitset(&blocked, mask); | ||
| 235 | return sigsuspend(&blocked); | ||
| 236 | } | ||
| 237 | |||
| 238 | asmlinkage int | ||
| 239 | sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
| 240 | struct old_sigaction __user *oact) | ||
| 241 | { | ||
| 242 | struct k_sigaction new_ka, old_ka; | ||
| 243 | int ret; | ||
| 244 | |||
| 245 | if (act) { | ||
| 246 | old_sigset_t mask; | ||
| 247 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 248 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 249 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 250 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 251 | __get_user(mask, &act->sa_mask)) | ||
| 252 | return -EFAULT; | ||
| 253 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 254 | } | ||
| 255 | |||
| 256 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 257 | |||
| 258 | if (!ret && oact) { | ||
| 259 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 260 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 261 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 262 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 263 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 264 | return -EFAULT; | ||
| 265 | } | ||
| 266 | |||
| 267 | return ret; | ||
| 268 | } | ||
| 269 | |||
| 270 | asmlinkage int | ||
| 271 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss) | ||
| 272 | { | ||
| 273 | return do_sigaltstack(uss, uoss, rdusp()); | ||
| 274 | } | ||
| 275 | |||
| 276 | |||
| 277 | /* | ||
| 278 | * Do a signal return; undo the signal stack. | 228 | * Do a signal return; undo the signal stack. |
| 279 | * | 229 | * |
| 280 | * Keep the return code on the stack quadword aligned! | 230 | * Keep the return code on the stack quadword aligned! |
| @@ -765,8 +715,9 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw, | |||
| 765 | err |= __get_user(temp, &uc->uc_formatvec); | 715 | err |= __get_user(temp, &uc->uc_formatvec); |
| 766 | 716 | ||
| 767 | err |= rt_restore_fpu_state(uc); | 717 | err |= rt_restore_fpu_state(uc); |
| 718 | err |= restore_altstack(&uc->uc_stack); | ||
| 768 | 719 | ||
| 769 | if (err || do_sigaltstack(&uc->uc_stack, NULL, usp) == -EFAULT) | 720 | if (err) |
| 770 | goto badframe; | 721 | goto badframe; |
| 771 | 722 | ||
| 772 | if (mangle_kernel_stack(regs, temp, &uc->uc_extra)) | 723 | if (mangle_kernel_stack(regs, temp, &uc->uc_extra)) |
| @@ -1014,11 +965,7 @@ static int setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 1014 | /* Create the ucontext. */ | 965 | /* Create the ucontext. */ |
| 1015 | err |= __put_user(0, &frame->uc.uc_flags); | 966 | err |= __put_user(0, &frame->uc.uc_flags); |
| 1016 | err |= __put_user(NULL, &frame->uc.uc_link); | 967 | err |= __put_user(NULL, &frame->uc.uc_link); |
| 1017 | err |= __put_user((void __user *)current->sas_ss_sp, | 968 | err |= __save_altstack(&frame->uc.uc_stack, rdusp()); |
| 1018 | &frame->uc.uc_stack.ss_sp); | ||
| 1019 | err |= __put_user(sas_ss_flags(rdusp()), | ||
| 1020 | &frame->uc.uc_stack.ss_flags); | ||
| 1021 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 1022 | err |= rt_setup_ucontext(&frame->uc, regs); | 969 | err |= rt_setup_ucontext(&frame->uc, regs); |
| 1023 | err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set)); | 970 | err |= copy_to_user (&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 1024 | 971 | ||
diff --git a/arch/microblaze/include/asm/unistd.h b/arch/microblaze/include/asm/unistd.h index 10f8ac186855..b3778391d9cc 100644 --- a/arch/microblaze/include/asm/unistd.h +++ b/arch/microblaze/include/asm/unistd.h | |||
| @@ -33,8 +33,6 @@ | |||
| 33 | #define __ARCH_WANT_SYS_OLDUMOUNT | 33 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 34 | #define __ARCH_WANT_SYS_SIGPENDING | 34 | #define __ARCH_WANT_SYS_SIGPENDING |
| 35 | #define __ARCH_WANT_SYS_SIGPROCMASK | 35 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 36 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 37 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 38 | #define __ARCH_WANT_SYS_CLONE | 36 | #define __ARCH_WANT_SYS_CLONE |
| 39 | #define __ARCH_WANT_SYS_VFORK | 37 | #define __ARCH_WANT_SYS_VFORK |
| 40 | #define __ARCH_WANT_SYS_FORK | 38 | #define __ARCH_WANT_SYS_FORK |
diff --git a/arch/microblaze/kernel/entry-nommu.S b/arch/microblaze/kernel/entry-nommu.S index 70da83a49670..7e394fc2c439 100644 --- a/arch/microblaze/kernel/entry-nommu.S +++ b/arch/microblaze/kernel/entry-nommu.S | |||
| @@ -124,6 +124,7 @@ ret_from_intr: | |||
| 124 | lwi r11, r1, PT_MODE | 124 | lwi r11, r1, PT_MODE |
| 125 | bneid r11, no_intr_resched | 125 | bneid r11, no_intr_resched |
| 126 | 126 | ||
| 127 | 3: | ||
| 127 | lwi r6, r31, TS_THREAD_INFO /* get thread info */ | 128 | lwi r6, r31, TS_THREAD_INFO /* get thread info */ |
| 128 | lwi r19, r6, TI_FLAGS /* get flags in thread info */ | 129 | lwi r19, r6, TI_FLAGS /* get flags in thread info */ |
| 129 | /* do an extra work if any bits are set */ | 130 | /* do an extra work if any bits are set */ |
| @@ -132,11 +133,13 @@ ret_from_intr: | |||
| 132 | beqi r11, 1f | 133 | beqi r11, 1f |
| 133 | bralid r15, schedule | 134 | bralid r15, schedule |
| 134 | nop | 135 | nop |
| 136 | bri 3b | ||
| 135 | 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME | 137 | 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME |
| 136 | beqid r11, no_intr_resched | 138 | beqid r11, no_intr_resched |
| 137 | addk r5, r1, r0 | 139 | addk r5, r1, r0 |
| 138 | bralid r15, do_notify_resume | 140 | bralid r15, do_notify_resume |
| 139 | addk r6, r0, r0 | 141 | addk r6, r0, r0 |
| 142 | bri 3b | ||
| 140 | 143 | ||
| 141 | no_intr_resched: | 144 | no_intr_resched: |
| 142 | /* Disable interrupts, we are now committed to the state restore */ | 145 | /* Disable interrupts, we are now committed to the state restore */ |
| @@ -280,6 +283,7 @@ ENTRY(_user_exception) | |||
| 280 | /* Figure out which function to use for this system call. */ | 283 | /* Figure out which function to use for this system call. */ |
| 281 | /* Note Microblaze barrel shift is optional, so don't rely on it */ | 284 | /* Note Microblaze barrel shift is optional, so don't rely on it */ |
| 282 | add r12, r12, r12 /* convert num -> ptr */ | 285 | add r12, r12, r12 /* convert num -> ptr */ |
| 286 | addik r30, r0, 1 /* restarts allowed */ | ||
| 283 | add r12, r12, r12 | 287 | add r12, r12, r12 |
| 284 | lwi r12, r12, sys_call_table /* Get function pointer */ | 288 | lwi r12, r12, sys_call_table /* Get function pointer */ |
| 285 | addik r15, r0, ret_to_user-8 /* set return address */ | 289 | addik r15, r0, ret_to_user-8 /* set return address */ |
| @@ -369,6 +373,7 @@ ENTRY(_debug_exception) | |||
| 369 | bralid r15, send_sig | 373 | bralid r15, send_sig |
| 370 | add r7, r0, r0 /* 3rd param zero */ | 374 | add r7, r0, r0 /* 3rd param zero */ |
| 371 | 375 | ||
| 376 | addik r30, r0, 1 /* restarts allowed ??? */ | ||
| 372 | /* Restore r3/r4 to work around how ret_to_user works */ | 377 | /* Restore r3/r4 to work around how ret_to_user works */ |
| 373 | lwi r3, r1, PT_R3 | 378 | lwi r3, r1, PT_R3 |
| 374 | lwi r4, r1, PT_R4 | 379 | lwi r4, r1, PT_R4 |
| @@ -482,18 +487,26 @@ ENTRY(ret_from_kernel_thread) | |||
| 482 | addk r3, r0, r0 | 487 | addk r3, r0, r0 |
| 483 | 488 | ||
| 484 | work_pending: | 489 | work_pending: |
| 490 | lwi r11, r1, PT_MODE | ||
| 491 | bneid r11, 2f | ||
| 492 | 3: | ||
| 485 | enable_irq | 493 | enable_irq |
| 486 | |||
| 487 | andi r11, r19, _TIF_NEED_RESCHED | 494 | andi r11, r19, _TIF_NEED_RESCHED |
| 488 | beqi r11, 1f | 495 | beqi r11, 1f |
| 489 | bralid r15, schedule | 496 | bralid r15, schedule |
| 490 | nop | 497 | nop |
| 498 | bri 4f | ||
| 491 | 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME | 499 | 1: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME |
| 492 | beqi r11, no_work_pending | 500 | beqi r11, no_work_pending |
| 493 | addk r5, r1, r0 | 501 | addk r5, r30, r0 |
| 494 | bralid r15, do_notify_resume | 502 | bralid r15, do_notify_resume |
| 495 | addik r6, r0, 1 | 503 | addik r6, r0, 1 |
| 496 | bri no_work_pending | 504 | addk r30, r0, r0 /* no restarts from now on */ |
| 505 | 4: | ||
| 506 | disable_irq | ||
| 507 | lwi r6, r31, TS_THREAD_INFO /* get thread info */ | ||
| 508 | lwi r19, r6, TI_FLAGS /* get flags in thread info */ | ||
| 509 | bri 3b | ||
| 497 | 510 | ||
| 498 | ENTRY(ret_to_user) | 511 | ENTRY(ret_to_user) |
| 499 | disable_irq | 512 | disable_irq |
| @@ -507,6 +520,7 @@ ENTRY(ret_to_user) | |||
| 507 | no_work_pending: | 520 | no_work_pending: |
| 508 | disable_irq | 521 | disable_irq |
| 509 | 522 | ||
| 523 | 2: | ||
| 510 | /* save r31 */ | 524 | /* save r31 */ |
| 511 | swi r31, r0, PER_CPU(CURRENT_SAVE) | 525 | swi r31, r0, PER_CPU(CURRENT_SAVE) |
| 512 | /* save mode indicator */ | 526 | /* save mode indicator */ |
| @@ -559,6 +573,7 @@ no_work_pending: | |||
| 559 | nop | 573 | nop |
| 560 | 574 | ||
| 561 | sys_rt_sigreturn_wrapper: | 575 | sys_rt_sigreturn_wrapper: |
| 576 | addk r30, r0, r0 /* no restarts for this one */ | ||
| 562 | brid sys_rt_sigreturn | 577 | brid sys_rt_sigreturn |
| 563 | addk r5, r1, r0 | 578 | addk r5, r1, r0 |
| 564 | 579 | ||
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index c217367dfc7b..0536bc021cc6 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S | |||
| @@ -354,6 +354,7 @@ C_ENTRY(_user_exception): | |||
| 354 | /* Note Microblaze barrel shift is optional, so don't rely on it */ | 354 | /* Note Microblaze barrel shift is optional, so don't rely on it */ |
| 355 | add r12, r12, r12; /* convert num -> ptr */ | 355 | add r12, r12, r12; /* convert num -> ptr */ |
| 356 | add r12, r12, r12; | 356 | add r12, r12, r12; |
| 357 | addi r30, r0, 1 /* restarts allowed */ | ||
| 357 | 358 | ||
| 358 | #ifdef DEBUG | 359 | #ifdef DEBUG |
| 359 | /* Trac syscalls and stored them to syscall_debug_table */ | 360 | /* Trac syscalls and stored them to syscall_debug_table */ |
| @@ -401,26 +402,27 @@ C_ENTRY(ret_from_trap): | |||
| 401 | * trigger rescheduling. */ | 402 | * trigger rescheduling. */ |
| 402 | /* get thread info from current task */ | 403 | /* get thread info from current task */ |
| 403 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; | 404 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; |
| 404 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 405 | lwi r19, r11, TI_FLAGS; /* get flags in thread info */ |
| 405 | andi r11, r11, _TIF_NEED_RESCHED; | 406 | andi r11, r19, _TIF_NEED_RESCHED; |
| 406 | beqi r11, 5f; | 407 | beqi r11, 5f; |
| 407 | 408 | ||
| 408 | bralid r15, schedule; /* Call scheduler */ | 409 | bralid r15, schedule; /* Call scheduler */ |
| 409 | nop; /* delay slot */ | 410 | nop; /* delay slot */ |
| 411 | bri 1b | ||
| 410 | 412 | ||
| 411 | /* Maybe handle a signal */ | 413 | /* Maybe handle a signal */ |
| 412 | 5: /* get thread info from current task*/ | 414 | 5: |
| 413 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; | 415 | andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; |
| 414 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 416 | beqi r11, 4f; /* Signals to handle, handle them */ |
| 415 | andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; | ||
| 416 | beqi r11, 1f; /* Signals to handle, handle them */ | ||
| 417 | 417 | ||
| 418 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ | 418 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ |
| 419 | bralid r15, do_notify_resume; /* Handle any signals */ | 419 | bralid r15, do_notify_resume; /* Handle any signals */ |
| 420 | addi r6, r0, 1; /* Arg 2: int in_syscall */ | 420 | add r6, r30, r0; /* Arg 2: int in_syscall */ |
| 421 | add r30, r0, r0 /* no more restarts */ | ||
| 422 | bri 1b | ||
| 421 | 423 | ||
| 422 | /* Finally, return to user state. */ | 424 | /* Finally, return to user state. */ |
| 423 | 1: set_bip; /* Ints masked for state restore */ | 425 | 4: set_bip; /* Ints masked for state restore */ |
| 424 | swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ | 426 | swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ |
| 425 | VM_OFF; | 427 | VM_OFF; |
| 426 | tophys(r1,r1); | 428 | tophys(r1,r1); |
| @@ -464,6 +466,7 @@ C_ENTRY(ret_from_kernel_thread): | |||
| 464 | add r3, r0, r0 | 466 | add r3, r0, r0 |
| 465 | 467 | ||
| 466 | C_ENTRY(sys_rt_sigreturn_wrapper): | 468 | C_ENTRY(sys_rt_sigreturn_wrapper): |
| 469 | addik r30, r0, 0 /* no restarts */ | ||
| 467 | brid sys_rt_sigreturn /* Do real work */ | 470 | brid sys_rt_sigreturn /* Do real work */ |
| 468 | addik r5, r1, 0; /* add user context as 1st arg */ | 471 | addik r5, r1, 0; /* add user context as 1st arg */ |
| 469 | 472 | ||
| @@ -571,20 +574,20 @@ C_ENTRY(ret_from_exc): | |||
| 571 | 574 | ||
| 572 | /* We're returning to user mode, so check for various conditions that | 575 | /* We're returning to user mode, so check for various conditions that |
| 573 | trigger rescheduling. */ | 576 | trigger rescheduling. */ |
| 577 | 1: | ||
| 574 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ | 578 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ |
| 575 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 579 | lwi r19, r11, TI_FLAGS; /* get flags in thread info */ |
| 576 | andi r11, r11, _TIF_NEED_RESCHED; | 580 | andi r11, r19, _TIF_NEED_RESCHED; |
| 577 | beqi r11, 5f; | 581 | beqi r11, 5f; |
| 578 | 582 | ||
| 579 | /* Call the scheduler before returning from a syscall/trap. */ | 583 | /* Call the scheduler before returning from a syscall/trap. */ |
| 580 | bralid r15, schedule; /* Call scheduler */ | 584 | bralid r15, schedule; /* Call scheduler */ |
| 581 | nop; /* delay slot */ | 585 | nop; /* delay slot */ |
| 586 | bri 1b | ||
| 582 | 587 | ||
| 583 | /* Maybe handle a signal */ | 588 | /* Maybe handle a signal */ |
| 584 | 5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ | 589 | 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; |
| 585 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 590 | beqi r11, 4f; /* Signals to handle, handle them */ |
| 586 | andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; | ||
| 587 | beqi r11, 1f; /* Signals to handle, handle them */ | ||
| 588 | 591 | ||
| 589 | /* | 592 | /* |
| 590 | * Handle a signal return; Pending signals should be in r18. | 593 | * Handle a signal return; Pending signals should be in r18. |
| @@ -600,9 +603,10 @@ C_ENTRY(ret_from_exc): | |||
| 600 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ | 603 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ |
| 601 | bralid r15, do_notify_resume; /* Handle any signals */ | 604 | bralid r15, do_notify_resume; /* Handle any signals */ |
| 602 | addi r6, r0, 0; /* Arg 2: int in_syscall */ | 605 | addi r6, r0, 0; /* Arg 2: int in_syscall */ |
| 606 | bri 1b | ||
| 603 | 607 | ||
| 604 | /* Finally, return to user state. */ | 608 | /* Finally, return to user state. */ |
| 605 | 1: set_bip; /* Ints masked for state restore */ | 609 | 4: set_bip; /* Ints masked for state restore */ |
| 606 | swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ | 610 | swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ |
| 607 | VM_OFF; | 611 | VM_OFF; |
| 608 | tophys(r1,r1); | 612 | tophys(r1,r1); |
| @@ -682,22 +686,23 @@ ret_from_irq: | |||
| 682 | lwi r11, r1, PT_MODE; | 686 | lwi r11, r1, PT_MODE; |
| 683 | bnei r11, 2f; | 687 | bnei r11, 2f; |
| 684 | 688 | ||
| 689 | 1: | ||
| 685 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; | 690 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; |
| 686 | lwi r11, r11, TI_FLAGS; /* MS: get flags from thread info */ | 691 | lwi r19, r11, TI_FLAGS; /* MS: get flags from thread info */ |
| 687 | andi r11, r11, _TIF_NEED_RESCHED; | 692 | andi r11, r19, _TIF_NEED_RESCHED; |
| 688 | beqi r11, 5f | 693 | beqi r11, 5f |
| 689 | bralid r15, schedule; | 694 | bralid r15, schedule; |
| 690 | nop; /* delay slot */ | 695 | nop; /* delay slot */ |
| 696 | bri 1b | ||
| 691 | 697 | ||
| 692 | /* Maybe handle a signal */ | 698 | /* Maybe handle a signal */ |
| 693 | 5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* MS: get thread info */ | 699 | 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; |
| 694 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | ||
| 695 | andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; | ||
| 696 | beqid r11, no_intr_resched | 700 | beqid r11, no_intr_resched |
| 697 | /* Handle a signal return; Pending signals should be in r18. */ | 701 | /* Handle a signal return; Pending signals should be in r18. */ |
| 698 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ | 702 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ |
| 699 | bralid r15, do_notify_resume; /* Handle any signals */ | 703 | bralid r15, do_notify_resume; /* Handle any signals */ |
| 700 | addi r6, r0, 0; /* Arg 2: int in_syscall */ | 704 | addi r6, r0, 0; /* Arg 2: int in_syscall */ |
| 705 | bri 1b | ||
| 701 | 706 | ||
| 702 | /* Finally, return to user state. */ | 707 | /* Finally, return to user state. */ |
| 703 | no_intr_resched: | 708 | no_intr_resched: |
| @@ -815,28 +820,29 @@ dbtrap_call: /* Return point for kernel/user entry + 8 because of rtsd r15, 8 */ | |||
| 815 | lwi r11, r1, PT_MODE; | 820 | lwi r11, r1, PT_MODE; |
| 816 | bnei r11, 2f; | 821 | bnei r11, 2f; |
| 817 | /* MS: Return to user space - gdb */ | 822 | /* MS: Return to user space - gdb */ |
| 823 | 1: | ||
| 818 | /* Get current task ptr into r11 */ | 824 | /* Get current task ptr into r11 */ |
| 819 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ | 825 | lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ |
| 820 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 826 | lwi r19, r11, TI_FLAGS; /* get flags in thread info */ |
| 821 | andi r11, r11, _TIF_NEED_RESCHED; | 827 | andi r11, r19, _TIF_NEED_RESCHED; |
| 822 | beqi r11, 5f; | 828 | beqi r11, 5f; |
| 823 | 829 | ||
| 824 | /* Call the scheduler before returning from a syscall/trap. */ | 830 | /* Call the scheduler before returning from a syscall/trap. */ |
| 825 | bralid r15, schedule; /* Call scheduler */ | 831 | bralid r15, schedule; /* Call scheduler */ |
| 826 | nop; /* delay slot */ | 832 | nop; /* delay slot */ |
| 833 | bri 1b | ||
| 827 | 834 | ||
| 828 | /* Maybe handle a signal */ | 835 | /* Maybe handle a signal */ |
| 829 | 5: lwi r11, CURRENT_TASK, TS_THREAD_INFO; /* get thread info */ | 836 | 5: andi r11, r19, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; |
| 830 | lwi r11, r11, TI_FLAGS; /* get flags in thread info */ | 837 | beqi r11, 4f; /* Signals to handle, handle them */ |
| 831 | andi r11, r11, _TIF_SIGPENDING | _TIF_NOTIFY_RESUME; | ||
| 832 | beqi r11, 1f; /* Signals to handle, handle them */ | ||
| 833 | 838 | ||
| 834 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ | 839 | addik r5, r1, 0; /* Arg 1: struct pt_regs *regs */ |
| 835 | bralid r15, do_notify_resume; /* Handle any signals */ | 840 | bralid r15, do_notify_resume; /* Handle any signals */ |
| 836 | addi r6, r0, 0; /* Arg 2: int in_syscall */ | 841 | addi r6, r0, 0; /* Arg 2: int in_syscall */ |
| 842 | bri 1b | ||
| 837 | 843 | ||
| 838 | /* Finally, return to user state. */ | 844 | /* Finally, return to user state. */ |
| 839 | 1: swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ | 845 | 4: swi CURRENT_TASK, r0, PER_CPU(CURRENT_SAVE); /* save current */ |
| 840 | VM_OFF; | 846 | VM_OFF; |
| 841 | tophys(r1,r1); | 847 | tophys(r1,r1); |
| 842 | /* MS: Restore all regs */ | 848 | /* MS: Restore all regs */ |
diff --git a/arch/microblaze/kernel/ptrace.c b/arch/microblaze/kernel/ptrace.c index ab1b9db661f3..b050219c42e6 100644 --- a/arch/microblaze/kernel/ptrace.c +++ b/arch/microblaze/kernel/ptrace.c | |||
| @@ -164,29 +164,6 @@ asmlinkage void do_syscall_trace_leave(struct pt_regs *regs) | |||
| 164 | tracehook_report_syscall_exit(regs, step); | 164 | tracehook_report_syscall_exit(regs, step); |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | #if 0 | ||
| 168 | static asmlinkage void syscall_trace(void) | ||
| 169 | { | ||
| 170 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | ||
| 171 | return; | ||
| 172 | if (!(current->ptrace & PT_PTRACED)) | ||
| 173 | return; | ||
| 174 | /* The 0x80 provides a way for the tracing parent to distinguish | ||
| 175 | between a syscall stop and SIGTRAP delivery */ | ||
| 176 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) | ||
| 177 | ? 0x80 : 0)); | ||
| 178 | /* | ||
| 179 | * this isn't the same as continuing with a signal, but it will do | ||
| 180 | * for normal use. strace only continues with a signal if the | ||
| 181 | * stopping signal is not SIGTRAP. -brl | ||
| 182 | */ | ||
| 183 | if (current->exit_code) { | ||
| 184 | send_sig(current->exit_code, current, 1); | ||
| 185 | current->exit_code = 0; | ||
| 186 | } | ||
| 187 | } | ||
| 188 | #endif | ||
| 189 | |||
| 190 | void ptrace_disable(struct task_struct *child) | 167 | void ptrace_disable(struct task_struct *child) |
| 191 | { | 168 | { |
| 192 | /* nothing to do */ | 169 | /* nothing to do */ |
diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signal.c index ac3d0a0f4814..9f7a8bde0686 100644 --- a/arch/microblaze/kernel/signal.c +++ b/arch/microblaze/kernel/signal.c | |||
| @@ -41,13 +41,6 @@ | |||
| 41 | #include <asm/cacheflush.h> | 41 | #include <asm/cacheflush.h> |
| 42 | #include <asm/syscalls.h> | 42 | #include <asm/syscalls.h> |
| 43 | 43 | ||
| 44 | asmlinkage long | ||
| 45 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
| 46 | struct pt_regs *regs) | ||
| 47 | { | ||
| 48 | return do_sigaltstack(uss, uoss, regs->r1); | ||
| 49 | } | ||
| 50 | |||
| 51 | /* | 44 | /* |
| 52 | * Do a signal return; undo the signal stack. | 45 | * Do a signal return; undo the signal stack. |
| 53 | */ | 46 | */ |
| @@ -109,9 +102,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) | |||
| 109 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &rval)) | 102 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &rval)) |
| 110 | goto badframe; | 103 | goto badframe; |
| 111 | 104 | ||
| 112 | /* It is more difficult to avoid calling this function than to | 105 | if (restore_altstack(&frame->uc.uc_stack)) |
| 113 | call it and ignore errors. */ | ||
| 114 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1) == -EFAULT) | ||
| 115 | goto badframe; | 106 | goto badframe; |
| 116 | 107 | ||
| 117 | return rval; | 108 | return rval; |
| @@ -194,11 +185,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 194 | /* Create the ucontext. */ | 185 | /* Create the ucontext. */ |
| 195 | err |= __put_user(0, &frame->uc.uc_flags); | 186 | err |= __put_user(0, &frame->uc.uc_flags); |
| 196 | err |= __put_user(NULL, &frame->uc.uc_link); | 187 | err |= __put_user(NULL, &frame->uc.uc_link); |
| 197 | err |= __put_user((void __user *)current->sas_ss_sp, | 188 | err |= __save_altstack(&frame->uc.uc_stack, regs->r1); |
| 198 | &frame->uc.uc_stack.ss_sp); | ||
| 199 | err |= __put_user(sas_ss_flags(regs->r1), | ||
| 200 | &frame->uc.uc_stack.ss_flags); | ||
| 201 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 202 | err |= setup_sigcontext(&frame->uc.uc_mcontext, | 189 | err |= setup_sigcontext(&frame->uc.uc_mcontext, |
| 203 | regs, set->sig[0]); | 190 | regs, set->sig[0]); |
| 204 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 191 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| @@ -356,15 +343,6 @@ static void do_signal(struct pt_regs *regs, int in_syscall) | |||
| 356 | 343 | ||
| 357 | asmlinkage void do_notify_resume(struct pt_regs *regs, int in_syscall) | 344 | asmlinkage void do_notify_resume(struct pt_regs *regs, int in_syscall) |
| 358 | { | 345 | { |
| 359 | /* | ||
| 360 | * We want the common case to go fast, which | ||
| 361 | * is why we may in certain cases get here from | ||
| 362 | * kernel mode. Just return without doing anything | ||
| 363 | * if so. | ||
| 364 | */ | ||
| 365 | if (kernel_mode(regs)) | ||
| 366 | return; | ||
| 367 | |||
| 368 | if (test_thread_flag(TIF_SIGPENDING)) | 346 | if (test_thread_flag(TIF_SIGPENDING)) |
| 369 | do_signal(regs, in_syscall); | 347 | do_signal(regs, in_syscall); |
| 370 | 348 | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 5d7170bfeb28..198641589bb5 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -40,6 +40,7 @@ config MIPS | |||
| 40 | select HAVE_MOD_ARCH_SPECIFIC | 40 | select HAVE_MOD_ARCH_SPECIFIC |
| 41 | select MODULES_USE_ELF_REL if MODULES | 41 | select MODULES_USE_ELF_REL if MODULES |
| 42 | select MODULES_USE_ELF_RELA if MODULES && 64BIT | 42 | select MODULES_USE_ELF_RELA if MODULES && 64BIT |
| 43 | select CLONE_BACKWARDS | ||
| 43 | 44 | ||
| 44 | menu "Machine selection" | 45 | menu "Machine selection" |
| 45 | 46 | ||
diff --git a/arch/mips/include/asm/compat.h b/arch/mips/include/asm/compat.h index 3c5d1464b7bd..ebaae9649f8a 100644 --- a/arch/mips/include/asm/compat.h +++ b/arch/mips/include/asm/compat.h | |||
| @@ -288,6 +288,14 @@ struct compat_shmid64_ds { | |||
| 288 | compat_ulong_t __unused2; | 288 | compat_ulong_t __unused2; |
| 289 | }; | 289 | }; |
| 290 | 290 | ||
| 291 | /* MIPS has unusual order of fields in stack_t */ | ||
| 292 | typedef struct compat_sigaltstack { | ||
| 293 | compat_uptr_t ss_sp; | ||
| 294 | compat_size_t ss_size; | ||
| 295 | int ss_flags; | ||
| 296 | } compat_stack_t; | ||
| 297 | #define compat_sigaltstack compat_sigaltstack | ||
| 298 | |||
| 291 | static inline int is_compat_task(void) | 299 | static inline int is_compat_task(void) |
| 292 | { | 300 | { |
| 293 | return test_thread_flag(TIF_32BIT_ADDR); | 301 | return test_thread_flag(TIF_32BIT_ADDR); |
diff --git a/arch/mips/include/asm/signal.h b/arch/mips/include/asm/signal.h index cf4a08062d1d..197f6367c201 100644 --- a/arch/mips/include/asm/signal.h +++ b/arch/mips/include/asm/signal.h | |||
| @@ -21,4 +21,6 @@ | |||
| 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 | ||
| 25 | |||
| 24 | #endif /* _ASM_SIGNAL_H */ | 26 | #endif /* _ASM_SIGNAL_H */ |
diff --git a/arch/mips/include/asm/sim.h b/arch/mips/include/asm/sim.h index 0cd719fabb51..91831800c480 100644 --- a/arch/mips/include/asm/sim.h +++ b/arch/mips/include/asm/sim.h | |||
| @@ -20,10 +20,10 @@ | |||
| 20 | #define save_static_function(symbol) \ | 20 | #define save_static_function(symbol) \ |
| 21 | __asm__( \ | 21 | __asm__( \ |
| 22 | ".text\n\t" \ | 22 | ".text\n\t" \ |
| 23 | ".globl\t" #symbol "\n\t" \ | 23 | ".globl\t__" #symbol "\n\t" \ |
| 24 | ".align\t2\n\t" \ | 24 | ".align\t2\n\t" \ |
| 25 | ".type\t" #symbol ", @function\n\t" \ | 25 | ".type\t__" #symbol ", @function\n\t" \ |
| 26 | ".ent\t" #symbol ", 0\n" \ | 26 | ".ent\t__" #symbol ", 0\n__" \ |
| 27 | #symbol":\n\t" \ | 27 | #symbol":\n\t" \ |
| 28 | ".frame\t$29, 0, $31\n\t" \ | 28 | ".frame\t$29, 0, $31\n\t" \ |
| 29 | "sw\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \ | 29 | "sw\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \ |
| @@ -35,9 +35,9 @@ __asm__( \ | |||
| 35 | "sw\t$22,"__str(PT_R22)"($29)\n\t" \ | 35 | "sw\t$22,"__str(PT_R22)"($29)\n\t" \ |
| 36 | "sw\t$23,"__str(PT_R23)"($29)\n\t" \ | 36 | "sw\t$23,"__str(PT_R23)"($29)\n\t" \ |
| 37 | "sw\t$30,"__str(PT_R30)"($29)\n\t" \ | 37 | "sw\t$30,"__str(PT_R30)"($29)\n\t" \ |
| 38 | "j\t_" #symbol "\n\t" \ | 38 | "j\t" #symbol "\n\t" \ |
| 39 | ".end\t" #symbol "\n\t" \ | 39 | ".end\t__" #symbol "\n\t" \ |
| 40 | ".size\t" #symbol",. - " #symbol) | 40 | ".size\t__" #symbol",. - __" #symbol) |
| 41 | 41 | ||
| 42 | #define nabi_no_regargs | 42 | #define nabi_no_regargs |
| 43 | 43 | ||
| @@ -48,10 +48,10 @@ __asm__( \ | |||
| 48 | #define save_static_function(symbol) \ | 48 | #define save_static_function(symbol) \ |
| 49 | __asm__( \ | 49 | __asm__( \ |
| 50 | ".text\n\t" \ | 50 | ".text\n\t" \ |
| 51 | ".globl\t" #symbol "\n\t" \ | 51 | ".globl\t__" #symbol "\n\t" \ |
| 52 | ".align\t2\n\t" \ | 52 | ".align\t2\n\t" \ |
| 53 | ".type\t" #symbol ", @function\n\t" \ | 53 | ".type\t__" #symbol ", @function\n\t" \ |
| 54 | ".ent\t" #symbol ", 0\n" \ | 54 | ".ent\t__" #symbol ", 0\n__" \ |
| 55 | #symbol":\n\t" \ | 55 | #symbol":\n\t" \ |
| 56 | ".frame\t$29, 0, $31\n\t" \ | 56 | ".frame\t$29, 0, $31\n\t" \ |
| 57 | "sd\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \ | 57 | "sd\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \ |
| @@ -63,9 +63,9 @@ __asm__( \ | |||
| 63 | "sd\t$22,"__str(PT_R22)"($29)\n\t" \ | 63 | "sd\t$22,"__str(PT_R22)"($29)\n\t" \ |
| 64 | "sd\t$23,"__str(PT_R23)"($29)\n\t" \ | 64 | "sd\t$23,"__str(PT_R23)"($29)\n\t" \ |
| 65 | "sd\t$30,"__str(PT_R30)"($29)\n\t" \ | 65 | "sd\t$30,"__str(PT_R30)"($29)\n\t" \ |
| 66 | "j\t_" #symbol "\n\t" \ | 66 | "j\t" #symbol "\n\t" \ |
| 67 | ".end\t" #symbol "\n\t" \ | 67 | ".end\t__" #symbol "\n\t" \ |
| 68 | ".size\t" #symbol",. - " #symbol) | 68 | ".size\t__" #symbol",. - __" #symbol) |
| 69 | 69 | ||
| 70 | #define nabi_no_regargs \ | 70 | #define nabi_no_regargs \ |
| 71 | unsigned long __dummy0, \ | 71 | unsigned long __dummy0, \ |
diff --git a/arch/mips/include/asm/unistd.h b/arch/mips/include/asm/unistd.h index 9e47cc11aa26..64f661e32879 100644 --- a/arch/mips/include/asm/unistd.h +++ b/arch/mips/include/asm/unistd.h | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #define __ARCH_WANT_SYS_OLDUMOUNT | 35 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 36 | #define __ARCH_WANT_SYS_SIGPENDING | 36 | #define __ARCH_WANT_SYS_SIGPENDING |
| 37 | #define __ARCH_WANT_SYS_SIGPROCMASK | 37 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 38 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 39 | # ifdef CONFIG_32BIT | 38 | # ifdef CONFIG_32BIT |
| 40 | # define __ARCH_WANT_STAT64 | 39 | # define __ARCH_WANT_STAT64 |
| 41 | # define __ARCH_WANT_SYS_TIME | 40 | # define __ARCH_WANT_SYS_TIME |
| @@ -43,6 +42,8 @@ | |||
| 43 | # ifdef CONFIG_MIPS32_O32 | 42 | # ifdef CONFIG_MIPS32_O32 |
| 44 | # define __ARCH_WANT_COMPAT_SYS_TIME | 43 | # define __ARCH_WANT_COMPAT_SYS_TIME |
| 45 | # endif | 44 | # endif |
| 45 | #define __ARCH_WANT_SYS_FORK | ||
| 46 | #define __ARCH_WANT_SYS_CLONE | ||
| 46 | 47 | ||
| 47 | /* whitelists for checksyscalls */ | 48 | /* whitelists for checksyscalls */ |
| 48 | #define __IGNORE_select | 49 | #define __IGNORE_select |
diff --git a/arch/mips/include/uapi/asm/signal.h b/arch/mips/include/uapi/asm/signal.h index 770732cb8d03..6783c887a678 100644 --- a/arch/mips/include/uapi/asm/signal.h +++ b/arch/mips/include/uapi/asm/signal.h | |||
| @@ -96,15 +96,13 @@ typedef unsigned long old_sigset_t; /* at least 32 bits */ | |||
| 96 | 96 | ||
| 97 | #include <asm-generic/signal-defs.h> | 97 | #include <asm-generic/signal-defs.h> |
| 98 | 98 | ||
| 99 | #ifndef __KERNEL__ | ||
| 99 | struct sigaction { | 100 | struct sigaction { |
| 100 | unsigned int sa_flags; | 101 | unsigned int sa_flags; |
| 101 | __sighandler_t sa_handler; | 102 | __sighandler_t sa_handler; |
| 102 | sigset_t sa_mask; | 103 | sigset_t sa_mask; |
| 103 | }; | 104 | }; |
| 104 | 105 | #endif | |
| 105 | struct k_sigaction { | ||
| 106 | struct sigaction sa; | ||
| 107 | }; | ||
| 108 | 106 | ||
| 109 | /* IRIX compatible stack_t */ | 107 | /* IRIX compatible stack_t */ |
| 110 | typedef struct sigaltstack { | 108 | typedef struct sigaltstack { |
diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c index 7adab86c632c..253bd8ad7446 100644 --- a/arch/mips/kernel/linux32.c +++ b/arch/mips/kernel/linux32.c | |||
| @@ -119,22 +119,6 @@ SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf, | |||
| 119 | return sys_pwrite64(fd, buf, count, merge_64(a4, a5)); | 119 | return sys_pwrite64(fd, buf, count, merge_64(a4, a5)); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | SYSCALL_DEFINE2(32_sched_rr_get_interval, compat_pid_t, pid, | ||
| 123 | struct compat_timespec __user *, interval) | ||
| 124 | { | ||
| 125 | struct timespec t; | ||
| 126 | int ret; | ||
| 127 | mm_segment_t old_fs = get_fs(); | ||
| 128 | |||
| 129 | set_fs(KERNEL_DS); | ||
| 130 | ret = sys_sched_rr_get_interval(pid, (struct timespec __user *)&t); | ||
| 131 | set_fs(old_fs); | ||
| 132 | if (put_user (t.tv_sec, &interval->tv_sec) || | ||
| 133 | __put_user(t.tv_nsec, &interval->tv_nsec)) | ||
| 134 | return -EFAULT; | ||
| 135 | return ret; | ||
| 136 | } | ||
| 137 | |||
| 138 | #ifdef CONFIG_SYSVIPC | 122 | #ifdef CONFIG_SYSVIPC |
| 139 | 123 | ||
| 140 | SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third, | 124 | SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third, |
| @@ -295,27 +279,6 @@ asmlinkage long sys32_fallocate(int fd, int mode, unsigned offset_a2, | |||
| 295 | merge_64(len_a4, len_a5)); | 279 | merge_64(len_a4, len_a5)); |
| 296 | } | 280 | } |
| 297 | 281 | ||
| 298 | save_static_function(sys32_clone); | ||
| 299 | static int noinline __used | ||
| 300 | _sys32_clone(nabi_no_regargs struct pt_regs regs) | ||
| 301 | { | ||
| 302 | unsigned long clone_flags; | ||
| 303 | unsigned long newsp; | ||
| 304 | int __user *parent_tidptr, *child_tidptr; | ||
| 305 | |||
| 306 | clone_flags = regs.regs[4]; | ||
| 307 | newsp = regs.regs[5]; | ||
| 308 | if (!newsp) | ||
| 309 | newsp = regs.regs[29]; | ||
| 310 | parent_tidptr = (int __user *) regs.regs[6]; | ||
| 311 | |||
| 312 | /* Use __dummy4 instead of getting it off the stack, so that | ||
| 313 | syscall() works. */ | ||
| 314 | child_tidptr = (int __user *) __dummy4; | ||
| 315 | return do_fork(clone_flags, newsp, 0, | ||
| 316 | parent_tidptr, child_tidptr); | ||
| 317 | } | ||
| 318 | |||
| 319 | asmlinkage long sys32_lookup_dcookie(u32 a0, u32 a1, char __user *buf, | 282 | asmlinkage long sys32_lookup_dcookie(u32 a0, u32 a1, char __user *buf, |
| 320 | size_t len) | 283 | size_t len) |
| 321 | { | 284 | { |
| @@ -328,10 +291,3 @@ SYSCALL_DEFINE6(32_fanotify_mark, int, fanotify_fd, unsigned int, flags, | |||
| 328 | return sys_fanotify_mark(fanotify_fd, flags, merge_64(a3, a4), | 291 | return sys_fanotify_mark(fanotify_fd, flags, merge_64(a3, a4), |
| 329 | dfd, pathname); | 292 | dfd, pathname); |
| 330 | } | 293 | } |
| 331 | |||
| 332 | SYSCALL_DEFINE6(32_futex, u32 __user *, uaddr, int, op, u32, val, | ||
| 333 | struct compat_timespec __user *, utime, u32 __user *, uaddr2, | ||
| 334 | u32, val3) | ||
| 335 | { | ||
| 336 | return compat_sys_futex(uaddr, op, val, utime, uaddr2, val3); | ||
| 337 | } | ||
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index a11c6f9fdd5e..a33d2ef8f273 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
| @@ -156,7 +156,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
| 156 | *childregs = *regs; | 156 | *childregs = *regs; |
| 157 | childregs->regs[7] = 0; /* Clear error flag */ | 157 | childregs->regs[7] = 0; /* Clear error flag */ |
| 158 | childregs->regs[2] = 0; /* Child gets zero as return value */ | 158 | childregs->regs[2] = 0; /* Child gets zero as return value */ |
| 159 | childregs->regs[29] = usp; | 159 | if (usp) |
| 160 | childregs->regs[29] = usp; | ||
| 160 | ti->addr_limit = USER_DS; | 161 | ti->addr_limit = USER_DS; |
| 161 | 162 | ||
| 162 | p->thread.reg29 = (unsigned long) childregs; | 163 | p->thread.reg29 = (unsigned long) childregs; |
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index d20a4bc9ed05..80ff9422215f 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
| @@ -226,7 +226,7 @@ einval: li v0, -ENOSYS | |||
| 226 | .macro syscalltable | 226 | .macro syscalltable |
| 227 | sys sys_syscall 8 /* 4000 */ | 227 | sys sys_syscall 8 /* 4000 */ |
| 228 | sys sys_exit 1 | 228 | sys sys_exit 1 |
| 229 | sys sys_fork 0 | 229 | sys __sys_fork 0 |
| 230 | sys sys_read 3 | 230 | sys sys_read 3 |
| 231 | sys sys_write 3 | 231 | sys sys_write 3 |
| 232 | sys sys_open 3 /* 4005 */ | 232 | sys sys_open 3 /* 4005 */ |
| @@ -344,7 +344,7 @@ einval: li v0, -ENOSYS | |||
| 344 | sys sys_ipc 6 | 344 | sys sys_ipc 6 |
| 345 | sys sys_fsync 1 | 345 | sys sys_fsync 1 |
| 346 | sys sys_sigreturn 0 | 346 | sys sys_sigreturn 0 |
| 347 | sys sys_clone 0 /* 4120 */ | 347 | sys __sys_clone 6 /* 4120 */ |
| 348 | sys sys_setdomainname 2 | 348 | sys sys_setdomainname 2 |
| 349 | sys sys_newuname 1 | 349 | sys sys_newuname 1 |
| 350 | sys sys_ni_syscall 0 /* sys_modify_ldt */ | 350 | sys sys_ni_syscall 0 /* sys_modify_ldt */ |
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index b64f642da073..9444ad9ea575 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
| @@ -170,8 +170,8 @@ sys_call_table: | |||
| 170 | PTR sys_socketpair | 170 | PTR sys_socketpair |
| 171 | PTR sys_setsockopt | 171 | PTR sys_setsockopt |
| 172 | PTR sys_getsockopt | 172 | PTR sys_getsockopt |
| 173 | PTR sys_clone /* 5055 */ | 173 | PTR __sys_clone /* 5055 */ |
| 174 | PTR sys_fork | 174 | PTR __sys_fork |
| 175 | PTR sys_execve | 175 | PTR sys_execve |
| 176 | PTR sys_exit | 176 | PTR sys_exit |
| 177 | PTR sys_wait4 | 177 | PTR sys_wait4 |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index c29ac197f446..3b18a8e29215 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -117,8 +117,8 @@ EXPORT(sysn32_call_table) | |||
| 117 | PTR sys_mprotect /* 6010 */ | 117 | PTR sys_mprotect /* 6010 */ |
| 118 | PTR sys_munmap | 118 | PTR sys_munmap |
| 119 | PTR sys_brk | 119 | PTR sys_brk |
| 120 | PTR sys_32_rt_sigaction | 120 | PTR compat_sys_rt_sigaction |
| 121 | PTR sys_32_rt_sigprocmask | 121 | PTR compat_sys_rt_sigprocmask |
| 122 | PTR compat_sys_ioctl /* 6015 */ | 122 | PTR compat_sys_ioctl /* 6015 */ |
| 123 | PTR sys_pread64 | 123 | PTR sys_pread64 |
| 124 | PTR sys_pwrite64 | 124 | PTR sys_pwrite64 |
| @@ -159,8 +159,8 @@ EXPORT(sysn32_call_table) | |||
| 159 | PTR sys_socketpair | 159 | PTR sys_socketpair |
| 160 | PTR compat_sys_setsockopt | 160 | PTR compat_sys_setsockopt |
| 161 | PTR sys_getsockopt | 161 | PTR sys_getsockopt |
| 162 | PTR sys_clone /* 6055 */ | 162 | PTR __sys_clone /* 6055 */ |
| 163 | PTR sys_fork | 163 | PTR __sys_fork |
| 164 | PTR compat_sys_execve | 164 | PTR compat_sys_execve |
| 165 | PTR sys_exit | 165 | PTR sys_exit |
| 166 | PTR compat_sys_wait4 | 166 | PTR compat_sys_wait4 |
| @@ -229,11 +229,11 @@ EXPORT(sysn32_call_table) | |||
| 229 | PTR sys_getsid | 229 | PTR sys_getsid |
| 230 | PTR sys_capget | 230 | PTR sys_capget |
| 231 | PTR sys_capset | 231 | PTR sys_capset |
| 232 | PTR sys_32_rt_sigpending /* 6125 */ | 232 | PTR compat_sys_rt_sigpending /* 6125 */ |
| 233 | PTR compat_sys_rt_sigtimedwait | 233 | PTR compat_sys_rt_sigtimedwait |
| 234 | PTR sys_32_rt_sigqueueinfo | 234 | PTR compat_sys_rt_sigqueueinfo |
| 235 | PTR sysn32_rt_sigsuspend | 235 | PTR compat_sys_rt_sigsuspend |
| 236 | PTR sys32_sigaltstack | 236 | PTR compat_sys_sigaltstack |
| 237 | PTR compat_sys_utime /* 6130 */ | 237 | PTR compat_sys_utime /* 6130 */ |
| 238 | PTR sys_mknod | 238 | PTR sys_mknod |
| 239 | PTR sys_32_personality | 239 | PTR sys_32_personality |
| @@ -249,7 +249,7 @@ EXPORT(sysn32_call_table) | |||
| 249 | PTR sys_sched_getscheduler | 249 | PTR sys_sched_getscheduler |
| 250 | PTR sys_sched_get_priority_max | 250 | PTR sys_sched_get_priority_max |
| 251 | PTR sys_sched_get_priority_min | 251 | PTR sys_sched_get_priority_min |
| 252 | PTR sys_32_sched_rr_get_interval /* 6145 */ | 252 | PTR compat_sys_sched_rr_get_interval /* 6145 */ |
| 253 | PTR sys_mlock | 253 | PTR sys_mlock |
| 254 | PTR sys_munlock | 254 | PTR sys_munlock |
| 255 | PTR sys_mlockall | 255 | PTR sys_mlockall |
| @@ -298,7 +298,7 @@ EXPORT(sysn32_call_table) | |||
| 298 | PTR sys_fremovexattr | 298 | PTR sys_fremovexattr |
| 299 | PTR sys_tkill | 299 | PTR sys_tkill |
| 300 | PTR sys_ni_syscall | 300 | PTR sys_ni_syscall |
| 301 | PTR sys_32_futex | 301 | PTR compat_sys_futex |
| 302 | PTR compat_sys_sched_setaffinity /* 6195 */ | 302 | PTR compat_sys_sched_setaffinity /* 6195 */ |
| 303 | PTR compat_sys_sched_getaffinity | 303 | PTR compat_sys_sched_getaffinity |
| 304 | PTR sys_cacheflush | 304 | PTR sys_cacheflush |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index cf3e75e46650..063cd0d6ddd2 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
| @@ -194,7 +194,7 @@ einval: li v0, -ENOSYS | |||
| 194 | sys_call_table: | 194 | sys_call_table: |
| 195 | PTR sys32_syscall /* 4000 */ | 195 | PTR sys32_syscall /* 4000 */ |
| 196 | PTR sys_exit | 196 | PTR sys_exit |
| 197 | PTR sys_fork | 197 | PTR __sys_fork |
| 198 | PTR sys_read | 198 | PTR sys_read |
| 199 | PTR sys_write | 199 | PTR sys_write |
| 200 | PTR compat_sys_open /* 4005 */ | 200 | PTR compat_sys_open /* 4005 */ |
| @@ -312,7 +312,7 @@ sys_call_table: | |||
| 312 | PTR sys_32_ipc | 312 | PTR sys_32_ipc |
| 313 | PTR sys_fsync | 313 | PTR sys_fsync |
| 314 | PTR sys32_sigreturn | 314 | PTR sys32_sigreturn |
| 315 | PTR sys32_clone /* 4120 */ | 315 | PTR __sys_clone /* 4120 */ |
| 316 | PTR sys_setdomainname | 316 | PTR sys_setdomainname |
| 317 | PTR sys_newuname | 317 | PTR sys_newuname |
| 318 | PTR sys_ni_syscall /* sys_modify_ldt */ | 318 | PTR sys_ni_syscall /* sys_modify_ldt */ |
| @@ -357,7 +357,7 @@ sys_call_table: | |||
| 357 | PTR sys_sched_yield | 357 | PTR sys_sched_yield |
| 358 | PTR sys_sched_get_priority_max | 358 | PTR sys_sched_get_priority_max |
| 359 | PTR sys_sched_get_priority_min | 359 | PTR sys_sched_get_priority_min |
| 360 | PTR sys_32_sched_rr_get_interval /* 4165 */ | 360 | PTR compat_sys_sched_rr_get_interval /* 4165 */ |
| 361 | PTR compat_sys_nanosleep | 361 | PTR compat_sys_nanosleep |
| 362 | PTR sys_mremap | 362 | PTR sys_mremap |
| 363 | PTR sys_accept | 363 | PTR sys_accept |
| @@ -386,19 +386,19 @@ sys_call_table: | |||
| 386 | PTR sys_getresgid | 386 | PTR sys_getresgid |
| 387 | PTR sys_prctl | 387 | PTR sys_prctl |
| 388 | PTR sys32_rt_sigreturn | 388 | PTR sys32_rt_sigreturn |
| 389 | PTR sys_32_rt_sigaction | 389 | PTR compat_sys_rt_sigaction |
| 390 | PTR sys_32_rt_sigprocmask /* 4195 */ | 390 | PTR compat_sys_rt_sigprocmask /* 4195 */ |
| 391 | PTR sys_32_rt_sigpending | 391 | PTR compat_sys_rt_sigpending |
| 392 | PTR compat_sys_rt_sigtimedwait | 392 | PTR compat_sys_rt_sigtimedwait |
| 393 | PTR sys_32_rt_sigqueueinfo | 393 | PTR compat_sys_rt_sigqueueinfo |
| 394 | PTR sys32_rt_sigsuspend | 394 | PTR compat_sys_rt_sigsuspend |
| 395 | PTR sys_32_pread /* 4200 */ | 395 | PTR sys_32_pread /* 4200 */ |
| 396 | PTR sys_32_pwrite | 396 | PTR sys_32_pwrite |
| 397 | PTR sys_chown | 397 | PTR sys_chown |
| 398 | PTR sys_getcwd | 398 | PTR sys_getcwd |
| 399 | PTR sys_capget | 399 | PTR sys_capget |
| 400 | PTR sys_capset /* 4205 */ | 400 | PTR sys_capset /* 4205 */ |
| 401 | PTR sys32_sigaltstack | 401 | PTR compat_sys_sigaltstack |
| 402 | PTR sys_32_sendfile | 402 | PTR sys_32_sendfile |
| 403 | PTR sys_ni_syscall | 403 | PTR sys_ni_syscall |
| 404 | PTR sys_ni_syscall | 404 | PTR sys_ni_syscall |
| @@ -430,7 +430,7 @@ sys_call_table: | |||
| 430 | PTR sys_fremovexattr /* 4235 */ | 430 | PTR sys_fremovexattr /* 4235 */ |
| 431 | PTR sys_tkill | 431 | PTR sys_tkill |
| 432 | PTR sys_sendfile64 | 432 | PTR sys_sendfile64 |
| 433 | PTR sys_32_futex | 433 | PTR compat_sys_futex |
| 434 | PTR compat_sys_sched_setaffinity | 434 | PTR compat_sys_sched_setaffinity |
| 435 | PTR compat_sys_sched_getaffinity /* 4240 */ | 435 | PTR compat_sys_sched_getaffinity /* 4240 */ |
| 436 | PTR compat_sys_io_setup | 436 | PTR compat_sys_io_setup |
| @@ -470,7 +470,7 @@ sys_call_table: | |||
| 470 | PTR compat_sys_mq_notify /* 4275 */ | 470 | PTR compat_sys_mq_notify /* 4275 */ |
| 471 | PTR compat_sys_mq_getsetattr | 471 | PTR compat_sys_mq_getsetattr |
| 472 | PTR sys_ni_syscall /* sys_vserver */ | 472 | PTR sys_ni_syscall /* sys_vserver */ |
| 473 | PTR sys_32_waitid | 473 | PTR compat_sys_waitid |
| 474 | PTR sys_ni_syscall /* available, was setaltroot */ | 474 | PTR sys_ni_syscall /* available, was setaltroot */ |
| 475 | PTR sys_add_key /* 4280 */ | 475 | PTR sys_add_key /* 4280 */ |
| 476 | PTR sys_request_key | 476 | PTR sys_request_key |
diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c index b6aa77035019..95b019d92f50 100644 --- a/arch/mips/kernel/signal.c +++ b/arch/mips/kernel/signal.c | |||
| @@ -247,35 +247,12 @@ void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 247 | */ | 247 | */ |
| 248 | 248 | ||
| 249 | #ifdef CONFIG_TRAD_SIGNALS | 249 | #ifdef CONFIG_TRAD_SIGNALS |
| 250 | asmlinkage int sys_sigsuspend(nabi_no_regargs struct pt_regs regs) | 250 | SYSCALL_DEFINE1(sigsuspend, sigset_t __user *, uset) |
| 251 | { | 251 | { |
| 252 | sigset_t newset; | 252 | return sys_rt_sigsuspend(uset, sizeof(sigset_t)); |
| 253 | sigset_t __user *uset; | ||
| 254 | |||
| 255 | uset = (sigset_t __user *) regs.regs[4]; | ||
| 256 | if (copy_from_user(&newset, uset, sizeof(sigset_t))) | ||
| 257 | return -EFAULT; | ||
| 258 | return sigsuspend(&newset); | ||
| 259 | } | 253 | } |
| 260 | #endif | 254 | #endif |
| 261 | 255 | ||
| 262 | asmlinkage int sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | ||
| 263 | { | ||
| 264 | sigset_t newset; | ||
| 265 | sigset_t __user *unewset; | ||
| 266 | size_t sigsetsize; | ||
| 267 | |||
| 268 | /* XXX Don't preclude handling different sized sigset_t's. */ | ||
| 269 | sigsetsize = regs.regs[5]; | ||
| 270 | if (sigsetsize != sizeof(sigset_t)) | ||
| 271 | return -EINVAL; | ||
| 272 | |||
| 273 | unewset = (sigset_t __user *) regs.regs[4]; | ||
| 274 | if (copy_from_user(&newset, unewset, sizeof(newset))) | ||
| 275 | return -EFAULT; | ||
| 276 | return sigsuspend(&newset); | ||
| 277 | } | ||
| 278 | |||
| 279 | #ifdef CONFIG_TRAD_SIGNALS | 256 | #ifdef CONFIG_TRAD_SIGNALS |
| 280 | SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act, | 257 | SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act, |
| 281 | struct sigaction __user *, oact) | 258 | struct sigaction __user *, oact) |
| @@ -317,15 +294,6 @@ SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act, | |||
| 317 | } | 294 | } |
| 318 | #endif | 295 | #endif |
| 319 | 296 | ||
| 320 | asmlinkage int sys_sigaltstack(nabi_no_regargs struct pt_regs regs) | ||
| 321 | { | ||
| 322 | const stack_t __user *uss = (const stack_t __user *) regs.regs[4]; | ||
| 323 | stack_t __user *uoss = (stack_t __user *) regs.regs[5]; | ||
| 324 | unsigned long usp = regs.regs[29]; | ||
| 325 | |||
| 326 | return do_sigaltstack(uss, uoss, usp); | ||
| 327 | } | ||
| 328 | |||
| 329 | #ifdef CONFIG_TRAD_SIGNALS | 297 | #ifdef CONFIG_TRAD_SIGNALS |
| 330 | asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs) | 298 | asmlinkage void sys_sigreturn(nabi_no_regargs struct pt_regs regs) |
| 331 | { | 299 | { |
| @@ -382,9 +350,8 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 382 | else if (sig) | 350 | else if (sig) |
| 383 | force_sig(sig, current); | 351 | force_sig(sig, current); |
| 384 | 352 | ||
| 385 | /* It is more difficult to avoid calling this function than to | 353 | if (restore_altstack(&frame->rs_uc.uc_stack)) |
| 386 | call it and ignore errors. */ | 354 | goto badframe; |
| 387 | do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs.regs[29]); | ||
| 388 | 355 | ||
| 389 | /* | 356 | /* |
| 390 | * Don't let your children do this ... | 357 | * Don't let your children do this ... |
| @@ -461,12 +428,7 @@ static int setup_rt_frame(void *sig_return, struct k_sigaction *ka, | |||
| 461 | /* Create the ucontext. */ | 428 | /* Create the ucontext. */ |
| 462 | err |= __put_user(0, &frame->rs_uc.uc_flags); | 429 | err |= __put_user(0, &frame->rs_uc.uc_flags); |
| 463 | err |= __put_user(NULL, &frame->rs_uc.uc_link); | 430 | err |= __put_user(NULL, &frame->rs_uc.uc_link); |
| 464 | err |= __put_user((void __user *)current->sas_ss_sp, | 431 | err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]); |
| 465 | &frame->rs_uc.uc_stack.ss_sp); | ||
| 466 | err |= __put_user(sas_ss_flags(regs->regs[29]), | ||
| 467 | &frame->rs_uc.uc_stack.ss_flags); | ||
| 468 | err |= __put_user(current->sas_ss_size, | ||
| 469 | &frame->rs_uc.uc_stack.ss_size); | ||
| 470 | err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); | 432 | err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); |
| 471 | err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)); | 433 | err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)); |
| 472 | 434 | ||
diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c index da1b56a39ac7..ad7c2be0c33d 100644 --- a/arch/mips/kernel/signal32.c +++ b/arch/mips/kernel/signal32.c | |||
| @@ -55,23 +55,10 @@ extern asmlinkage int fpu_emulator_restore_context32(struct sigcontext32 __user | |||
| 55 | typedef unsigned int __sighandler32_t; | 55 | typedef unsigned int __sighandler32_t; |
| 56 | typedef void (*vfptr_t)(void); | 56 | typedef void (*vfptr_t)(void); |
| 57 | 57 | ||
| 58 | struct sigaction32 { | ||
| 59 | unsigned int sa_flags; | ||
| 60 | __sighandler32_t sa_handler; | ||
| 61 | compat_sigset_t sa_mask; | ||
| 62 | }; | ||
| 63 | |||
| 64 | /* IRIX compatible stack_t */ | ||
| 65 | typedef struct sigaltstack32 { | ||
| 66 | s32 ss_sp; | ||
| 67 | compat_size_t ss_size; | ||
| 68 | int ss_flags; | ||
| 69 | } stack32_t; | ||
| 70 | |||
| 71 | struct ucontext32 { | 58 | struct ucontext32 { |
| 72 | u32 uc_flags; | 59 | u32 uc_flags; |
| 73 | s32 uc_link; | 60 | s32 uc_link; |
| 74 | stack32_t uc_stack; | 61 | compat_stack_t uc_stack; |
| 75 | struct sigcontext32 uc_mcontext; | 62 | struct sigcontext32 uc_mcontext; |
| 76 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ | 63 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ |
| 77 | }; | 64 | }; |
| @@ -280,36 +267,13 @@ static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t __user *ubuf) | |||
| 280 | * Atomically swap in the new signal mask, and wait for a signal. | 267 | * Atomically swap in the new signal mask, and wait for a signal. |
| 281 | */ | 268 | */ |
| 282 | 269 | ||
| 283 | asmlinkage int sys32_sigsuspend(nabi_no_regargs struct pt_regs regs) | 270 | asmlinkage int sys32_sigsuspend(compat_sigset_t __user *uset) |
| 284 | { | 271 | { |
| 285 | compat_sigset_t __user *uset; | 272 | return compat_sys_rt_sigsuspend(uset, sizeof(compat_sigset_t)); |
| 286 | sigset_t newset; | ||
| 287 | |||
| 288 | uset = (compat_sigset_t __user *) regs.regs[4]; | ||
| 289 | if (get_sigset(&newset, uset)) | ||
| 290 | return -EFAULT; | ||
| 291 | return sigsuspend(&newset); | ||
| 292 | } | ||
| 293 | |||
| 294 | asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | ||
| 295 | { | ||
| 296 | compat_sigset_t __user *uset; | ||
| 297 | sigset_t newset; | ||
| 298 | size_t sigsetsize; | ||
| 299 | |||
| 300 | /* XXX Don't preclude handling different sized sigset_t's. */ | ||
| 301 | sigsetsize = regs.regs[5]; | ||
| 302 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
| 303 | return -EINVAL; | ||
| 304 | |||
| 305 | uset = (compat_sigset_t __user *) regs.regs[4]; | ||
| 306 | if (get_sigset(&newset, uset)) | ||
| 307 | return -EFAULT; | ||
| 308 | return sigsuspend(&newset); | ||
| 309 | } | 273 | } |
| 310 | 274 | ||
| 311 | SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act, | 275 | SYSCALL_DEFINE3(32_sigaction, long, sig, const struct compat_sigaction __user *, act, |
| 312 | struct sigaction32 __user *, oact) | 276 | struct compat_sigaction __user *, oact) |
| 313 | { | 277 | { |
| 314 | struct k_sigaction new_ka, old_ka; | 278 | struct k_sigaction new_ka, old_ka; |
| 315 | int ret; | 279 | int ret; |
| @@ -350,45 +314,6 @@ SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act, | |||
| 350 | return ret; | 314 | return ret; |
| 351 | } | 315 | } |
| 352 | 316 | ||
| 353 | asmlinkage int sys32_sigaltstack(nabi_no_regargs struct pt_regs regs) | ||
| 354 | { | ||
| 355 | const stack32_t __user *uss = (const stack32_t __user *) regs.regs[4]; | ||
| 356 | stack32_t __user *uoss = (stack32_t __user *) regs.regs[5]; | ||
| 357 | unsigned long usp = regs.regs[29]; | ||
| 358 | stack_t kss, koss; | ||
| 359 | int ret, err = 0; | ||
| 360 | mm_segment_t old_fs = get_fs(); | ||
| 361 | s32 sp; | ||
| 362 | |||
| 363 | if (uss) { | ||
| 364 | if (!access_ok(VERIFY_READ, uss, sizeof(*uss))) | ||
| 365 | return -EFAULT; | ||
| 366 | err |= __get_user(sp, &uss->ss_sp); | ||
| 367 | kss.ss_sp = (void __user *) (long) sp; | ||
| 368 | err |= __get_user(kss.ss_size, &uss->ss_size); | ||
| 369 | err |= __get_user(kss.ss_flags, &uss->ss_flags); | ||
| 370 | if (err) | ||
| 371 | return -EFAULT; | ||
| 372 | } | ||
| 373 | |||
| 374 | set_fs(KERNEL_DS); | ||
| 375 | ret = do_sigaltstack(uss ? (stack_t __user *)&kss : NULL, | ||
| 376 | uoss ? (stack_t __user *)&koss : NULL, usp); | ||
| 377 | set_fs(old_fs); | ||
| 378 | |||
| 379 | if (!ret && uoss) { | ||
| 380 | if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss))) | ||
| 381 | return -EFAULT; | ||
| 382 | sp = (int) (unsigned long) koss.ss_sp; | ||
| 383 | err |= __put_user(sp, &uoss->ss_sp); | ||
| 384 | err |= __put_user(koss.ss_size, &uoss->ss_size); | ||
| 385 | err |= __put_user(koss.ss_flags, &uoss->ss_flags); | ||
| 386 | if (err) | ||
| 387 | return -EFAULT; | ||
| 388 | } | ||
| 389 | return ret; | ||
| 390 | } | ||
| 391 | |||
| 392 | int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) | 317 | int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) |
| 393 | { | 318 | { |
| 394 | int err; | 319 | int err; |
| @@ -490,10 +415,7 @@ badframe: | |||
| 490 | asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | 415 | asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) |
| 491 | { | 416 | { |
| 492 | struct rt_sigframe32 __user *frame; | 417 | struct rt_sigframe32 __user *frame; |
| 493 | mm_segment_t old_fs; | ||
| 494 | sigset_t set; | 418 | sigset_t set; |
| 495 | stack_t st; | ||
| 496 | s32 sp; | ||
| 497 | int sig; | 419 | int sig; |
| 498 | 420 | ||
| 499 | frame = (struct rt_sigframe32 __user *) regs.regs[29]; | 421 | frame = (struct rt_sigframe32 __user *) regs.regs[29]; |
| @@ -510,22 +432,9 @@ asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 510 | else if (sig) | 432 | else if (sig) |
| 511 | force_sig(sig, current); | 433 | force_sig(sig, current); |
| 512 | 434 | ||
| 513 | /* The ucontext contains a stack32_t, so we must convert! */ | 435 | if (compat_restore_altstack(&frame->rs_uc.uc_stack)) |
| 514 | if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp)) | ||
| 515 | goto badframe; | ||
| 516 | st.ss_sp = (void __user *)(long) sp; | ||
| 517 | if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size)) | ||
| 518 | goto badframe; | ||
| 519 | if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags)) | ||
| 520 | goto badframe; | 436 | goto badframe; |
| 521 | 437 | ||
| 522 | /* It is more difficult to avoid calling this function than to | ||
| 523 | call it and ignore errors. */ | ||
| 524 | old_fs = get_fs(); | ||
| 525 | set_fs(KERNEL_DS); | ||
| 526 | do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); | ||
| 527 | set_fs(old_fs); | ||
| 528 | |||
| 529 | /* | 438 | /* |
| 530 | * Don't let your children do this ... | 439 | * Don't let your children do this ... |
| 531 | */ | 440 | */ |
| @@ -590,7 +499,6 @@ static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka, | |||
| 590 | { | 499 | { |
| 591 | struct rt_sigframe32 __user *frame; | 500 | struct rt_sigframe32 __user *frame; |
| 592 | int err = 0; | 501 | int err = 0; |
| 593 | s32 sp; | ||
| 594 | 502 | ||
| 595 | frame = get_sigframe(ka, regs, sizeof(*frame)); | 503 | frame = get_sigframe(ka, regs, sizeof(*frame)); |
| 596 | if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) | 504 | if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) |
| @@ -602,13 +510,7 @@ static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka, | |||
| 602 | /* Create the ucontext. */ | 510 | /* Create the ucontext. */ |
| 603 | err |= __put_user(0, &frame->rs_uc.uc_flags); | 511 | err |= __put_user(0, &frame->rs_uc.uc_flags); |
| 604 | err |= __put_user(0, &frame->rs_uc.uc_link); | 512 | err |= __put_user(0, &frame->rs_uc.uc_link); |
| 605 | sp = (int) (long) current->sas_ss_sp; | 513 | err |= __compat_save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]); |
| 606 | err |= __put_user(sp, | ||
| 607 | &frame->rs_uc.uc_stack.ss_sp); | ||
| 608 | err |= __put_user(sas_ss_flags(regs->regs[29]), | ||
| 609 | &frame->rs_uc.uc_stack.ss_flags); | ||
| 610 | err |= __put_user(current->sas_ss_size, | ||
| 611 | &frame->rs_uc.uc_stack.ss_size); | ||
| 612 | err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext); | 514 | err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext); |
| 613 | err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set); | 515 | err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set); |
| 614 | 516 | ||
| @@ -656,131 +558,6 @@ struct mips_abi mips_abi_32 = { | |||
| 656 | .restart = __NR_O32_restart_syscall | 558 | .restart = __NR_O32_restart_syscall |
| 657 | }; | 559 | }; |
| 658 | 560 | ||
| 659 | SYSCALL_DEFINE4(32_rt_sigaction, int, sig, | ||
| 660 | const struct sigaction32 __user *, act, | ||
| 661 | struct sigaction32 __user *, oact, unsigned int, sigsetsize) | ||
| 662 | { | ||
| 663 | struct k_sigaction new_sa, old_sa; | ||
| 664 | int ret = -EINVAL; | ||
| 665 | |||
| 666 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 667 | if (sigsetsize != sizeof(sigset_t)) | ||
| 668 | goto out; | ||
| 669 | |||
| 670 | if (act) { | ||
| 671 | s32 handler; | ||
| 672 | int err = 0; | ||
| 673 | |||
| 674 | if (!access_ok(VERIFY_READ, act, sizeof(*act))) | ||
| 675 | return -EFAULT; | ||
| 676 | err |= __get_user(handler, &act->sa_handler); | ||
| 677 | new_sa.sa.sa_handler = (void __user *)(s64)handler; | ||
| 678 | err |= __get_user(new_sa.sa.sa_flags, &act->sa_flags); | ||
| 679 | err |= get_sigset(&new_sa.sa.sa_mask, &act->sa_mask); | ||
| 680 | if (err) | ||
| 681 | return -EFAULT; | ||
| 682 | } | ||
| 683 | |||
| 684 | ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL); | ||
| 685 | |||
| 686 | if (!ret && oact) { | ||
| 687 | int err = 0; | ||
| 688 | |||
| 689 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact))) | ||
| 690 | return -EFAULT; | ||
| 691 | |||
| 692 | err |= __put_user((u32)(u64)old_sa.sa.sa_handler, | ||
| 693 | &oact->sa_handler); | ||
| 694 | err |= __put_user(old_sa.sa.sa_flags, &oact->sa_flags); | ||
| 695 | err |= put_sigset(&old_sa.sa.sa_mask, &oact->sa_mask); | ||
| 696 | if (err) | ||
| 697 | return -EFAULT; | ||
| 698 | } | ||
| 699 | out: | ||
| 700 | return ret; | ||
| 701 | } | ||
| 702 | |||
| 703 | SYSCALL_DEFINE4(32_rt_sigprocmask, int, how, compat_sigset_t __user *, set, | ||
| 704 | compat_sigset_t __user *, oset, unsigned int, sigsetsize) | ||
| 705 | { | ||
| 706 | sigset_t old_set, new_set; | ||
| 707 | int ret; | ||
| 708 | mm_segment_t old_fs = get_fs(); | ||
| 709 | |||
| 710 | if (set && get_sigset(&new_set, set)) | ||
| 711 | return -EFAULT; | ||
| 712 | |||
| 713 | set_fs(KERNEL_DS); | ||
| 714 | ret = sys_rt_sigprocmask(how, set ? (sigset_t __user *)&new_set : NULL, | ||
| 715 | oset ? (sigset_t __user *)&old_set : NULL, | ||
| 716 | sigsetsize); | ||
| 717 | set_fs(old_fs); | ||
| 718 | |||
| 719 | if (!ret && oset && put_sigset(&old_set, oset)) | ||
| 720 | return -EFAULT; | ||
| 721 | |||
| 722 | return ret; | ||
| 723 | } | ||
| 724 | |||
| 725 | SYSCALL_DEFINE2(32_rt_sigpending, compat_sigset_t __user *, uset, | ||
| 726 | unsigned int, sigsetsize) | ||
| 727 | { | ||
| 728 | int ret; | ||
| 729 | sigset_t set; | ||
| 730 | mm_segment_t old_fs = get_fs(); | ||
| 731 | |||
| 732 | set_fs(KERNEL_DS); | ||
| 733 | ret = sys_rt_sigpending((sigset_t __user *)&set, sigsetsize); | ||
| 734 | set_fs(old_fs); | ||
| 735 | |||
| 736 | if (!ret && put_sigset(&set, uset)) | ||
| 737 | return -EFAULT; | ||
| 738 | |||
| 739 | return ret; | ||
| 740 | } | ||
| 741 | |||
| 742 | SYSCALL_DEFINE3(32_rt_sigqueueinfo, int, pid, int, sig, | ||
| 743 | compat_siginfo_t __user *, uinfo) | ||
| 744 | { | ||
| 745 | siginfo_t info; | ||
| 746 | int ret; | ||
| 747 | mm_segment_t old_fs = get_fs(); | ||
| 748 | |||
| 749 | if (copy_from_user(&info, uinfo, 3*sizeof(int)) || | ||
| 750 | copy_from_user(info._sifields._pad, uinfo->_sifields._pad, SI_PAD_SIZE)) | ||
| 751 | return -EFAULT; | ||
| 752 | set_fs(KERNEL_DS); | ||
| 753 | ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *)&info); | ||
| 754 | set_fs(old_fs); | ||
| 755 | return ret; | ||
| 756 | } | ||
| 757 | |||
| 758 | SYSCALL_DEFINE5(32_waitid, int, which, compat_pid_t, pid, | ||
| 759 | compat_siginfo_t __user *, uinfo, int, options, | ||
| 760 | struct compat_rusage __user *, uru) | ||
| 761 | { | ||
| 762 | siginfo_t info; | ||
| 763 | struct rusage ru; | ||
| 764 | long ret; | ||
| 765 | mm_segment_t old_fs = get_fs(); | ||
| 766 | |||
| 767 | info.si_signo = 0; | ||
| 768 | set_fs(KERNEL_DS); | ||
| 769 | ret = sys_waitid(which, pid, (siginfo_t __user *) &info, options, | ||
| 770 | uru ? (struct rusage __user *) &ru : NULL); | ||
| 771 | set_fs(old_fs); | ||
| 772 | |||
| 773 | if (ret < 0 || info.si_signo == 0) | ||
| 774 | return ret; | ||
| 775 | |||
| 776 | if (uru && (ret = put_compat_rusage(&ru, uru))) | ||
| 777 | return ret; | ||
| 778 | |||
| 779 | BUG_ON(info.si_code & __SI_MASK); | ||
| 780 | info.si_code |= __SI_CHLD; | ||
| 781 | return copy_siginfo_to_user32(uinfo, &info); | ||
| 782 | } | ||
| 783 | |||
| 784 | static int signal32_init(void) | 561 | static int signal32_init(void) |
| 785 | { | 562 | { |
| 786 | if (cpu_has_fpu) { | 563 | if (cpu_has_fpu) { |
diff --git a/arch/mips/kernel/signal_n32.c b/arch/mips/kernel/signal_n32.c index 3574c145511b..5f4ef2ae6199 100644 --- a/arch/mips/kernel/signal_n32.c +++ b/arch/mips/kernel/signal_n32.c | |||
| @@ -50,18 +50,10 @@ | |||
| 50 | extern int setup_sigcontext(struct pt_regs *, struct sigcontext __user *); | 50 | extern int setup_sigcontext(struct pt_regs *, struct sigcontext __user *); |
| 51 | extern int restore_sigcontext(struct pt_regs *, struct sigcontext __user *); | 51 | extern int restore_sigcontext(struct pt_regs *, struct sigcontext __user *); |
| 52 | 52 | ||
| 53 | |||
| 54 | /* IRIX compatible stack_t */ | ||
| 55 | typedef struct sigaltstack32 { | ||
| 56 | s32 ss_sp; | ||
| 57 | compat_size_t ss_size; | ||
| 58 | int ss_flags; | ||
| 59 | } stack32_t; | ||
| 60 | |||
| 61 | struct ucontextn32 { | 53 | struct ucontextn32 { |
| 62 | u32 uc_flags; | 54 | u32 uc_flags; |
| 63 | s32 uc_link; | 55 | s32 uc_link; |
| 64 | stack32_t uc_stack; | 56 | compat_stack_t uc_stack; |
| 65 | struct sigcontext uc_mcontext; | 57 | struct sigcontext uc_mcontext; |
| 66 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ | 58 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ |
| 67 | }; | 59 | }; |
| @@ -73,34 +65,10 @@ struct rt_sigframe_n32 { | |||
| 73 | struct ucontextn32 rs_uc; | 65 | struct ucontextn32 rs_uc; |
| 74 | }; | 66 | }; |
| 75 | 67 | ||
| 76 | extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); | ||
| 77 | |||
| 78 | asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs) | ||
| 79 | { | ||
| 80 | compat_sigset_t __user *unewset; | ||
| 81 | compat_sigset_t uset; | ||
| 82 | size_t sigsetsize; | ||
| 83 | sigset_t newset; | ||
| 84 | |||
| 85 | /* XXX Don't preclude handling different sized sigset_t's. */ | ||
| 86 | sigsetsize = regs.regs[5]; | ||
| 87 | if (sigsetsize != sizeof(sigset_t)) | ||
| 88 | return -EINVAL; | ||
| 89 | |||
| 90 | unewset = (compat_sigset_t __user *) regs.regs[4]; | ||
| 91 | if (copy_from_user(&uset, unewset, sizeof(uset))) | ||
| 92 | return -EFAULT; | ||
| 93 | sigset_from_compat(&newset, &uset); | ||
| 94 | return sigsuspend(&newset); | ||
| 95 | } | ||
| 96 | |||
| 97 | asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | 68 | asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) |
| 98 | { | 69 | { |
| 99 | struct rt_sigframe_n32 __user *frame; | 70 | struct rt_sigframe_n32 __user *frame; |
| 100 | mm_segment_t old_fs; | ||
| 101 | sigset_t set; | 71 | sigset_t set; |
| 102 | stack_t st; | ||
| 103 | s32 sp; | ||
| 104 | int sig; | 72 | int sig; |
| 105 | 73 | ||
| 106 | frame = (struct rt_sigframe_n32 __user *) regs.regs[29]; | 74 | frame = (struct rt_sigframe_n32 __user *) regs.regs[29]; |
| @@ -117,23 +85,9 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) | |||
| 117 | else if (sig) | 85 | else if (sig) |
| 118 | force_sig(sig, current); | 86 | force_sig(sig, current); |
| 119 | 87 | ||
| 120 | /* The ucontext contains a stack32_t, so we must convert! */ | 88 | if (compat_restore_altstack(&frame->rs_uc.uc_stack)) |
| 121 | if (__get_user(sp, &frame->rs_uc.uc_stack.ss_sp)) | ||
| 122 | goto badframe; | ||
| 123 | st.ss_sp = (void __user *)(long) sp; | ||
| 124 | if (__get_user(st.ss_size, &frame->rs_uc.uc_stack.ss_size)) | ||
| 125 | goto badframe; | ||
| 126 | if (__get_user(st.ss_flags, &frame->rs_uc.uc_stack.ss_flags)) | ||
| 127 | goto badframe; | 89 | goto badframe; |
| 128 | 90 | ||
| 129 | /* It is more difficult to avoid calling this function than to | ||
| 130 | call it and ignore errors. */ | ||
| 131 | old_fs = get_fs(); | ||
| 132 | set_fs(KERNEL_DS); | ||
| 133 | do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); | ||
| 134 | set_fs(old_fs); | ||
| 135 | |||
| 136 | |||
| 137 | /* | 91 | /* |
| 138 | * Don't let your children do this ... | 92 | * Don't let your children do this ... |
| 139 | */ | 93 | */ |
| @@ -153,7 +107,6 @@ static int setup_rt_frame_n32(void *sig_return, struct k_sigaction *ka, | |||
| 153 | { | 107 | { |
| 154 | struct rt_sigframe_n32 __user *frame; | 108 | struct rt_sigframe_n32 __user *frame; |
| 155 | int err = 0; | 109 | int err = 0; |
| 156 | s32 sp; | ||
| 157 | 110 | ||
| 158 | frame = get_sigframe(ka, regs, sizeof(*frame)); | 111 | frame = get_sigframe(ka, regs, sizeof(*frame)); |
| 159 | if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) | 112 | if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame))) |
| @@ -165,13 +118,7 @@ static int setup_rt_frame_n32(void *sig_return, struct k_sigaction *ka, | |||
| 165 | /* Create the ucontext. */ | 118 | /* Create the ucontext. */ |
| 166 | err |= __put_user(0, &frame->rs_uc.uc_flags); | 119 | err |= __put_user(0, &frame->rs_uc.uc_flags); |
| 167 | err |= __put_user(0, &frame->rs_uc.uc_link); | 120 | err |= __put_user(0, &frame->rs_uc.uc_link); |
| 168 | sp = (int) (long) current->sas_ss_sp; | 121 | err |= __compat_save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]); |
| 169 | err |= __put_user(sp, | ||
| 170 | &frame->rs_uc.uc_stack.ss_sp); | ||
| 171 | err |= __put_user(sas_ss_flags(regs->regs[29]), | ||
| 172 | &frame->rs_uc.uc_stack.ss_flags); | ||
| 173 | err |= __put_user(current->sas_ss_size, | ||
| 174 | &frame->rs_uc.uc_stack.ss_size); | ||
| 175 | err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); | 122 | err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); |
| 176 | err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set); | 123 | err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set); |
| 177 | 124 | ||
diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c index 201cb76b4df9..b32466a1a1d2 100644 --- a/arch/mips/kernel/syscall.c +++ b/arch/mips/kernel/syscall.c | |||
| @@ -46,20 +46,14 @@ | |||
| 46 | * argument. Historically that used to be expensive in Linux. These days | 46 | * argument. Historically that used to be expensive in Linux. These days |
| 47 | * the performance advantage is negligible. | 47 | * the performance advantage is negligible. |
| 48 | */ | 48 | */ |
| 49 | asmlinkage int sysm_pipe(nabi_no_regargs volatile struct pt_regs regs) | 49 | asmlinkage int sysm_pipe(void) |
| 50 | { | 50 | { |
| 51 | int fd[2]; | 51 | int fd[2]; |
| 52 | int error, res; | 52 | int error = do_pipe_flags(fd, 0); |
| 53 | 53 | if (error) | |
| 54 | error = do_pipe_flags(fd, 0); | 54 | return error; |
| 55 | if (error) { | 55 | current_pt_regs()->regs[3] = fd[1]; |
| 56 | res = error; | 56 | return fd[0]; |
| 57 | goto out; | ||
| 58 | } | ||
| 59 | regs.regs[3] = fd[1]; | ||
| 60 | res = fd[0]; | ||
| 61 | out: | ||
| 62 | return res; | ||
| 63 | } | 57 | } |
| 64 | 58 | ||
| 65 | SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len, | 59 | SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len, |
| @@ -89,43 +83,7 @@ SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len, | |||
| 89 | } | 83 | } |
| 90 | 84 | ||
| 91 | save_static_function(sys_fork); | 85 | save_static_function(sys_fork); |
| 92 | static int __used noinline | ||
| 93 | _sys_fork(nabi_no_regargs struct pt_regs regs) | ||
| 94 | { | ||
| 95 | return do_fork(SIGCHLD, regs.regs[29], 0, NULL, NULL); | ||
| 96 | } | ||
| 97 | |||
| 98 | save_static_function(sys_clone); | 86 | save_static_function(sys_clone); |
| 99 | static int __used noinline | ||
| 100 | _sys_clone(nabi_no_regargs struct pt_regs regs) | ||
| 101 | { | ||
| 102 | unsigned long clone_flags; | ||
| 103 | unsigned long newsp; | ||
| 104 | int __user *parent_tidptr, *child_tidptr; | ||
| 105 | |||
| 106 | clone_flags = regs.regs[4]; | ||
| 107 | newsp = regs.regs[5]; | ||
| 108 | if (!newsp) | ||
| 109 | newsp = regs.regs[29]; | ||
| 110 | parent_tidptr = (int __user *) regs.regs[6]; | ||
| 111 | #ifdef CONFIG_32BIT | ||
| 112 | /* We need to fetch the fifth argument off the stack. */ | ||
| 113 | child_tidptr = NULL; | ||
| 114 | if (clone_flags & (CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID)) { | ||
| 115 | int __user *__user *usp = (int __user *__user *) regs.regs[29]; | ||
| 116 | if (regs.regs[2] == __NR_syscall) { | ||
| 117 | if (get_user (child_tidptr, &usp[5])) | ||
| 118 | return -EFAULT; | ||
| 119 | } | ||
| 120 | else if (get_user (child_tidptr, &usp[4])) | ||
| 121 | return -EFAULT; | ||
| 122 | } | ||
| 123 | #else | ||
| 124 | child_tidptr = (int __user *) regs.regs[8]; | ||
| 125 | #endif | ||
| 126 | return do_fork(clone_flags, newsp, 0, | ||
| 127 | parent_tidptr, child_tidptr); | ||
| 128 | } | ||
| 129 | 87 | ||
| 130 | SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) | 88 | SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) |
| 131 | { | 89 | { |
| @@ -138,10 +96,10 @@ SYSCALL_DEFINE1(set_thread_area, unsigned long, addr) | |||
| 138 | return 0; | 96 | return 0; |
| 139 | } | 97 | } |
| 140 | 98 | ||
| 141 | static inline int mips_atomic_set(struct pt_regs *regs, | 99 | static inline int mips_atomic_set(unsigned long addr, unsigned long new) |
| 142 | unsigned long addr, unsigned long new) | ||
| 143 | { | 100 | { |
| 144 | unsigned long old, tmp; | 101 | unsigned long old, tmp; |
| 102 | struct pt_regs *regs; | ||
| 145 | unsigned int err; | 103 | unsigned int err; |
| 146 | 104 | ||
| 147 | if (unlikely(addr & 3)) | 105 | if (unlikely(addr & 3)) |
| @@ -222,6 +180,7 @@ static inline int mips_atomic_set(struct pt_regs *regs, | |||
| 222 | if (unlikely(err)) | 180 | if (unlikely(err)) |
| 223 | return err; | 181 | return err; |
| 224 | 182 | ||
| 183 | regs = current_pt_regs(); | ||
| 225 | regs->regs[2] = old; | 184 | regs->regs[2] = old; |
| 226 | regs->regs[7] = 0; /* No error */ | 185 | regs->regs[7] = 0; /* No error */ |
| 227 | 186 | ||
| @@ -235,22 +194,14 @@ static inline int mips_atomic_set(struct pt_regs *regs, | |||
| 235 | : "r" (regs)); | 194 | : "r" (regs)); |
| 236 | 195 | ||
| 237 | /* unreached. Honestly. */ | 196 | /* unreached. Honestly. */ |
| 238 | while (1); | 197 | unreachable(); |
| 239 | } | 198 | } |
| 240 | 199 | ||
| 241 | save_static_function(sys_sysmips); | 200 | SYSCALL_DEFINE3(sysmips, long, cmd, long, arg1, long, arg2) |
| 242 | static int __used noinline | ||
| 243 | _sys_sysmips(nabi_no_regargs struct pt_regs regs) | ||
| 244 | { | 201 | { |
| 245 | long cmd, arg1, arg2; | ||
| 246 | |||
| 247 | cmd = regs.regs[4]; | ||
| 248 | arg1 = regs.regs[5]; | ||
| 249 | arg2 = regs.regs[6]; | ||
| 250 | |||
| 251 | switch (cmd) { | 202 | switch (cmd) { |
| 252 | case MIPS_ATOMIC_SET: | 203 | case MIPS_ATOMIC_SET: |
| 253 | return mips_atomic_set(®s, arg1, arg2); | 204 | return mips_atomic_set(arg1, arg2); |
| 254 | 205 | ||
| 255 | case MIPS_FIXADE: | 206 | case MIPS_FIXADE: |
| 256 | if (arg1 & ~3) | 207 | if (arg1 & ~3) |
diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index e70001cfa05b..ad0caea0bfea 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig | |||
| @@ -10,6 +10,8 @@ config MN10300 | |||
| 10 | select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER | 10 | select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER |
| 11 | select GENERIC_CLOCKEVENTS | 11 | select GENERIC_CLOCKEVENTS |
| 12 | select MODULES_USE_ELF_RELA | 12 | select MODULES_USE_ELF_RELA |
| 13 | select OLD_SIGSUSPEND3 | ||
| 14 | select OLD_SIGACTION | ||
| 13 | 15 | ||
| 14 | config AM33_2 | 16 | config AM33_2 |
| 15 | def_bool n | 17 | def_bool n |
diff --git a/arch/mn10300/include/asm/signal.h b/arch/mn10300/include/asm/signal.h index d280e9780793..214ff5e9fe60 100644 --- a/arch/mn10300/include/asm/signal.h +++ b/arch/mn10300/include/asm/signal.h | |||
| @@ -26,23 +26,8 @@ typedef struct { | |||
| 26 | unsigned long sig[_NSIG_WORDS]; | 26 | unsigned long sig[_NSIG_WORDS]; |
| 27 | } sigset_t; | 27 | } sigset_t; |
| 28 | 28 | ||
| 29 | struct old_sigaction { | 29 | #define __ARCH_HAS_SA_RESTORER |
| 30 | __sighandler_t sa_handler; | 30 | |
| 31 | old_sigset_t sa_mask; | ||
| 32 | unsigned long sa_flags; | ||
| 33 | __sigrestore_t sa_restorer; | ||
| 34 | }; | ||
| 35 | |||
| 36 | struct sigaction { | ||
| 37 | __sighandler_t sa_handler; | ||
| 38 | unsigned long sa_flags; | ||
| 39 | __sigrestore_t sa_restorer; | ||
| 40 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 41 | }; | ||
| 42 | |||
| 43 | struct k_sigaction { | ||
| 44 | struct sigaction sa; | ||
| 45 | }; | ||
| 46 | #include <asm/sigcontext.h> | 31 | #include <asm/sigcontext.h> |
| 47 | 32 | ||
| 48 | #endif /* _ASM_SIGNAL_H */ | 33 | #endif /* _ASM_SIGNAL_H */ |
diff --git a/arch/mn10300/include/asm/unistd.h b/arch/mn10300/include/asm/unistd.h index e6d2ed4ba68f..7f9d9adfa51e 100644 --- a/arch/mn10300/include/asm/unistd.h +++ b/arch/mn10300/include/asm/unistd.h | |||
| @@ -41,8 +41,6 @@ | |||
| 41 | #define __ARCH_WANT_SYS_OLDUMOUNT | 41 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 42 | #define __ARCH_WANT_SYS_SIGPENDING | 42 | #define __ARCH_WANT_SYS_SIGPENDING |
| 43 | #define __ARCH_WANT_SYS_SIGPROCMASK | 43 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 44 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 45 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 46 | #define __ARCH_WANT_SYS_FORK | 44 | #define __ARCH_WANT_SYS_FORK |
| 47 | #define __ARCH_WANT_SYS_VFORK | 45 | #define __ARCH_WANT_SYS_VFORK |
| 48 | #define __ARCH_WANT_SYS_CLONE | 46 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/mn10300/kernel/signal.c b/arch/mn10300/kernel/signal.c index f570b3085ef9..9dfac5cd16e6 100644 --- a/arch/mn10300/kernel/signal.c +++ b/arch/mn10300/kernel/signal.c | |||
| @@ -32,59 +32,6 @@ | |||
| 32 | #define DEBUG_SIG 0 | 32 | #define DEBUG_SIG 0 |
| 33 | 33 | ||
| 34 | /* | 34 | /* |
| 35 | * atomically swap in the new signal mask, and wait for a signal. | ||
| 36 | */ | ||
| 37 | asmlinkage long sys_sigsuspend(int history0, int history1, old_sigset_t mask) | ||
| 38 | { | ||
| 39 | sigset_t blocked; | ||
| 40 | siginitset(&blocked, mask); | ||
| 41 | return sigsuspend(&blocked); | ||
| 42 | } | ||
| 43 | |||
| 44 | /* | ||
| 45 | * set signal action syscall | ||
| 46 | */ | ||
| 47 | asmlinkage long sys_sigaction(int sig, | ||
| 48 | const struct old_sigaction __user *act, | ||
| 49 | struct old_sigaction __user *oact) | ||
| 50 | { | ||
| 51 | struct k_sigaction new_ka, old_ka; | ||
| 52 | int ret; | ||
| 53 | |||
| 54 | if (act) { | ||
| 55 | old_sigset_t mask; | ||
| 56 | if (verify_area(VERIFY_READ, act, sizeof(*act)) || | ||
| 57 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 58 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 59 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 60 | __get_user(mask, &act->sa_mask)) | ||
| 61 | return -EFAULT; | ||
| 62 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 63 | } | ||
| 64 | |||
| 65 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 66 | |||
| 67 | if (!ret && oact) { | ||
| 68 | if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 69 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 70 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 71 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 72 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 73 | return -EFAULT; | ||
| 74 | } | ||
| 75 | |||
| 76 | return ret; | ||
| 77 | } | ||
| 78 | |||
| 79 | /* | ||
| 80 | * set alternate signal stack syscall | ||
| 81 | */ | ||
| 82 | asmlinkage long sys_sigaltstack(const stack_t __user *uss, stack_t *uoss) | ||
| 83 | { | ||
| 84 | return do_sigaltstack(uss, uoss, current_frame()->sp); | ||
| 85 | } | ||
| 86 | |||
| 87 | /* | ||
| 88 | * do a signal return; undo the signal stack. | 35 | * do a signal return; undo the signal stack. |
| 89 | */ | 36 | */ |
| 90 | static int restore_sigcontext(struct pt_regs *regs, | 37 | static int restore_sigcontext(struct pt_regs *regs, |
| @@ -193,8 +140,7 @@ asmlinkage long sys_rt_sigreturn(void) | |||
| 193 | if (restore_sigcontext(current_frame(), &frame->uc.uc_mcontext, &d0)) | 140 | if (restore_sigcontext(current_frame(), &frame->uc.uc_mcontext, &d0)) |
| 194 | goto badframe; | 141 | goto badframe; |
| 195 | 142 | ||
| 196 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, current_frame()->sp) == | 143 | if (restore_altstack(&frame->uc.uc_stack)) |
| 197 | -EFAULT) | ||
| 198 | goto badframe; | 144 | goto badframe; |
| 199 | 145 | ||
| 200 | return d0; | 146 | return d0; |
| @@ -359,9 +305,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 359 | /* create the ucontext. */ | 305 | /* create the ucontext. */ |
| 360 | if (__put_user(0, &frame->uc.uc_flags) || | 306 | if (__put_user(0, &frame->uc.uc_flags) || |
| 361 | __put_user(0, &frame->uc.uc_link) || | 307 | __put_user(0, &frame->uc.uc_link) || |
| 362 | __put_user((void *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp) || | 308 | __save_altstack(&frame->uc.uc_stack, regs->sp) || |
| 363 | __put_user(sas_ss_flags(regs->sp), &frame->uc.uc_stack.ss_flags) || | ||
| 364 | __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size) || | ||
| 365 | setup_sigcontext(&frame->uc.uc_mcontext, | 309 | setup_sigcontext(&frame->uc.uc_mcontext, |
| 366 | &frame->fpuctx, regs, set->sig[0]) || | 310 | &frame->fpuctx, regs, set->sig[0]) || |
| 367 | __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set))) | 311 | __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set))) |
diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S index 5e5b30601bbf..54afd0a129fe 100644 --- a/arch/openrisc/kernel/entry.S +++ b/arch/openrisc/kernel/entry.S | |||
| @@ -1083,10 +1083,6 @@ ENTRY(__sys_fork) | |||
| 1083 | l.j _fork_save_extra_regs_and_call | 1083 | l.j _fork_save_extra_regs_and_call |
| 1084 | l.addi r3,r1,0 | 1084 | l.addi r3,r1,0 |
| 1085 | 1085 | ||
| 1086 | ENTRY(sys_sigaltstack) | ||
| 1087 | l.j _sys_sigaltstack | ||
| 1088 | l.addi r5,r1,0 | ||
| 1089 | |||
| 1090 | ENTRY(sys_rt_sigreturn) | 1086 | ENTRY(sys_rt_sigreturn) |
| 1091 | l.j _sys_rt_sigreturn | 1087 | l.j _sys_rt_sigreturn |
| 1092 | l.addi r3,r1,0 | 1088 | l.addi r3,r1,0 |
diff --git a/arch/openrisc/kernel/signal.c b/arch/openrisc/kernel/signal.c index ddedc8a77861..ae167f7e081a 100644 --- a/arch/openrisc/kernel/signal.c +++ b/arch/openrisc/kernel/signal.c | |||
| @@ -33,12 +33,6 @@ | |||
| 33 | 33 | ||
| 34 | #define DEBUG_SIG 0 | 34 | #define DEBUG_SIG 0 |
| 35 | 35 | ||
| 36 | asmlinkage long | ||
| 37 | _sys_sigaltstack(const stack_t *uss, stack_t *uoss, struct pt_regs *regs) | ||
| 38 | { | ||
| 39 | return do_sigaltstack(uss, uoss, regs->sp); | ||
| 40 | } | ||
| 41 | |||
| 42 | struct rt_sigframe { | 36 | struct rt_sigframe { |
| 43 | struct siginfo *pinfo; | 37 | struct siginfo *pinfo; |
| 44 | void *puc; | 38 | void *puc; |
| @@ -103,9 +97,7 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs) | |||
| 103 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) | 97 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) |
| 104 | goto badframe; | 98 | goto badframe; |
| 105 | 99 | ||
| 106 | /* It is more difficult to avoid calling this function than to | 100 | if (restore_altstack(&frame->uc.uc_stack)) |
| 107 | call it and ignore errors. */ | ||
| 108 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) | ||
| 109 | goto badframe; | 101 | goto badframe; |
| 110 | 102 | ||
| 111 | return regs->gpr[11]; | 103 | return regs->gpr[11]; |
| @@ -205,10 +197,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 205 | err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); | 197 | err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext)); |
| 206 | err |= __put_user(0, &frame->uc.uc_flags); | 198 | err |= __put_user(0, &frame->uc.uc_flags); |
| 207 | err |= __put_user(NULL, &frame->uc.uc_link); | 199 | err |= __put_user(NULL, &frame->uc.uc_link); |
| 208 | err |= __put_user((void *)current->sas_ss_sp, | 200 | err |= __save_altstack(&frame->uc.uc_stack, regs->sp); |
| 209 | &frame->uc.uc_stack.ss_sp); | ||
| 210 | err |= __put_user(sas_ss_flags(regs->sp), &frame->uc.uc_stack.ss_flags); | ||
| 211 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 212 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); | 201 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]); |
| 213 | 202 | ||
| 214 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 203 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
diff --git a/arch/parisc/include/asm/signal.h b/arch/parisc/include/asm/signal.h index b1a7c4c4a53a..81a545773971 100644 --- a/arch/parisc/include/asm/signal.h +++ b/arch/parisc/include/asm/signal.h | |||
| @@ -20,15 +20,13 @@ typedef struct { | |||
| 20 | unsigned long sig[_NSIG_WORDS]; | 20 | unsigned long sig[_NSIG_WORDS]; |
| 21 | } sigset_t; | 21 | } sigset_t; |
| 22 | 22 | ||
| 23 | #ifndef __KERNEL__ | ||
| 23 | struct sigaction { | 24 | struct sigaction { |
| 24 | __sighandler_t sa_handler; | 25 | __sighandler_t sa_handler; |
| 25 | unsigned long sa_flags; | 26 | unsigned long sa_flags; |
| 26 | sigset_t sa_mask; /* mask last for extensibility */ | 27 | sigset_t sa_mask; /* mask last for extensibility */ |
| 27 | }; | 28 | }; |
| 28 | 29 | #endif | |
| 29 | struct k_sigaction { | ||
| 30 | struct sigaction sa; | ||
| 31 | }; | ||
| 32 | 30 | ||
| 33 | #include <asm/sigcontext.h> | 31 | #include <asm/sigcontext.h> |
| 34 | 32 | ||
diff --git a/arch/parisc/include/asm/unistd.h b/arch/parisc/include/asm/unistd.h index 74f801ebbe77..ae9a46cbfd92 100644 --- a/arch/parisc/include/asm/unistd.h +++ b/arch/parisc/include/asm/unistd.h | |||
| @@ -161,9 +161,6 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) \ | |||
| 161 | #define __ARCH_WANT_SYS_OLDUMOUNT | 161 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 162 | #define __ARCH_WANT_SYS_SIGPENDING | 162 | #define __ARCH_WANT_SYS_SIGPENDING |
| 163 | #define __ARCH_WANT_SYS_SIGPROCMASK | 163 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 164 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 165 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 166 | #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | ||
| 167 | #define __ARCH_WANT_SYS_FORK | 164 | #define __ARCH_WANT_SYS_FORK |
| 168 | #define __ARCH_WANT_SYS_VFORK | 165 | #define __ARCH_WANT_SYS_VFORK |
| 169 | #define __ARCH_WANT_SYS_CLONE | 166 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index 7c9648919c91..f33201bf8977 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
| @@ -1748,44 +1748,6 @@ ENTRY(sys_rt_sigreturn_wrapper) | |||
| 1748 | LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */ | 1748 | LDREG PT_GR28(%r1),%r28 /* reload original r28 for syscall_exit */ |
| 1749 | ENDPROC(sys_rt_sigreturn_wrapper) | 1749 | ENDPROC(sys_rt_sigreturn_wrapper) |
| 1750 | 1750 | ||
| 1751 | ENTRY(sys_sigaltstack_wrapper) | ||
| 1752 | /* Get the user stack pointer */ | ||
| 1753 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r1 | ||
| 1754 | ldo TASK_REGS(%r1),%r24 /* get pt regs */ | ||
| 1755 | LDREG TASK_PT_GR30(%r24),%r24 | ||
| 1756 | STREG %r2, -RP_OFFSET(%r30) | ||
| 1757 | #ifdef CONFIG_64BIT | ||
| 1758 | ldo FRAME_SIZE(%r30), %r30 | ||
| 1759 | BL do_sigaltstack,%r2 | ||
| 1760 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
| 1761 | #else | ||
| 1762 | BL do_sigaltstack,%r2 | ||
| 1763 | ldo FRAME_SIZE(%r30), %r30 | ||
| 1764 | #endif | ||
| 1765 | |||
| 1766 | ldo -FRAME_SIZE(%r30), %r30 | ||
| 1767 | LDREG -RP_OFFSET(%r30), %r2 | ||
| 1768 | bv %r0(%r2) | ||
| 1769 | nop | ||
| 1770 | ENDPROC(sys_sigaltstack_wrapper) | ||
| 1771 | |||
| 1772 | #ifdef CONFIG_64BIT | ||
| 1773 | ENTRY(sys32_sigaltstack_wrapper) | ||
| 1774 | /* Get the user stack pointer */ | ||
| 1775 | LDREG TI_TASK-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r24 | ||
| 1776 | LDREG TASK_PT_GR30(%r24),%r24 | ||
| 1777 | STREG %r2, -RP_OFFSET(%r30) | ||
| 1778 | ldo FRAME_SIZE(%r30), %r30 | ||
| 1779 | BL do_sigaltstack32,%r2 | ||
| 1780 | ldo -16(%r30),%r29 /* Reference param save area */ | ||
| 1781 | |||
| 1782 | ldo -FRAME_SIZE(%r30), %r30 | ||
| 1783 | LDREG -RP_OFFSET(%r30), %r2 | ||
| 1784 | bv %r0(%r2) | ||
| 1785 | nop | ||
| 1786 | ENDPROC(sys32_sigaltstack_wrapper) | ||
| 1787 | #endif | ||
| 1788 | |||
| 1789 | ENTRY(syscall_exit) | 1751 | ENTRY(syscall_exit) |
| 1790 | /* NOTE: HP-UX syscalls also come through here | 1752 | /* NOTE: HP-UX syscalls also come through here |
| 1791 | * after hpux_syscall_exit fixes up return | 1753 | * after hpux_syscall_exit fixes up return |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 52c85b2f502e..98e9e7126565 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
| @@ -143,7 +143,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
| 143 | goto give_sigsegv; | 143 | goto give_sigsegv; |
| 144 | DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", | 144 | DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", |
| 145 | usp, &compat_frame->uc.uc_stack); | 145 | usp, &compat_frame->uc.uc_stack); |
| 146 | if (do_sigaltstack32(&compat_frame->uc.uc_stack, NULL, usp) == -EFAULT) | 146 | if (compat_restore_altstack(&compat_frame->uc.uc_stack)) |
| 147 | goto give_sigsegv; | 147 | goto give_sigsegv; |
| 148 | } else | 148 | } else |
| 149 | #endif | 149 | #endif |
| @@ -154,7 +154,7 @@ sys_rt_sigreturn(struct pt_regs *regs, int in_syscall) | |||
| 154 | goto give_sigsegv; | 154 | goto give_sigsegv; |
| 155 | DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", | 155 | DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", |
| 156 | usp, &frame->uc.uc_stack); | 156 | usp, &frame->uc.uc_stack); |
| 157 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT) | 157 | if (restore_altstack(&frame->uc.uc_stack)) |
| 158 | goto give_sigsegv; | 158 | goto give_sigsegv; |
| 159 | } | 159 | } |
| 160 | 160 | ||
| @@ -262,15 +262,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 262 | if (is_compat_task()) { | 262 | if (is_compat_task()) { |
| 263 | DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); | 263 | DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); |
| 264 | err |= copy_siginfo_to_user32(&compat_frame->info, info); | 264 | err |= copy_siginfo_to_user32(&compat_frame->info, info); |
| 265 | DBG(1,"SETUP_RT_FRAME: 1\n"); | 265 | err |= __compat_save_altstack( &compat_frame->uc.uc_stack, regs->gr[30]); |
| 266 | compat_val = (compat_int_t)current->sas_ss_sp; | ||
| 267 | err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp); | ||
| 268 | DBG(1,"SETUP_RT_FRAME: 2\n"); | ||
| 269 | compat_val = (compat_int_t)current->sas_ss_size; | ||
| 270 | err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_size); | ||
| 271 | DBG(1,"SETUP_RT_FRAME: 3\n"); | ||
| 272 | compat_val = sas_ss_flags(regs->gr[30]); | ||
| 273 | err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_flags); | ||
| 274 | DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc); | 266 | DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc); |
| 275 | DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext); | 267 | DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext); |
| 276 | err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext, | 268 | err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext, |
| @@ -282,10 +274,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 282 | { | 274 | { |
| 283 | DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info); | 275 | DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info); |
| 284 | err |= copy_siginfo_to_user(&frame->info, info); | 276 | err |= copy_siginfo_to_user(&frame->info, info); |
| 285 | err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 277 | err |= __save_altstack(&frame->uc.uc_stack, regs->gr[30]); |
| 286 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 287 | err |= __put_user(sas_ss_flags(regs->gr[30]), | ||
| 288 | &frame->uc.uc_stack.ss_flags); | ||
| 289 | DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc); | 278 | DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc); |
| 290 | DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext); | 279 | DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext); |
| 291 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall); | 280 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall); |
diff --git a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c index 2ddcabb616ce..33eca1b04926 100644 --- a/arch/parisc/kernel/signal32.c +++ b/arch/parisc/kernel/signal32.c | |||
| @@ -60,136 +60,6 @@ sigset_64to32(compat_sigset_t *s32, sigset_t *s64) | |||
| 60 | s32->sig[1] = (s64->sig[0] >> 32) & 0xffffffffUL; | 60 | s32->sig[1] = (s64->sig[0] >> 32) & 0xffffffffUL; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | static int | ||
| 64 | put_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz) | ||
| 65 | { | ||
| 66 | compat_sigset_t s; | ||
| 67 | |||
| 68 | if (sz != sizeof(compat_sigset_t)) | ||
| 69 | return -EINVAL; | ||
| 70 | sigset_64to32(&s, set); | ||
| 71 | |||
| 72 | return copy_to_user(up, &s, sizeof s); | ||
| 73 | } | ||
| 74 | |||
| 75 | static int | ||
| 76 | get_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz) | ||
| 77 | { | ||
| 78 | compat_sigset_t s; | ||
| 79 | int r; | ||
| 80 | |||
| 81 | if (sz != sizeof(compat_sigset_t)) | ||
| 82 | return -EINVAL; | ||
| 83 | |||
| 84 | if ((r = copy_from_user(&s, up, sz)) == 0) { | ||
| 85 | sigset_32to64(set, &s); | ||
| 86 | } | ||
| 87 | |||
| 88 | return r; | ||
| 89 | } | ||
| 90 | |||
| 91 | int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, compat_sigset_t __user *oset, | ||
| 92 | unsigned int sigsetsize) | ||
| 93 | { | ||
| 94 | sigset_t old_set, new_set; | ||
| 95 | int ret; | ||
| 96 | |||
| 97 | if (set) { | ||
| 98 | ret = get_sigset32(set, &new_set, sigsetsize); | ||
| 99 | if (ret) | ||
| 100 | return ret; | ||
| 101 | } | ||
| 102 | |||
| 103 | KERNEL_SYSCALL(ret, sys_rt_sigprocmask, how, set ? (sigset_t __user *)&new_set : NULL, | ||
| 104 | oset ? (sigset_t __user *)&old_set : NULL, sigsetsize); | ||
| 105 | |||
| 106 | if (!ret && oset && put_sigset32(oset, &old_set, sigsetsize)) | ||
| 107 | return -EFAULT; | ||
| 108 | |||
| 109 | return ret; | ||
| 110 | } | ||
| 111 | |||
| 112 | |||
| 113 | int sys32_rt_sigpending(compat_sigset_t __user *uset, unsigned int sigsetsize) | ||
| 114 | { | ||
| 115 | int ret; | ||
| 116 | sigset_t set; | ||
| 117 | |||
| 118 | KERNEL_SYSCALL(ret, sys_rt_sigpending, (sigset_t __user *)&set, sigsetsize); | ||
| 119 | |||
| 120 | if (!ret && put_sigset32(uset, &set, sigsetsize)) | ||
| 121 | return -EFAULT; | ||
| 122 | |||
| 123 | return ret; | ||
| 124 | } | ||
| 125 | |||
| 126 | long | ||
| 127 | sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, struct sigaction32 __user *oact, | ||
| 128 | size_t sigsetsize) | ||
| 129 | { | ||
| 130 | struct k_sigaction32 new_sa32, old_sa32; | ||
| 131 | struct k_sigaction new_sa, old_sa; | ||
| 132 | int ret = -EINVAL; | ||
| 133 | |||
| 134 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 135 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
| 136 | return -EINVAL; | ||
| 137 | |||
| 138 | if (act) { | ||
| 139 | if (copy_from_user(&new_sa32.sa, act, sizeof new_sa32.sa)) | ||
| 140 | return -EFAULT; | ||
| 141 | new_sa.sa.sa_handler = (__sighandler_t)(unsigned long)new_sa32.sa.sa_handler; | ||
| 142 | new_sa.sa.sa_flags = new_sa32.sa.sa_flags; | ||
| 143 | sigset_32to64(&new_sa.sa.sa_mask, &new_sa32.sa.sa_mask); | ||
| 144 | } | ||
| 145 | |||
| 146 | ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL); | ||
| 147 | |||
| 148 | if (!ret && oact) { | ||
| 149 | sigset_64to32(&old_sa32.sa.sa_mask, &old_sa.sa.sa_mask); | ||
| 150 | old_sa32.sa.sa_flags = old_sa.sa.sa_flags; | ||
| 151 | old_sa32.sa.sa_handler = (__sighandler_t32)(unsigned long)old_sa.sa.sa_handler; | ||
| 152 | if (copy_to_user(oact, &old_sa32.sa, sizeof old_sa32.sa)) | ||
| 153 | return -EFAULT; | ||
| 154 | } | ||
| 155 | return ret; | ||
| 156 | } | ||
| 157 | |||
| 158 | int | ||
| 159 | do_sigaltstack32 (const compat_stack_t __user *uss32, compat_stack_t __user *uoss32, unsigned long sp) | ||
| 160 | { | ||
| 161 | compat_stack_t ss32, oss32; | ||
| 162 | stack_t ss, oss; | ||
| 163 | stack_t *ssp = NULL, *ossp = NULL; | ||
| 164 | int ret; | ||
| 165 | |||
| 166 | if (uss32) { | ||
| 167 | if (copy_from_user(&ss32, uss32, sizeof ss32)) | ||
| 168 | return -EFAULT; | ||
| 169 | |||
| 170 | ss.ss_sp = (void __user *)(unsigned long)ss32.ss_sp; | ||
| 171 | ss.ss_flags = ss32.ss_flags; | ||
| 172 | ss.ss_size = ss32.ss_size; | ||
| 173 | |||
| 174 | ssp = &ss; | ||
| 175 | } | ||
| 176 | |||
| 177 | if (uoss32) | ||
| 178 | ossp = &oss; | ||
| 179 | |||
| 180 | KERNEL_SYSCALL(ret, do_sigaltstack, (const stack_t __user *)ssp, (stack_t __user *)ossp, sp); | ||
| 181 | |||
| 182 | if (!ret && uoss32) { | ||
| 183 | oss32.ss_sp = (unsigned int)(unsigned long)oss.ss_sp; | ||
| 184 | oss32.ss_flags = oss.ss_flags; | ||
| 185 | oss32.ss_size = oss.ss_size; | ||
| 186 | if (copy_to_user(uoss32, &oss32, sizeof *uoss32)) | ||
| 187 | return -EFAULT; | ||
| 188 | } | ||
| 189 | |||
| 190 | return ret; | ||
| 191 | } | ||
| 192 | |||
| 193 | long | 63 | long |
| 194 | restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf, | 64 | restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf, |
| 195 | struct pt_regs *regs) | 65 | struct pt_regs *regs) |
| @@ -506,22 +376,3 @@ copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from) | |||
| 506 | } | 376 | } |
| 507 | return err; | 377 | return err; |
| 508 | } | 378 | } |
| 509 | |||
| 510 | asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig, | ||
| 511 | struct compat_siginfo __user *uinfo) | ||
| 512 | { | ||
| 513 | siginfo_t info; | ||
| 514 | |||
| 515 | if (copy_siginfo_from_user32(&info, uinfo)) | ||
| 516 | return -EFAULT; | ||
| 517 | |||
| 518 | /* Not even root can pretend to send signals from the kernel. | ||
| 519 | Nor can they impersonate a kill(), which adds source info. */ | ||
| 520 | if (info.si_code >= 0) | ||
| 521 | return -EPERM; | ||
| 522 | info.si_signo = sig; | ||
| 523 | |||
| 524 | /* POSIX.1b doesn't mention process groups. */ | ||
| 525 | return kill_proc_info(sig, &info, pid); | ||
| 526 | } | ||
| 527 | |||
diff --git a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h index 08a88b5349a2..72ab41a51f32 100644 --- a/arch/parisc/kernel/signal32.h +++ b/arch/parisc/kernel/signal32.h | |||
| @@ -21,23 +21,6 @@ | |||
| 21 | 21 | ||
| 22 | #include <linux/compat.h> | 22 | #include <linux/compat.h> |
| 23 | 23 | ||
| 24 | typedef compat_uptr_t compat_sighandler_t; | ||
| 25 | |||
| 26 | typedef struct compat_sigaltstack { | ||
| 27 | compat_uptr_t ss_sp; | ||
| 28 | compat_int_t ss_flags; | ||
| 29 | compat_size_t ss_size; | ||
| 30 | } compat_stack_t; | ||
| 31 | |||
| 32 | /* Most things should be clean enough to redefine this at will, if care | ||
| 33 | is taken to make libc match. */ | ||
| 34 | |||
| 35 | struct compat_sigaction { | ||
| 36 | compat_sighandler_t sa_handler; | ||
| 37 | compat_uint_t sa_flags; | ||
| 38 | compat_sigset_t sa_mask; /* mask last for extensibility */ | ||
| 39 | }; | ||
| 40 | |||
| 41 | /* 32-bit ucontext as seen from an 64-bit kernel */ | 24 | /* 32-bit ucontext as seen from an 64-bit kernel */ |
| 42 | struct compat_ucontext { | 25 | struct compat_ucontext { |
| 43 | compat_uint_t uc_flags; | 26 | compat_uint_t uc_flags; |
| @@ -51,10 +34,6 @@ struct compat_ucontext { | |||
| 51 | 34 | ||
| 52 | /* ELF32 signal handling */ | 35 | /* ELF32 signal handling */ |
| 53 | 36 | ||
| 54 | struct k_sigaction32 { | ||
| 55 | struct compat_sigaction sa; | ||
| 56 | }; | ||
| 57 | |||
| 58 | int copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from); | 37 | int copy_siginfo_to_user32 (compat_siginfo_t __user *to, siginfo_t *from); |
| 59 | int copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from); | 38 | int copy_siginfo_from_user32 (siginfo_t *to, compat_siginfo_t __user *from); |
| 60 | 39 | ||
| @@ -102,8 +81,6 @@ struct compat_rt_sigframe { | |||
| 102 | 81 | ||
| 103 | void sigset_32to64(sigset_t *s64, compat_sigset_t *s32); | 82 | void sigset_32to64(sigset_t *s64, compat_sigset_t *s32); |
| 104 | void sigset_64to32(compat_sigset_t *s32, sigset_t *s64); | 83 | void sigset_64to32(compat_sigset_t *s32, sigset_t *s64); |
| 105 | int do_sigaltstack32 (const compat_stack_t __user *uss32, | ||
| 106 | compat_stack_t __user *uoss32, unsigned long sp); | ||
| 107 | long restore_sigcontext32(struct compat_sigcontext __user *sc, | 84 | long restore_sigcontext32(struct compat_sigcontext __user *sc, |
| 108 | struct compat_regfile __user *rf, | 85 | struct compat_regfile __user *rf, |
| 109 | struct pt_regs *regs); | 86 | struct pt_regs *regs); |
diff --git a/arch/parisc/kernel/sys32.h b/arch/parisc/kernel/sys32.h index 06c2090cfaba..60dd470f39f8 100644 --- a/arch/parisc/kernel/sys32.h +++ b/arch/parisc/kernel/sys32.h | |||
| @@ -33,16 +33,4 @@ | |||
| 33 | set_fs (old_fs); \ | 33 | set_fs (old_fs); \ |
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | #ifdef CONFIG_COMPAT | ||
| 37 | |||
| 38 | typedef __u32 __sighandler_t32; | ||
| 39 | |||
| 40 | struct sigaction32 { | ||
| 41 | __sighandler_t32 sa_handler; | ||
| 42 | unsigned int sa_flags; | ||
| 43 | compat_sigset_t sa_mask; /* mask last for extensibility */ | ||
| 44 | }; | ||
| 45 | |||
| 46 | #endif | ||
| 47 | |||
| 48 | #endif | 36 | #endif |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 129fd472c471..fc9cab1cc2df 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
| @@ -252,7 +252,7 @@ | |||
| 252 | ENTRY_SAME(mremap) | 252 | ENTRY_SAME(mremap) |
| 253 | ENTRY_SAME(setresuid) | 253 | ENTRY_SAME(setresuid) |
| 254 | ENTRY_SAME(getresuid) /* 165 */ | 254 | ENTRY_SAME(getresuid) /* 165 */ |
| 255 | ENTRY_DIFF(sigaltstack_wrapper) | 255 | ENTRY_COMP(sigaltstack) |
| 256 | ENTRY_SAME(ni_syscall) /* query_module */ | 256 | ENTRY_SAME(ni_syscall) /* query_module */ |
| 257 | ENTRY_SAME(poll) | 257 | ENTRY_SAME(poll) |
| 258 | /* structs contain pointers and an in_addr... */ | 258 | /* structs contain pointers and an in_addr... */ |
| @@ -262,9 +262,9 @@ | |||
| 262 | ENTRY_SAME(prctl) | 262 | ENTRY_SAME(prctl) |
| 263 | /* signals need a careful review */ | 263 | /* signals need a careful review */ |
| 264 | ENTRY_SAME(rt_sigreturn_wrapper) | 264 | ENTRY_SAME(rt_sigreturn_wrapper) |
| 265 | ENTRY_DIFF(rt_sigaction) | 265 | ENTRY_COMP(rt_sigaction) |
| 266 | ENTRY_DIFF(rt_sigprocmask) /* 175 */ | 266 | ENTRY_COMP(rt_sigprocmask) /* 175 */ |
| 267 | ENTRY_DIFF(rt_sigpending) | 267 | ENTRY_COMP(rt_sigpending) |
| 268 | ENTRY_COMP(rt_sigtimedwait) | 268 | ENTRY_COMP(rt_sigtimedwait) |
| 269 | /* even though the struct siginfo_t is different, it appears like | 269 | /* even though the struct siginfo_t is different, it appears like |
| 270 | * all the paths use values which should be same wide and narrow. | 270 | * all the paths use values which should be same wide and narrow. |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index a5255f242be9..5c7470689a10 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
| @@ -143,6 +143,8 @@ config PPC | |||
| 143 | select MODULES_USE_ELF_RELA | 143 | select MODULES_USE_ELF_RELA |
| 144 | select CLONE_BACKWARDS | 144 | select CLONE_BACKWARDS |
| 145 | select ARCH_USE_BUILTIN_BSWAP | 145 | select ARCH_USE_BUILTIN_BSWAP |
| 146 | select OLD_SIGSUSPEND | ||
| 147 | select OLD_SIGACTION if PPC32 | ||
| 146 | 148 | ||
| 147 | config EARLY_PRINTK | 149 | config EARLY_PRINTK |
| 148 | bool | 150 | bool |
| @@ -153,6 +155,7 @@ config COMPAT | |||
| 153 | default y if PPC64 | 155 | default y if PPC64 |
| 154 | select COMPAT_BINFMT_ELF | 156 | select COMPAT_BINFMT_ELF |
| 155 | select ARCH_WANT_OLD_COMPAT_IPC | 157 | select ARCH_WANT_OLD_COMPAT_IPC |
| 158 | select COMPAT_OLD_SIGACTION | ||
| 156 | 159 | ||
| 157 | config SYSVIPC_COMPAT | 160 | config SYSVIPC_COMPAT |
| 158 | bool | 161 | bool |
diff --git a/arch/powerpc/include/asm/signal.h b/arch/powerpc/include/asm/signal.h index a101637725a2..fbe66c463891 100644 --- a/arch/powerpc/include/asm/signal.h +++ b/arch/powerpc/include/asm/signal.h | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #ifndef _ASM_POWERPC_SIGNAL_H | 1 | #ifndef _ASM_POWERPC_SIGNAL_H |
| 2 | #define _ASM_POWERPC_SIGNAL_H | 2 | #define _ASM_POWERPC_SIGNAL_H |
| 3 | 3 | ||
| 4 | #define __ARCH_HAS_SA_RESTORER | ||
| 4 | #include <uapi/asm/signal.h> | 5 | #include <uapi/asm/signal.h> |
| 5 | 6 | ||
| 6 | #endif /* _ASM_POWERPC_SIGNAL_H */ | 7 | #endif /* _ASM_POWERPC_SIGNAL_H */ |
diff --git a/arch/powerpc/include/asm/syscalls.h b/arch/powerpc/include/asm/syscalls.h index b5308d3e6d39..23be8f1e7e64 100644 --- a/arch/powerpc/include/asm/syscalls.h +++ b/arch/powerpc/include/asm/syscalls.h | |||
| @@ -5,11 +5,8 @@ | |||
| 5 | #include <linux/compiler.h> | 5 | #include <linux/compiler.h> |
| 6 | #include <linux/linkage.h> | 6 | #include <linux/linkage.h> |
| 7 | #include <linux/types.h> | 7 | #include <linux/types.h> |
| 8 | #include <asm/signal.h> | ||
| 9 | 8 | ||
| 10 | struct pt_regs; | ||
| 11 | struct rtas_args; | 9 | struct rtas_args; |
| 12 | struct sigaction; | ||
| 13 | 10 | ||
| 14 | asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len, | 11 | asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len, |
| 15 | unsigned long prot, unsigned long flags, | 12 | unsigned long prot, unsigned long flags, |
| @@ -17,20 +14,8 @@ asmlinkage unsigned long sys_mmap(unsigned long addr, size_t len, | |||
| 17 | asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len, | 14 | asmlinkage unsigned long sys_mmap2(unsigned long addr, size_t len, |
| 18 | unsigned long prot, unsigned long flags, | 15 | unsigned long prot, unsigned long flags, |
| 19 | unsigned long fd, unsigned long pgoff); | 16 | unsigned long fd, unsigned long pgoff); |
| 20 | asmlinkage long sys_pipe(int __user *fildes); | ||
| 21 | asmlinkage long sys_pipe2(int __user *fildes, int flags); | ||
| 22 | asmlinkage long sys_rt_sigaction(int sig, | ||
| 23 | const struct sigaction __user *act, | ||
| 24 | struct sigaction __user *oact, size_t sigsetsize); | ||
| 25 | asmlinkage long ppc64_personality(unsigned long personality); | 17 | asmlinkage long ppc64_personality(unsigned long personality); |
| 26 | asmlinkage int ppc_rtas(struct rtas_args __user *uargs); | 18 | asmlinkage int ppc_rtas(struct rtas_args __user *uargs); |
| 27 | asmlinkage time_t sys64_time(time_t __user * tloc); | ||
| 28 | |||
| 29 | asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, | ||
| 30 | size_t sigsetsize); | ||
| 31 | asmlinkage long sys_sigaltstack(const stack_t __user *uss, | ||
| 32 | stack_t __user *uoss, unsigned long r5, unsigned long r6, | ||
| 33 | unsigned long r7, unsigned long r8, struct pt_regs *regs); | ||
| 34 | 19 | ||
| 35 | #endif /* __KERNEL__ */ | 20 | #endif /* __KERNEL__ */ |
| 36 | #endif /* __ASM_POWERPC_SYSCALLS_H */ | 21 | #endif /* __ASM_POWERPC_SYSCALLS_H */ |
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index 97909d3b1d7b..d906f33441c6 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
| @@ -10,8 +10,8 @@ SYSCALL_SPU(read) | |||
| 10 | SYSCALL_SPU(write) | 10 | SYSCALL_SPU(write) |
| 11 | COMPAT_SYS_SPU(open) | 11 | COMPAT_SYS_SPU(open) |
| 12 | SYSCALL_SPU(close) | 12 | SYSCALL_SPU(close) |
| 13 | COMPAT_SYS_SPU(waitpid) | 13 | SYSCALL_SPU(waitpid) |
| 14 | COMPAT_SYS_SPU(creat) | 14 | SYSCALL_SPU(creat) |
| 15 | SYSCALL_SPU(link) | 15 | SYSCALL_SPU(link) |
| 16 | SYSCALL_SPU(unlink) | 16 | SYSCALL_SPU(unlink) |
| 17 | COMPAT_SYS(execve) | 17 | COMPAT_SYS(execve) |
| @@ -36,13 +36,13 @@ SYSCALL(pause) | |||
| 36 | COMPAT_SYS(utime) | 36 | COMPAT_SYS(utime) |
| 37 | SYSCALL(ni_syscall) | 37 | SYSCALL(ni_syscall) |
| 38 | SYSCALL(ni_syscall) | 38 | SYSCALL(ni_syscall) |
| 39 | COMPAT_SYS_SPU(access) | 39 | SYSCALL_SPU(access) |
| 40 | COMPAT_SYS_SPU(nice) | 40 | SYSCALL_SPU(nice) |
| 41 | SYSCALL(ni_syscall) | 41 | SYSCALL(ni_syscall) |
| 42 | SYSCALL_SPU(sync) | 42 | SYSCALL_SPU(sync) |
| 43 | COMPAT_SYS_SPU(kill) | 43 | SYSCALL_SPU(kill) |
| 44 | SYSCALL_SPU(rename) | 44 | SYSCALL_SPU(rename) |
| 45 | COMPAT_SYS_SPU(mkdir) | 45 | SYSCALL_SPU(mkdir) |
| 46 | SYSCALL_SPU(rmdir) | 46 | SYSCALL_SPU(rmdir) |
| 47 | SYSCALL_SPU(dup) | 47 | SYSCALL_SPU(dup) |
| 48 | SYSCALL_SPU(pipe) | 48 | SYSCALL_SPU(pipe) |
| @@ -60,10 +60,10 @@ SYSCALL(ni_syscall) | |||
| 60 | COMPAT_SYS_SPU(ioctl) | 60 | COMPAT_SYS_SPU(ioctl) |
| 61 | COMPAT_SYS_SPU(fcntl) | 61 | COMPAT_SYS_SPU(fcntl) |
| 62 | SYSCALL(ni_syscall) | 62 | SYSCALL(ni_syscall) |
| 63 | COMPAT_SYS_SPU(setpgid) | 63 | SYSCALL_SPU(setpgid) |
| 64 | SYSCALL(ni_syscall) | 64 | SYSCALL(ni_syscall) |
| 65 | SYSX(sys_ni_syscall,sys_olduname, sys_olduname) | 65 | SYSX(sys_ni_syscall,sys_olduname, sys_olduname) |
| 66 | COMPAT_SYS_SPU(umask) | 66 | SYSCALL_SPU(umask) |
| 67 | SYSCALL_SPU(chroot) | 67 | SYSCALL_SPU(chroot) |
| 68 | COMPAT_SYS(ustat) | 68 | COMPAT_SYS(ustat) |
| 69 | SYSCALL_SPU(dup2) | 69 | SYSCALL_SPU(dup2) |
| @@ -72,23 +72,24 @@ SYSCALL_SPU(getpgrp) | |||
| 72 | SYSCALL_SPU(setsid) | 72 | SYSCALL_SPU(setsid) |
| 73 | SYS32ONLY(sigaction) | 73 | SYS32ONLY(sigaction) |
| 74 | SYSCALL_SPU(sgetmask) | 74 | SYSCALL_SPU(sgetmask) |
| 75 | COMPAT_SYS_SPU(ssetmask) | 75 | SYSCALL_SPU(ssetmask) |
| 76 | SYSCALL_SPU(setreuid) | 76 | SYSCALL_SPU(setreuid) |
| 77 | SYSCALL_SPU(setregid) | 77 | SYSCALL_SPU(setregid) |
| 78 | #define compat_sys_sigsuspend sys_sigsuspend | ||
| 78 | SYS32ONLY(sigsuspend) | 79 | SYS32ONLY(sigsuspend) |
| 79 | COMPAT_SYS(sigpending) | 80 | COMPAT_SYS(sigpending) |
| 80 | COMPAT_SYS_SPU(sethostname) | 81 | SYSCALL_SPU(sethostname) |
| 81 | COMPAT_SYS_SPU(setrlimit) | 82 | COMPAT_SYS_SPU(setrlimit) |
| 82 | COMPAT_SYS(old_getrlimit) | 83 | COMPAT_SYS(old_getrlimit) |
| 83 | COMPAT_SYS_SPU(getrusage) | 84 | COMPAT_SYS_SPU(getrusage) |
| 84 | COMPAT_SYS_SPU(gettimeofday) | 85 | COMPAT_SYS_SPU(gettimeofday) |
| 85 | COMPAT_SYS_SPU(settimeofday) | 86 | COMPAT_SYS_SPU(settimeofday) |
| 86 | COMPAT_SYS_SPU(getgroups) | 87 | SYSCALL_SPU(getgroups) |
| 87 | COMPAT_SYS_SPU(setgroups) | 88 | SYSCALL_SPU(setgroups) |
| 88 | SYSX(sys_ni_syscall,sys_ni_syscall,ppc_select) | 89 | SYSX(sys_ni_syscall,sys_ni_syscall,ppc_select) |
| 89 | SYSCALL_SPU(symlink) | 90 | SYSCALL_SPU(symlink) |
| 90 | OLDSYS(lstat) | 91 | OLDSYS(lstat) |
| 91 | COMPAT_SYS_SPU(readlink) | 92 | SYSCALL_SPU(readlink) |
| 92 | SYSCALL(uselib) | 93 | SYSCALL(uselib) |
| 93 | SYSCALL(swapon) | 94 | SYSCALL(swapon) |
| 94 | SYSCALL(reboot) | 95 | SYSCALL(reboot) |
| @@ -99,14 +100,14 @@ COMPAT_SYS_SPU(truncate) | |||
| 99 | COMPAT_SYS_SPU(ftruncate) | 100 | COMPAT_SYS_SPU(ftruncate) |
| 100 | SYSCALL_SPU(fchmod) | 101 | SYSCALL_SPU(fchmod) |
| 101 | SYSCALL_SPU(fchown) | 102 | SYSCALL_SPU(fchown) |
| 102 | COMPAT_SYS_SPU(getpriority) | 103 | SYSCALL_SPU(getpriority) |
| 103 | COMPAT_SYS_SPU(setpriority) | 104 | SYSCALL_SPU(setpriority) |
| 104 | SYSCALL(ni_syscall) | 105 | SYSCALL(ni_syscall) |
| 105 | COMPAT_SYS(statfs) | 106 | COMPAT_SYS(statfs) |
| 106 | COMPAT_SYS(fstatfs) | 107 | COMPAT_SYS(fstatfs) |
| 107 | SYSCALL(ni_syscall) | 108 | SYSCALL(ni_syscall) |
| 108 | COMPAT_SYS_SPU(socketcall) | 109 | COMPAT_SYS_SPU(socketcall) |
| 109 | COMPAT_SYS_SPU(syslog) | 110 | SYSCALL_SPU(syslog) |
| 110 | COMPAT_SYS_SPU(setitimer) | 111 | COMPAT_SYS_SPU(setitimer) |
| 111 | COMPAT_SYS_SPU(getitimer) | 112 | COMPAT_SYS_SPU(getitimer) |
| 112 | COMPAT_SYS_SPU(newstat) | 113 | COMPAT_SYS_SPU(newstat) |
| @@ -124,7 +125,7 @@ COMPAT_SYS(ipc) | |||
| 124 | SYSCALL_SPU(fsync) | 125 | SYSCALL_SPU(fsync) |
| 125 | SYS32ONLY(sigreturn) | 126 | SYS32ONLY(sigreturn) |
| 126 | PPC_SYS(clone) | 127 | PPC_SYS(clone) |
| 127 | COMPAT_SYS_SPU(setdomainname) | 128 | SYSCALL_SPU(setdomainname) |
| 128 | SYSCALL_SPU(newuname) | 129 | SYSCALL_SPU(newuname) |
| 129 | SYSCALL(ni_syscall) | 130 | SYSCALL(ni_syscall) |
| 130 | COMPAT_SYS_SPU(adjtimex) | 131 | COMPAT_SYS_SPU(adjtimex) |
| @@ -135,10 +136,10 @@ SYSCALL(init_module) | |||
| 135 | SYSCALL(delete_module) | 136 | SYSCALL(delete_module) |
| 136 | SYSCALL(ni_syscall) | 137 | SYSCALL(ni_syscall) |
| 137 | SYSCALL(quotactl) | 138 | SYSCALL(quotactl) |
| 138 | COMPAT_SYS_SPU(getpgid) | 139 | SYSCALL_SPU(getpgid) |
| 139 | SYSCALL_SPU(fchdir) | 140 | SYSCALL_SPU(fchdir) |
| 140 | SYSCALL_SPU(bdflush) | 141 | SYSCALL_SPU(bdflush) |
| 141 | COMPAT_SYS(sysfs) | 142 | SYSCALL_SPU(sysfs) |
| 142 | SYSX_SPU(ppc64_personality,ppc64_personality,sys_personality) | 143 | SYSX_SPU(ppc64_personality,ppc64_personality,sys_personality) |
| 143 | SYSCALL(ni_syscall) | 144 | SYSCALL(ni_syscall) |
| 144 | SYSCALL_SPU(setfsuid) | 145 | SYSCALL_SPU(setfsuid) |
| @@ -150,21 +151,21 @@ SYSCALL_SPU(flock) | |||
| 150 | SYSCALL_SPU(msync) | 151 | SYSCALL_SPU(msync) |
| 151 | COMPAT_SYS_SPU(readv) | 152 | COMPAT_SYS_SPU(readv) |
| 152 | COMPAT_SYS_SPU(writev) | 153 | COMPAT_SYS_SPU(writev) |
| 153 | COMPAT_SYS_SPU(getsid) | 154 | SYSCALL_SPU(getsid) |
| 154 | SYSCALL_SPU(fdatasync) | 155 | SYSCALL_SPU(fdatasync) |
| 155 | COMPAT_SYS(sysctl) | 156 | COMPAT_SYS(sysctl) |
| 156 | SYSCALL_SPU(mlock) | 157 | SYSCALL_SPU(mlock) |
| 157 | SYSCALL_SPU(munlock) | 158 | SYSCALL_SPU(munlock) |
| 158 | SYSCALL_SPU(mlockall) | 159 | SYSCALL_SPU(mlockall) |
| 159 | SYSCALL_SPU(munlockall) | 160 | SYSCALL_SPU(munlockall) |
| 160 | COMPAT_SYS_SPU(sched_setparam) | 161 | SYSCALL_SPU(sched_setparam) |
| 161 | COMPAT_SYS_SPU(sched_getparam) | 162 | SYSCALL_SPU(sched_getparam) |
| 162 | COMPAT_SYS_SPU(sched_setscheduler) | 163 | SYSCALL_SPU(sched_setscheduler) |
| 163 | COMPAT_SYS_SPU(sched_getscheduler) | 164 | SYSCALL_SPU(sched_getscheduler) |
| 164 | SYSCALL_SPU(sched_yield) | 165 | SYSCALL_SPU(sched_yield) |
| 165 | COMPAT_SYS_SPU(sched_get_priority_max) | 166 | SYSCALL_SPU(sched_get_priority_max) |
| 166 | COMPAT_SYS_SPU(sched_get_priority_min) | 167 | SYSCALL_SPU(sched_get_priority_min) |
| 167 | SYSX_SPU(sys_sched_rr_get_interval,compat_sys_sched_rr_get_interval_wrapper,sys_sched_rr_get_interval) | 168 | COMPAT_SYS_SPU(sched_rr_get_interval) |
| 168 | COMPAT_SYS_SPU(nanosleep) | 169 | COMPAT_SYS_SPU(nanosleep) |
| 169 | SYSCALL_SPU(mremap) | 170 | SYSCALL_SPU(mremap) |
| 170 | SYSCALL_SPU(setresuid) | 171 | SYSCALL_SPU(setresuid) |
| @@ -174,7 +175,7 @@ SYSCALL_SPU(poll) | |||
| 174 | SYSCALL(ni_syscall) | 175 | SYSCALL(ni_syscall) |
| 175 | SYSCALL_SPU(setresgid) | 176 | SYSCALL_SPU(setresgid) |
| 176 | SYSCALL_SPU(getresgid) | 177 | SYSCALL_SPU(getresgid) |
| 177 | COMPAT_SYS_SPU(prctl) | 178 | SYSCALL_SPU(prctl) |
| 178 | COMPAT_SYS(rt_sigreturn) | 179 | COMPAT_SYS(rt_sigreturn) |
| 179 | COMPAT_SYS(rt_sigaction) | 180 | COMPAT_SYS(rt_sigaction) |
| 180 | COMPAT_SYS(rt_sigprocmask) | 181 | COMPAT_SYS(rt_sigprocmask) |
| @@ -253,7 +254,7 @@ COMPAT_SYS_SPU(clock_gettime) | |||
| 253 | COMPAT_SYS_SPU(clock_getres) | 254 | COMPAT_SYS_SPU(clock_getres) |
| 254 | COMPAT_SYS_SPU(clock_nanosleep) | 255 | COMPAT_SYS_SPU(clock_nanosleep) |
| 255 | SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext) | 256 | SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext) |
| 256 | COMPAT_SYS_SPU(tgkill) | 257 | SYSCALL_SPU(tgkill) |
| 257 | COMPAT_SYS_SPU(utimes) | 258 | COMPAT_SYS_SPU(utimes) |
| 258 | COMPAT_SYS_SPU(statfs64) | 259 | COMPAT_SYS_SPU(statfs64) |
| 259 | COMPAT_SYS_SPU(fstatfs64) | 260 | COMPAT_SYS_SPU(fstatfs64) |
| @@ -276,8 +277,8 @@ COMPAT_SYS(add_key) | |||
| 276 | COMPAT_SYS(request_key) | 277 | COMPAT_SYS(request_key) |
| 277 | COMPAT_SYS(keyctl) | 278 | COMPAT_SYS(keyctl) |
| 278 | COMPAT_SYS(waitid) | 279 | COMPAT_SYS(waitid) |
| 279 | COMPAT_SYS(ioprio_set) | 280 | SYSCALL(ioprio_set) |
| 280 | COMPAT_SYS(ioprio_get) | 281 | SYSCALL(ioprio_get) |
| 281 | SYSCALL(inotify_init) | 282 | SYSCALL(inotify_init) |
| 282 | SYSCALL(inotify_add_watch) | 283 | SYSCALL(inotify_add_watch) |
| 283 | SYSCALL(inotify_rm_watch) | 284 | SYSCALL(inotify_rm_watch) |
diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 1d4864a40e35..f25b5c45c435 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h | |||
| @@ -44,17 +44,13 @@ | |||
| 44 | #define __ARCH_WANT_SYS_OLDUMOUNT | 44 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 45 | #define __ARCH_WANT_SYS_SIGPENDING | 45 | #define __ARCH_WANT_SYS_SIGPENDING |
| 46 | #define __ARCH_WANT_SYS_SIGPROCMASK | 46 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 47 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 48 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 49 | #ifdef CONFIG_PPC32 | 47 | #ifdef CONFIG_PPC32 |
| 50 | #define __ARCH_WANT_OLD_STAT | 48 | #define __ARCH_WANT_OLD_STAT |
| 51 | #endif | 49 | #endif |
| 52 | #ifdef CONFIG_PPC64 | 50 | #ifdef CONFIG_PPC64 |
| 53 | #define __ARCH_WANT_COMPAT_SYS_TIME | 51 | #define __ARCH_WANT_COMPAT_SYS_TIME |
| 54 | #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | ||
| 55 | #define __ARCH_WANT_SYS_NEWFSTATAT | 52 | #define __ARCH_WANT_SYS_NEWFSTATAT |
| 56 | #define __ARCH_WANT_COMPAT_SYS_SENDFILE | 53 | #define __ARCH_WANT_COMPAT_SYS_SENDFILE |
| 57 | #define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL | ||
| 58 | #endif | 54 | #endif |
| 59 | #define __ARCH_WANT_SYS_FORK | 55 | #define __ARCH_WANT_SYS_FORK |
| 60 | #define __ARCH_WANT_SYS_VFORK | 56 | #define __ARCH_WANT_SYS_VFORK |
diff --git a/arch/powerpc/include/uapi/asm/signal.h b/arch/powerpc/include/uapi/asm/signal.h index e079fb39d5bc..6c69ee94fd8d 100644 --- a/arch/powerpc/include/uapi/asm/signal.h +++ b/arch/powerpc/include/uapi/asm/signal.h | |||
| @@ -90,6 +90,7 @@ typedef struct { | |||
| 90 | 90 | ||
| 91 | #include <asm-generic/signal-defs.h> | 91 | #include <asm-generic/signal-defs.h> |
| 92 | 92 | ||
| 93 | #ifndef __KERNEL__ | ||
| 93 | struct old_sigaction { | 94 | struct old_sigaction { |
| 94 | __sighandler_t sa_handler; | 95 | __sighandler_t sa_handler; |
| 95 | old_sigset_t sa_mask; | 96 | old_sigset_t sa_mask; |
| @@ -103,10 +104,7 @@ struct sigaction { | |||
| 103 | __sigrestore_t sa_restorer; | 104 | __sigrestore_t sa_restorer; |
| 104 | sigset_t sa_mask; /* mask last for extensibility */ | 105 | sigset_t sa_mask; /* mask last for extensibility */ |
| 105 | }; | 106 | }; |
| 106 | 107 | #endif | |
| 107 | struct k_sigaction { | ||
| 108 | struct sigaction sa; | ||
| 109 | }; | ||
| 110 | 108 | ||
| 111 | typedef struct sigaltstack { | 109 | typedef struct sigaltstack { |
| 112 | void __user *ss_sp; | 110 | void __user *ss_sp; |
diff --git a/arch/powerpc/kernel/ppc32.h b/arch/powerpc/kernel/ppc32.h index 02fb0ee26093..a27c914d5802 100644 --- a/arch/powerpc/kernel/ppc32.h +++ b/arch/powerpc/kernel/ppc32.h | |||
| @@ -16,30 +16,6 @@ | |||
| 16 | 16 | ||
| 17 | /* These are here to support 32-bit syscalls on a 64-bit kernel. */ | 17 | /* These are here to support 32-bit syscalls on a 64-bit kernel. */ |
| 18 | 18 | ||
| 19 | #define __old_sigaction32 old_sigaction32 | ||
| 20 | |||
| 21 | struct __old_sigaction32 { | ||
| 22 | compat_uptr_t sa_handler; | ||
| 23 | compat_old_sigset_t sa_mask; | ||
| 24 | unsigned int sa_flags; | ||
| 25 | compat_uptr_t sa_restorer; /* not used by Linux/SPARC yet */ | ||
| 26 | }; | ||
| 27 | |||
| 28 | |||
| 29 | |||
| 30 | struct sigaction32 { | ||
| 31 | compat_uptr_t sa_handler; /* Really a pointer, but need to deal with 32 bits */ | ||
| 32 | unsigned int sa_flags; | ||
| 33 | compat_uptr_t sa_restorer; /* Another 32 bit pointer */ | ||
| 34 | compat_sigset_t sa_mask; /* A 32 bit mask */ | ||
| 35 | }; | ||
| 36 | |||
| 37 | typedef struct sigaltstack_32 { | ||
| 38 | unsigned int ss_sp; | ||
| 39 | int ss_flags; | ||
| 40 | compat_size_t ss_size; | ||
| 41 | } stack_32_t; | ||
| 42 | |||
| 43 | struct pt_regs32 { | 19 | struct pt_regs32 { |
| 44 | unsigned int gpr[32]; | 20 | unsigned int gpr[32]; |
| 45 | unsigned int nip; | 21 | unsigned int nip; |
| @@ -75,7 +51,7 @@ struct mcontext32 { | |||
| 75 | struct ucontext32 { | 51 | struct ucontext32 { |
| 76 | unsigned int uc_flags; | 52 | unsigned int uc_flags; |
| 77 | unsigned int uc_link; | 53 | unsigned int uc_link; |
| 78 | stack_32_t uc_stack; | 54 | compat_stack_t uc_stack; |
| 79 | int uc_pad[7]; | 55 | int uc_pad[7]; |
| 80 | compat_uptr_t uc_regs; /* points to uc_mcontext field */ | 56 | compat_uptr_t uc_regs; /* points to uc_mcontext field */ |
| 81 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ | 57 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ |
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c index 3003d890e9ef..cf12eae02de5 100644 --- a/arch/powerpc/kernel/signal.c +++ b/arch/powerpc/kernel/signal.c | |||
| @@ -170,10 +170,3 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags) | |||
| 170 | tracehook_notify_resume(regs); | 170 | tracehook_notify_resume(regs); |
| 171 | } | 171 | } |
| 172 | } | 172 | } |
| 173 | |||
| 174 | long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
| 175 | unsigned long r5, unsigned long r6, unsigned long r7, | ||
| 176 | unsigned long r8, struct pt_regs *regs) | ||
| 177 | { | ||
| 178 | return do_sigaltstack(uss, uoss, regs->gpr[1]); | ||
| 179 | } | ||
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c index e4a88d340de6..3acb28e245b4 100644 --- a/arch/powerpc/kernel/signal_32.c +++ b/arch/powerpc/kernel/signal_32.c | |||
| @@ -57,10 +57,7 @@ | |||
| 57 | #undef DEBUG_SIG | 57 | #undef DEBUG_SIG |
| 58 | 58 | ||
| 59 | #ifdef CONFIG_PPC64 | 59 | #ifdef CONFIG_PPC64 |
| 60 | #define sys_sigsuspend compat_sys_sigsuspend | ||
| 61 | #define sys_rt_sigsuspend compat_sys_rt_sigsuspend | ||
| 62 | #define sys_rt_sigreturn compat_sys_rt_sigreturn | 60 | #define sys_rt_sigreturn compat_sys_rt_sigreturn |
| 63 | #define sys_sigaction compat_sys_sigaction | ||
| 64 | #define sys_swapcontext compat_sys_swapcontext | 61 | #define sys_swapcontext compat_sys_swapcontext |
| 65 | #define sys_sigreturn compat_sys_sigreturn | 62 | #define sys_sigreturn compat_sys_sigreturn |
| 66 | 63 | ||
| @@ -69,6 +66,8 @@ | |||
| 69 | #define mcontext mcontext32 | 66 | #define mcontext mcontext32 |
| 70 | #define ucontext ucontext32 | 67 | #define ucontext ucontext32 |
| 71 | 68 | ||
| 69 | #define __save_altstack __compat_save_altstack | ||
| 70 | |||
| 72 | /* | 71 | /* |
| 73 | * Userspace code may pass a ucontext which doesn't include VSX added | 72 | * Userspace code may pass a ucontext which doesn't include VSX added |
| 74 | * at the end. We need to check for this case. | 73 | * at the end. We need to check for this case. |
| @@ -131,23 +130,6 @@ static inline int get_sigset_t(sigset_t *set, | |||
| 131 | return 0; | 130 | return 0; |
| 132 | } | 131 | } |
| 133 | 132 | ||
| 134 | static inline int get_old_sigaction(struct k_sigaction *new_ka, | ||
| 135 | struct old_sigaction __user *act) | ||
| 136 | { | ||
| 137 | compat_old_sigset_t mask; | ||
| 138 | compat_uptr_t handler, restorer; | ||
| 139 | |||
| 140 | if (get_user(handler, &act->sa_handler) || | ||
| 141 | __get_user(restorer, &act->sa_restorer) || | ||
| 142 | __get_user(new_ka->sa.sa_flags, &act->sa_flags) || | ||
| 143 | __get_user(mask, &act->sa_mask)) | ||
| 144 | return -EFAULT; | ||
| 145 | new_ka->sa.sa_handler = compat_ptr(handler); | ||
| 146 | new_ka->sa.sa_restorer = compat_ptr(restorer); | ||
| 147 | siginitset(&new_ka->sa.sa_mask, mask); | ||
| 148 | return 0; | ||
| 149 | } | ||
| 150 | |||
| 151 | #define to_user_ptr(p) ptr_to_compat(p) | 133 | #define to_user_ptr(p) ptr_to_compat(p) |
| 152 | #define from_user_ptr(p) compat_ptr(p) | 134 | #define from_user_ptr(p) compat_ptr(p) |
| 153 | 135 | ||
| @@ -197,21 +179,6 @@ static inline int get_sigset_t(sigset_t *set, const sigset_t __user *uset) | |||
| 197 | return copy_from_user(set, uset, sizeof(*uset)); | 179 | return copy_from_user(set, uset, sizeof(*uset)); |
| 198 | } | 180 | } |
| 199 | 181 | ||
| 200 | static inline int get_old_sigaction(struct k_sigaction *new_ka, | ||
| 201 | struct old_sigaction __user *act) | ||
| 202 | { | ||
| 203 | old_sigset_t mask; | ||
| 204 | |||
| 205 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 206 | __get_user(new_ka->sa.sa_handler, &act->sa_handler) || | ||
| 207 | __get_user(new_ka->sa.sa_restorer, &act->sa_restorer) || | ||
| 208 | __get_user(new_ka->sa.sa_flags, &act->sa_flags) || | ||
| 209 | __get_user(mask, &act->sa_mask)) | ||
| 210 | return -EFAULT; | ||
| 211 | siginitset(&new_ka->sa.sa_mask, mask); | ||
| 212 | return 0; | ||
| 213 | } | ||
| 214 | |||
| 215 | #define to_user_ptr(p) ((unsigned long)(p)) | 182 | #define to_user_ptr(p) ((unsigned long)(p)) |
| 216 | #define from_user_ptr(p) ((void __user *)(p)) | 183 | #define from_user_ptr(p) ((void __user *)(p)) |
| 217 | 184 | ||
| @@ -235,50 +202,8 @@ static inline int restore_general_regs(struct pt_regs *regs, | |||
| 235 | return -EFAULT; | 202 | return -EFAULT; |
| 236 | return 0; | 203 | return 0; |
| 237 | } | 204 | } |
| 238 | |||
| 239 | #endif /* CONFIG_PPC64 */ | ||
| 240 | |||
| 241 | /* | ||
| 242 | * Atomically swap in the new signal mask, and wait for a signal. | ||
| 243 | */ | ||
| 244 | long sys_sigsuspend(old_sigset_t mask) | ||
| 245 | { | ||
| 246 | sigset_t blocked; | ||
| 247 | siginitset(&blocked, mask); | ||
| 248 | return sigsuspend(&blocked); | ||
| 249 | } | ||
| 250 | |||
| 251 | long sys_sigaction(int sig, struct old_sigaction __user *act, | ||
| 252 | struct old_sigaction __user *oact) | ||
| 253 | { | ||
| 254 | struct k_sigaction new_ka, old_ka; | ||
| 255 | int ret; | ||
| 256 | |||
| 257 | #ifdef CONFIG_PPC64 | ||
| 258 | if (sig < 0) | ||
| 259 | sig = -sig; | ||
| 260 | #endif | 205 | #endif |
| 261 | 206 | ||
| 262 | if (act) { | ||
| 263 | if (get_old_sigaction(&new_ka, act)) | ||
| 264 | return -EFAULT; | ||
| 265 | } | ||
| 266 | |||
| 267 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 268 | if (!ret && oact) { | ||
| 269 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 270 | __put_user(to_user_ptr(old_ka.sa.sa_handler), | ||
| 271 | &oact->sa_handler) || | ||
| 272 | __put_user(to_user_ptr(old_ka.sa.sa_restorer), | ||
| 273 | &oact->sa_restorer) || | ||
| 274 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 275 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 276 | return -EFAULT; | ||
| 277 | } | ||
| 278 | |||
| 279 | return ret; | ||
| 280 | } | ||
| 281 | |||
| 282 | /* | 207 | /* |
| 283 | * When we have signals to deliver, we set up on the | 208 | * When we have signals to deliver, we set up on the |
| 284 | * user stack, going down from the original stack pointer: | 209 | * user stack, going down from the original stack pointer: |
| @@ -951,89 +876,6 @@ static long restore_tm_user_regs(struct pt_regs *regs, | |||
| 951 | #endif | 876 | #endif |
| 952 | 877 | ||
| 953 | #ifdef CONFIG_PPC64 | 878 | #ifdef CONFIG_PPC64 |
| 954 | long compat_sys_rt_sigaction(int sig, const struct sigaction32 __user *act, | ||
| 955 | struct sigaction32 __user *oact, size_t sigsetsize) | ||
| 956 | { | ||
| 957 | struct k_sigaction new_ka, old_ka; | ||
| 958 | int ret; | ||
| 959 | |||
| 960 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 961 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
| 962 | return -EINVAL; | ||
| 963 | |||
| 964 | if (act) { | ||
| 965 | compat_uptr_t handler; | ||
| 966 | |||
| 967 | ret = get_user(handler, &act->sa_handler); | ||
| 968 | new_ka.sa.sa_handler = compat_ptr(handler); | ||
| 969 | ret |= get_sigset_t(&new_ka.sa.sa_mask, &act->sa_mask); | ||
| 970 | ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 971 | if (ret) | ||
| 972 | return -EFAULT; | ||
| 973 | } | ||
| 974 | |||
| 975 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 976 | if (!ret && oact) { | ||
| 977 | ret = put_user(to_user_ptr(old_ka.sa.sa_handler), &oact->sa_handler); | ||
| 978 | ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask); | ||
| 979 | ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 980 | } | ||
| 981 | return ret; | ||
| 982 | } | ||
| 983 | |||
| 984 | /* | ||
| 985 | * Note: it is necessary to treat how as an unsigned int, with the | ||
| 986 | * corresponding cast to a signed int to insure that the proper | ||
| 987 | * conversion (sign extension) between the register representation | ||
| 988 | * of a signed int (msr in 32-bit mode) and the register representation | ||
| 989 | * of a signed int (msr in 64-bit mode) is performed. | ||
| 990 | */ | ||
| 991 | long compat_sys_rt_sigprocmask(u32 how, compat_sigset_t __user *set, | ||
| 992 | compat_sigset_t __user *oset, size_t sigsetsize) | ||
| 993 | { | ||
| 994 | sigset_t s; | ||
| 995 | sigset_t __user *up; | ||
| 996 | int ret; | ||
| 997 | mm_segment_t old_fs = get_fs(); | ||
| 998 | |||
| 999 | if (set) { | ||
| 1000 | if (get_sigset_t(&s, set)) | ||
| 1001 | return -EFAULT; | ||
| 1002 | } | ||
| 1003 | |||
| 1004 | set_fs(KERNEL_DS); | ||
| 1005 | /* This is valid because of the set_fs() */ | ||
| 1006 | up = (sigset_t __user *) &s; | ||
| 1007 | ret = sys_rt_sigprocmask((int)how, set ? up : NULL, oset ? up : NULL, | ||
| 1008 | sigsetsize); | ||
| 1009 | set_fs(old_fs); | ||
| 1010 | if (ret) | ||
| 1011 | return ret; | ||
| 1012 | if (oset) { | ||
| 1013 | if (put_sigset_t(oset, &s)) | ||
| 1014 | return -EFAULT; | ||
| 1015 | } | ||
| 1016 | return 0; | ||
| 1017 | } | ||
| 1018 | |||
| 1019 | long compat_sys_rt_sigpending(compat_sigset_t __user *set, compat_size_t sigsetsize) | ||
| 1020 | { | ||
| 1021 | sigset_t s; | ||
| 1022 | int ret; | ||
| 1023 | mm_segment_t old_fs = get_fs(); | ||
| 1024 | |||
| 1025 | set_fs(KERNEL_DS); | ||
| 1026 | /* The __user pointer cast is valid because of the set_fs() */ | ||
| 1027 | ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize); | ||
| 1028 | set_fs(old_fs); | ||
| 1029 | if (!ret) { | ||
| 1030 | if (put_sigset_t(set, &s)) | ||
| 1031 | return -EFAULT; | ||
| 1032 | } | ||
| 1033 | return ret; | ||
| 1034 | } | ||
| 1035 | |||
| 1036 | |||
| 1037 | int copy_siginfo_to_user32(struct compat_siginfo __user *d, siginfo_t *s) | 879 | int copy_siginfo_to_user32(struct compat_siginfo __user *d, siginfo_t *s) |
| 1038 | { | 880 | { |
| 1039 | int err; | 881 | int err; |
| @@ -1102,79 +944,6 @@ int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from) | |||
| 1102 | 944 | ||
| 1103 | return 0; | 945 | return 0; |
| 1104 | } | 946 | } |
| 1105 | |||
| 1106 | /* | ||
| 1107 | * Note: it is necessary to treat pid and sig as unsigned ints, with the | ||
| 1108 | * corresponding cast to a signed int to insure that the proper conversion | ||
| 1109 | * (sign extension) between the register representation of a signed int | ||
| 1110 | * (msr in 32-bit mode) and the register representation of a signed int | ||
| 1111 | * (msr in 64-bit mode) is performed. | ||
| 1112 | */ | ||
| 1113 | long compat_sys_rt_sigqueueinfo(u32 pid, u32 sig, compat_siginfo_t __user *uinfo) | ||
| 1114 | { | ||
| 1115 | siginfo_t info; | ||
| 1116 | int ret; | ||
| 1117 | mm_segment_t old_fs = get_fs(); | ||
| 1118 | |||
| 1119 | ret = copy_siginfo_from_user32(&info, uinfo); | ||
| 1120 | if (unlikely(ret)) | ||
| 1121 | return ret; | ||
| 1122 | |||
| 1123 | set_fs (KERNEL_DS); | ||
| 1124 | /* The __user pointer cast is valid becasuse of the set_fs() */ | ||
| 1125 | ret = sys_rt_sigqueueinfo((int)pid, (int)sig, (siginfo_t __user *) &info); | ||
| 1126 | set_fs (old_fs); | ||
| 1127 | return ret; | ||
| 1128 | } | ||
| 1129 | /* | ||
| 1130 | * Start Alternate signal stack support | ||
| 1131 | * | ||
| 1132 | * System Calls | ||
| 1133 | * sigaltatck compat_sys_sigaltstack | ||
| 1134 | */ | ||
| 1135 | |||
| 1136 | int compat_sys_sigaltstack(u32 __new, u32 __old, int r5, | ||
| 1137 | int r6, int r7, int r8, struct pt_regs *regs) | ||
| 1138 | { | ||
| 1139 | stack_32_t __user * newstack = compat_ptr(__new); | ||
| 1140 | stack_32_t __user * oldstack = compat_ptr(__old); | ||
| 1141 | stack_t uss, uoss; | ||
| 1142 | int ret; | ||
| 1143 | mm_segment_t old_fs; | ||
| 1144 | unsigned long sp; | ||
| 1145 | compat_uptr_t ss_sp; | ||
| 1146 | |||
| 1147 | /* | ||
| 1148 | * set sp to the user stack on entry to the system call | ||
| 1149 | * the system call router sets R9 to the saved registers | ||
| 1150 | */ | ||
| 1151 | sp = regs->gpr[1]; | ||
| 1152 | |||
| 1153 | /* Put new stack info in local 64 bit stack struct */ | ||
| 1154 | if (newstack) { | ||
| 1155 | if (get_user(ss_sp, &newstack->ss_sp) || | ||
| 1156 | __get_user(uss.ss_flags, &newstack->ss_flags) || | ||
| 1157 | __get_user(uss.ss_size, &newstack->ss_size)) | ||
| 1158 | return -EFAULT; | ||
| 1159 | uss.ss_sp = compat_ptr(ss_sp); | ||
| 1160 | } | ||
| 1161 | |||
| 1162 | old_fs = get_fs(); | ||
| 1163 | set_fs(KERNEL_DS); | ||
| 1164 | /* The __user pointer casts are valid because of the set_fs() */ | ||
| 1165 | ret = do_sigaltstack( | ||
| 1166 | newstack ? (stack_t __user *) &uss : NULL, | ||
| 1167 | oldstack ? (stack_t __user *) &uoss : NULL, | ||
| 1168 | sp); | ||
| 1169 | set_fs(old_fs); | ||
| 1170 | /* Copy the stack information to the user output buffer */ | ||
| 1171 | if (!ret && oldstack && | ||
| 1172 | (put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) || | ||
| 1173 | __put_user(uoss.ss_flags, &oldstack->ss_flags) || | ||
| 1174 | __put_user(uoss.ss_size, &oldstack->ss_size))) | ||
| 1175 | return -EFAULT; | ||
| 1176 | return ret; | ||
| 1177 | } | ||
| 1178 | #endif /* CONFIG_PPC64 */ | 947 | #endif /* CONFIG_PPC64 */ |
| 1179 | 948 | ||
| 1180 | /* | 949 | /* |
| @@ -1202,10 +971,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka, | |||
| 1202 | /* Put the siginfo & fill in most of the ucontext */ | 971 | /* Put the siginfo & fill in most of the ucontext */ |
| 1203 | if (copy_siginfo_to_user(&rt_sf->info, info) | 972 | if (copy_siginfo_to_user(&rt_sf->info, info) |
| 1204 | || __put_user(0, &rt_sf->uc.uc_flags) | 973 | || __put_user(0, &rt_sf->uc.uc_flags) |
| 1205 | || __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp) | 974 | || __save_altstack(&rt_sf->uc.uc_stack, regs->gpr[1]) |
| 1206 | || __put_user(sas_ss_flags(regs->gpr[1]), | ||
| 1207 | &rt_sf->uc.uc_stack.ss_flags) | ||
| 1208 | || __put_user(current->sas_ss_size, &rt_sf->uc.uc_stack.ss_size) | ||
| 1209 | || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext), | 975 | || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext), |
| 1210 | &rt_sf->uc.uc_regs) | 976 | &rt_sf->uc.uc_regs) |
| 1211 | || put_sigset_t(&rt_sf->uc.uc_sigmask, oldset)) | 977 | || put_sigset_t(&rt_sf->uc.uc_sigmask, oldset)) |
| @@ -1494,14 +1260,11 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8, | |||
| 1494 | * change it. -- paulus | 1260 | * change it. -- paulus |
| 1495 | */ | 1261 | */ |
| 1496 | #ifdef CONFIG_PPC64 | 1262 | #ifdef CONFIG_PPC64 |
| 1497 | /* | 1263 | if (compat_restore_altstack(&rt_sf->uc.uc_stack)) |
| 1498 | * We use the compat_sys_ version that does the 32/64 bits conversion | 1264 | goto bad; |
| 1499 | * and takes userland pointer directly. What about error checking ? | ||
| 1500 | * nobody does any... | ||
| 1501 | */ | ||
| 1502 | compat_sys_sigaltstack((u32)(u64)&rt_sf->uc.uc_stack, 0, 0, 0, 0, 0, regs); | ||
| 1503 | #else | 1265 | #else |
| 1504 | do_sigaltstack(&rt_sf->uc.uc_stack, NULL, regs->gpr[1]); | 1266 | if (restore_altstack(&rt_sf->uc.uc_stack)) |
| 1267 | goto bad; | ||
| 1505 | #endif | 1268 | #endif |
| 1506 | set_thread_flag(TIF_RESTOREALL); | 1269 | set_thread_flag(TIF_RESTOREALL); |
| 1507 | return 0; | 1270 | return 0; |
| @@ -1617,7 +1380,7 @@ int sys_debug_setcontext(struct ucontext __user *ctx, | |||
| 1617 | * always done it up until now so it is probably better not to | 1380 | * always done it up until now so it is probably better not to |
| 1618 | * change it. -- paulus | 1381 | * change it. -- paulus |
| 1619 | */ | 1382 | */ |
| 1620 | do_sigaltstack(&ctx->uc_stack, NULL, regs->gpr[1]); | 1383 | restore_altstack(&ctx->uc_stack); |
| 1621 | 1384 | ||
| 1622 | set_thread_flag(TIF_RESTOREALL); | 1385 | set_thread_flag(TIF_RESTOREALL); |
| 1623 | out: | 1386 | out: |
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 7a76ee48a952..995f8543cb57 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
| @@ -676,10 +676,8 @@ int sys_rt_sigreturn(unsigned long r3, unsigned long r4, unsigned long r5, | |||
| 676 | if (restore_sigcontext(regs, NULL, 1, &uc->uc_mcontext)) | 676 | if (restore_sigcontext(regs, NULL, 1, &uc->uc_mcontext)) |
| 677 | goto badframe; | 677 | goto badframe; |
| 678 | 678 | ||
| 679 | /* do_sigaltstack expects a __user pointer and won't modify | 679 | if (restore_altstack(&uc->uc_stack)) |
| 680 | * what's in there anyway | 680 | goto badframe; |
| 681 | */ | ||
| 682 | do_sigaltstack(&uc->uc_stack, NULL, regs->gpr[1]); | ||
| 683 | 681 | ||
| 684 | set_thread_flag(TIF_RESTOREALL); | 682 | set_thread_flag(TIF_RESTOREALL); |
| 685 | return 0; | 683 | return 0; |
| @@ -723,10 +721,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info, | |||
| 723 | 721 | ||
| 724 | /* Create the ucontext. */ | 722 | /* Create the ucontext. */ |
| 725 | err |= __put_user(0, &frame->uc.uc_flags); | 723 | err |= __put_user(0, &frame->uc.uc_flags); |
| 726 | err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 724 | err |= __save_altstack(&frame->uc.uc_stack, regs->gpr[1]); |
| 727 | err |= __put_user(sas_ss_flags(regs->gpr[1]), | ||
| 728 | &frame->uc.uc_stack.ss_flags); | ||
| 729 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 730 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | 725 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
| 731 | if (MSR_TM_ACTIVE(regs->msr)) { | 726 | if (MSR_TM_ACTIVE(regs->msr)) { |
| 732 | /* The ucontext_t passed to userland points to the second | 727 | /* The ucontext_t passed to userland points to the second |
diff --git a/arch/powerpc/kernel/sys_ppc32.c b/arch/powerpc/kernel/sys_ppc32.c index 8a93778ed9f5..dbc44ba5b078 100644 --- a/arch/powerpc/kernel/sys_ppc32.c +++ b/arch/powerpc/kernel/sys_ppc32.c | |||
| @@ -61,16 +61,6 @@ asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp, | |||
| 61 | return compat_sys_select((int)n, inp, outp, exp, compat_ptr(tvp_x)); | 61 | return compat_sys_select((int)n, inp, outp, exp, compat_ptr(tvp_x)); |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | /* Note: it is necessary to treat option as an unsigned int, | ||
| 65 | * with the corresponding cast to a signed int to insure that the | ||
| 66 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 67 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 68 | */ | ||
| 69 | asmlinkage long compat_sys_sysfs(u32 option, u32 arg1, u32 arg2) | ||
| 70 | { | ||
| 71 | return sys_sysfs((int)option, arg1, arg2); | ||
| 72 | } | ||
| 73 | |||
| 74 | #ifdef CONFIG_SYSVIPC | 64 | #ifdef CONFIG_SYSVIPC |
| 75 | long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr, | 65 | long compat_sys_ipc(u32 call, u32 first, u32 second, u32 third, compat_uptr_t ptr, |
| 76 | u32 fifth) | 66 | u32 fifth) |
| @@ -156,125 +146,6 @@ asmlinkage long compat_sys_sendfile64_wrapper(u32 out_fd, u32 in_fd, | |||
| 156 | (off_t __user *)offset, count); | 146 | (off_t __user *)offset, count); |
| 157 | } | 147 | } |
| 158 | 148 | ||
| 159 | /* Note: it is necessary to treat option as an unsigned int, | ||
| 160 | * with the corresponding cast to a signed int to insure that the | ||
| 161 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 162 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 163 | */ | ||
| 164 | asmlinkage long compat_sys_prctl(u32 option, u32 arg2, u32 arg3, u32 arg4, u32 arg5) | ||
| 165 | { | ||
| 166 | return sys_prctl((int)option, | ||
| 167 | (unsigned long) arg2, | ||
| 168 | (unsigned long) arg3, | ||
| 169 | (unsigned long) arg4, | ||
| 170 | (unsigned long) arg5); | ||
| 171 | } | ||
| 172 | |||
| 173 | /* Note: it is necessary to treat pid as an unsigned int, | ||
| 174 | * with the corresponding cast to a signed int to insure that the | ||
| 175 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 176 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 177 | */ | ||
| 178 | asmlinkage long compat_sys_sched_rr_get_interval_wrapper(u32 pid, | ||
| 179 | struct compat_timespec __user *interval) | ||
| 180 | { | ||
| 181 | return compat_sys_sched_rr_get_interval((int)pid, interval); | ||
| 182 | } | ||
| 183 | |||
| 184 | /* Note: it is necessary to treat mode as an unsigned int, | ||
| 185 | * with the corresponding cast to a signed int to insure that the | ||
| 186 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 187 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 188 | */ | ||
| 189 | asmlinkage long compat_sys_access(const char __user * filename, u32 mode) | ||
| 190 | { | ||
| 191 | return sys_access(filename, (int)mode); | ||
| 192 | } | ||
| 193 | |||
| 194 | |||
| 195 | /* Note: it is necessary to treat mode as an unsigned int, | ||
| 196 | * with the corresponding cast to a signed int to insure that the | ||
| 197 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 198 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 199 | */ | ||
| 200 | asmlinkage long compat_sys_creat(const char __user * pathname, u32 mode) | ||
| 201 | { | ||
| 202 | return sys_creat(pathname, (int)mode); | ||
| 203 | } | ||
| 204 | |||
| 205 | |||
| 206 | /* Note: it is necessary to treat pid and options as unsigned ints, | ||
| 207 | * with the corresponding cast to a signed int to insure that the | ||
| 208 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 209 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 210 | */ | ||
| 211 | asmlinkage long compat_sys_waitpid(u32 pid, unsigned int __user * stat_addr, u32 options) | ||
| 212 | { | ||
| 213 | return sys_waitpid((int)pid, stat_addr, (int)options); | ||
| 214 | } | ||
| 215 | |||
| 216 | |||
| 217 | /* Note: it is necessary to treat gidsetsize as an unsigned int, | ||
| 218 | * with the corresponding cast to a signed int to insure that the | ||
| 219 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 220 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 221 | */ | ||
| 222 | asmlinkage long compat_sys_getgroups(u32 gidsetsize, gid_t __user *grouplist) | ||
| 223 | { | ||
| 224 | return sys_getgroups((int)gidsetsize, grouplist); | ||
| 225 | } | ||
| 226 | |||
| 227 | |||
| 228 | /* Note: it is necessary to treat pid as an unsigned int, | ||
| 229 | * with the corresponding cast to a signed int to insure that the | ||
| 230 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 231 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 232 | */ | ||
| 233 | asmlinkage long compat_sys_getpgid(u32 pid) | ||
| 234 | { | ||
| 235 | return sys_getpgid((int)pid); | ||
| 236 | } | ||
| 237 | |||
| 238 | |||
| 239 | |||
| 240 | /* Note: it is necessary to treat pid as an unsigned int, | ||
| 241 | * with the corresponding cast to a signed int to insure that the | ||
| 242 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 243 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 244 | */ | ||
| 245 | asmlinkage long compat_sys_getsid(u32 pid) | ||
| 246 | { | ||
| 247 | return sys_getsid((int)pid); | ||
| 248 | } | ||
| 249 | |||
| 250 | |||
| 251 | /* Note: it is necessary to treat pid and sig as unsigned ints, | ||
| 252 | * with the corresponding cast to a signed int to insure that the | ||
| 253 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 254 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 255 | */ | ||
| 256 | asmlinkage long compat_sys_kill(u32 pid, u32 sig) | ||
| 257 | { | ||
| 258 | return sys_kill((int)pid, (int)sig); | ||
| 259 | } | ||
| 260 | |||
| 261 | |||
| 262 | /* Note: it is necessary to treat mode as an unsigned int, | ||
| 263 | * with the corresponding cast to a signed int to insure that the | ||
| 264 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 265 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 266 | */ | ||
| 267 | asmlinkage long compat_sys_mkdir(const char __user * pathname, u32 mode) | ||
| 268 | { | ||
| 269 | return sys_mkdir(pathname, (int)mode); | ||
| 270 | } | ||
| 271 | |||
| 272 | long compat_sys_nice(u32 increment) | ||
| 273 | { | ||
| 274 | /* sign extend increment */ | ||
| 275 | return sys_nice((int)increment); | ||
| 276 | } | ||
| 277 | |||
| 278 | off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin) | 149 | off_t ppc32_lseek(unsigned int fd, u32 offset, unsigned int origin) |
| 279 | { | 150 | { |
| 280 | /* sign extend n */ | 151 | /* sign extend n */ |
| @@ -293,172 +164,6 @@ long compat_sys_ftruncate(int fd, u32 length) | |||
| 293 | return sys_ftruncate(fd, (int)length); | 164 | return sys_ftruncate(fd, (int)length); |
| 294 | } | 165 | } |
| 295 | 166 | ||
| 296 | /* Note: it is necessary to treat bufsiz as an unsigned int, | ||
| 297 | * with the corresponding cast to a signed int to insure that the | ||
| 298 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 299 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 300 | */ | ||
| 301 | asmlinkage long compat_sys_readlink(const char __user * path, char __user * buf, u32 bufsiz) | ||
| 302 | { | ||
| 303 | return sys_readlink(path, buf, (int)bufsiz); | ||
| 304 | } | ||
| 305 | |||
| 306 | /* Note: it is necessary to treat option as an unsigned int, | ||
| 307 | * with the corresponding cast to a signed int to insure that the | ||
| 308 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 309 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 310 | */ | ||
| 311 | asmlinkage long compat_sys_sched_get_priority_max(u32 policy) | ||
| 312 | { | ||
| 313 | return sys_sched_get_priority_max((int)policy); | ||
| 314 | } | ||
| 315 | |||
| 316 | |||
| 317 | /* Note: it is necessary to treat policy as an unsigned int, | ||
| 318 | * with the corresponding cast to a signed int to insure that the | ||
| 319 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 320 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 321 | */ | ||
| 322 | asmlinkage long compat_sys_sched_get_priority_min(u32 policy) | ||
| 323 | { | ||
| 324 | return sys_sched_get_priority_min((int)policy); | ||
| 325 | } | ||
| 326 | |||
| 327 | |||
| 328 | /* Note: it is necessary to treat pid as an unsigned int, | ||
| 329 | * with the corresponding cast to a signed int to insure that the | ||
| 330 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 331 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 332 | */ | ||
| 333 | asmlinkage long compat_sys_sched_getparam(u32 pid, struct sched_param __user *param) | ||
| 334 | { | ||
| 335 | return sys_sched_getparam((int)pid, param); | ||
| 336 | } | ||
| 337 | |||
| 338 | |||
| 339 | /* Note: it is necessary to treat pid as an unsigned int, | ||
| 340 | * with the corresponding cast to a signed int to insure that the | ||
| 341 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 342 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 343 | */ | ||
| 344 | asmlinkage long compat_sys_sched_getscheduler(u32 pid) | ||
| 345 | { | ||
| 346 | return sys_sched_getscheduler((int)pid); | ||
| 347 | } | ||
| 348 | |||
| 349 | |||
| 350 | /* Note: it is necessary to treat pid as an unsigned int, | ||
| 351 | * with the corresponding cast to a signed int to insure that the | ||
| 352 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 353 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 354 | */ | ||
| 355 | asmlinkage long compat_sys_sched_setparam(u32 pid, struct sched_param __user *param) | ||
| 356 | { | ||
| 357 | return sys_sched_setparam((int)pid, param); | ||
| 358 | } | ||
| 359 | |||
| 360 | |||
| 361 | /* Note: it is necessary to treat pid and policy as unsigned ints, | ||
| 362 | * with the corresponding cast to a signed int to insure that the | ||
| 363 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 364 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 365 | */ | ||
| 366 | asmlinkage long compat_sys_sched_setscheduler(u32 pid, u32 policy, struct sched_param __user *param) | ||
| 367 | { | ||
| 368 | return sys_sched_setscheduler((int)pid, (int)policy, param); | ||
| 369 | } | ||
| 370 | |||
| 371 | |||
| 372 | /* Note: it is necessary to treat len as an unsigned int, | ||
| 373 | * with the corresponding cast to a signed int to insure that the | ||
| 374 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 375 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 376 | */ | ||
| 377 | asmlinkage long compat_sys_setdomainname(char __user *name, u32 len) | ||
| 378 | { | ||
| 379 | return sys_setdomainname(name, (int)len); | ||
| 380 | } | ||
| 381 | |||
| 382 | |||
| 383 | /* Note: it is necessary to treat gidsetsize as an unsigned int, | ||
| 384 | * with the corresponding cast to a signed int to insure that the | ||
| 385 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 386 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 387 | */ | ||
| 388 | asmlinkage long compat_sys_setgroups(u32 gidsetsize, gid_t __user *grouplist) | ||
| 389 | { | ||
| 390 | return sys_setgroups((int)gidsetsize, grouplist); | ||
| 391 | } | ||
| 392 | |||
| 393 | |||
| 394 | asmlinkage long compat_sys_sethostname(char __user *name, u32 len) | ||
| 395 | { | ||
| 396 | /* sign extend len */ | ||
| 397 | return sys_sethostname(name, (int)len); | ||
| 398 | } | ||
| 399 | |||
| 400 | |||
| 401 | /* Note: it is necessary to treat pid and pgid as unsigned ints, | ||
| 402 | * with the corresponding cast to a signed int to insure that the | ||
| 403 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 404 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 405 | */ | ||
| 406 | asmlinkage long compat_sys_setpgid(u32 pid, u32 pgid) | ||
| 407 | { | ||
| 408 | return sys_setpgid((int)pid, (int)pgid); | ||
| 409 | } | ||
| 410 | |||
| 411 | long compat_sys_getpriority(u32 which, u32 who) | ||
| 412 | { | ||
| 413 | /* sign extend which and who */ | ||
| 414 | return sys_getpriority((int)which, (int)who); | ||
| 415 | } | ||
| 416 | |||
| 417 | long compat_sys_setpriority(u32 which, u32 who, u32 niceval) | ||
| 418 | { | ||
| 419 | /* sign extend which, who and niceval */ | ||
| 420 | return sys_setpriority((int)which, (int)who, (int)niceval); | ||
| 421 | } | ||
| 422 | |||
| 423 | long compat_sys_ioprio_get(u32 which, u32 who) | ||
| 424 | { | ||
| 425 | /* sign extend which and who */ | ||
| 426 | return sys_ioprio_get((int)which, (int)who); | ||
| 427 | } | ||
| 428 | |||
| 429 | long compat_sys_ioprio_set(u32 which, u32 who, u32 ioprio) | ||
| 430 | { | ||
| 431 | /* sign extend which, who and ioprio */ | ||
| 432 | return sys_ioprio_set((int)which, (int)who, (int)ioprio); | ||
| 433 | } | ||
| 434 | |||
| 435 | /* Note: it is necessary to treat newmask as an unsigned int, | ||
| 436 | * with the corresponding cast to a signed int to insure that the | ||
| 437 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 438 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 439 | */ | ||
| 440 | asmlinkage long compat_sys_ssetmask(u32 newmask) | ||
| 441 | { | ||
| 442 | return sys_ssetmask((int) newmask); | ||
| 443 | } | ||
| 444 | |||
| 445 | asmlinkage long compat_sys_syslog(u32 type, char __user * buf, u32 len) | ||
| 446 | { | ||
| 447 | /* sign extend len */ | ||
| 448 | return sys_syslog(type, buf, (int)len); | ||
| 449 | } | ||
| 450 | |||
| 451 | |||
| 452 | /* Note: it is necessary to treat mask as an unsigned int, | ||
| 453 | * with the corresponding cast to a signed int to insure that the | ||
| 454 | * proper conversion (sign extension) between the register representation of a signed int (msr in 32-bit mode) | ||
| 455 | * and the register representation of a signed int (msr in 64-bit mode) is performed. | ||
| 456 | */ | ||
| 457 | asmlinkage long compat_sys_umask(u32 mask) | ||
| 458 | { | ||
| 459 | return sys_umask((int)mask); | ||
| 460 | } | ||
| 461 | |||
| 462 | unsigned long compat_sys_mmap2(unsigned long addr, size_t len, | 167 | unsigned long compat_sys_mmap2(unsigned long addr, size_t len, |
| 463 | unsigned long prot, unsigned long flags, | 168 | unsigned long prot, unsigned long flags, |
| 464 | unsigned long fd, unsigned long pgoff) | 169 | unsigned long fd, unsigned long pgoff) |
| @@ -467,12 +172,6 @@ unsigned long compat_sys_mmap2(unsigned long addr, size_t len, | |||
| 467 | return sys_mmap(addr, len, prot, flags, fd, pgoff << 12); | 172 | return sys_mmap(addr, len, prot, flags, fd, pgoff << 12); |
| 468 | } | 173 | } |
| 469 | 174 | ||
| 470 | long compat_sys_tgkill(u32 tgid, u32 pid, int sig) | ||
| 471 | { | ||
| 472 | /* sign extend tgid, pid */ | ||
| 473 | return sys_tgkill((int)tgid, (int)pid, sig); | ||
| 474 | } | ||
| 475 | |||
| 476 | /* | 175 | /* |
| 477 | * long long munging: | 176 | * long long munging: |
| 478 | * The 32 bit ABI passes long longs in an odd even register pair. | 177 | * The 32 bit ABI passes long longs in an odd even register pair. |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index b220e152aefa..f09ae7b0b4c5 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
| @@ -137,6 +137,8 @@ config S390 | |||
| 137 | select INIT_ALL_POSSIBLE | 137 | select INIT_ALL_POSSIBLE |
| 138 | select KTIME_SCALAR if 32BIT | 138 | select KTIME_SCALAR if 32BIT |
| 139 | select MODULES_USE_ELF_RELA | 139 | select MODULES_USE_ELF_RELA |
| 140 | select OLD_SIGSUSPEND3 | ||
| 141 | select OLD_SIGACTION | ||
| 140 | select SYSCTL_EXCEPTION_TRACE | 142 | select SYSCTL_EXCEPTION_TRACE |
| 141 | select USE_GENERIC_SMP_HELPERS if SMP | 143 | select USE_GENERIC_SMP_HELPERS if SMP |
| 142 | select VIRT_CPU_ACCOUNTING | 144 | select VIRT_CPU_ACCOUNTING |
| @@ -249,6 +251,7 @@ config COMPAT | |||
| 249 | depends on 64BIT | 251 | depends on 64BIT |
| 250 | select COMPAT_BINFMT_ELF if BINFMT_ELF | 252 | select COMPAT_BINFMT_ELF if BINFMT_ELF |
| 251 | select ARCH_WANT_OLD_COMPAT_IPC | 253 | select ARCH_WANT_OLD_COMPAT_IPC |
| 254 | select COMPAT_OLD_SIGACTION | ||
| 252 | help | 255 | help |
| 253 | Select this option if you want to enable your system kernel to | 256 | Select this option if you want to enable your system kernel to |
| 254 | handle system-calls from ELF binaries for 31 bit ESA. This option | 257 | handle system-calls from ELF binaries for 31 bit ESA. This option |
diff --git a/arch/s390/include/asm/signal.h b/arch/s390/include/asm/signal.h index db7ddfaf5b79..abf9e5735943 100644 --- a/arch/s390/include/asm/signal.h +++ b/arch/s390/include/asm/signal.h | |||
| @@ -21,22 +21,5 @@ typedef struct { | |||
| 21 | unsigned long sig[_NSIG_WORDS]; | 21 | unsigned long sig[_NSIG_WORDS]; |
| 22 | } sigset_t; | 22 | } sigset_t; |
| 23 | 23 | ||
| 24 | struct old_sigaction { | 24 | #define __ARCH_HAS_SA_RESTORER |
| 25 | __sighandler_t sa_handler; | ||
| 26 | old_sigset_t sa_mask; | ||
| 27 | unsigned long sa_flags; | ||
| 28 | void (*sa_restorer)(void); | ||
| 29 | }; | ||
| 30 | |||
| 31 | struct sigaction { | ||
| 32 | __sighandler_t sa_handler; | ||
| 33 | unsigned long sa_flags; | ||
| 34 | void (*sa_restorer)(void); | ||
| 35 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 36 | }; | ||
| 37 | |||
| 38 | struct k_sigaction { | ||
| 39 | struct sigaction sa; | ||
| 40 | }; | ||
| 41 | |||
| 42 | #endif | 25 | #endif |
diff --git a/arch/s390/include/asm/unistd.h b/arch/s390/include/asm/unistd.h index 636530872516..a6667a952969 100644 --- a/arch/s390/include/asm/unistd.h +++ b/arch/s390/include/asm/unistd.h | |||
| @@ -43,15 +43,12 @@ | |||
| 43 | #define __ARCH_WANT_SYS_OLDUMOUNT | 43 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 44 | #define __ARCH_WANT_SYS_SIGPENDING | 44 | #define __ARCH_WANT_SYS_SIGPENDING |
| 45 | #define __ARCH_WANT_SYS_SIGPROCMASK | 45 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 46 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 47 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 48 | # ifndef CONFIG_64BIT | 46 | # ifndef CONFIG_64BIT |
| 49 | # define __ARCH_WANT_STAT64 | 47 | # define __ARCH_WANT_STAT64 |
| 50 | # define __ARCH_WANT_SYS_TIME | 48 | # define __ARCH_WANT_SYS_TIME |
| 51 | # endif | 49 | # endif |
| 52 | # ifdef CONFIG_COMPAT | 50 | # ifdef CONFIG_COMPAT |
| 53 | # define __ARCH_WANT_COMPAT_SYS_TIME | 51 | # define __ARCH_WANT_COMPAT_SYS_TIME |
| 54 | # define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | ||
| 55 | # endif | 52 | # endif |
| 56 | #define __ARCH_WANT_SYS_FORK | 53 | #define __ARCH_WANT_SYS_FORK |
| 57 | #define __ARCH_WANT_SYS_VFORK | 54 | #define __ARCH_WANT_SYS_VFORK |
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 65cca95843e1..19f26de27fae 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
| @@ -352,86 +352,6 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned | |||
| 352 | return sys_ftruncate(fd, (high << 32) | low); | 352 | return sys_ftruncate(fd, (high << 32) | low); |
| 353 | } | 353 | } |
| 354 | 354 | ||
| 355 | asmlinkage long sys32_sched_rr_get_interval(compat_pid_t pid, | ||
| 356 | struct compat_timespec __user *interval) | ||
| 357 | { | ||
| 358 | struct timespec t; | ||
| 359 | int ret; | ||
| 360 | mm_segment_t old_fs = get_fs (); | ||
| 361 | |||
| 362 | set_fs (KERNEL_DS); | ||
| 363 | ret = sys_sched_rr_get_interval(pid, | ||
| 364 | (struct timespec __force __user *) &t); | ||
| 365 | set_fs (old_fs); | ||
| 366 | if (put_compat_timespec(&t, interval)) | ||
| 367 | return -EFAULT; | ||
| 368 | return ret; | ||
| 369 | } | ||
| 370 | |||
| 371 | asmlinkage long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, | ||
| 372 | compat_sigset_t __user *oset, size_t sigsetsize) | ||
| 373 | { | ||
| 374 | sigset_t s; | ||
| 375 | compat_sigset_t s32; | ||
| 376 | int ret; | ||
| 377 | mm_segment_t old_fs = get_fs(); | ||
| 378 | |||
| 379 | if (set) { | ||
| 380 | if (copy_from_user (&s32, set, sizeof(compat_sigset_t))) | ||
| 381 | return -EFAULT; | ||
| 382 | s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); | ||
| 383 | } | ||
| 384 | set_fs (KERNEL_DS); | ||
| 385 | ret = sys_rt_sigprocmask(how, | ||
| 386 | set ? (sigset_t __force __user *) &s : NULL, | ||
| 387 | oset ? (sigset_t __force __user *) &s : NULL, | ||
| 388 | sigsetsize); | ||
| 389 | set_fs (old_fs); | ||
| 390 | if (ret) return ret; | ||
| 391 | if (oset) { | ||
| 392 | s32.sig[1] = (s.sig[0] >> 32); | ||
| 393 | s32.sig[0] = s.sig[0]; | ||
| 394 | if (copy_to_user (oset, &s32, sizeof(compat_sigset_t))) | ||
| 395 | return -EFAULT; | ||
| 396 | } | ||
| 397 | return 0; | ||
| 398 | } | ||
| 399 | |||
| 400 | asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *set, | ||
| 401 | size_t sigsetsize) | ||
| 402 | { | ||
| 403 | sigset_t s; | ||
| 404 | compat_sigset_t s32; | ||
| 405 | int ret; | ||
| 406 | mm_segment_t old_fs = get_fs(); | ||
| 407 | |||
| 408 | set_fs (KERNEL_DS); | ||
| 409 | ret = sys_rt_sigpending((sigset_t __force __user *) &s, sigsetsize); | ||
| 410 | set_fs (old_fs); | ||
| 411 | if (!ret) { | ||
| 412 | s32.sig[1] = (s.sig[0] >> 32); | ||
| 413 | s32.sig[0] = s.sig[0]; | ||
| 414 | if (copy_to_user (set, &s32, sizeof(compat_sigset_t))) | ||
| 415 | return -EFAULT; | ||
| 416 | } | ||
| 417 | return ret; | ||
| 418 | } | ||
| 419 | |||
| 420 | asmlinkage long | ||
| 421 | sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo) | ||
| 422 | { | ||
| 423 | siginfo_t info; | ||
| 424 | int ret; | ||
| 425 | mm_segment_t old_fs = get_fs(); | ||
| 426 | |||
| 427 | if (copy_siginfo_from_user32(&info, uinfo)) | ||
| 428 | return -EFAULT; | ||
| 429 | set_fs (KERNEL_DS); | ||
| 430 | ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __force __user *) &info); | ||
| 431 | set_fs (old_fs); | ||
| 432 | return ret; | ||
| 433 | } | ||
| 434 | |||
| 435 | asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf, | 355 | asmlinkage long sys32_pread64(unsigned int fd, char __user *ubuf, |
| 436 | size_t count, u32 poshi, u32 poslo) | 356 | size_t count, u32 poshi, u32 poslo) |
| 437 | { | 357 | { |
diff --git a/arch/s390/kernel/compat_linux.h b/arch/s390/kernel/compat_linux.h index d4d0239970ac..00d92a5a6f6c 100644 --- a/arch/s390/kernel/compat_linux.h +++ b/arch/s390/kernel/compat_linux.h | |||
| @@ -17,13 +17,6 @@ struct ipc_kludge_32 { | |||
| 17 | __s32 msgtyp; | 17 | __s32 msgtyp; |
| 18 | }; | 18 | }; |
| 19 | 19 | ||
| 20 | struct old_sigaction32 { | ||
| 21 | __u32 sa_handler; /* Really a pointer, but need to deal with 32 bits */ | ||
| 22 | compat_old_sigset_t sa_mask; /* A 32 bit mask */ | ||
| 23 | __u32 sa_flags; | ||
| 24 | __u32 sa_restorer; /* Another 32 bit pointer */ | ||
| 25 | }; | ||
| 26 | |||
| 27 | /* asm/sigcontext.h */ | 20 | /* asm/sigcontext.h */ |
| 28 | typedef union | 21 | typedef union |
| 29 | { | 22 | { |
| @@ -68,24 +61,12 @@ struct sigcontext32 | |||
| 68 | }; | 61 | }; |
| 69 | 62 | ||
| 70 | /* asm/signal.h */ | 63 | /* asm/signal.h */ |
| 71 | struct sigaction32 { | ||
| 72 | __u32 sa_handler; /* pointer */ | ||
| 73 | __u32 sa_flags; | ||
| 74 | __u32 sa_restorer; /* pointer */ | ||
| 75 | compat_sigset_t sa_mask; /* mask last for extensibility */ | ||
| 76 | }; | ||
| 77 | |||
| 78 | typedef struct { | ||
| 79 | __u32 ss_sp; /* pointer */ | ||
| 80 | int ss_flags; | ||
| 81 | compat_size_t ss_size; | ||
| 82 | } stack_t32; | ||
| 83 | 64 | ||
| 84 | /* asm/ucontext.h */ | 65 | /* asm/ucontext.h */ |
| 85 | struct ucontext32 { | 66 | struct ucontext32 { |
| 86 | __u32 uc_flags; | 67 | __u32 uc_flags; |
| 87 | __u32 uc_link; /* pointer */ | 68 | __u32 uc_link; /* pointer */ |
| 88 | stack_t32 uc_stack; | 69 | compat_stack_t uc_stack; |
| 89 | _sigregs32 uc_mcontext; | 70 | _sigregs32 uc_mcontext; |
| 90 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ | 71 | compat_sigset_t uc_sigmask; /* mask last for extensibility */ |
| 91 | }; | 72 | }; |
| @@ -93,8 +74,6 @@ struct ucontext32 { | |||
| 93 | struct stat64_emu31; | 74 | struct stat64_emu31; |
| 94 | struct mmap_arg_struct_emu31; | 75 | struct mmap_arg_struct_emu31; |
| 95 | struct fadvise64_64_args; | 76 | struct fadvise64_64_args; |
| 96 | struct old_sigaction32; | ||
| 97 | struct old_sigaction32; | ||
| 98 | 77 | ||
| 99 | long sys32_chown16(const char __user * filename, u16 user, u16 group); | 78 | long sys32_chown16(const char __user * filename, u16 user, u16 group); |
| 100 | long sys32_lchown16(const char __user * filename, u16 user, u16 group); | 79 | long sys32_lchown16(const char __user * filename, u16 user, u16 group); |
| @@ -119,12 +98,6 @@ long sys32_ipc(u32 call, int first, int second, int third, u32 ptr); | |||
| 119 | long sys32_truncate64(const char __user * path, unsigned long high, | 98 | long sys32_truncate64(const char __user * path, unsigned long high, |
| 120 | unsigned long low); | 99 | unsigned long low); |
| 121 | long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low); | 100 | long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned long low); |
| 122 | long sys32_sched_rr_get_interval(compat_pid_t pid, | ||
| 123 | struct compat_timespec __user *interval); | ||
| 124 | long sys32_rt_sigprocmask(int how, compat_sigset_t __user *set, | ||
| 125 | compat_sigset_t __user *oset, size_t sigsetsize); | ||
| 126 | long sys32_rt_sigpending(compat_sigset_t __user *set, size_t sigsetsize); | ||
| 127 | long sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo); | ||
| 128 | long sys32_init_module(void __user *umod, unsigned long len, | 101 | long sys32_init_module(void __user *umod, unsigned long len, |
| 129 | const char __user *uargs); | 102 | const char __user *uargs); |
| 130 | long sys32_delete_module(const char __user *name_user, unsigned int flags); | 103 | long sys32_delete_module(const char __user *name_user, unsigned int flags); |
| @@ -149,9 +122,4 @@ long sys32_read(unsigned int fd, char __user * buf, size_t count); | |||
| 149 | long sys32_write(unsigned int fd, const char __user * buf, size_t count); | 122 | long sys32_write(unsigned int fd, const char __user * buf, size_t count); |
| 150 | long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise); | 123 | long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise); |
| 151 | long sys32_fadvise64_64(struct fadvise64_64_args __user *args); | 124 | long sys32_fadvise64_64(struct fadvise64_64_args __user *args); |
| 152 | long sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | ||
| 153 | struct old_sigaction32 __user *oact); | ||
| 154 | long sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, | ||
| 155 | struct sigaction32 __user *oact, size_t sigsetsize); | ||
| 156 | long sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss); | ||
| 157 | #endif /* _ASM_S390X_S390_H */ | 125 | #endif /* _ASM_S390X_S390_H */ |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index 593fcc9253fc..3e71194c1902 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
| @@ -157,122 +157,6 @@ int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | |||
| 157 | return err; | 157 | return err; |
| 158 | } | 158 | } |
| 159 | 159 | ||
| 160 | asmlinkage long | ||
| 161 | sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | ||
| 162 | struct old_sigaction32 __user *oact) | ||
| 163 | { | ||
| 164 | struct k_sigaction new_ka, old_ka; | ||
| 165 | unsigned long sa_handler, sa_restorer; | ||
| 166 | int ret; | ||
| 167 | |||
| 168 | if (act) { | ||
| 169 | compat_old_sigset_t mask; | ||
| 170 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 171 | __get_user(sa_handler, &act->sa_handler) || | ||
| 172 | __get_user(sa_restorer, &act->sa_restorer) || | ||
| 173 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 174 | __get_user(mask, &act->sa_mask)) | ||
| 175 | return -EFAULT; | ||
| 176 | new_ka.sa.sa_handler = (__sighandler_t) sa_handler; | ||
| 177 | new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer; | ||
| 178 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 179 | } | ||
| 180 | |||
| 181 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 182 | |||
| 183 | if (!ret && oact) { | ||
| 184 | sa_handler = (unsigned long) old_ka.sa.sa_handler; | ||
| 185 | sa_restorer = (unsigned long) old_ka.sa.sa_restorer; | ||
| 186 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 187 | __put_user(sa_handler, &oact->sa_handler) || | ||
| 188 | __put_user(sa_restorer, &oact->sa_restorer) || | ||
| 189 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 190 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 191 | return -EFAULT; | ||
| 192 | } | ||
| 193 | |||
| 194 | return ret; | ||
| 195 | } | ||
| 196 | |||
| 197 | asmlinkage long | ||
| 198 | sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, | ||
| 199 | struct sigaction32 __user *oact, size_t sigsetsize) | ||
| 200 | { | ||
| 201 | struct k_sigaction new_ka, old_ka; | ||
| 202 | unsigned long sa_handler; | ||
| 203 | int ret; | ||
| 204 | compat_sigset_t set32; | ||
| 205 | |||
| 206 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 207 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
| 208 | return -EINVAL; | ||
| 209 | |||
| 210 | if (act) { | ||
| 211 | ret = get_user(sa_handler, &act->sa_handler); | ||
| 212 | ret |= __copy_from_user(&set32, &act->sa_mask, | ||
| 213 | sizeof(compat_sigset_t)); | ||
| 214 | new_ka.sa.sa_mask.sig[0] = | ||
| 215 | set32.sig[0] | (((long)set32.sig[1]) << 32); | ||
| 216 | ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 217 | |||
| 218 | if (ret) | ||
| 219 | return -EFAULT; | ||
| 220 | new_ka.sa.sa_handler = (__sighandler_t) sa_handler; | ||
| 221 | } | ||
| 222 | |||
| 223 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 224 | |||
| 225 | if (!ret && oact) { | ||
| 226 | set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32); | ||
| 227 | set32.sig[0] = old_ka.sa.sa_mask.sig[0]; | ||
| 228 | ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler); | ||
| 229 | ret |= __copy_to_user(&oact->sa_mask, &set32, | ||
| 230 | sizeof(compat_sigset_t)); | ||
| 231 | ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 232 | } | ||
| 233 | |||
| 234 | return ret; | ||
| 235 | } | ||
| 236 | |||
| 237 | asmlinkage long | ||
| 238 | sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss) | ||
| 239 | { | ||
| 240 | struct pt_regs *regs = task_pt_regs(current); | ||
| 241 | stack_t kss, koss; | ||
| 242 | unsigned long ss_sp; | ||
| 243 | int ret, err = 0; | ||
| 244 | mm_segment_t old_fs = get_fs(); | ||
| 245 | |||
| 246 | if (uss) { | ||
| 247 | if (!access_ok(VERIFY_READ, uss, sizeof(*uss))) | ||
| 248 | return -EFAULT; | ||
| 249 | err |= __get_user(ss_sp, &uss->ss_sp); | ||
| 250 | err |= __get_user(kss.ss_size, &uss->ss_size); | ||
| 251 | err |= __get_user(kss.ss_flags, &uss->ss_flags); | ||
| 252 | if (err) | ||
| 253 | return -EFAULT; | ||
| 254 | kss.ss_sp = (void __user *) ss_sp; | ||
| 255 | } | ||
| 256 | |||
| 257 | set_fs (KERNEL_DS); | ||
| 258 | ret = do_sigaltstack((stack_t __force __user *) (uss ? &kss : NULL), | ||
| 259 | (stack_t __force __user *) (uoss ? &koss : NULL), | ||
| 260 | regs->gprs[15]); | ||
| 261 | set_fs (old_fs); | ||
| 262 | |||
| 263 | if (!ret && uoss) { | ||
| 264 | if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss))) | ||
| 265 | return -EFAULT; | ||
| 266 | ss_sp = (unsigned long) koss.ss_sp; | ||
| 267 | err |= __put_user(ss_sp, &uoss->ss_sp); | ||
| 268 | err |= __put_user(koss.ss_size, &uoss->ss_size); | ||
| 269 | err |= __put_user(koss.ss_flags, &uoss->ss_flags); | ||
| 270 | if (err) | ||
| 271 | return -EFAULT; | ||
| 272 | } | ||
| 273 | return ret; | ||
| 274 | } | ||
| 275 | |||
| 276 | static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs) | 160 | static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs) |
| 277 | { | 161 | { |
| 278 | _s390_regs_common32 regs32; | 162 | _s390_regs_common32 regs32; |
| @@ -380,10 +264,6 @@ asmlinkage long sys32_rt_sigreturn(void) | |||
| 380 | struct pt_regs *regs = task_pt_regs(current); | 264 | struct pt_regs *regs = task_pt_regs(current); |
| 381 | rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15]; | 265 | rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15]; |
| 382 | sigset_t set; | 266 | sigset_t set; |
| 383 | stack_t st; | ||
| 384 | __u32 ss_sp; | ||
| 385 | int err; | ||
| 386 | mm_segment_t old_fs = get_fs(); | ||
| 387 | 267 | ||
| 388 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 268 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
| 389 | goto badframe; | 269 | goto badframe; |
| @@ -394,15 +274,8 @@ asmlinkage long sys32_rt_sigreturn(void) | |||
| 394 | goto badframe; | 274 | goto badframe; |
| 395 | if (restore_sigregs_gprs_high(regs, frame->gprs_high)) | 275 | if (restore_sigregs_gprs_high(regs, frame->gprs_high)) |
| 396 | goto badframe; | 276 | goto badframe; |
| 397 | err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp); | 277 | if (compat_restore_altstack(&frame->uc.uc_stack)) |
| 398 | st.ss_sp = compat_ptr(ss_sp); | ||
| 399 | err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size); | ||
| 400 | err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags); | ||
| 401 | if (err) | ||
| 402 | goto badframe; | 278 | goto badframe; |
| 403 | set_fs (KERNEL_DS); | ||
| 404 | do_sigaltstack((stack_t __force __user *)&st, NULL, regs->gprs[15]); | ||
| 405 | set_fs (old_fs); | ||
| 406 | return regs->gprs[2]; | 279 | return regs->gprs[2]; |
| 407 | badframe: | 280 | badframe: |
| 408 | force_sig(SIGSEGV, current); | 281 | force_sig(SIGSEGV, current); |
| @@ -530,10 +403,7 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 530 | /* Create the ucontext. */ | 403 | /* Create the ucontext. */ |
| 531 | err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags); | 404 | err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags); |
| 532 | err |= __put_user(0, &frame->uc.uc_link); | 405 | err |= __put_user(0, &frame->uc.uc_link); |
| 533 | err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 406 | err |= __compat_save_altstack(&frame->uc.uc_stack, regs->gprs[15]); |
| 534 | err |= __put_user(sas_ss_flags(regs->gprs[15]), | ||
| 535 | &frame->uc.uc_stack.ss_flags); | ||
| 536 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 537 | err |= save_sigregs32(regs, &frame->uc.uc_mcontext); | 407 | err |= save_sigregs32(regs, &frame->uc.uc_mcontext); |
| 538 | err |= save_sigregs_gprs_high(regs, frame->gprs_high); | 408 | err |= save_sigregs_gprs_high(regs, frame->gprs_high); |
| 539 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 409 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 9b9a805656b5..c14faf39ae36 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
| @@ -24,12 +24,6 @@ ENTRY(sys32_write_wrapper) | |||
| 24 | llgfr %r4,%r4 # size_t | 24 | llgfr %r4,%r4 # size_t |
| 25 | jg sys32_write # branch to system call | 25 | jg sys32_write # branch to system call |
| 26 | 26 | ||
| 27 | ENTRY(sys32_open_wrapper) | ||
| 28 | llgtr %r2,%r2 # const char * | ||
| 29 | lgfr %r3,%r3 # int | ||
| 30 | lgfr %r4,%r4 # int | ||
| 31 | jg compat_sys_open # branch to system call | ||
| 32 | |||
| 33 | ENTRY(sys32_close_wrapper) | 27 | ENTRY(sys32_close_wrapper) |
| 34 | llgfr %r2,%r2 # unsigned int | 28 | llgfr %r2,%r2 # unsigned int |
| 35 | jg sys_close # branch to system call | 29 | jg sys_close # branch to system call |
| @@ -226,12 +220,6 @@ ENTRY(sys32_dup2_wrapper) | |||
| 226 | 220 | ||
| 227 | #sys32_setsid_wrapper # void | 221 | #sys32_setsid_wrapper # void |
| 228 | 222 | ||
| 229 | ENTRY(sys32_sigaction_wrapper) | ||
| 230 | lgfr %r2,%r2 # int | ||
| 231 | llgtr %r3,%r3 # const struct old_sigaction * | ||
| 232 | llgtr %r4,%r4 # struct old_sigaction32 * | ||
| 233 | jg sys32_sigaction # branch to system call | ||
| 234 | |||
| 235 | ENTRY(sys32_setreuid16_wrapper) | 223 | ENTRY(sys32_setreuid16_wrapper) |
| 236 | llgfr %r2,%r2 # __kernel_old_uid_emu31_t | 224 | llgfr %r2,%r2 # __kernel_old_uid_emu31_t |
| 237 | llgfr %r3,%r3 # __kernel_old_uid_emu31_t | 225 | llgfr %r3,%r3 # __kernel_old_uid_emu31_t |
| @@ -396,17 +384,6 @@ ENTRY(sys32_syslog_wrapper) | |||
| 396 | lgfr %r4,%r4 # int | 384 | lgfr %r4,%r4 # int |
| 397 | jg sys_syslog # branch to system call | 385 | jg sys_syslog # branch to system call |
| 398 | 386 | ||
| 399 | ENTRY(compat_sys_setitimer_wrapper) | ||
| 400 | lgfr %r2,%r2 # int | ||
| 401 | llgtr %r3,%r3 # struct itimerval_emu31 * | ||
| 402 | llgtr %r4,%r4 # struct itimerval_emu31 * | ||
| 403 | jg compat_sys_setitimer # branch to system call | ||
| 404 | |||
| 405 | ENTRY(compat_sys_getitimer_wrapper) | ||
| 406 | lgfr %r2,%r2 # int | ||
| 407 | llgtr %r3,%r3 # struct itimerval_emu31 * | ||
| 408 | jg compat_sys_getitimer # branch to system call | ||
| 409 | |||
| 410 | ENTRY(compat_sys_newstat_wrapper) | 387 | ENTRY(compat_sys_newstat_wrapper) |
| 411 | llgtr %r2,%r2 # char * | 388 | llgtr %r2,%r2 # char * |
| 412 | llgtr %r3,%r3 # struct stat_emu31 * | 389 | llgtr %r3,%r3 # struct stat_emu31 * |
| @@ -424,13 +401,6 @@ ENTRY(compat_sys_newfstat_wrapper) | |||
| 424 | 401 | ||
| 425 | #sys32_vhangup_wrapper # void | 402 | #sys32_vhangup_wrapper # void |
| 426 | 403 | ||
| 427 | ENTRY(compat_sys_wait4_wrapper) | ||
| 428 | lgfr %r2,%r2 # pid_t | ||
| 429 | llgtr %r3,%r3 # unsigned int * | ||
| 430 | lgfr %r4,%r4 # int | ||
| 431 | llgtr %r5,%r5 # struct rusage * | ||
| 432 | jg compat_sys_wait4 # branch to system call | ||
| 433 | |||
| 434 | ENTRY(sys32_swapoff_wrapper) | 404 | ENTRY(sys32_swapoff_wrapper) |
| 435 | llgtr %r2,%r2 # const char * | 405 | llgtr %r2,%r2 # const char * |
| 436 | jg sys_swapoff # branch to system call | 406 | jg sys_swapoff # branch to system call |
| @@ -474,12 +444,6 @@ ENTRY(sys32_mprotect_wrapper) | |||
| 474 | llgfr %r4,%r4 # unsigned long | 444 | llgfr %r4,%r4 # unsigned long |
| 475 | jg sys_mprotect # branch to system call | 445 | jg sys_mprotect # branch to system call |
| 476 | 446 | ||
| 477 | ENTRY(compat_sys_sigprocmask_wrapper) | ||
| 478 | lgfr %r2,%r2 # int | ||
| 479 | llgtr %r3,%r3 # compat_old_sigset_t * | ||
| 480 | llgtr %r4,%r4 # compat_old_sigset_t * | ||
| 481 | jg compat_sys_sigprocmask # branch to system call | ||
| 482 | |||
| 483 | ENTRY(sys_init_module_wrapper) | 447 | ENTRY(sys_init_module_wrapper) |
| 484 | llgtr %r2,%r2 # void * | 448 | llgtr %r2,%r2 # void * |
| 485 | llgfr %r3,%r3 # unsigned long | 449 | llgfr %r3,%r3 # unsigned long |
| @@ -628,11 +592,6 @@ ENTRY(sys32_sched_get_priority_min_wrapper) | |||
| 628 | lgfr %r2,%r2 # int | 592 | lgfr %r2,%r2 # int |
| 629 | jg sys_sched_get_priority_min # branch to system call | 593 | jg sys_sched_get_priority_min # branch to system call |
| 630 | 594 | ||
| 631 | ENTRY(sys32_sched_rr_get_interval_wrapper) | ||
| 632 | lgfr %r2,%r2 # pid_t | ||
| 633 | llgtr %r3,%r3 # struct compat_timespec * | ||
| 634 | jg sys32_sched_rr_get_interval # branch to system call | ||
| 635 | |||
| 636 | ENTRY(compat_sys_nanosleep_wrapper) | 595 | ENTRY(compat_sys_nanosleep_wrapper) |
| 637 | llgtr %r2,%r2 # struct compat_timespec * | 596 | llgtr %r2,%r2 # struct compat_timespec * |
| 638 | llgtr %r3,%r3 # struct compat_timespec * | 597 | llgtr %r3,%r3 # struct compat_timespec * |
| @@ -686,43 +645,6 @@ ENTRY(sys32_prctl_wrapper) | |||
| 686 | 645 | ||
| 687 | #sys32_rt_sigreturn_wrapper # done in rt_sigreturn_glue | 646 | #sys32_rt_sigreturn_wrapper # done in rt_sigreturn_glue |
| 688 | 647 | ||
| 689 | ENTRY(sys32_rt_sigaction_wrapper) | ||
| 690 | lgfr %r2,%r2 # int | ||
| 691 | llgtr %r3,%r3 # const struct sigaction_emu31 * | ||
| 692 | llgtr %r4,%r4 # const struct sigaction_emu31 * | ||
| 693 | llgfr %r5,%r5 # size_t | ||
| 694 | jg sys32_rt_sigaction # branch to system call | ||
| 695 | |||
| 696 | ENTRY(sys32_rt_sigprocmask_wrapper) | ||
| 697 | lgfr %r2,%r2 # int | ||
| 698 | llgtr %r3,%r3 # old_sigset_emu31 * | ||
| 699 | llgtr %r4,%r4 # old_sigset_emu31 * | ||
| 700 | llgfr %r5,%r5 # size_t | ||
| 701 | jg sys32_rt_sigprocmask # branch to system call | ||
| 702 | |||
| 703 | ENTRY(sys32_rt_sigpending_wrapper) | ||
| 704 | llgtr %r2,%r2 # sigset_emu31 * | ||
| 705 | llgfr %r3,%r3 # size_t | ||
| 706 | jg sys32_rt_sigpending # branch to system call | ||
| 707 | |||
| 708 | ENTRY(compat_sys_rt_sigtimedwait_wrapper) | ||
| 709 | llgtr %r2,%r2 # const sigset_emu31_t * | ||
| 710 | llgtr %r3,%r3 # siginfo_emu31_t * | ||
| 711 | llgtr %r4,%r4 # const struct compat_timespec * | ||
| 712 | llgfr %r5,%r5 # size_t | ||
| 713 | jg compat_sys_rt_sigtimedwait # branch to system call | ||
| 714 | |||
| 715 | ENTRY(sys32_rt_sigqueueinfo_wrapper) | ||
| 716 | lgfr %r2,%r2 # int | ||
| 717 | lgfr %r3,%r3 # int | ||
| 718 | llgtr %r4,%r4 # siginfo_emu31_t * | ||
| 719 | jg sys32_rt_sigqueueinfo # branch to system call | ||
| 720 | |||
| 721 | ENTRY(compat_sys_rt_sigsuspend_wrapper) | ||
| 722 | llgtr %r2,%r2 # compat_sigset_t * | ||
| 723 | llgfr %r3,%r3 # compat_size_t | ||
| 724 | jg compat_sys_rt_sigsuspend | ||
| 725 | |||
| 726 | ENTRY(sys32_pread64_wrapper) | 648 | ENTRY(sys32_pread64_wrapper) |
| 727 | llgfr %r2,%r2 # unsigned int | 649 | llgfr %r2,%r2 # unsigned int |
| 728 | llgtr %r3,%r3 # char * | 650 | llgtr %r3,%r3 # char * |
| @@ -760,11 +682,6 @@ ENTRY(sys32_capset_wrapper) | |||
| 760 | llgtr %r3,%r3 # const cap_user_data_t | 682 | llgtr %r3,%r3 # const cap_user_data_t |
| 761 | jg sys_capset # branch to system call | 683 | jg sys_capset # branch to system call |
| 762 | 684 | ||
| 763 | ENTRY(sys32_sigaltstack_wrapper) | ||
| 764 | llgtr %r2,%r2 # const stack_emu31_t * | ||
| 765 | llgtr %r3,%r3 # stack_emu31_t * | ||
| 766 | jg sys32_sigaltstack | ||
| 767 | |||
| 768 | ENTRY(sys32_sendfile_wrapper) | 685 | ENTRY(sys32_sendfile_wrapper) |
| 769 | lgfr %r2,%r2 # int | 686 | lgfr %r2,%r2 # int |
| 770 | lgfr %r3,%r3 # int | 687 | lgfr %r3,%r3 # int |
| @@ -921,16 +838,6 @@ ENTRY(sys32_fstat64_wrapper) | |||
| 921 | llgtr %r3,%r3 # struct stat64 * | 838 | llgtr %r3,%r3 # struct stat64 * |
| 922 | jg sys32_fstat64 # branch to system call | 839 | jg sys32_fstat64 # branch to system call |
| 923 | 840 | ||
| 924 | ENTRY(compat_sys_futex_wrapper) | ||
| 925 | llgtr %r2,%r2 # u32 * | ||
| 926 | lgfr %r3,%r3 # int | ||
| 927 | lgfr %r4,%r4 # int | ||
| 928 | llgtr %r5,%r5 # struct compat_timespec * | ||
| 929 | llgtr %r6,%r6 # u32 * | ||
| 930 | lgf %r0,164(%r15) # int | ||
| 931 | stg %r0,160(%r15) | ||
| 932 | jg compat_sys_futex # branch to system call | ||
| 933 | |||
| 934 | ENTRY(sys32_setxattr_wrapper) | 841 | ENTRY(sys32_setxattr_wrapper) |
| 935 | llgtr %r2,%r2 # char * | 842 | llgtr %r2,%r2 # char * |
| 936 | llgtr %r3,%r3 # char * | 843 | llgtr %r3,%r3 # char * |
| @@ -1216,14 +1123,6 @@ ENTRY(sys32_remap_file_pages_wrapper) | |||
| 1216 | llgfr %r6,%r6 # unsigned long | 1123 | llgfr %r6,%r6 # unsigned long |
| 1217 | jg sys_remap_file_pages | 1124 | jg sys_remap_file_pages |
| 1218 | 1125 | ||
| 1219 | ENTRY(compat_sys_waitid_wrapper) | ||
| 1220 | lgfr %r2,%r2 # int | ||
| 1221 | lgfr %r3,%r3 # pid_t | ||
| 1222 | llgtr %r4,%r4 # siginfo_emu31_t * | ||
| 1223 | lgfr %r5,%r5 # int | ||
| 1224 | llgtr %r6,%r6 # struct rusage_emu31 * | ||
| 1225 | jg compat_sys_waitid | ||
| 1226 | |||
| 1227 | ENTRY(compat_sys_kexec_load_wrapper) | 1126 | ENTRY(compat_sys_kexec_load_wrapper) |
| 1228 | llgfr %r2,%r2 # unsigned long | 1127 | llgfr %r2,%r2 # unsigned long |
| 1229 | llgfr %r3,%r3 # unsigned long | 1128 | llgfr %r3,%r3 # unsigned long |
| @@ -1253,13 +1152,6 @@ ENTRY(sys_inotify_rm_watch_wrapper) | |||
| 1253 | llgfr %r3,%r3 # u32 | 1152 | llgfr %r3,%r3 # u32 |
| 1254 | jg sys_inotify_rm_watch | 1153 | jg sys_inotify_rm_watch |
| 1255 | 1154 | ||
| 1256 | ENTRY(compat_sys_openat_wrapper) | ||
| 1257 | llgfr %r2,%r2 # unsigned int | ||
| 1258 | llgtr %r3,%r3 # const char * | ||
| 1259 | lgfr %r4,%r4 # int | ||
| 1260 | lgfr %r5,%r5 # int | ||
| 1261 | jg compat_sys_openat | ||
| 1262 | |||
| 1263 | ENTRY(sys_mkdirat_wrapper) | 1155 | ENTRY(sys_mkdirat_wrapper) |
| 1264 | lgfr %r2,%r2 # int | 1156 | lgfr %r2,%r2 # int |
| 1265 | llgtr %r3,%r3 # const char * | 1157 | llgtr %r3,%r3 # const char * |
| @@ -1362,17 +1254,6 @@ ENTRY(sys_unshare_wrapper) | |||
| 1362 | llgfr %r2,%r2 # unsigned long | 1254 | llgfr %r2,%r2 # unsigned long |
| 1363 | jg sys_unshare | 1255 | jg sys_unshare |
| 1364 | 1256 | ||
| 1365 | ENTRY(compat_sys_set_robust_list_wrapper) | ||
| 1366 | llgtr %r2,%r2 # struct compat_robust_list_head * | ||
| 1367 | llgfr %r3,%r3 # size_t | ||
| 1368 | jg compat_sys_set_robust_list | ||
| 1369 | |||
| 1370 | ENTRY(compat_sys_get_robust_list_wrapper) | ||
| 1371 | lgfr %r2,%r2 # int | ||
| 1372 | llgtr %r3,%r3 # compat_uptr_t_t * | ||
| 1373 | llgtr %r4,%r4 # compat_size_t * | ||
| 1374 | jg compat_sys_get_robust_list | ||
| 1375 | |||
| 1376 | ENTRY(sys_splice_wrapper) | 1257 | ENTRY(sys_splice_wrapper) |
| 1377 | lgfr %r2,%r2 # int | 1258 | lgfr %r2,%r2 # int |
| 1378 | llgtr %r3,%r3 # loff_t * | 1259 | llgtr %r3,%r3 # loff_t * |
| @@ -1458,18 +1339,6 @@ ENTRY(sys_timerfd_create_wrapper) | |||
| 1458 | lgfr %r3,%r3 # int | 1339 | lgfr %r3,%r3 # int |
| 1459 | jg sys_timerfd_create | 1340 | jg sys_timerfd_create |
| 1460 | 1341 | ||
| 1461 | ENTRY(compat_sys_timerfd_settime_wrapper) | ||
| 1462 | lgfr %r2,%r2 # int | ||
| 1463 | lgfr %r3,%r3 # int | ||
| 1464 | llgtr %r4,%r4 # struct compat_itimerspec * | ||
| 1465 | llgtr %r5,%r5 # struct compat_itimerspec * | ||
| 1466 | jg compat_sys_timerfd_settime | ||
| 1467 | |||
| 1468 | ENTRY(compat_sys_timerfd_gettime_wrapper) | ||
| 1469 | lgfr %r2,%r2 # int | ||
| 1470 | llgtr %r3,%r3 # struct compat_itimerspec * | ||
| 1471 | jg compat_sys_timerfd_gettime | ||
| 1472 | |||
| 1473 | ENTRY(compat_sys_signalfd4_wrapper) | 1342 | ENTRY(compat_sys_signalfd4_wrapper) |
| 1474 | lgfr %r2,%r2 # int | 1343 | lgfr %r2,%r2 # int |
| 1475 | llgtr %r3,%r3 # compat_sigset_t * | 1344 | llgtr %r3,%r3 # compat_sigset_t * |
| @@ -1550,13 +1419,6 @@ ENTRY(compat_sys_pwritev_wrapper) | |||
| 1550 | llgfr %r6,%r6 # u32 | 1419 | llgfr %r6,%r6 # u32 |
| 1551 | jg compat_sys_pwritev # branch to system call | 1420 | jg compat_sys_pwritev # branch to system call |
| 1552 | 1421 | ||
| 1553 | ENTRY(compat_sys_rt_tgsigqueueinfo_wrapper) | ||
| 1554 | lgfr %r2,%r2 # compat_pid_t | ||
| 1555 | lgfr %r3,%r3 # compat_pid_t | ||
| 1556 | lgfr %r4,%r4 # int | ||
| 1557 | llgtr %r5,%r5 # struct compat_siginfo * | ||
| 1558 | jg compat_sys_rt_tgsigqueueinfo_wrapper # branch to system call | ||
| 1559 | |||
| 1560 | ENTRY(sys_perf_event_open_wrapper) | 1422 | ENTRY(sys_perf_event_open_wrapper) |
| 1561 | llgtr %r2,%r2 # const struct perf_event_attr * | 1423 | llgtr %r2,%r2 # const struct perf_event_attr * |
| 1562 | lgfr %r3,%r3 # pid_t | 1424 | lgfr %r3,%r3 # pid_t |
| @@ -1607,12 +1469,6 @@ ENTRY(sys_name_to_handle_at_wrapper) | |||
| 1607 | lgfr %r6,%r6 # int | 1469 | lgfr %r6,%r6 # int |
| 1608 | jg sys_name_to_handle_at | 1470 | jg sys_name_to_handle_at |
| 1609 | 1471 | ||
| 1610 | ENTRY(compat_sys_open_by_handle_at_wrapper) | ||
| 1611 | lgfr %r2,%r2 # int | ||
| 1612 | llgtr %r3,%r3 # struct file_handle __user * | ||
| 1613 | lgfr %r4,%r4 # int | ||
| 1614 | jg compat_sys_open_by_handle_at | ||
| 1615 | |||
| 1616 | ENTRY(compat_sys_clock_adjtime_wrapper) | 1472 | ENTRY(compat_sys_clock_adjtime_wrapper) |
| 1617 | lgfr %r2,%r2 # clockid_t (int) | 1473 | lgfr %r2,%r2 # clockid_t (int) |
| 1618 | llgtr %r3,%r3 # struct compat_timex __user * | 1474 | llgtr %r3,%r3 # struct compat_timex __user * |
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index 2711936fe706..c3a736a3ed44 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h | |||
| @@ -73,10 +73,6 @@ long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low, | |||
| 73 | long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args); | 73 | long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args); |
| 74 | long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, | 74 | long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, |
| 75 | u32 len_low); | 75 | u32 len_low); |
| 76 | long sys_sigsuspend(int history0, int history1, old_sigset_t mask); | ||
| 77 | long sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
| 78 | struct old_sigaction __user *oact); | ||
| 79 | long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss); | ||
| 80 | long sys_sigreturn(void); | 76 | long sys_sigreturn(void); |
| 81 | long sys_rt_sigreturn(void); | 77 | long sys_rt_sigreturn(void); |
| 82 | long sys32_sigreturn(void); | 78 | long sys32_sigreturn(void); |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index c3ff70a7b247..9c6e747a5e1e 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
| @@ -48,54 +48,6 @@ typedef struct | |||
| 48 | struct ucontext uc; | 48 | struct ucontext uc; |
| 49 | } rt_sigframe; | 49 | } rt_sigframe; |
| 50 | 50 | ||
| 51 | /* | ||
| 52 | * Atomically swap in the new signal mask, and wait for a signal. | ||
| 53 | */ | ||
| 54 | SYSCALL_DEFINE3(sigsuspend, int, history0, int, history1, old_sigset_t, mask) | ||
| 55 | { | ||
| 56 | sigset_t blocked; | ||
| 57 | siginitset(&blocked, mask); | ||
| 58 | return sigsuspend(&blocked); | ||
| 59 | } | ||
| 60 | |||
| 61 | SYSCALL_DEFINE3(sigaction, int, sig, const struct old_sigaction __user *, act, | ||
| 62 | struct old_sigaction __user *, oact) | ||
| 63 | { | ||
| 64 | struct k_sigaction new_ka, old_ka; | ||
| 65 | int ret; | ||
| 66 | |||
| 67 | if (act) { | ||
| 68 | old_sigset_t mask; | ||
| 69 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 70 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 71 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 72 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 73 | __get_user(mask, &act->sa_mask)) | ||
| 74 | return -EFAULT; | ||
| 75 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 76 | } | ||
| 77 | |||
| 78 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 79 | |||
| 80 | if (!ret && oact) { | ||
| 81 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 82 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 83 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 84 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 85 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 86 | return -EFAULT; | ||
| 87 | } | ||
| 88 | |||
| 89 | return ret; | ||
| 90 | } | ||
| 91 | |||
| 92 | SYSCALL_DEFINE2(sigaltstack, const stack_t __user *, uss, | ||
| 93 | stack_t __user *, uoss) | ||
| 94 | { | ||
| 95 | struct pt_regs *regs = task_pt_regs(current); | ||
| 96 | return do_sigaltstack(uss, uoss, regs->gprs[15]); | ||
| 97 | } | ||
| 98 | |||
| 99 | /* Returns non-zero on fault. */ | 51 | /* Returns non-zero on fault. */ |
| 100 | static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | 52 | static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs) |
| 101 | { | 53 | { |
| @@ -190,8 +142,7 @@ SYSCALL_DEFINE0(rt_sigreturn) | |||
| 190 | set_current_blocked(&set); | 142 | set_current_blocked(&set); |
| 191 | if (restore_sigregs(regs, &frame->uc.uc_mcontext)) | 143 | if (restore_sigregs(regs, &frame->uc.uc_mcontext)) |
| 192 | goto badframe; | 144 | goto badframe; |
| 193 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, | 145 | if (restore_altstack(&frame->uc.uc_stack)) |
| 194 | regs->gprs[15]) == -EFAULT) | ||
| 195 | goto badframe; | 146 | goto badframe; |
| 196 | return regs->gprs[2]; | 147 | return regs->gprs[2]; |
| 197 | badframe: | 148 | badframe: |
| @@ -325,10 +276,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 325 | /* Create the ucontext. */ | 276 | /* Create the ucontext. */ |
| 326 | err |= __put_user(0, &frame->uc.uc_flags); | 277 | err |= __put_user(0, &frame->uc.uc_flags); |
| 327 | err |= __put_user(NULL, &frame->uc.uc_link); | 278 | err |= __put_user(NULL, &frame->uc.uc_link); |
| 328 | err |= __put_user((void __user *)current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 279 | err |= __save_altstack(&frame->uc.uc_stack, regs->gprs[15]); |
| 329 | err |= __put_user(sas_ss_flags(regs->gprs[15]), | ||
| 330 | &frame->uc.uc_stack.ss_flags); | ||
| 331 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 332 | err |= save_sigregs(regs, &frame->uc.uc_mcontext); | 280 | err |= save_sigregs(regs, &frame->uc.uc_mcontext); |
| 333 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 281 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 334 | if (err) | 282 | if (err) |
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 6a6c61f94dd3..aaac708aa110 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S | |||
| @@ -13,7 +13,7 @@ SYSCALL(sys_exit,sys_exit,sys32_exit_wrapper) | |||
| 13 | SYSCALL(sys_fork,sys_fork,sys_fork) | 13 | SYSCALL(sys_fork,sys_fork,sys_fork) |
| 14 | SYSCALL(sys_read,sys_read,sys32_read_wrapper) | 14 | SYSCALL(sys_read,sys_read,sys32_read_wrapper) |
| 15 | SYSCALL(sys_write,sys_write,sys32_write_wrapper) | 15 | SYSCALL(sys_write,sys_write,sys32_write_wrapper) |
| 16 | SYSCALL(sys_open,sys_open,sys32_open_wrapper) /* 5 */ | 16 | SYSCALL(sys_open,sys_open,compat_sys_open) /* 5 */ |
| 17 | SYSCALL(sys_close,sys_close,sys32_close_wrapper) | 17 | SYSCALL(sys_close,sys_close,sys32_close_wrapper) |
| 18 | SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_restart_syscall) | 18 | SYSCALL(sys_restart_syscall,sys_restart_syscall,sys_restart_syscall) |
| 19 | SYSCALL(sys_creat,sys_creat,sys32_creat_wrapper) | 19 | SYSCALL(sys_creat,sys_creat,sys32_creat_wrapper) |
| @@ -75,7 +75,7 @@ SYSCALL(sys_dup2,sys_dup2,sys32_dup2_wrapper) | |||
| 75 | SYSCALL(sys_getppid,sys_getppid,sys_getppid) | 75 | SYSCALL(sys_getppid,sys_getppid,sys_getppid) |
| 76 | SYSCALL(sys_getpgrp,sys_getpgrp,sys_getpgrp) /* 65 */ | 76 | SYSCALL(sys_getpgrp,sys_getpgrp,sys_getpgrp) /* 65 */ |
| 77 | SYSCALL(sys_setsid,sys_setsid,sys_setsid) | 77 | SYSCALL(sys_setsid,sys_setsid,sys_setsid) |
| 78 | SYSCALL(sys_sigaction,sys_sigaction,sys32_sigaction_wrapper) | 78 | SYSCALL(sys_sigaction,sys_sigaction,compat_sys_sigaction) |
| 79 | NI_SYSCALL /* old sgetmask syscall*/ | 79 | NI_SYSCALL /* old sgetmask syscall*/ |
| 80 | NI_SYSCALL /* old ssetmask syscall*/ | 80 | NI_SYSCALL /* old ssetmask syscall*/ |
| 81 | SYSCALL(sys_setreuid16,sys_ni_syscall,sys32_setreuid16_wrapper) /* old setreuid16 syscall */ | 81 | SYSCALL(sys_setreuid16,sys_ni_syscall,sys32_setreuid16_wrapper) /* old setreuid16 syscall */ |
| @@ -112,8 +112,8 @@ SYSCALL(sys_fstatfs,sys_fstatfs,compat_sys_fstatfs_wrapper) /* 100 */ | |||
| 112 | NI_SYSCALL /* ioperm for i386 */ | 112 | NI_SYSCALL /* ioperm for i386 */ |
| 113 | SYSCALL(sys_socketcall,sys_socketcall,compat_sys_socketcall_wrapper) | 113 | SYSCALL(sys_socketcall,sys_socketcall,compat_sys_socketcall_wrapper) |
| 114 | SYSCALL(sys_syslog,sys_syslog,sys32_syslog_wrapper) | 114 | SYSCALL(sys_syslog,sys_syslog,sys32_syslog_wrapper) |
| 115 | SYSCALL(sys_setitimer,sys_setitimer,compat_sys_setitimer_wrapper) | 115 | SYSCALL(sys_setitimer,sys_setitimer,compat_sys_setitimer) |
| 116 | SYSCALL(sys_getitimer,sys_getitimer,compat_sys_getitimer_wrapper) /* 105 */ | 116 | SYSCALL(sys_getitimer,sys_getitimer,compat_sys_getitimer) /* 105 */ |
| 117 | SYSCALL(sys_newstat,sys_newstat,compat_sys_newstat_wrapper) | 117 | SYSCALL(sys_newstat,sys_newstat,compat_sys_newstat_wrapper) |
| 118 | SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat_wrapper) | 118 | SYSCALL(sys_newlstat,sys_newlstat,compat_sys_newlstat_wrapper) |
| 119 | SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat_wrapper) | 119 | SYSCALL(sys_newfstat,sys_newfstat,compat_sys_newfstat_wrapper) |
| @@ -122,7 +122,7 @@ SYSCALL(sys_lookup_dcookie,sys_lookup_dcookie,sys32_lookup_dcookie_wrapper) /* 1 | |||
| 122 | SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup) | 122 | SYSCALL(sys_vhangup,sys_vhangup,sys_vhangup) |
| 123 | NI_SYSCALL /* old "idle" system call */ | 123 | NI_SYSCALL /* old "idle" system call */ |
| 124 | NI_SYSCALL /* vm86old for i386 */ | 124 | NI_SYSCALL /* vm86old for i386 */ |
| 125 | SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4_wrapper) | 125 | SYSCALL(sys_wait4,sys_wait4,compat_sys_wait4) |
| 126 | SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper) /* 115 */ | 126 | SYSCALL(sys_swapoff,sys_swapoff,sys32_swapoff_wrapper) /* 115 */ |
| 127 | SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper) | 127 | SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper) |
| 128 | SYSCALL(sys_s390_ipc,sys_s390_ipc,sys32_ipc_wrapper) | 128 | SYSCALL(sys_s390_ipc,sys_s390_ipc,sys32_ipc_wrapper) |
| @@ -134,7 +134,7 @@ SYSCALL(sys_newuname,sys_newuname,sys32_newuname_wrapper) | |||
| 134 | NI_SYSCALL /* modify_ldt for i386 */ | 134 | NI_SYSCALL /* modify_ldt for i386 */ |
| 135 | SYSCALL(sys_adjtimex,sys_adjtimex,compat_sys_adjtimex_wrapper) | 135 | SYSCALL(sys_adjtimex,sys_adjtimex,compat_sys_adjtimex_wrapper) |
| 136 | SYSCALL(sys_mprotect,sys_mprotect,sys32_mprotect_wrapper) /* 125 */ | 136 | SYSCALL(sys_mprotect,sys_mprotect,sys32_mprotect_wrapper) /* 125 */ |
| 137 | SYSCALL(sys_sigprocmask,sys_sigprocmask,compat_sys_sigprocmask_wrapper) | 137 | SYSCALL(sys_sigprocmask,sys_sigprocmask,compat_sys_sigprocmask) |
| 138 | NI_SYSCALL /* old "create module" */ | 138 | NI_SYSCALL /* old "create module" */ |
| 139 | SYSCALL(sys_init_module,sys_init_module,sys_init_module_wrapper) | 139 | SYSCALL(sys_init_module,sys_init_module,sys_init_module_wrapper) |
| 140 | SYSCALL(sys_delete_module,sys_delete_module,sys_delete_module_wrapper) | 140 | SYSCALL(sys_delete_module,sys_delete_module,sys_delete_module_wrapper) |
| @@ -169,7 +169,7 @@ SYSCALL(sys_sched_getscheduler,sys_sched_getscheduler,sys32_sched_getscheduler_w | |||
| 169 | SYSCALL(sys_sched_yield,sys_sched_yield,sys_sched_yield) | 169 | SYSCALL(sys_sched_yield,sys_sched_yield,sys_sched_yield) |
| 170 | SYSCALL(sys_sched_get_priority_max,sys_sched_get_priority_max,sys32_sched_get_priority_max_wrapper) | 170 | SYSCALL(sys_sched_get_priority_max,sys_sched_get_priority_max,sys32_sched_get_priority_max_wrapper) |
| 171 | SYSCALL(sys_sched_get_priority_min,sys_sched_get_priority_min,sys32_sched_get_priority_min_wrapper) /* 160 */ | 171 | SYSCALL(sys_sched_get_priority_min,sys_sched_get_priority_min,sys32_sched_get_priority_min_wrapper) /* 160 */ |
| 172 | SYSCALL(sys_sched_rr_get_interval,sys_sched_rr_get_interval,sys32_sched_rr_get_interval_wrapper) | 172 | SYSCALL(sys_sched_rr_get_interval,sys_sched_rr_get_interval,compat_sys_sched_rr_get_interval) |
| 173 | SYSCALL(sys_nanosleep,sys_nanosleep,compat_sys_nanosleep_wrapper) | 173 | SYSCALL(sys_nanosleep,sys_nanosleep,compat_sys_nanosleep_wrapper) |
| 174 | SYSCALL(sys_mremap,sys_mremap,sys32_mremap_wrapper) | 174 | SYSCALL(sys_mremap,sys_mremap,sys32_mremap_wrapper) |
| 175 | SYSCALL(sys_setresuid16,sys_ni_syscall,sys32_setresuid16_wrapper) /* old setresuid16 syscall */ | 175 | SYSCALL(sys_setresuid16,sys_ni_syscall,sys32_setresuid16_wrapper) /* old setresuid16 syscall */ |
| @@ -182,19 +182,19 @@ SYSCALL(sys_setresgid16,sys_ni_syscall,sys32_setresgid16_wrapper) /* 170 old set | |||
| 182 | SYSCALL(sys_getresgid16,sys_ni_syscall,sys32_getresgid16_wrapper) /* old getresgid16 syscall */ | 182 | SYSCALL(sys_getresgid16,sys_ni_syscall,sys32_getresgid16_wrapper) /* old getresgid16 syscall */ |
| 183 | SYSCALL(sys_prctl,sys_prctl,sys32_prctl_wrapper) | 183 | SYSCALL(sys_prctl,sys_prctl,sys32_prctl_wrapper) |
| 184 | SYSCALL(sys_rt_sigreturn,sys_rt_sigreturn,sys32_rt_sigreturn) | 184 | SYSCALL(sys_rt_sigreturn,sys_rt_sigreturn,sys32_rt_sigreturn) |
| 185 | SYSCALL(sys_rt_sigaction,sys_rt_sigaction,sys32_rt_sigaction_wrapper) | 185 | SYSCALL(sys_rt_sigaction,sys_rt_sigaction,compat_sys_rt_sigaction) |
| 186 | SYSCALL(sys_rt_sigprocmask,sys_rt_sigprocmask,sys32_rt_sigprocmask_wrapper) /* 175 */ | 186 | SYSCALL(sys_rt_sigprocmask,sys_rt_sigprocmask,compat_sys_rt_sigprocmask) /* 175 */ |
| 187 | SYSCALL(sys_rt_sigpending,sys_rt_sigpending,sys32_rt_sigpending_wrapper) | 187 | SYSCALL(sys_rt_sigpending,sys_rt_sigpending,compat_sys_rt_sigpending) |
| 188 | SYSCALL(sys_rt_sigtimedwait,sys_rt_sigtimedwait,compat_sys_rt_sigtimedwait_wrapper) | 188 | SYSCALL(sys_rt_sigtimedwait,sys_rt_sigtimedwait,compat_sys_rt_sigtimedwait) |
| 189 | SYSCALL(sys_rt_sigqueueinfo,sys_rt_sigqueueinfo,sys32_rt_sigqueueinfo_wrapper) | 189 | SYSCALL(sys_rt_sigqueueinfo,sys_rt_sigqueueinfo,compat_sys_rt_sigqueueinfo) |
| 190 | SYSCALL(sys_rt_sigsuspend,sys_rt_sigsuspend,compat_sys_rt_sigsuspend_wrapper) | 190 | SYSCALL(sys_rt_sigsuspend,sys_rt_sigsuspend,compat_sys_rt_sigsuspend) |
| 191 | SYSCALL(sys_pread64,sys_pread64,sys32_pread64_wrapper) /* 180 */ | 191 | SYSCALL(sys_pread64,sys_pread64,sys32_pread64_wrapper) /* 180 */ |
| 192 | SYSCALL(sys_pwrite64,sys_pwrite64,sys32_pwrite64_wrapper) | 192 | SYSCALL(sys_pwrite64,sys_pwrite64,sys32_pwrite64_wrapper) |
| 193 | SYSCALL(sys_chown16,sys_ni_syscall,sys32_chown16_wrapper) /* old chown16 syscall */ | 193 | SYSCALL(sys_chown16,sys_ni_syscall,sys32_chown16_wrapper) /* old chown16 syscall */ |
| 194 | SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper) | 194 | SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper) |
| 195 | SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper) | 195 | SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper) |
| 196 | SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper) /* 185 */ | 196 | SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper) /* 185 */ |
| 197 | SYSCALL(sys_sigaltstack,sys_sigaltstack,sys32_sigaltstack_wrapper) | 197 | SYSCALL(sys_sigaltstack,sys_sigaltstack,compat_sys_sigaltstack) |
| 198 | SYSCALL(sys_sendfile,sys_sendfile64,sys32_sendfile_wrapper) | 198 | SYSCALL(sys_sendfile,sys_sendfile64,sys32_sendfile_wrapper) |
| 199 | NI_SYSCALL /* streams1 */ | 199 | NI_SYSCALL /* streams1 */ |
| 200 | NI_SYSCALL /* streams2 */ | 200 | NI_SYSCALL /* streams2 */ |
| @@ -246,7 +246,7 @@ SYSCALL(sys_lremovexattr,sys_lremovexattr,sys32_lremovexattr_wrapper) | |||
| 246 | SYSCALL(sys_fremovexattr,sys_fremovexattr,sys32_fremovexattr_wrapper) /* 235 */ | 246 | SYSCALL(sys_fremovexattr,sys_fremovexattr,sys32_fremovexattr_wrapper) /* 235 */ |
| 247 | SYSCALL(sys_gettid,sys_gettid,sys_gettid) | 247 | SYSCALL(sys_gettid,sys_gettid,sys_gettid) |
| 248 | SYSCALL(sys_tkill,sys_tkill,sys_tkill_wrapper) | 248 | SYSCALL(sys_tkill,sys_tkill,sys_tkill_wrapper) |
| 249 | SYSCALL(sys_futex,sys_futex,compat_sys_futex_wrapper) | 249 | SYSCALL(sys_futex,sys_futex,compat_sys_futex) |
| 250 | SYSCALL(sys_sched_setaffinity,sys_sched_setaffinity,sys32_sched_setaffinity_wrapper) | 250 | SYSCALL(sys_sched_setaffinity,sys_sched_setaffinity,sys32_sched_setaffinity_wrapper) |
| 251 | SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,sys32_sched_getaffinity_wrapper) /* 240 */ | 251 | SYSCALL(sys_sched_getaffinity,sys_sched_getaffinity,sys32_sched_getaffinity_wrapper) /* 240 */ |
| 252 | SYSCALL(sys_tgkill,sys_tgkill,sys_tgkill_wrapper) | 252 | SYSCALL(sys_tgkill,sys_tgkill,sys_tgkill_wrapper) |
| @@ -289,14 +289,14 @@ SYSCALL(sys_kexec_load,sys_kexec_load,compat_sys_kexec_load_wrapper) | |||
| 289 | SYSCALL(sys_add_key,sys_add_key,compat_sys_add_key_wrapper) | 289 | SYSCALL(sys_add_key,sys_add_key,compat_sys_add_key_wrapper) |
| 290 | SYSCALL(sys_request_key,sys_request_key,compat_sys_request_key_wrapper) | 290 | SYSCALL(sys_request_key,sys_request_key,compat_sys_request_key_wrapper) |
| 291 | SYSCALL(sys_keyctl,sys_keyctl,compat_sys_keyctl_wrapper) /* 280 */ | 291 | SYSCALL(sys_keyctl,sys_keyctl,compat_sys_keyctl_wrapper) /* 280 */ |
| 292 | SYSCALL(sys_waitid,sys_waitid,compat_sys_waitid_wrapper) | 292 | SYSCALL(sys_waitid,sys_waitid,compat_sys_waitid) |
| 293 | SYSCALL(sys_ioprio_set,sys_ioprio_set,sys_ioprio_set_wrapper) | 293 | SYSCALL(sys_ioprio_set,sys_ioprio_set,sys_ioprio_set_wrapper) |
| 294 | SYSCALL(sys_ioprio_get,sys_ioprio_get,sys_ioprio_get_wrapper) | 294 | SYSCALL(sys_ioprio_get,sys_ioprio_get,sys_ioprio_get_wrapper) |
| 295 | SYSCALL(sys_inotify_init,sys_inotify_init,sys_inotify_init) | 295 | SYSCALL(sys_inotify_init,sys_inotify_init,sys_inotify_init) |
| 296 | SYSCALL(sys_inotify_add_watch,sys_inotify_add_watch,sys_inotify_add_watch_wrapper) /* 285 */ | 296 | SYSCALL(sys_inotify_add_watch,sys_inotify_add_watch,sys_inotify_add_watch_wrapper) /* 285 */ |
| 297 | SYSCALL(sys_inotify_rm_watch,sys_inotify_rm_watch,sys_inotify_rm_watch_wrapper) | 297 | SYSCALL(sys_inotify_rm_watch,sys_inotify_rm_watch,sys_inotify_rm_watch_wrapper) |
| 298 | NI_SYSCALL /* 287 sys_migrate_pages */ | 298 | NI_SYSCALL /* 287 sys_migrate_pages */ |
| 299 | SYSCALL(sys_openat,sys_openat,compat_sys_openat_wrapper) | 299 | SYSCALL(sys_openat,sys_openat,compat_sys_openat) |
| 300 | SYSCALL(sys_mkdirat,sys_mkdirat,sys_mkdirat_wrapper) | 300 | SYSCALL(sys_mkdirat,sys_mkdirat,sys_mkdirat_wrapper) |
| 301 | SYSCALL(sys_mknodat,sys_mknodat,sys_mknodat_wrapper) /* 290 */ | 301 | SYSCALL(sys_mknodat,sys_mknodat,sys_mknodat_wrapper) /* 290 */ |
| 302 | SYSCALL(sys_fchownat,sys_fchownat,sys_fchownat_wrapper) | 302 | SYSCALL(sys_fchownat,sys_fchownat,sys_fchownat_wrapper) |
| @@ -312,8 +312,8 @@ SYSCALL(sys_faccessat,sys_faccessat,sys_faccessat_wrapper) /* 300 */ | |||
| 312 | SYSCALL(sys_pselect6,sys_pselect6,compat_sys_pselect6_wrapper) | 312 | SYSCALL(sys_pselect6,sys_pselect6,compat_sys_pselect6_wrapper) |
| 313 | SYSCALL(sys_ppoll,sys_ppoll,compat_sys_ppoll_wrapper) | 313 | SYSCALL(sys_ppoll,sys_ppoll,compat_sys_ppoll_wrapper) |
| 314 | SYSCALL(sys_unshare,sys_unshare,sys_unshare_wrapper) | 314 | SYSCALL(sys_unshare,sys_unshare,sys_unshare_wrapper) |
| 315 | SYSCALL(sys_set_robust_list,sys_set_robust_list,compat_sys_set_robust_list_wrapper) | 315 | SYSCALL(sys_set_robust_list,sys_set_robust_list,compat_sys_set_robust_list) |
| 316 | SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list_wrapper) | 316 | SYSCALL(sys_get_robust_list,sys_get_robust_list,compat_sys_get_robust_list) |
| 317 | SYSCALL(sys_splice,sys_splice,sys_splice_wrapper) | 317 | SYSCALL(sys_splice,sys_splice,sys_splice_wrapper) |
| 318 | SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_wrapper) | 318 | SYSCALL(sys_sync_file_range,sys_sync_file_range,sys_sync_file_range_wrapper) |
| 319 | SYSCALL(sys_tee,sys_tee,sys_tee_wrapper) | 319 | SYSCALL(sys_tee,sys_tee,sys_tee_wrapper) |
| @@ -328,8 +328,8 @@ SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper) | |||
| 328 | NI_SYSCALL /* 317 old sys_timer_fd */ | 328 | NI_SYSCALL /* 317 old sys_timer_fd */ |
| 329 | SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper) | 329 | SYSCALL(sys_eventfd,sys_eventfd,sys_eventfd_wrapper) |
| 330 | SYSCALL(sys_timerfd_create,sys_timerfd_create,sys_timerfd_create_wrapper) | 330 | SYSCALL(sys_timerfd_create,sys_timerfd_create,sys_timerfd_create_wrapper) |
| 331 | SYSCALL(sys_timerfd_settime,sys_timerfd_settime,compat_sys_timerfd_settime_wrapper) /* 320 */ | 331 | SYSCALL(sys_timerfd_settime,sys_timerfd_settime,compat_sys_timerfd_settime) /* 320 */ |
| 332 | SYSCALL(sys_timerfd_gettime,sys_timerfd_gettime,compat_sys_timerfd_gettime_wrapper) | 332 | SYSCALL(sys_timerfd_gettime,sys_timerfd_gettime,compat_sys_timerfd_gettime) |
| 333 | SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4_wrapper) | 333 | SYSCALL(sys_signalfd4,sys_signalfd4,compat_sys_signalfd4_wrapper) |
| 334 | SYSCALL(sys_eventfd2,sys_eventfd2,sys_eventfd2_wrapper) | 334 | SYSCALL(sys_eventfd2,sys_eventfd2,sys_eventfd2_wrapper) |
| 335 | SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper) | 335 | SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper) |
| @@ -338,13 +338,13 @@ SYSCALL(sys_dup3,sys_dup3,sys_dup3_wrapper) | |||
| 338 | SYSCALL(sys_epoll_create1,sys_epoll_create1,sys_epoll_create1_wrapper) | 338 | SYSCALL(sys_epoll_create1,sys_epoll_create1,sys_epoll_create1_wrapper) |
| 339 | SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv_wrapper) | 339 | SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv_wrapper) |
| 340 | SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev_wrapper) | 340 | SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev_wrapper) |
| 341 | SYSCALL(sys_rt_tgsigqueueinfo,sys_rt_tgsigqueueinfo,compat_sys_rt_tgsigqueueinfo_wrapper) /* 330 */ | 341 | SYSCALL(sys_rt_tgsigqueueinfo,sys_rt_tgsigqueueinfo,compat_sys_rt_tgsigqueueinfo) /* 330 */ |
| 342 | SYSCALL(sys_perf_event_open,sys_perf_event_open,sys_perf_event_open_wrapper) | 342 | SYSCALL(sys_perf_event_open,sys_perf_event_open,sys_perf_event_open_wrapper) |
| 343 | SYSCALL(sys_fanotify_init,sys_fanotify_init,sys_fanotify_init_wrapper) | 343 | SYSCALL(sys_fanotify_init,sys_fanotify_init,sys_fanotify_init_wrapper) |
| 344 | SYSCALL(sys_fanotify_mark,sys_fanotify_mark,sys_fanotify_mark_wrapper) | 344 | SYSCALL(sys_fanotify_mark,sys_fanotify_mark,sys_fanotify_mark_wrapper) |
| 345 | SYSCALL(sys_prlimit64,sys_prlimit64,sys_prlimit64_wrapper) | 345 | SYSCALL(sys_prlimit64,sys_prlimit64,sys_prlimit64_wrapper) |
| 346 | SYSCALL(sys_name_to_handle_at,sys_name_to_handle_at,sys_name_to_handle_at_wrapper) /* 335 */ | 346 | SYSCALL(sys_name_to_handle_at,sys_name_to_handle_at,sys_name_to_handle_at_wrapper) /* 335 */ |
| 347 | SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at_wrapper) | 347 | SYSCALL(sys_open_by_handle_at,sys_open_by_handle_at,compat_sys_open_by_handle_at) |
| 348 | SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime_wrapper) | 348 | SYSCALL(sys_clock_adjtime,sys_clock_adjtime,compat_sys_clock_adjtime_wrapper) |
| 349 | SYSCALL(sys_syncfs,sys_syncfs,sys_syncfs_wrapper) | 349 | SYSCALL(sys_syncfs,sys_syncfs,sys_syncfs_wrapper) |
| 350 | SYSCALL(sys_setns,sys_setns,sys_setns_wrapper) | 350 | SYSCALL(sys_setns,sys_setns,sys_setns_wrapper) |
diff --git a/arch/score/include/asm/syscalls.h b/arch/score/include/asm/syscalls.h index acaeed680956..98d1df92fbd1 100644 --- a/arch/score/include/asm/syscalls.h +++ b/arch/score/include/asm/syscalls.h | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | #ifndef _ASM_SCORE_SYSCALLS_H | 1 | #ifndef _ASM_SCORE_SYSCALLS_H |
| 2 | #define _ASM_SCORE_SYSCALLS_H | 2 | #define _ASM_SCORE_SYSCALLS_H |
| 3 | 3 | ||
| 4 | asmlinkage long score_sigaltstack(struct pt_regs *regs); | ||
| 5 | asmlinkage long score_rt_sigreturn(struct pt_regs *regs); | 4 | asmlinkage long score_rt_sigreturn(struct pt_regs *regs); |
| 6 | 5 | ||
| 7 | #include <asm-generic/syscalls.h> | 6 | #include <asm-generic/syscalls.h> |
diff --git a/arch/score/kernel/entry.S b/arch/score/kernel/entry.S index 1557ca1a2951..7234ed09b7b7 100644 --- a/arch/score/kernel/entry.S +++ b/arch/score/kernel/entry.S | |||
| @@ -491,8 +491,3 @@ ENTRY(sys_rt_sigreturn) | |||
| 491 | mv r4, r0 | 491 | mv r4, r0 |
| 492 | la r8, score_rt_sigreturn | 492 | la r8, score_rt_sigreturn |
| 493 | br r8 | 493 | br r8 |
| 494 | |||
| 495 | ENTRY(sys_sigaltstack) | ||
| 496 | mv r4, r0 | ||
| 497 | la r8, score_sigaltstack | ||
| 498 | br r8 | ||
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c index 02353bde92d8..a00fba32b0eb 100644 --- a/arch/score/kernel/signal.c +++ b/arch/score/kernel/signal.c | |||
| @@ -134,16 +134,6 @@ static void __user *get_sigframe(struct k_sigaction *ka, | |||
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | asmlinkage long | 136 | asmlinkage long |
| 137 | score_sigaltstack(struct pt_regs *regs) | ||
| 138 | { | ||
| 139 | const stack_t __user *uss = (const stack_t __user *) regs->regs[4]; | ||
| 140 | stack_t __user *uoss = (stack_t __user *) regs->regs[5]; | ||
| 141 | unsigned long usp = regs->regs[0]; | ||
| 142 | |||
| 143 | return do_sigaltstack(uss, uoss, usp); | ||
| 144 | } | ||
| 145 | |||
| 146 | asmlinkage long | ||
| 147 | score_rt_sigreturn(struct pt_regs *regs) | 137 | score_rt_sigreturn(struct pt_regs *regs) |
| 148 | { | 138 | { |
| 149 | struct rt_sigframe __user *frame; | 139 | struct rt_sigframe __user *frame; |
| @@ -167,9 +157,7 @@ score_rt_sigreturn(struct pt_regs *regs) | |||
| 167 | else if (sig) | 157 | else if (sig) |
| 168 | force_sig(sig, current); | 158 | force_sig(sig, current); |
| 169 | 159 | ||
| 170 | /* It is more difficult to avoid calling this function than to | 160 | if (restore_altstack(&frame->rs_uc.uc_stack)) |
| 171 | call it and ignore errors. */ | ||
| 172 | if (do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs->regs[0]) == -EFAULT) | ||
| 173 | goto badframe; | 161 | goto badframe; |
| 174 | regs->is_syscall = 0; | 162 | regs->is_syscall = 0; |
| 175 | 163 | ||
| @@ -209,12 +197,7 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 209 | err |= copy_siginfo_to_user(&frame->rs_info, info); | 197 | err |= copy_siginfo_to_user(&frame->rs_info, info); |
| 210 | err |= __put_user(0, &frame->rs_uc.uc_flags); | 198 | err |= __put_user(0, &frame->rs_uc.uc_flags); |
| 211 | err |= __put_user(NULL, &frame->rs_uc.uc_link); | 199 | err |= __put_user(NULL, &frame->rs_uc.uc_link); |
| 212 | err |= __put_user((void __user *)current->sas_ss_sp, | 200 | err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[0]); |
| 213 | &frame->rs_uc.uc_stack.ss_sp); | ||
| 214 | err |= __put_user(sas_ss_flags(regs->regs[0]), | ||
| 215 | &frame->rs_uc.uc_stack.ss_flags); | ||
| 216 | err |= __put_user(current->sas_ss_size, | ||
| 217 | &frame->rs_uc.uc_stack.ss_size); | ||
| 218 | err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); | 201 | err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext); |
| 219 | err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)); | 202 | err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)); |
| 220 | 203 | ||
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 479146c180cb..ef6717a64bc7 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
| @@ -39,6 +39,8 @@ config SUPERH | |||
| 39 | select GENERIC_STRNLEN_USER | 39 | select GENERIC_STRNLEN_USER |
| 40 | select HAVE_MOD_ARCH_SPECIFIC if DWARF_UNWINDER | 40 | select HAVE_MOD_ARCH_SPECIFIC if DWARF_UNWINDER |
| 41 | select MODULES_USE_ELF_RELA | 41 | select MODULES_USE_ELF_RELA |
| 42 | select OLD_SIGSUSPEND | ||
| 43 | select OLD_SIGACTION | ||
| 42 | help | 44 | help |
| 43 | The SuperH is a RISC processor targeted for use in embedded systems | 45 | The SuperH is a RISC processor targeted for use in embedded systems |
| 44 | and consumer electronics; it was also used in the Sega Dreamcast | 46 | and consumer electronics; it was also used in the Sega Dreamcast |
diff --git a/arch/sh/include/asm/syscalls_32.h b/arch/sh/include/asm/syscalls_32.h index cc25485996bb..4f97df87d7d5 100644 --- a/arch/sh/include/asm/syscalls_32.h +++ b/arch/sh/include/asm/syscalls_32.h | |||
| @@ -9,12 +9,6 @@ | |||
| 9 | 9 | ||
| 10 | struct pt_regs; | 10 | struct pt_regs; |
| 11 | 11 | ||
| 12 | asmlinkage int sys_sigsuspend(old_sigset_t mask); | ||
| 13 | asmlinkage int sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
| 14 | struct old_sigaction __user *oact); | ||
| 15 | asmlinkage int sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
| 16 | unsigned long r6, unsigned long r7, | ||
| 17 | struct pt_regs __regs); | ||
| 18 | asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5, | 12 | asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5, |
| 19 | unsigned long r6, unsigned long r7, | 13 | unsigned long r6, unsigned long r7, |
| 20 | struct pt_regs __regs); | 14 | struct pt_regs __regs); |
diff --git a/arch/sh/include/asm/unistd.h b/arch/sh/include/asm/unistd.h index 012004ed3330..5e90fa2b7eed 100644 --- a/arch/sh/include/asm/unistd.h +++ b/arch/sh/include/asm/unistd.h | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | # include <asm/unistd_64.h> | 4 | # include <asm/unistd_64.h> |
| 5 | # endif | 5 | # endif |
| 6 | 6 | ||
| 7 | # define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 8 | # define __ARCH_WANT_OLD_READDIR | 7 | # define __ARCH_WANT_OLD_READDIR |
| 9 | # define __ARCH_WANT_OLD_STAT | 8 | # define __ARCH_WANT_OLD_STAT |
| 10 | # define __ARCH_WANT_STAT64 | 9 | # define __ARCH_WANT_STAT64 |
| @@ -27,7 +26,6 @@ | |||
| 27 | # define __ARCH_WANT_SYS_OLDUMOUNT | 26 | # define __ARCH_WANT_SYS_OLDUMOUNT |
| 28 | # define __ARCH_WANT_SYS_SIGPENDING | 27 | # define __ARCH_WANT_SYS_SIGPENDING |
| 29 | # define __ARCH_WANT_SYS_SIGPROCMASK | 28 | # define __ARCH_WANT_SYS_SIGPROCMASK |
| 30 | # define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 31 | # define __ARCH_WANT_SYS_FORK | 29 | # define __ARCH_WANT_SYS_FORK |
| 32 | # define __ARCH_WANT_SYS_VFORK | 30 | # define __ARCH_WANT_SYS_VFORK |
| 33 | # define __ARCH_WANT_SYS_CLONE | 31 | # define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/sh/include/uapi/asm/signal.h b/arch/sh/include/uapi/asm/signal.h index 9ac530a90bce..cb96d02f55a4 100644 --- a/arch/sh/include/uapi/asm/signal.h +++ b/arch/sh/include/uapi/asm/signal.h | |||
| @@ -5,11 +5,13 @@ | |||
| 5 | 5 | ||
| 6 | #include <asm-generic/signal.h> | 6 | #include <asm-generic/signal.h> |
| 7 | 7 | ||
| 8 | #ifndef __KERNEL__ | ||
| 8 | struct old_sigaction { | 9 | struct old_sigaction { |
| 9 | __sighandler_t sa_handler; | 10 | __sighandler_t sa_handler; |
| 10 | old_sigset_t sa_mask; | 11 | old_sigset_t sa_mask; |
| 11 | unsigned long sa_flags; | 12 | unsigned long sa_flags; |
| 12 | void (*sa_restorer)(void); | 13 | void (*sa_restorer)(void); |
| 13 | }; | 14 | }; |
| 15 | #endif | ||
| 14 | 16 | ||
| 15 | #endif /* __ASM_SH_SIGNAL_H */ | 17 | #endif /* __ASM_SH_SIGNAL_H */ |
diff --git a/arch/sh/kernel/signal_32.c b/arch/sh/kernel/signal_32.c index 2f1f65356c0c..6af6e7c5cac8 100644 --- a/arch/sh/kernel/signal_32.c +++ b/arch/sh/kernel/signal_32.c | |||
| @@ -47,60 +47,6 @@ struct fdpic_func_descriptor { | |||
| 47 | #define UNWINDGUARD 64 | 47 | #define UNWINDGUARD 64 |
| 48 | 48 | ||
| 49 | /* | 49 | /* |
| 50 | * Atomically swap in the new signal mask, and wait for a signal. | ||
| 51 | */ | ||
| 52 | asmlinkage int | ||
| 53 | sys_sigsuspend(old_sigset_t mask) | ||
| 54 | { | ||
| 55 | sigset_t blocked; | ||
| 56 | siginitset(&blocked, mask); | ||
| 57 | return sigsuspend(&blocked); | ||
| 58 | } | ||
| 59 | |||
| 60 | asmlinkage int | ||
| 61 | sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
| 62 | struct old_sigaction __user *oact) | ||
| 63 | { | ||
| 64 | struct k_sigaction new_ka, old_ka; | ||
| 65 | int ret; | ||
| 66 | |||
| 67 | if (act) { | ||
| 68 | old_sigset_t mask; | ||
| 69 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 70 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 71 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 72 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 73 | __get_user(mask, &act->sa_mask)) | ||
| 74 | return -EFAULT; | ||
| 75 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 76 | } | ||
| 77 | |||
| 78 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 79 | |||
| 80 | if (!ret && oact) { | ||
| 81 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 82 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 83 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 84 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 85 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 86 | return -EFAULT; | ||
| 87 | } | ||
| 88 | |||
| 89 | return ret; | ||
| 90 | } | ||
| 91 | |||
| 92 | asmlinkage int | ||
| 93 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
| 94 | unsigned long r6, unsigned long r7, | ||
| 95 | struct pt_regs __regs) | ||
| 96 | { | ||
| 97 | struct pt_regs *regs = RELOC_HIDE(&__regs, 0); | ||
| 98 | |||
| 99 | return do_sigaltstack(uss, uoss, regs->regs[15]); | ||
| 100 | } | ||
| 101 | |||
| 102 | |||
| 103 | /* | ||
| 104 | * Do a signal return; undo the signal stack. | 50 | * Do a signal return; undo the signal stack. |
| 105 | */ | 51 | */ |
| 106 | 52 | ||
| @@ -257,8 +203,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5, | |||
| 257 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) | 203 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &r0)) |
| 258 | goto badframe; | 204 | goto badframe; |
| 259 | 205 | ||
| 260 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, | 206 | if (restore_altstack(&frame->uc.uc_stack)) |
| 261 | regs->regs[15]) == -EFAULT) | ||
| 262 | goto badframe; | 207 | goto badframe; |
| 263 | 208 | ||
| 264 | return r0; | 209 | return r0; |
| @@ -423,11 +368,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 423 | /* Create the ucontext. */ | 368 | /* Create the ucontext. */ |
| 424 | err |= __put_user(0, &frame->uc.uc_flags); | 369 | err |= __put_user(0, &frame->uc.uc_flags); |
| 425 | err |= __put_user(NULL, &frame->uc.uc_link); | 370 | err |= __put_user(NULL, &frame->uc.uc_link); |
| 426 | err |= __put_user((void *)current->sas_ss_sp, | 371 | err |= __save_altstack(&frame->uc.uc_stack, regs->regs[15]); |
| 427 | &frame->uc.uc_stack.ss_sp); | ||
| 428 | err |= __put_user(sas_ss_flags(regs->regs[15]), | ||
| 429 | &frame->uc.uc_stack.ss_flags); | ||
| 430 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 431 | err |= setup_sigcontext(&frame->uc.uc_mcontext, | 372 | err |= setup_sigcontext(&frame->uc.uc_mcontext, |
| 432 | regs, set->sig[0]); | 373 | regs, set->sig[0]); |
| 433 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 374 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c index d867cd95a622..23d4c71c91af 100644 --- a/arch/sh/kernel/signal_64.c +++ b/arch/sh/kernel/signal_64.c | |||
| @@ -128,58 +128,6 @@ static void do_signal(struct pt_regs *regs) | |||
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | /* | 130 | /* |
| 131 | * Atomically swap in the new signal mask, and wait for a signal. | ||
| 132 | */ | ||
| 133 | asmlinkage int | ||
| 134 | sys_sigsuspend(old_sigset_t mask) | ||
| 135 | { | ||
| 136 | sigset_t blocked; | ||
| 137 | siginitset(&blocked, mask); | ||
| 138 | return sigsuspend(&blocked); | ||
| 139 | } | ||
| 140 | |||
| 141 | asmlinkage int | ||
| 142 | sys_sigaction(int sig, const struct old_sigaction __user *act, | ||
| 143 | struct old_sigaction __user *oact) | ||
| 144 | { | ||
| 145 | struct k_sigaction new_ka, old_ka; | ||
| 146 | int ret; | ||
| 147 | |||
| 148 | if (act) { | ||
| 149 | old_sigset_t mask; | ||
| 150 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 151 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 152 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 153 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 154 | __get_user(mask, &act->sa_mask)) | ||
| 155 | return -EFAULT; | ||
| 156 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 157 | } | ||
| 158 | |||
| 159 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 160 | |||
| 161 | if (!ret && oact) { | ||
| 162 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 163 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 164 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 165 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 166 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 167 | return -EFAULT; | ||
| 168 | } | ||
| 169 | |||
| 170 | return ret; | ||
| 171 | } | ||
| 172 | |||
| 173 | asmlinkage int | ||
| 174 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
| 175 | unsigned long r4, unsigned long r5, unsigned long r6, | ||
| 176 | unsigned long r7, | ||
| 177 | struct pt_regs * regs) | ||
| 178 | { | ||
| 179 | return do_sigaltstack(uss, uoss, REF_REG_SP); | ||
| 180 | } | ||
| 181 | |||
| 182 | /* | ||
| 183 | * Do a signal return; undo the signal stack. | 131 | * Do a signal return; undo the signal stack. |
| 184 | */ | 132 | */ |
| 185 | struct sigframe { | 133 | struct sigframe { |
| @@ -364,9 +312,7 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3, | |||
| 364 | goto badframe; | 312 | goto badframe; |
| 365 | regs->pc -= 4; | 313 | regs->pc -= 4; |
| 366 | 314 | ||
| 367 | /* It is more difficult to avoid calling this function than to | 315 | if (restore_altstack(&frame->uc.uc_stack)) |
| 368 | call it and ignore errors. */ | ||
| 369 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, REF_REG_SP) == -EFAULT) | ||
| 370 | goto badframe; | 316 | goto badframe; |
| 371 | 317 | ||
| 372 | return (int) ret; | 318 | return (int) ret; |
| @@ -560,11 +506,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 560 | /* Create the ucontext. */ | 506 | /* Create the ucontext. */ |
| 561 | err |= __put_user(0, &frame->uc.uc_flags); | 507 | err |= __put_user(0, &frame->uc.uc_flags); |
| 562 | err |= __put_user(0, &frame->uc.uc_link); | 508 | err |= __put_user(0, &frame->uc.uc_link); |
| 563 | err |= __put_user((void *)current->sas_ss_sp, | 509 | err |= __save_altstack(&frame->uc.uc_stack, regs->regs[REG_SP]); |
| 564 | &frame->uc.uc_stack.ss_sp); | ||
| 565 | err |= __put_user(sas_ss_flags(regs->regs[REG_SP]), | ||
| 566 | &frame->uc.uc_stack.ss_flags); | ||
| 567 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 568 | err |= setup_sigcontext(&frame->uc.uc_mcontext, | 510 | err |= setup_sigcontext(&frame->uc.uc_mcontext, |
| 569 | regs, set->sig[0]); | 511 | regs, set->sig[0]); |
| 570 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 512 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index 9bff3db17c8c..58fb1e3f631d 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
| @@ -40,12 +40,15 @@ config SPARC | |||
| 40 | select GENERIC_STRNCPY_FROM_USER | 40 | select GENERIC_STRNCPY_FROM_USER |
| 41 | select GENERIC_STRNLEN_USER | 41 | select GENERIC_STRNLEN_USER |
| 42 | select MODULES_USE_ELF_RELA | 42 | select MODULES_USE_ELF_RELA |
| 43 | select ODD_RT_SIGACTION | ||
| 44 | select OLD_SIGSUSPEND | ||
| 43 | 45 | ||
| 44 | config SPARC32 | 46 | config SPARC32 |
| 45 | def_bool !64BIT | 47 | def_bool !64BIT |
| 46 | select GENERIC_ATOMIC64 | 48 | select GENERIC_ATOMIC64 |
| 47 | select CLZ_TAB | 49 | select CLZ_TAB |
| 48 | select HAVE_UID16 | 50 | select HAVE_UID16 |
| 51 | select OLD_SIGACTION | ||
| 49 | 52 | ||
| 50 | config SPARC64 | 53 | config SPARC64 |
| 51 | def_bool 64BIT | 54 | def_bool 64BIT |
| @@ -543,6 +546,7 @@ config COMPAT | |||
| 543 | select COMPAT_BINFMT_ELF | 546 | select COMPAT_BINFMT_ELF |
| 544 | select HAVE_UID16 | 547 | select HAVE_UID16 |
| 545 | select ARCH_WANT_OLD_COMPAT_IPC | 548 | select ARCH_WANT_OLD_COMPAT_IPC |
| 549 | select COMPAT_OLD_SIGACTION | ||
| 546 | 550 | ||
| 547 | config SYSVIPC_COMPAT | 551 | config SYSVIPC_COMPAT |
| 548 | bool | 552 | bool |
diff --git a/arch/sparc/include/asm/compat_signal.h b/arch/sparc/include/asm/compat_signal.h index b759eab9b51c..9ed1f128b4d1 100644 --- a/arch/sparc/include/asm/compat_signal.h +++ b/arch/sparc/include/asm/compat_signal.h | |||
| @@ -18,12 +18,6 @@ struct __old_sigaction32 { | |||
| 18 | unsigned int sa_flags; | 18 | unsigned int sa_flags; |
| 19 | unsigned sa_restorer; /* not used by Linux/SPARC yet */ | 19 | unsigned sa_restorer; /* not used by Linux/SPARC yet */ |
| 20 | }; | 20 | }; |
| 21 | |||
| 22 | typedef struct sigaltstack32 { | ||
| 23 | u32 ss_sp; | ||
| 24 | int ss_flags; | ||
| 25 | compat_size_t ss_size; | ||
| 26 | } stack_t32; | ||
| 27 | #endif | 21 | #endif |
| 28 | 22 | ||
| 29 | #endif /* !(_COMPAT_SIGNAL_H) */ | 23 | #endif /* !(_COMPAT_SIGNAL_H) */ |
diff --git a/arch/sparc/include/asm/signal.h b/arch/sparc/include/asm/signal.h index 77b85850d543..c33ce3f2ba84 100644 --- a/arch/sparc/include/asm/signal.h +++ b/arch/sparc/include/asm/signal.h | |||
| @@ -21,10 +21,8 @@ | |||
| 21 | */ | 21 | */ |
| 22 | #define SA_STATIC_ALLOC 0x8000 | 22 | #define SA_STATIC_ALLOC 0x8000 |
| 23 | 23 | ||
| 24 | struct k_sigaction { | 24 | #define __ARCH_HAS_KA_RESTORER |
| 25 | struct __new_sigaction sa; | 25 | #define __ARCH_HAS_SA_RESTORER |
| 26 | void __user *ka_restorer; | ||
| 27 | }; | ||
| 28 | 26 | ||
| 29 | #endif /* !(__ASSEMBLY__) */ | 27 | #endif /* !(__ASSEMBLY__) */ |
| 30 | #endif /* !(__SPARC_SIGNAL_H) */ | 28 | #endif /* !(__SPARC_SIGNAL_H) */ |
diff --git a/arch/sparc/include/asm/unistd.h b/arch/sparc/include/asm/unistd.h index 87ce24c5eb95..5356810bd7e7 100644 --- a/arch/sparc/include/asm/unistd.h +++ b/arch/sparc/include/asm/unistd.h | |||
| @@ -38,14 +38,11 @@ | |||
| 38 | #define __ARCH_WANT_SYS_OLDUMOUNT | 38 | #define __ARCH_WANT_SYS_OLDUMOUNT |
| 39 | #define __ARCH_WANT_SYS_SIGPENDING | 39 | #define __ARCH_WANT_SYS_SIGPENDING |
| 40 | #define __ARCH_WANT_SYS_SIGPROCMASK | 40 | #define __ARCH_WANT_SYS_SIGPROCMASK |
| 41 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 42 | #ifdef __32bit_syscall_numbers__ | 41 | #ifdef __32bit_syscall_numbers__ |
| 43 | #define __ARCH_WANT_SYS_IPC | 42 | #define __ARCH_WANT_SYS_IPC |
| 44 | #else | 43 | #else |
| 45 | #define __ARCH_WANT_COMPAT_SYS_TIME | 44 | #define __ARCH_WANT_COMPAT_SYS_TIME |
| 46 | #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | ||
| 47 | #define __ARCH_WANT_COMPAT_SYS_SENDFILE | 45 | #define __ARCH_WANT_COMPAT_SYS_SENDFILE |
| 48 | #define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL | ||
| 49 | #endif | 46 | #endif |
| 50 | 47 | ||
| 51 | /* | 48 | /* |
diff --git a/arch/sparc/include/uapi/asm/signal.h b/arch/sparc/include/uapi/asm/signal.h index c4ffd6c97106..f387400fcfdf 100644 --- a/arch/sparc/include/uapi/asm/signal.h +++ b/arch/sparc/include/uapi/asm/signal.h | |||
| @@ -153,6 +153,7 @@ struct sigstack { | |||
| 153 | 153 | ||
| 154 | #include <asm-generic/signal-defs.h> | 154 | #include <asm-generic/signal-defs.h> |
| 155 | 155 | ||
| 156 | #ifndef __KERNEL__ | ||
| 156 | struct __new_sigaction { | 157 | struct __new_sigaction { |
| 157 | __sighandler_t sa_handler; | 158 | __sighandler_t sa_handler; |
| 158 | unsigned long sa_flags; | 159 | unsigned long sa_flags; |
| @@ -166,6 +167,7 @@ struct __old_sigaction { | |||
| 166 | unsigned long sa_flags; | 167 | unsigned long sa_flags; |
| 167 | void (*sa_restorer)(void); /* not used by Linux/SPARC yet */ | 168 | void (*sa_restorer)(void); /* not used by Linux/SPARC yet */ |
| 168 | }; | 169 | }; |
| 170 | #endif | ||
| 169 | 171 | ||
| 170 | typedef struct sigaltstack { | 172 | typedef struct sigaltstack { |
| 171 | void __user *ss_sp; | 173 | void __user *ss_sp; |
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 21fd1a8f47d2..e2a030045089 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S | |||
| @@ -820,14 +820,6 @@ sys_sparc_pipe: | |||
| 820 | mov %l5, %o7 | 820 | mov %l5, %o7 |
| 821 | 821 | ||
| 822 | .align 4 | 822 | .align 4 |
| 823 | .globl sys_sigaltstack | ||
| 824 | sys_sigaltstack: | ||
| 825 | mov %o7, %l5 | ||
| 826 | mov %fp, %o2 | ||
| 827 | call do_sigaltstack | ||
| 828 | mov %l5, %o7 | ||
| 829 | |||
| 830 | .align 4 | ||
| 831 | .globl sys_sigstack | 823 | .globl sys_sigstack |
| 832 | sys_sigstack: | 824 | sys_sigstack: |
| 833 | mov %o7, %l5 | 825 | mov %o7, %l5 |
diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index 53e48f721ce3..cd5dc4d411d1 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c | |||
| @@ -61,7 +61,7 @@ struct rt_signal_frame32 { | |||
| 61 | compat_sigset_t mask; | 61 | compat_sigset_t mask; |
| 62 | /* __siginfo_fpu_t * */ u32 fpu_save; | 62 | /* __siginfo_fpu_t * */ u32 fpu_save; |
| 63 | unsigned int insns[2]; | 63 | unsigned int insns[2]; |
| 64 | stack_t32 stack; | 64 | compat_stack_t stack; |
| 65 | unsigned int extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */ | 65 | unsigned int extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */ |
| 66 | /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */ | 66 | /* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */ |
| 67 | siginfo_extra_v8plus_t v8plus; | 67 | siginfo_extra_v8plus_t v8plus; |
| @@ -230,13 +230,11 @@ segv: | |||
| 230 | asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) | 230 | asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) |
| 231 | { | 231 | { |
| 232 | struct rt_signal_frame32 __user *sf; | 232 | struct rt_signal_frame32 __user *sf; |
| 233 | unsigned int psr, pc, npc, u_ss_sp; | 233 | unsigned int psr, pc, npc; |
| 234 | compat_uptr_t fpu_save; | 234 | compat_uptr_t fpu_save; |
| 235 | compat_uptr_t rwin_save; | 235 | compat_uptr_t rwin_save; |
| 236 | mm_segment_t old_fs; | ||
| 237 | sigset_t set; | 236 | sigset_t set; |
| 238 | compat_sigset_t seta; | 237 | compat_sigset_t seta; |
| 239 | stack_t st; | ||
| 240 | int err, i; | 238 | int err, i; |
| 241 | 239 | ||
| 242 | /* Always make any pending restarted system calls return -EINTR */ | 240 | /* Always make any pending restarted system calls return -EINTR */ |
| @@ -295,20 +293,10 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) | |||
| 295 | if (!err && fpu_save) | 293 | if (!err && fpu_save) |
| 296 | err |= restore_fpu_state(regs, compat_ptr(fpu_save)); | 294 | err |= restore_fpu_state(regs, compat_ptr(fpu_save)); |
| 297 | err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t)); | 295 | err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t)); |
| 298 | err |= __get_user(u_ss_sp, &sf->stack.ss_sp); | 296 | err |= compat_restore_altstack(&sf->stack); |
| 299 | st.ss_sp = compat_ptr(u_ss_sp); | ||
| 300 | err |= __get_user(st.ss_flags, &sf->stack.ss_flags); | ||
| 301 | err |= __get_user(st.ss_size, &sf->stack.ss_size); | ||
| 302 | if (err) | 297 | if (err) |
| 303 | goto segv; | 298 | goto segv; |
| 304 | 299 | ||
| 305 | /* It is more difficult to avoid calling this function than to | ||
| 306 | call it and ignore errors. */ | ||
| 307 | old_fs = get_fs(); | ||
| 308 | set_fs(KERNEL_DS); | ||
| 309 | do_sigaltstack((stack_t __user *) &st, NULL, (unsigned long)sf); | ||
| 310 | set_fs(old_fs); | ||
| 311 | |||
| 312 | err |= __get_user(rwin_save, &sf->rwin_save); | 300 | err |= __get_user(rwin_save, &sf->rwin_save); |
| 313 | if (!err && rwin_save) { | 301 | if (!err && rwin_save) { |
| 314 | if (restore_rwin_state(compat_ptr(rwin_save))) | 302 | if (restore_rwin_state(compat_ptr(rwin_save))) |
| @@ -335,7 +323,7 @@ static int invalid_frame_pointer(void __user *fp, int fplen) | |||
| 335 | return 0; | 323 | return 0; |
| 336 | } | 324 | } |
| 337 | 325 | ||
| 338 | static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) | 326 | static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) |
| 339 | { | 327 | { |
| 340 | unsigned long sp; | 328 | unsigned long sp; |
| 341 | 329 | ||
| @@ -350,12 +338,7 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns | |||
| 350 | return (void __user *) -1L; | 338 | return (void __user *) -1L; |
| 351 | 339 | ||
| 352 | /* This is the X/Open sanctioned signal stack switching. */ | 340 | /* This is the X/Open sanctioned signal stack switching. */ |
| 353 | if (sa->sa_flags & SA_ONSTACK) { | 341 | sp = sigsp(sp, ksig) - framesize; |
| 354 | if (sas_ss_flags(sp) == 0) | ||
| 355 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
| 356 | } | ||
| 357 | |||
| 358 | sp -= framesize; | ||
| 359 | 342 | ||
| 360 | /* Always align the stack frame. This handles two cases. First, | 343 | /* Always align the stack frame. This handles two cases. First, |
| 361 | * sigaltstack need not be mindful of platform specific stack | 344 | * sigaltstack need not be mindful of platform specific stack |
| @@ -426,8 +409,8 @@ out_irqs_on: | |||
| 426 | 409 | ||
| 427 | } | 410 | } |
| 428 | 411 | ||
| 429 | static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | 412 | static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs, |
| 430 | int signo, sigset_t *oldset) | 413 | sigset_t *oldset) |
| 431 | { | 414 | { |
| 432 | struct signal_frame32 __user *sf; | 415 | struct signal_frame32 __user *sf; |
| 433 | int i, err, wsaved; | 416 | int i, err, wsaved; |
| @@ -449,10 +432,12 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 449 | sigframe_size += sizeof(__siginfo_rwin_t); | 432 | sigframe_size += sizeof(__siginfo_rwin_t); |
| 450 | 433 | ||
| 451 | sf = (struct signal_frame32 __user *) | 434 | sf = (struct signal_frame32 __user *) |
| 452 | get_sigframe(&ka->sa, regs, sigframe_size); | 435 | get_sigframe(ksig, regs, sigframe_size); |
| 453 | 436 | ||
| 454 | if (invalid_frame_pointer(sf, sigframe_size)) | 437 | if (invalid_frame_pointer(sf, sigframe_size)) { |
| 455 | goto sigill; | 438 | do_exit(SIGILL); |
| 439 | return -EINVAL; | ||
| 440 | } | ||
| 456 | 441 | ||
| 457 | tail = (sf + 1); | 442 | tail = (sf + 1); |
| 458 | 443 | ||
| @@ -526,16 +511,16 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 526 | err |= __put_user(rp->ins[7], &sf->ss.callers_pc); | 511 | err |= __put_user(rp->ins[7], &sf->ss.callers_pc); |
| 527 | } | 512 | } |
| 528 | if (err) | 513 | if (err) |
| 529 | goto sigsegv; | 514 | return err; |
| 530 | 515 | ||
| 531 | /* 3. signal handler back-trampoline and parameters */ | 516 | /* 3. signal handler back-trampoline and parameters */ |
| 532 | regs->u_regs[UREG_FP] = (unsigned long) sf; | 517 | regs->u_regs[UREG_FP] = (unsigned long) sf; |
| 533 | regs->u_regs[UREG_I0] = signo; | 518 | regs->u_regs[UREG_I0] = ksig->sig; |
| 534 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 519 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
| 535 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; | 520 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; |
| 536 | 521 | ||
| 537 | /* 4. signal handler */ | 522 | /* 4. signal handler */ |
| 538 | regs->tpc = (unsigned long) ka->sa.sa_handler; | 523 | regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; |
| 539 | regs->tnpc = (regs->tpc + 4); | 524 | regs->tnpc = (regs->tpc + 4); |
| 540 | if (test_thread_flag(TIF_32BIT)) { | 525 | if (test_thread_flag(TIF_32BIT)) { |
| 541 | regs->tpc &= 0xffffffff; | 526 | regs->tpc &= 0xffffffff; |
| @@ -543,8 +528,8 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 543 | } | 528 | } |
| 544 | 529 | ||
| 545 | /* 5. return to kernel instructions */ | 530 | /* 5. return to kernel instructions */ |
| 546 | if (ka->ka_restorer) { | 531 | if (ksig->ka.ka_restorer) { |
| 547 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 532 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
| 548 | } else { | 533 | } else { |
| 549 | unsigned long address = ((unsigned long)&(sf->insns[0])); | 534 | unsigned long address = ((unsigned long)&(sf->insns[0])); |
| 550 | 535 | ||
| @@ -553,23 +538,14 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 553 | err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/ | 538 | err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/ |
| 554 | err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/ | 539 | err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/ |
| 555 | if (err) | 540 | if (err) |
| 556 | goto sigsegv; | 541 | return err; |
| 557 | flush_signal_insns(address); | 542 | flush_signal_insns(address); |
| 558 | } | 543 | } |
| 559 | return 0; | 544 | return 0; |
| 560 | |||
| 561 | sigill: | ||
| 562 | do_exit(SIGILL); | ||
| 563 | return -EINVAL; | ||
| 564 | |||
| 565 | sigsegv: | ||
| 566 | force_sigsegv(signo, current); | ||
| 567 | return -EFAULT; | ||
| 568 | } | 545 | } |
| 569 | 546 | ||
| 570 | static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | 547 | static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs, |
| 571 | unsigned long signr, sigset_t *oldset, | 548 | sigset_t *oldset) |
| 572 | siginfo_t *info) | ||
| 573 | { | 549 | { |
| 574 | struct rt_signal_frame32 __user *sf; | 550 | struct rt_signal_frame32 __user *sf; |
| 575 | int i, err, wsaved; | 551 | int i, err, wsaved; |
| @@ -591,10 +567,12 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 591 | sigframe_size += sizeof(__siginfo_rwin_t); | 567 | sigframe_size += sizeof(__siginfo_rwin_t); |
| 592 | 568 | ||
| 593 | sf = (struct rt_signal_frame32 __user *) | 569 | sf = (struct rt_signal_frame32 __user *) |
| 594 | get_sigframe(&ka->sa, regs, sigframe_size); | 570 | get_sigframe(ksig, regs, sigframe_size); |
| 595 | 571 | ||
| 596 | if (invalid_frame_pointer(sf, sigframe_size)) | 572 | if (invalid_frame_pointer(sf, sigframe_size)) { |
| 597 | goto sigill; | 573 | do_exit(SIGILL); |
| 574 | return -EINVAL; | ||
| 575 | } | ||
| 598 | 576 | ||
| 599 | tail = (sf + 1); | 577 | tail = (sf + 1); |
| 600 | 578 | ||
| @@ -639,12 +617,10 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 639 | } | 617 | } |
| 640 | 618 | ||
| 641 | /* Update the siginfo structure. */ | 619 | /* Update the siginfo structure. */ |
| 642 | err |= copy_siginfo_to_user32(&sf->info, info); | 620 | err |= copy_siginfo_to_user32(&sf->info, &ksig->info); |
| 643 | 621 | ||
| 644 | /* Setup sigaltstack */ | 622 | /* Setup sigaltstack */ |
| 645 | err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); | 623 | err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); |
| 646 | err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags); | ||
| 647 | err |= __put_user(current->sas_ss_size, &sf->stack.ss_size); | ||
| 648 | 624 | ||
| 649 | switch (_NSIG_WORDS) { | 625 | switch (_NSIG_WORDS) { |
| 650 | case 4: seta.sig[7] = (oldset->sig[3] >> 32); | 626 | case 4: seta.sig[7] = (oldset->sig[3] >> 32); |
| @@ -674,16 +650,16 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 674 | err |= __put_user(rp->ins[7], &sf->ss.callers_pc); | 650 | err |= __put_user(rp->ins[7], &sf->ss.callers_pc); |
| 675 | } | 651 | } |
| 676 | if (err) | 652 | if (err) |
| 677 | goto sigsegv; | 653 | return err; |
| 678 | 654 | ||
| 679 | /* 3. signal handler back-trampoline and parameters */ | 655 | /* 3. signal handler back-trampoline and parameters */ |
| 680 | regs->u_regs[UREG_FP] = (unsigned long) sf; | 656 | regs->u_regs[UREG_FP] = (unsigned long) sf; |
| 681 | regs->u_regs[UREG_I0] = signr; | 657 | regs->u_regs[UREG_I0] = ksig->sig; |
| 682 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 658 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
| 683 | regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; | 659 | regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; |
| 684 | 660 | ||
| 685 | /* 4. signal handler */ | 661 | /* 4. signal handler */ |
| 686 | regs->tpc = (unsigned long) ka->sa.sa_handler; | 662 | regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; |
| 687 | regs->tnpc = (regs->tpc + 4); | 663 | regs->tnpc = (regs->tpc + 4); |
| 688 | if (test_thread_flag(TIF_32BIT)) { | 664 | if (test_thread_flag(TIF_32BIT)) { |
| 689 | regs->tpc &= 0xffffffff; | 665 | regs->tpc &= 0xffffffff; |
| @@ -691,8 +667,8 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 691 | } | 667 | } |
| 692 | 668 | ||
| 693 | /* 5. return to kernel instructions */ | 669 | /* 5. return to kernel instructions */ |
| 694 | if (ka->ka_restorer) | 670 | if (ksig->ka.ka_restorer) |
| 695 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 671 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
| 696 | else { | 672 | else { |
| 697 | unsigned long address = ((unsigned long)&(sf->insns[0])); | 673 | unsigned long address = ((unsigned long)&(sf->insns[0])); |
| 698 | 674 | ||
| @@ -704,36 +680,25 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 704 | /* t 0x10 */ | 680 | /* t 0x10 */ |
| 705 | err |= __put_user(0x91d02010, &sf->insns[1]); | 681 | err |= __put_user(0x91d02010, &sf->insns[1]); |
| 706 | if (err) | 682 | if (err) |
| 707 | goto sigsegv; | 683 | return err; |
| 708 | 684 | ||
| 709 | flush_signal_insns(address); | 685 | flush_signal_insns(address); |
| 710 | } | 686 | } |
| 711 | return 0; | 687 | return 0; |
| 712 | |||
| 713 | sigill: | ||
| 714 | do_exit(SIGILL); | ||
| 715 | return -EINVAL; | ||
| 716 | |||
| 717 | sigsegv: | ||
| 718 | force_sigsegv(signr, current); | ||
| 719 | return -EFAULT; | ||
| 720 | } | 688 | } |
| 721 | 689 | ||
| 722 | static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka, | 690 | static inline void handle_signal32(struct ksignal *ksig, |
| 723 | siginfo_t *info, | 691 | struct pt_regs *regs) |
| 724 | sigset_t *oldset, struct pt_regs *regs) | ||
| 725 | { | 692 | { |
| 693 | sigset_t *oldset = sigmask_to_save(); | ||
| 726 | int err; | 694 | int err; |
| 727 | 695 | ||
| 728 | if (ka->sa.sa_flags & SA_SIGINFO) | 696 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
| 729 | err = setup_rt_frame32(ka, regs, signr, oldset, info); | 697 | err = setup_rt_frame32(ksig, regs, oldset); |
| 730 | else | 698 | else |
| 731 | err = setup_frame32(ka, regs, signr, oldset); | 699 | err = setup_frame32(ksig, regs, oldset); |
| 732 | |||
| 733 | if (err) | ||
| 734 | return; | ||
| 735 | 700 | ||
| 736 | signal_delivered(signr, info, ka, regs, 0); | 701 | signal_setup_done(err, ksig, 0); |
| 737 | } | 702 | } |
| 738 | 703 | ||
| 739 | static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, | 704 | static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, |
| @@ -763,50 +728,41 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs | |||
| 763 | */ | 728 | */ |
| 764 | void do_signal32(sigset_t *oldset, struct pt_regs * regs) | 729 | void do_signal32(sigset_t *oldset, struct pt_regs * regs) |
| 765 | { | 730 | { |
| 766 | struct k_sigaction ka; | 731 | struct ksignal ksig; |
| 767 | unsigned long orig_i0; | 732 | unsigned long orig_i0 = 0; |
| 768 | int restart_syscall; | 733 | int restart_syscall = 0; |
| 769 | siginfo_t info; | 734 | bool has_handler = get_signal(&ksig); |
| 770 | int signr; | ||
| 771 | |||
| 772 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | ||
| 773 | 735 | ||
| 774 | restart_syscall = 0; | ||
| 775 | orig_i0 = 0; | ||
| 776 | if (pt_regs_is_syscall(regs) && | 736 | if (pt_regs_is_syscall(regs) && |
| 777 | (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { | 737 | (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { |
| 778 | restart_syscall = 1; | 738 | restart_syscall = 1; |
| 779 | orig_i0 = regs->u_regs[UREG_G6]; | 739 | orig_i0 = regs->u_regs[UREG_G6]; |
| 780 | } | 740 | } |
| 781 | 741 | ||
| 782 | if (signr > 0) { | 742 | if (has_handler) { |
| 783 | if (restart_syscall) | 743 | if (restart_syscall) |
| 784 | syscall_restart32(orig_i0, regs, &ka.sa); | 744 | syscall_restart32(orig_i0, regs, &ksig.ka.sa); |
| 785 | handle_signal32(signr, &ka, &info, oldset, regs); | 745 | handle_signal32(&ksig, regs); |
| 786 | return; | 746 | } else { |
| 787 | } | 747 | if (restart_syscall) { |
| 788 | if (restart_syscall && | 748 | switch (regs->u_regs[UREG_I0]) { |
| 789 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | 749 | case ERESTARTNOHAND: |
| 790 | regs->u_regs[UREG_I0] == ERESTARTSYS || | 750 | case ERESTARTSYS: |
| 791 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | 751 | case ERESTARTNOINTR: |
| 792 | /* replay the system call when we are done */ | 752 | /* replay the system call when we are done */ |
| 793 | regs->u_regs[UREG_I0] = orig_i0; | 753 | regs->u_regs[UREG_I0] = orig_i0; |
| 794 | regs->tpc -= 4; | 754 | regs->tpc -= 4; |
| 795 | regs->tnpc -= 4; | 755 | regs->tnpc -= 4; |
| 796 | pt_regs_clear_syscall(regs); | 756 | pt_regs_clear_syscall(regs); |
| 797 | } | 757 | case ERESTART_RESTARTBLOCK: |
| 798 | if (restart_syscall && | 758 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| 799 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 759 | regs->tpc -= 4; |
| 800 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 760 | regs->tnpc -= 4; |
| 801 | regs->tpc -= 4; | 761 | pt_regs_clear_syscall(regs); |
| 802 | regs->tnpc -= 4; | 762 | } |
| 803 | pt_regs_clear_syscall(regs); | 763 | } |
| 764 | restore_saved_sigmask(); | ||
| 804 | } | 765 | } |
| 805 | |||
| 806 | /* If there's no signal to deliver, we just put the saved sigmask | ||
| 807 | * back | ||
| 808 | */ | ||
| 809 | restore_saved_sigmask(); | ||
| 810 | } | 766 | } |
| 811 | 767 | ||
| 812 | struct sigstack32 { | 768 | struct sigstack32 { |
| @@ -856,29 +812,3 @@ asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp) | |||
| 856 | out: | 812 | out: |
| 857 | return ret; | 813 | return ret; |
| 858 | } | 814 | } |
| 859 | |||
| 860 | asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp) | ||
| 861 | { | ||
| 862 | stack_t uss, uoss; | ||
| 863 | u32 u_ss_sp = 0; | ||
| 864 | int ret; | ||
| 865 | mm_segment_t old_fs; | ||
| 866 | stack_t32 __user *uss32 = compat_ptr(ussa); | ||
| 867 | stack_t32 __user *uoss32 = compat_ptr(uossa); | ||
| 868 | |||
| 869 | if (ussa && (get_user(u_ss_sp, &uss32->ss_sp) || | ||
| 870 | __get_user(uss.ss_flags, &uss32->ss_flags) || | ||
| 871 | __get_user(uss.ss_size, &uss32->ss_size))) | ||
| 872 | return -EFAULT; | ||
| 873 | uss.ss_sp = compat_ptr(u_ss_sp); | ||
| 874 | old_fs = get_fs(); | ||
| 875 | set_fs(KERNEL_DS); | ||
| 876 | ret = do_sigaltstack(ussa ? (stack_t __user *) &uss : NULL, | ||
| 877 | uossa ? (stack_t __user *) &uoss : NULL, sp); | ||
| 878 | set_fs(old_fs); | ||
| 879 | if (!ret && uossa && (put_user(ptr_to_compat(uoss.ss_sp), &uoss32->ss_sp) || | ||
| 880 | __put_user(uoss.ss_flags, &uoss32->ss_flags) || | ||
| 881 | __put_user(uoss.ss_size, &uoss32->ss_size))) | ||
| 882 | return -EFAULT; | ||
| 883 | return ret; | ||
| 884 | } | ||
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index 68f9c8650af4..7d5d8e1f8415 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c | |||
| @@ -59,18 +59,6 @@ struct rt_signal_frame { | |||
| 59 | #define SF_ALIGNEDSZ (((sizeof(struct signal_frame) + 7) & (~7))) | 59 | #define SF_ALIGNEDSZ (((sizeof(struct signal_frame) + 7) & (~7))) |
| 60 | #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7))) | 60 | #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7))) |
| 61 | 61 | ||
| 62 | static int _sigpause_common(old_sigset_t set) | ||
| 63 | { | ||
| 64 | sigset_t blocked; | ||
| 65 | siginitset(&blocked, set); | ||
| 66 | return sigsuspend(&blocked); | ||
| 67 | } | ||
| 68 | |||
| 69 | asmlinkage int sys_sigsuspend(old_sigset_t set) | ||
| 70 | { | ||
| 71 | return _sigpause_common(set); | ||
| 72 | } | ||
| 73 | |||
| 74 | asmlinkage void do_sigreturn(struct pt_regs *regs) | 62 | asmlinkage void do_sigreturn(struct pt_regs *regs) |
| 75 | { | 63 | { |
| 76 | struct signal_frame __user *sf; | 64 | struct signal_frame __user *sf; |
| @@ -141,9 +129,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs) | |||
| 141 | unsigned int psr, pc, npc; | 129 | unsigned int psr, pc, npc; |
| 142 | __siginfo_fpu_t __user *fpu_save; | 130 | __siginfo_fpu_t __user *fpu_save; |
| 143 | __siginfo_rwin_t __user *rwin_save; | 131 | __siginfo_rwin_t __user *rwin_save; |
| 144 | mm_segment_t old_fs; | ||
| 145 | sigset_t set; | 132 | sigset_t set; |
| 146 | stack_t st; | ||
| 147 | int err; | 133 | int err; |
| 148 | 134 | ||
| 149 | synchronize_user_stack(); | 135 | synchronize_user_stack(); |
| @@ -171,8 +157,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs) | |||
| 171 | if (!err && fpu_save) | 157 | if (!err && fpu_save) |
| 172 | err |= restore_fpu_state(regs, fpu_save); | 158 | err |= restore_fpu_state(regs, fpu_save); |
| 173 | err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); | 159 | err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); |
| 174 | 160 | err |= restore_altstack(&sf->stack); | |
| 175 | err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t)); | ||
| 176 | 161 | ||
| 177 | if (err) | 162 | if (err) |
| 178 | goto segv; | 163 | goto segv; |
| @@ -180,14 +165,6 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs) | |||
| 180 | regs->pc = pc; | 165 | regs->pc = pc; |
| 181 | regs->npc = npc; | 166 | regs->npc = npc; |
| 182 | 167 | ||
| 183 | /* It is more difficult to avoid calling this function than to | ||
| 184 | * call it and ignore errors. | ||
| 185 | */ | ||
| 186 | old_fs = get_fs(); | ||
| 187 | set_fs(KERNEL_DS); | ||
| 188 | do_sigaltstack((const stack_t __user *) &st, NULL, (unsigned long)sf); | ||
| 189 | set_fs(old_fs); | ||
| 190 | |||
| 191 | err |= __get_user(rwin_save, &sf->rwin_save); | 168 | err |= __get_user(rwin_save, &sf->rwin_save); |
| 192 | if (!err && rwin_save) { | 169 | if (!err && rwin_save) { |
| 193 | if (restore_rwin_state(rwin_save)) | 170 | if (restore_rwin_state(rwin_save)) |
| @@ -209,7 +186,7 @@ static inline int invalid_frame_pointer(void __user *fp, int fplen) | |||
| 209 | return 0; | 186 | return 0; |
| 210 | } | 187 | } |
| 211 | 188 | ||
| 212 | static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) | 189 | static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) |
| 213 | { | 190 | { |
| 214 | unsigned long sp = regs->u_regs[UREG_FP]; | 191 | unsigned long sp = regs->u_regs[UREG_FP]; |
| 215 | 192 | ||
| @@ -221,12 +198,7 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re | |||
| 221 | return (void __user *) -1L; | 198 | return (void __user *) -1L; |
| 222 | 199 | ||
| 223 | /* This is the X/Open sanctioned signal stack switching. */ | 200 | /* This is the X/Open sanctioned signal stack switching. */ |
| 224 | if (sa->sa_flags & SA_ONSTACK) { | 201 | sp = sigsp(sp, ksig) - framesize; |
| 225 | if (sas_ss_flags(sp) == 0) | ||
| 226 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
| 227 | } | ||
| 228 | |||
| 229 | sp -= framesize; | ||
| 230 | 202 | ||
| 231 | /* Always align the stack frame. This handles two cases. First, | 203 | /* Always align the stack frame. This handles two cases. First, |
| 232 | * sigaltstack need not be mindful of platform specific stack | 204 | * sigaltstack need not be mindful of platform specific stack |
| @@ -239,8 +211,8 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re | |||
| 239 | return (void __user *) sp; | 211 | return (void __user *) sp; |
| 240 | } | 212 | } |
| 241 | 213 | ||
| 242 | static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | 214 | static int setup_frame(struct ksignal *ksig, struct pt_regs *regs, |
| 243 | int signo, sigset_t *oldset) | 215 | sigset_t *oldset) |
| 244 | { | 216 | { |
| 245 | struct signal_frame __user *sf; | 217 | struct signal_frame __user *sf; |
| 246 | int sigframe_size, err, wsaved; | 218 | int sigframe_size, err, wsaved; |
| @@ -258,10 +230,12 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 258 | sigframe_size += sizeof(__siginfo_rwin_t); | 230 | sigframe_size += sizeof(__siginfo_rwin_t); |
| 259 | 231 | ||
| 260 | sf = (struct signal_frame __user *) | 232 | sf = (struct signal_frame __user *) |
| 261 | get_sigframe(&ka->sa, regs, sigframe_size); | 233 | get_sigframe(ksig, regs, sigframe_size); |
| 262 | 234 | ||
| 263 | if (invalid_frame_pointer(sf, sigframe_size)) | 235 | if (invalid_frame_pointer(sf, sigframe_size)) { |
| 264 | goto sigill_and_return; | 236 | do_exit(SIGILL); |
| 237 | return -EINVAL; | ||
| 238 | } | ||
| 265 | 239 | ||
| 266 | tail = sf + 1; | 240 | tail = sf + 1; |
| 267 | 241 | ||
| @@ -300,21 +274,21 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 300 | err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); | 274 | err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); |
| 301 | } | 275 | } |
| 302 | if (err) | 276 | if (err) |
| 303 | goto sigsegv; | 277 | return err; |
| 304 | 278 | ||
| 305 | /* 3. signal handler back-trampoline and parameters */ | 279 | /* 3. signal handler back-trampoline and parameters */ |
| 306 | regs->u_regs[UREG_FP] = (unsigned long) sf; | 280 | regs->u_regs[UREG_FP] = (unsigned long) sf; |
| 307 | regs->u_regs[UREG_I0] = signo; | 281 | regs->u_regs[UREG_I0] = ksig->sig; |
| 308 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 282 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
| 309 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; | 283 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; |
| 310 | 284 | ||
| 311 | /* 4. signal handler */ | 285 | /* 4. signal handler */ |
| 312 | regs->pc = (unsigned long) ka->sa.sa_handler; | 286 | regs->pc = (unsigned long) ksig->ka.sa.sa_handler; |
| 313 | regs->npc = (regs->pc + 4); | 287 | regs->npc = (regs->pc + 4); |
| 314 | 288 | ||
| 315 | /* 5. return to kernel instructions */ | 289 | /* 5. return to kernel instructions */ |
| 316 | if (ka->ka_restorer) | 290 | if (ksig->ka.ka_restorer) |
| 317 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 291 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
| 318 | else { | 292 | else { |
| 319 | regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); | 293 | regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); |
| 320 | 294 | ||
| @@ -324,24 +298,16 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 324 | /* t 0x10 */ | 298 | /* t 0x10 */ |
| 325 | err |= __put_user(0x91d02010, &sf->insns[1]); | 299 | err |= __put_user(0x91d02010, &sf->insns[1]); |
| 326 | if (err) | 300 | if (err) |
| 327 | goto sigsegv; | 301 | return err; |
| 328 | 302 | ||
| 329 | /* Flush instruction space. */ | 303 | /* Flush instruction space. */ |
| 330 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); | 304 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); |
| 331 | } | 305 | } |
| 332 | return 0; | 306 | return 0; |
| 333 | |||
| 334 | sigill_and_return: | ||
| 335 | do_exit(SIGILL); | ||
| 336 | return -EINVAL; | ||
| 337 | |||
| 338 | sigsegv: | ||
| 339 | force_sigsegv(signo, current); | ||
| 340 | return -EFAULT; | ||
| 341 | } | 307 | } |
| 342 | 308 | ||
| 343 | static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | 309 | static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs, |
| 344 | int signo, sigset_t *oldset, siginfo_t *info) | 310 | sigset_t *oldset) |
| 345 | { | 311 | { |
| 346 | struct rt_signal_frame __user *sf; | 312 | struct rt_signal_frame __user *sf; |
| 347 | int sigframe_size, wsaved; | 313 | int sigframe_size, wsaved; |
| @@ -357,9 +323,11 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 357 | if (wsaved) | 323 | if (wsaved) |
| 358 | sigframe_size += sizeof(__siginfo_rwin_t); | 324 | sigframe_size += sizeof(__siginfo_rwin_t); |
| 359 | sf = (struct rt_signal_frame __user *) | 325 | sf = (struct rt_signal_frame __user *) |
| 360 | get_sigframe(&ka->sa, regs, sigframe_size); | 326 | get_sigframe(ksig, regs, sigframe_size); |
| 361 | if (invalid_frame_pointer(sf, sigframe_size)) | 327 | if (invalid_frame_pointer(sf, sigframe_size)) { |
| 362 | goto sigill; | 328 | do_exit(SIGILL); |
| 329 | return -EINVAL; | ||
| 330 | } | ||
| 363 | 331 | ||
| 364 | tail = sf + 1; | 332 | tail = sf + 1; |
| 365 | err = __put_user(regs->pc, &sf->regs.pc); | 333 | err = __put_user(regs->pc, &sf->regs.pc); |
| @@ -391,9 +359,7 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 391 | err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t)); | 359 | err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t)); |
| 392 | 360 | ||
| 393 | /* Setup sigaltstack */ | 361 | /* Setup sigaltstack */ |
| 394 | err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); | 362 | err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]); |
| 395 | err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags); | ||
| 396 | err |= __put_user(current->sas_ss_size, &sf->stack.ss_size); | ||
| 397 | 363 | ||
| 398 | if (!wsaved) { | 364 | if (!wsaved) { |
| 399 | err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP], | 365 | err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP], |
| @@ -405,21 +371,21 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 405 | err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); | 371 | err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); |
| 406 | } | 372 | } |
| 407 | 373 | ||
| 408 | err |= copy_siginfo_to_user(&sf->info, info); | 374 | err |= copy_siginfo_to_user(&sf->info, &ksig->info); |
| 409 | 375 | ||
| 410 | if (err) | 376 | if (err) |
| 411 | goto sigsegv; | 377 | return err; |
| 412 | 378 | ||
| 413 | regs->u_regs[UREG_FP] = (unsigned long) sf; | 379 | regs->u_regs[UREG_FP] = (unsigned long) sf; |
| 414 | regs->u_regs[UREG_I0] = signo; | 380 | regs->u_regs[UREG_I0] = ksig->sig; |
| 415 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 381 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
| 416 | regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; | 382 | regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; |
| 417 | 383 | ||
| 418 | regs->pc = (unsigned long) ka->sa.sa_handler; | 384 | regs->pc = (unsigned long) ksig->ka.sa.sa_handler; |
| 419 | regs->npc = (regs->pc + 4); | 385 | regs->npc = (regs->pc + 4); |
| 420 | 386 | ||
| 421 | if (ka->ka_restorer) | 387 | if (ksig->ka.ka_restorer) |
| 422 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 388 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
| 423 | else { | 389 | else { |
| 424 | regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); | 390 | regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); |
| 425 | 391 | ||
| @@ -429,38 +395,25 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 429 | /* t 0x10 */ | 395 | /* t 0x10 */ |
| 430 | err |= __put_user(0x91d02010, &sf->insns[1]); | 396 | err |= __put_user(0x91d02010, &sf->insns[1]); |
| 431 | if (err) | 397 | if (err) |
| 432 | goto sigsegv; | 398 | return err; |
| 433 | 399 | ||
| 434 | /* Flush instruction space. */ | 400 | /* Flush instruction space. */ |
| 435 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); | 401 | flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); |
| 436 | } | 402 | } |
| 437 | return 0; | 403 | return 0; |
| 438 | |||
| 439 | sigill: | ||
| 440 | do_exit(SIGILL); | ||
| 441 | return -EINVAL; | ||
| 442 | |||
| 443 | sigsegv: | ||
| 444 | force_sigsegv(signo, current); | ||
| 445 | return -EFAULT; | ||
| 446 | } | 404 | } |
| 447 | 405 | ||
| 448 | static inline void | 406 | static inline void |
| 449 | handle_signal(unsigned long signr, struct k_sigaction *ka, | 407 | handle_signal(struct ksignal *ksig, struct pt_regs *regs) |
| 450 | siginfo_t *info, struct pt_regs *regs) | ||
| 451 | { | 408 | { |
| 452 | sigset_t *oldset = sigmask_to_save(); | 409 | sigset_t *oldset = sigmask_to_save(); |
| 453 | int err; | 410 | int err; |
| 454 | 411 | ||
| 455 | if (ka->sa.sa_flags & SA_SIGINFO) | 412 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
| 456 | err = setup_rt_frame(ka, regs, signr, oldset, info); | 413 | err = setup_rt_frame(ksig, regs, oldset); |
| 457 | else | 414 | else |
| 458 | err = setup_frame(ka, regs, signr, oldset); | 415 | err = setup_frame(ksig, regs, oldset); |
| 459 | 416 | signal_setup_done(err, ksig, 0); | |
| 460 | if (err) | ||
| 461 | return; | ||
| 462 | |||
| 463 | signal_delivered(signr, info, ka, regs, 0); | ||
| 464 | } | 417 | } |
| 465 | 418 | ||
| 466 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 419 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
| @@ -490,10 +443,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | |||
| 490 | */ | 443 | */ |
| 491 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | 444 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) |
| 492 | { | 445 | { |
| 493 | struct k_sigaction ka; | 446 | struct ksignal ksig; |
| 494 | int restart_syscall; | 447 | int restart_syscall; |
| 495 | siginfo_t info; | 448 | bool has_handler; |
| 496 | int signr; | ||
| 497 | 449 | ||
| 498 | /* It's a lot of work and synchronization to add a new ptrace | 450 | /* It's a lot of work and synchronization to add a new ptrace |
| 499 | * register for GDB to save and restore in order to get | 451 | * register for GDB to save and restore in order to get |
| @@ -516,7 +468,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 516 | if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) | 468 | if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) |
| 517 | regs->u_regs[UREG_G6] = orig_i0; | 469 | regs->u_regs[UREG_G6] = orig_i0; |
| 518 | 470 | ||
| 519 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 471 | has_handler = get_signal(&ksig); |
| 520 | 472 | ||
| 521 | /* If the debugger messes with the program counter, it clears | 473 | /* If the debugger messes with the program counter, it clears |
| 522 | * the software "in syscall" bit, directing us to not perform | 474 | * the software "in syscall" bit, directing us to not perform |
| @@ -528,35 +480,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 528 | orig_i0 = regs->u_regs[UREG_G6]; | 480 | orig_i0 = regs->u_regs[UREG_G6]; |
| 529 | } | 481 | } |
| 530 | 482 | ||
| 531 | 483 | if (has_handler) { | |
| 532 | if (signr > 0) { | ||
| 533 | if (restart_syscall) | 484 | if (restart_syscall) |
| 534 | syscall_restart(orig_i0, regs, &ka.sa); | 485 | syscall_restart(orig_i0, regs, &ksig.ka.sa); |
| 535 | handle_signal(signr, &ka, &info, regs); | 486 | handle_signal(&ksig, regs); |
| 536 | return; | 487 | } else { |
| 537 | } | 488 | if (restart_syscall) { |
| 538 | if (restart_syscall && | 489 | switch (regs->u_regs[UREG_I0]) { |
| 539 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | 490 | case ERESTARTNOHAND: |
| 540 | regs->u_regs[UREG_I0] == ERESTARTSYS || | 491 | case ERESTARTSYS: |
| 541 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | 492 | case ERESTARTNOINTR: |
| 542 | /* replay the system call when we are done */ | 493 | /* replay the system call when we are done */ |
| 543 | regs->u_regs[UREG_I0] = orig_i0; | 494 | regs->u_regs[UREG_I0] = orig_i0; |
| 544 | regs->pc -= 4; | 495 | regs->pc -= 4; |
| 545 | regs->npc -= 4; | 496 | regs->npc -= 4; |
| 546 | pt_regs_clear_syscall(regs); | 497 | pt_regs_clear_syscall(regs); |
| 547 | } | 498 | case ERESTART_RESTARTBLOCK: |
| 548 | if (restart_syscall && | 499 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| 549 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 500 | regs->pc -= 4; |
| 550 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 501 | regs->npc -= 4; |
| 551 | regs->pc -= 4; | 502 | pt_regs_clear_syscall(regs); |
| 552 | regs->npc -= 4; | 503 | } |
| 553 | pt_regs_clear_syscall(regs); | 504 | } |
| 505 | restore_saved_sigmask(); | ||
| 554 | } | 506 | } |
| 555 | |||
| 556 | /* if there's no signal to deliver, we just put the saved sigmask | ||
| 557 | * back | ||
| 558 | */ | ||
| 559 | restore_saved_sigmask(); | ||
| 560 | } | 507 | } |
| 561 | 508 | ||
| 562 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, | 509 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, |
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 689e1ba62809..35923e8abd82 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
| @@ -236,23 +236,6 @@ struct rt_signal_frame { | |||
| 236 | __siginfo_rwin_t *rwin_save; | 236 | __siginfo_rwin_t *rwin_save; |
| 237 | }; | 237 | }; |
| 238 | 238 | ||
| 239 | static long _sigpause_common(old_sigset_t set) | ||
| 240 | { | ||
| 241 | sigset_t blocked; | ||
| 242 | siginitset(&blocked, set); | ||
| 243 | return sigsuspend(&blocked); | ||
| 244 | } | ||
| 245 | |||
| 246 | asmlinkage long sys_sigpause(unsigned int set) | ||
| 247 | { | ||
| 248 | return _sigpause_common(set); | ||
| 249 | } | ||
| 250 | |||
| 251 | asmlinkage long sys_sigsuspend(old_sigset_t set) | ||
| 252 | { | ||
| 253 | return _sigpause_common(set); | ||
| 254 | } | ||
| 255 | |||
| 256 | void do_rt_sigreturn(struct pt_regs *regs) | 239 | void do_rt_sigreturn(struct pt_regs *regs) |
| 257 | { | 240 | { |
| 258 | struct rt_signal_frame __user *sf; | 241 | struct rt_signal_frame __user *sf; |
| @@ -295,7 +278,8 @@ void do_rt_sigreturn(struct pt_regs *regs) | |||
| 295 | err |= restore_fpu_state(regs, fpu_save); | 278 | err |= restore_fpu_state(regs, fpu_save); |
| 296 | 279 | ||
| 297 | err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); | 280 | err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); |
| 298 | if (err || do_sigaltstack(&sf->stack, NULL, (unsigned long)sf) == -EFAULT) | 281 | err |= restore_altstack(&sf->stack); |
| 282 | if (err) | ||
| 299 | goto segv; | 283 | goto segv; |
| 300 | 284 | ||
| 301 | err |= __get_user(rwin_save, &sf->rwin_save); | 285 | err |= __get_user(rwin_save, &sf->rwin_save); |
| @@ -324,7 +308,7 @@ static int invalid_frame_pointer(void __user *fp) | |||
| 324 | return 0; | 308 | return 0; |
| 325 | } | 309 | } |
| 326 | 310 | ||
| 327 | static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize) | 311 | static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize) |
| 328 | { | 312 | { |
| 329 | unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; | 313 | unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; |
| 330 | 314 | ||
| @@ -336,12 +320,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs * | |||
| 336 | return (void __user *) -1L; | 320 | return (void __user *) -1L; |
| 337 | 321 | ||
| 338 | /* This is the X/Open sanctioned signal stack switching. */ | 322 | /* This is the X/Open sanctioned signal stack switching. */ |
| 339 | if (ka->sa.sa_flags & SA_ONSTACK) { | 323 | sp = sigsp(sp, ksig) - framesize; |
| 340 | if (sas_ss_flags(sp) == 0) | ||
| 341 | sp = current->sas_ss_sp + current->sas_ss_size; | ||
| 342 | } | ||
| 343 | |||
| 344 | sp -= framesize; | ||
| 345 | 324 | ||
| 346 | /* Always align the stack frame. This handles two cases. First, | 325 | /* Always align the stack frame. This handles two cases. First, |
| 347 | * sigaltstack need not be mindful of platform specific stack | 326 | * sigaltstack need not be mindful of platform specific stack |
| @@ -355,8 +334,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs * | |||
| 355 | } | 334 | } |
| 356 | 335 | ||
| 357 | static inline int | 336 | static inline int |
| 358 | setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | 337 | setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs) |
| 359 | int signo, sigset_t *oldset, siginfo_t *info) | ||
| 360 | { | 338 | { |
| 361 | struct rt_signal_frame __user *sf; | 339 | struct rt_signal_frame __user *sf; |
| 362 | int wsaved, err, sf_size; | 340 | int wsaved, err, sf_size; |
| @@ -374,10 +352,12 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 374 | if (wsaved) | 352 | if (wsaved) |
| 375 | sf_size += sizeof(__siginfo_rwin_t); | 353 | sf_size += sizeof(__siginfo_rwin_t); |
| 376 | sf = (struct rt_signal_frame __user *) | 354 | sf = (struct rt_signal_frame __user *) |
| 377 | get_sigframe(ka, regs, sf_size); | 355 | get_sigframe(ksig, regs, sf_size); |
| 378 | 356 | ||
| 379 | if (invalid_frame_pointer (sf)) | 357 | if (invalid_frame_pointer (sf)) { |
| 380 | goto sigill; | 358 | do_exit(SIGILL); /* won't return, actually */ |
| 359 | return -EINVAL; | ||
| 360 | } | ||
| 381 | 361 | ||
| 382 | tail = (sf + 1); | 362 | tail = (sf + 1); |
| 383 | 363 | ||
| @@ -403,11 +383,9 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 403 | } | 383 | } |
| 404 | 384 | ||
| 405 | /* Setup sigaltstack */ | 385 | /* Setup sigaltstack */ |
| 406 | err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); | 386 | err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]); |
| 407 | err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags); | ||
| 408 | err |= __put_user(current->sas_ss_size, &sf->stack.ss_size); | ||
| 409 | 387 | ||
| 410 | err |= copy_to_user(&sf->mask, oldset, sizeof(sigset_t)); | 388 | err |= copy_to_user(&sf->mask, sigmask_to_save(), sizeof(sigset_t)); |
| 411 | 389 | ||
| 412 | if (!wsaved) { | 390 | if (!wsaved) { |
| 413 | err |= copy_in_user((u64 __user *)sf, | 391 | err |= copy_in_user((u64 __user *)sf, |
| @@ -420,18 +398,18 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 420 | rp = ¤t_thread_info()->reg_window[wsaved - 1]; | 398 | rp = ¤t_thread_info()->reg_window[wsaved - 1]; |
| 421 | err |= copy_to_user(sf, rp, sizeof(struct reg_window)); | 399 | err |= copy_to_user(sf, rp, sizeof(struct reg_window)); |
| 422 | } | 400 | } |
| 423 | if (info) | 401 | if (ksig->ka.sa.sa_flags & SA_SIGINFO) |
| 424 | err |= copy_siginfo_to_user(&sf->info, info); | 402 | err |= copy_siginfo_to_user(&sf->info, &ksig->info); |
| 425 | else { | 403 | else { |
| 426 | err |= __put_user(signo, &sf->info.si_signo); | 404 | err |= __put_user(ksig->sig, &sf->info.si_signo); |
| 427 | err |= __put_user(SI_NOINFO, &sf->info.si_code); | 405 | err |= __put_user(SI_NOINFO, &sf->info.si_code); |
| 428 | } | 406 | } |
| 429 | if (err) | 407 | if (err) |
| 430 | goto sigsegv; | 408 | return err; |
| 431 | 409 | ||
| 432 | /* 3. signal handler back-trampoline and parameters */ | 410 | /* 3. signal handler back-trampoline and parameters */ |
| 433 | regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS; | 411 | regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS; |
| 434 | regs->u_regs[UREG_I0] = signo; | 412 | regs->u_regs[UREG_I0] = ksig->sig; |
| 435 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; | 413 | regs->u_regs[UREG_I1] = (unsigned long) &sf->info; |
| 436 | 414 | ||
| 437 | /* The sigcontext is passed in this way because of how it | 415 | /* The sigcontext is passed in this way because of how it |
| @@ -441,37 +419,15 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, | |||
| 441 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; | 419 | regs->u_regs[UREG_I2] = (unsigned long) &sf->info; |
| 442 | 420 | ||
| 443 | /* 5. signal handler */ | 421 | /* 5. signal handler */ |
| 444 | regs->tpc = (unsigned long) ka->sa.sa_handler; | 422 | regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; |
| 445 | regs->tnpc = (regs->tpc + 4); | 423 | regs->tnpc = (regs->tpc + 4); |
| 446 | if (test_thread_flag(TIF_32BIT)) { | 424 | if (test_thread_flag(TIF_32BIT)) { |
| 447 | regs->tpc &= 0xffffffff; | 425 | regs->tpc &= 0xffffffff; |
| 448 | regs->tnpc &= 0xffffffff; | 426 | regs->tnpc &= 0xffffffff; |
| 449 | } | 427 | } |
| 450 | /* 4. return to kernel instructions */ | 428 | /* 4. return to kernel instructions */ |
| 451 | regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; | 429 | regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; |
| 452 | return 0; | 430 | return 0; |
| 453 | |||
| 454 | sigill: | ||
| 455 | do_exit(SIGILL); | ||
| 456 | return -EINVAL; | ||
| 457 | |||
| 458 | sigsegv: | ||
| 459 | force_sigsegv(signo, current); | ||
| 460 | return -EFAULT; | ||
| 461 | } | ||
| 462 | |||
| 463 | static inline void handle_signal(unsigned long signr, struct k_sigaction *ka, | ||
| 464 | siginfo_t *info, | ||
| 465 | sigset_t *oldset, struct pt_regs *regs) | ||
| 466 | { | ||
| 467 | int err; | ||
| 468 | |||
| 469 | err = setup_rt_frame(ka, regs, signr, oldset, | ||
| 470 | (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); | ||
| 471 | if (err) | ||
| 472 | return; | ||
| 473 | |||
| 474 | signal_delivered(signr, info, ka, regs, 0); | ||
| 475 | } | 431 | } |
| 476 | 432 | ||
| 477 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | 433 | static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, |
| @@ -501,11 +457,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, | |||
| 501 | */ | 457 | */ |
| 502 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | 458 | static void do_signal(struct pt_regs *regs, unsigned long orig_i0) |
| 503 | { | 459 | { |
| 504 | struct k_sigaction ka; | 460 | struct ksignal ksig; |
| 505 | int restart_syscall; | 461 | int restart_syscall; |
| 506 | sigset_t *oldset = sigmask_to_save(); | 462 | bool has_handler; |
| 507 | siginfo_t info; | ||
| 508 | int signr; | ||
| 509 | 463 | ||
| 510 | /* It's a lot of work and synchronization to add a new ptrace | 464 | /* It's a lot of work and synchronization to add a new ptrace |
| 511 | * register for GDB to save and restore in order to get | 465 | * register for GDB to save and restore in order to get |
| @@ -531,13 +485,13 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 531 | 485 | ||
| 532 | #ifdef CONFIG_COMPAT | 486 | #ifdef CONFIG_COMPAT |
| 533 | if (test_thread_flag(TIF_32BIT)) { | 487 | if (test_thread_flag(TIF_32BIT)) { |
| 534 | extern void do_signal32(sigset_t *, struct pt_regs *); | 488 | extern void do_signal32(struct pt_regs *); |
| 535 | do_signal32(oldset, regs); | 489 | do_signal32(regs); |
| 536 | return; | 490 | return; |
| 537 | } | 491 | } |
| 538 | #endif | 492 | #endif |
| 539 | 493 | ||
| 540 | signr = get_signal_to_deliver(&info, &ka, regs, NULL); | 494 | has_handler = get_signal(&ksig); |
| 541 | 495 | ||
| 542 | restart_syscall = 0; | 496 | restart_syscall = 0; |
| 543 | if (pt_regs_is_syscall(regs) && | 497 | if (pt_regs_is_syscall(regs) && |
| @@ -546,34 +500,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) | |||
| 546 | orig_i0 = regs->u_regs[UREG_G6]; | 500 | orig_i0 = regs->u_regs[UREG_G6]; |
| 547 | } | 501 | } |
| 548 | 502 | ||
| 549 | if (signr > 0) { | 503 | if (has_handler) { |
| 550 | if (restart_syscall) | 504 | if (restart_syscall) |
| 551 | syscall_restart(orig_i0, regs, &ka.sa); | 505 | syscall_restart(orig_i0, regs, &ksig.ka.sa); |
| 552 | handle_signal(signr, &ka, &info, oldset, regs); | 506 | signal_setup_done(setup_rt_frame(&ksig, regs), &ksig, 0); |
| 553 | return; | 507 | } else { |
| 554 | } | 508 | if (restart_syscall) { |
| 555 | if (restart_syscall && | 509 | switch (regs->u_regs[UREG_I0]) { |
| 556 | (regs->u_regs[UREG_I0] == ERESTARTNOHAND || | 510 | case ERESTARTNOHAND: |
| 557 | regs->u_regs[UREG_I0] == ERESTARTSYS || | 511 | case ERESTARTSYS: |
| 558 | regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { | 512 | case ERESTARTNOINTR: |
| 559 | /* replay the system call when we are done */ | 513 | /* replay the system call when we are done */ |
| 560 | regs->u_regs[UREG_I0] = orig_i0; | 514 | regs->u_regs[UREG_I0] = orig_i0; |
| 561 | regs->tpc -= 4; | 515 | regs->tpc -= 4; |
| 562 | regs->tnpc -= 4; | 516 | regs->tnpc -= 4; |
| 563 | pt_regs_clear_syscall(regs); | 517 | pt_regs_clear_syscall(regs); |
| 564 | } | 518 | case ERESTART_RESTARTBLOCK: |
| 565 | if (restart_syscall && | 519 | regs->u_regs[UREG_G1] = __NR_restart_syscall; |
| 566 | regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { | 520 | regs->tpc -= 4; |
| 567 | regs->u_regs[UREG_G1] = __NR_restart_syscall; | 521 | regs->tnpc -= 4; |
| 568 | regs->tpc -= 4; | 522 | pt_regs_clear_syscall(regs); |
| 569 | regs->tnpc -= 4; | 523 | } |
| 570 | pt_regs_clear_syscall(regs); | 524 | } |
| 525 | restore_saved_sigmask(); | ||
| 571 | } | 526 | } |
| 572 | |||
| 573 | /* If there's no signal to deliver, we just put the saved sigmask | ||
| 574 | * back | ||
| 575 | */ | ||
| 576 | restore_saved_sigmask(); | ||
| 577 | } | 527 | } |
| 578 | 528 | ||
| 579 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) | 529 | void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) |
diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index 8475a474273a..240a3cecc11e 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S | |||
| @@ -36,108 +36,22 @@ STUB: sra REG1, 0, REG1; \ | |||
| 36 | jmpl %g1 + %lo(SYSCALL), %g0; \ | 36 | jmpl %g1 + %lo(SYSCALL), %g0; \ |
| 37 | sra REG3, 0, REG3 | 37 | sra REG3, 0, REG3 |
| 38 | 38 | ||
| 39 | #define SIGN4(STUB,SYSCALL,REG1,REG2,REG3,REG4) \ | ||
| 40 | .align 32; \ | ||
| 41 | .globl STUB; \ | ||
| 42 | STUB: sra REG1, 0, REG1; \ | ||
| 43 | sethi %hi(SYSCALL), %g1; \ | ||
| 44 | sra REG2, 0, REG2; \ | ||
| 45 | sra REG3, 0, REG3; \ | ||
| 46 | jmpl %g1 + %lo(SYSCALL), %g0; \ | ||
| 47 | sra REG4, 0, REG4 | ||
| 48 | |||
| 49 | SIGN1(sys32_exit, sparc_exit, %o0) | ||
| 50 | SIGN1(sys32_exit_group, sparc_exit_group, %o0) | ||
| 51 | SIGN1(sys32_wait4, compat_sys_wait4, %o2) | ||
| 52 | SIGN1(sys32_creat, sys_creat, %o1) | ||
| 53 | SIGN1(sys32_mknod, sys_mknod, %o1) | ||
| 54 | SIGN1(sys32_umount, sys_umount, %o1) | ||
| 55 | SIGN1(sys32_signal, sys_signal, %o0) | ||
| 56 | SIGN1(sys32_access, sys_access, %o1) | ||
| 57 | SIGN1(sys32_msync, sys_msync, %o2) | ||
| 58 | SIGN2(sys32_reboot, sys_reboot, %o0, %o1) | ||
| 59 | SIGN1(sys32_setitimer, compat_sys_setitimer, %o0) | ||
| 60 | SIGN1(sys32_getitimer, compat_sys_getitimer, %o0) | ||
| 61 | SIGN1(sys32_sethostname, sys_sethostname, %o1) | ||
| 62 | SIGN1(sys32_swapon, sys_swapon, %o1) | ||
| 63 | SIGN1(sys32_sigaction, compat_sys_sigaction, %o0) | ||
| 64 | SIGN1(sys32_rt_sigaction, compat_sys_rt_sigaction, %o0) | ||
| 65 | SIGN1(sys32_sigprocmask, compat_sys_sigprocmask, %o0) | ||
| 66 | SIGN1(sys32_rt_sigprocmask, compat_sys_rt_sigprocmask, %o0) | ||
| 67 | SIGN2(sys32_rt_sigqueueinfo, compat_sys_rt_sigqueueinfo, %o0, %o1) | ||
| 68 | SIGN1(sys32_getrusage, compat_sys_getrusage, %o0) | 39 | SIGN1(sys32_getrusage, compat_sys_getrusage, %o0) |
| 69 | SIGN1(sys32_setxattr, sys_setxattr, %o4) | ||
| 70 | SIGN1(sys32_lsetxattr, sys_lsetxattr, %o4) | ||
| 71 | SIGN1(sys32_fsetxattr, sys_fsetxattr, %o4) | ||
| 72 | SIGN1(sys32_fgetxattr, sys_fgetxattr, %o0) | ||
| 73 | SIGN1(sys32_flistxattr, sys_flistxattr, %o0) | ||
| 74 | SIGN1(sys32_fremovexattr, sys_fremovexattr, %o0) | ||
| 75 | SIGN2(sys32_tkill, sys_tkill, %o0, %o1) | ||
| 76 | SIGN1(sys32_epoll_create, sys_epoll_create, %o0) | ||
| 77 | SIGN3(sys32_epoll_ctl, sys_epoll_ctl, %o0, %o1, %o2) | ||
| 78 | SIGN3(sys32_epoll_wait, sys_epoll_wait, %o0, %o2, %o3) | ||
| 79 | SIGN1(sys32_readahead, compat_sys_readahead, %o0) | 40 | SIGN1(sys32_readahead, compat_sys_readahead, %o0) |
| 80 | SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4) | 41 | SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4) |
| 81 | SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5) | 42 | SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5) |
| 82 | SIGN2(sys32_bdflush, sys_bdflush, %o0, %o1) | ||
| 83 | SIGN1(sys32_mlockall, sys_mlockall, %o0) | ||
| 84 | SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1) | 43 | SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1) |
| 85 | SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1) | 44 | SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1) |
| 86 | SIGN1(sys32_io_submit, compat_sys_io_submit, %o1) | 45 | SIGN1(sys32_io_submit, compat_sys_io_submit, %o1) |
| 87 | SIGN1(sys32_mq_open, compat_sys_mq_open, %o1) | 46 | SIGN1(sys32_mq_open, compat_sys_mq_open, %o1) |
| 88 | SIGN1(sys32_select, compat_sys_select, %o0) | 47 | SIGN1(sys32_select, compat_sys_select, %o0) |
| 89 | SIGN1(sys32_mkdir, sys_mkdir, %o1) | ||
| 90 | SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) | 48 | SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) |
| 91 | SIGN1(sys32_sysfs, compat_sys_sysfs, %o0) | ||
| 92 | SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1) | 49 | SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1) |
| 93 | SIGN2(sys32_sendfile64, sys_sendfile, %o0, %o1) | ||
| 94 | SIGN1(sys32_prctl, sys_prctl, %o0) | ||
| 95 | SIGN1(sys32_sched_rr_get_interval, compat_sys_sched_rr_get_interval, %o0) | ||
| 96 | SIGN2(sys32_waitpid, sys_waitpid, %o0, %o2) | ||
| 97 | SIGN1(sys32_getgroups, sys_getgroups, %o0) | ||
| 98 | SIGN1(sys32_getpgid, sys_getpgid, %o0) | ||
| 99 | SIGN2(sys32_getpriority, sys_getpriority, %o0, %o1) | ||
| 100 | SIGN1(sys32_getsid, sys_getsid, %o0) | ||
| 101 | SIGN2(sys32_kill, sys_kill, %o0, %o1) | ||
| 102 | SIGN1(sys32_nice, sys_nice, %o0) | ||
| 103 | SIGN1(sys32_lseek, sys_lseek, %o1) | ||
| 104 | SIGN2(sys32_open, sparc32_open, %o1, %o2) | ||
| 105 | SIGN1(sys32_readlink, sys_readlink, %o2) | ||
| 106 | SIGN1(sys32_sched_get_priority_max, sys_sched_get_priority_max, %o0) | ||
| 107 | SIGN1(sys32_sched_get_priority_min, sys_sched_get_priority_min, %o0) | ||
| 108 | SIGN1(sys32_sched_getparam, sys_sched_getparam, %o0) | ||
| 109 | SIGN1(sys32_sched_getscheduler, sys_sched_getscheduler, %o0) | ||
| 110 | SIGN1(sys32_sched_setparam, sys_sched_setparam, %o0) | ||
| 111 | SIGN2(sys32_sched_setscheduler, sys_sched_setscheduler, %o0, %o1) | ||
| 112 | SIGN1(sys32_getdomainname, sys_getdomainname, %o1) | ||
| 113 | SIGN1(sys32_setdomainname, sys_setdomainname, %o1) | ||
| 114 | SIGN1(sys32_setgroups, sys_setgroups, %o0) | ||
| 115 | SIGN2(sys32_setpgid, sys_setpgid, %o0, %o1) | ||
| 116 | SIGN3(sys32_setpriority, sys_setpriority, %o0, %o1, %o2) | ||
| 117 | SIGN1(sys32_ssetmask, sys_ssetmask, %o0) | ||
| 118 | SIGN2(sys32_syslog, sys_syslog, %o0, %o2) | ||
| 119 | SIGN1(sys32_umask, sys_umask, %o0) | ||
| 120 | SIGN3(sys32_tgkill, sys_tgkill, %o0, %o1, %o2) | ||
| 121 | SIGN1(sys32_sendto, sys_sendto, %o0) | ||
| 122 | SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) | 50 | SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) |
| 123 | SIGN3(sys32_socket, sys_socket, %o0, %o1, %o2) | ||
| 124 | SIGN2(sys32_connect, sys_connect, %o0, %o2) | ||
| 125 | SIGN2(sys32_bind, sys_bind, %o0, %o2) | ||
| 126 | SIGN2(sys32_listen, sys_listen, %o0, %o1) | ||
| 127 | SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) | 51 | SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0) |
| 128 | SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) | 52 | SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) |
| 129 | SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1) | ||
| 130 | SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2) | ||
| 131 | SIGN1(sys32_getpeername, sys_getpeername, %o0) | ||
| 132 | SIGN1(sys32_getsockname, sys_getsockname, %o0) | ||
| 133 | SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1) | ||
| 134 | SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2) | ||
| 135 | SIGN2(sys32_splice, sys_splice, %o0, %o2) | ||
| 136 | SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) | 53 | SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) |
| 137 | SIGN2(sys32_tee, sys_tee, %o0, %o1) | ||
| 138 | SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) | 54 | SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) |
| 139 | SIGN1(sys32_truncate, sys_truncate, %o1) | ||
| 140 | SIGN1(sys32_ftruncate, sys_ftruncate, %o1) | ||
| 141 | 55 | ||
| 142 | .globl sys32_mmap2 | 56 | .globl sys32_mmap2 |
| 143 | sys32_mmap2: | 57 | sys32_mmap2: |
diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index 4a4cdc633f6b..f38f2280fade 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c | |||
| @@ -206,133 +206,19 @@ asmlinkage long compat_sys_fstatat64(unsigned int dfd, | |||
| 206 | return cp_compat_stat64(&stat, statbuf); | 206 | return cp_compat_stat64(&stat, statbuf); |
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2) | 209 | COMPAT_SYSCALL_DEFINE3(sparc_sigaction, int, sig, |
| 210 | struct compat_old_sigaction __user *,act, | ||
| 211 | struct compat_old_sigaction __user *,oact) | ||
| 210 | { | 212 | { |
| 211 | return sys_sysfs(option, arg1, arg2); | ||
| 212 | } | ||
| 213 | |||
| 214 | asmlinkage long compat_sys_rt_sigprocmask(int how, | ||
| 215 | compat_sigset_t __user *set, | ||
| 216 | compat_sigset_t __user *oset, | ||
| 217 | compat_size_t sigsetsize) | ||
| 218 | { | ||
| 219 | sigset_t s; | ||
| 220 | compat_sigset_t s32; | ||
| 221 | int ret; | ||
| 222 | mm_segment_t old_fs = get_fs(); | ||
| 223 | |||
| 224 | if (set) { | ||
| 225 | if (copy_from_user (&s32, set, sizeof(compat_sigset_t))) | ||
| 226 | return -EFAULT; | ||
| 227 | switch (_NSIG_WORDS) { | ||
| 228 | case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32); | ||
| 229 | case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32); | ||
| 230 | case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32); | ||
| 231 | case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); | ||
| 232 | } | ||
| 233 | } | ||
| 234 | set_fs (KERNEL_DS); | ||
| 235 | ret = sys_rt_sigprocmask(how, | ||
| 236 | set ? (sigset_t __user *) &s : NULL, | ||
| 237 | oset ? (sigset_t __user *) &s : NULL, | ||
| 238 | sigsetsize); | ||
| 239 | set_fs (old_fs); | ||
| 240 | if (ret) return ret; | ||
| 241 | if (oset) { | ||
| 242 | switch (_NSIG_WORDS) { | ||
| 243 | case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3]; | ||
| 244 | case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2]; | ||
| 245 | case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1]; | ||
| 246 | case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0]; | ||
| 247 | } | ||
| 248 | if (copy_to_user (oset, &s32, sizeof(compat_sigset_t))) | ||
| 249 | return -EFAULT; | ||
| 250 | } | ||
| 251 | return 0; | ||
| 252 | } | ||
| 253 | |||
| 254 | asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *set, | ||
| 255 | compat_size_t sigsetsize) | ||
| 256 | { | ||
| 257 | sigset_t s; | ||
| 258 | compat_sigset_t s32; | ||
| 259 | int ret; | ||
| 260 | mm_segment_t old_fs = get_fs(); | ||
| 261 | |||
| 262 | set_fs (KERNEL_DS); | ||
| 263 | ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize); | ||
| 264 | set_fs (old_fs); | ||
| 265 | if (!ret) { | ||
| 266 | switch (_NSIG_WORDS) { | ||
| 267 | case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3]; | ||
| 268 | case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2]; | ||
| 269 | case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1]; | ||
| 270 | case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0]; | ||
| 271 | } | ||
| 272 | if (copy_to_user (set, &s32, sizeof(compat_sigset_t))) | ||
| 273 | return -EFAULT; | ||
| 274 | } | ||
| 275 | return ret; | ||
| 276 | } | ||
| 277 | |||
| 278 | asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig, | ||
| 279 | struct compat_siginfo __user *uinfo) | ||
| 280 | { | ||
| 281 | siginfo_t info; | ||
| 282 | int ret; | ||
| 283 | mm_segment_t old_fs = get_fs(); | ||
| 284 | |||
| 285 | if (copy_siginfo_from_user32(&info, uinfo)) | ||
| 286 | return -EFAULT; | ||
| 287 | |||
| 288 | set_fs (KERNEL_DS); | ||
| 289 | ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *) &info); | ||
| 290 | set_fs (old_fs); | ||
| 291 | return ret; | ||
| 292 | } | ||
| 293 | |||
| 294 | asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act, | ||
| 295 | struct old_sigaction32 __user *oact) | ||
| 296 | { | ||
| 297 | struct k_sigaction new_ka, old_ka; | ||
| 298 | int ret; | ||
| 299 | |||
| 300 | WARN_ON_ONCE(sig >= 0); | 213 | WARN_ON_ONCE(sig >= 0); |
| 301 | sig = -sig; | 214 | return compat_sys_sigaction(-sig, act, oact); |
| 302 | |||
| 303 | if (act) { | ||
| 304 | compat_old_sigset_t mask; | ||
| 305 | u32 u_handler, u_restorer; | ||
| 306 | |||
| 307 | ret = get_user(u_handler, &act->sa_handler); | ||
| 308 | new_ka.sa.sa_handler = compat_ptr(u_handler); | ||
| 309 | ret |= __get_user(u_restorer, &act->sa_restorer); | ||
| 310 | new_ka.sa.sa_restorer = compat_ptr(u_restorer); | ||
| 311 | ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 312 | ret |= __get_user(mask, &act->sa_mask); | ||
| 313 | if (ret) | ||
| 314 | return ret; | ||
| 315 | new_ka.ka_restorer = NULL; | ||
| 316 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 317 | } | ||
| 318 | |||
| 319 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 320 | |||
| 321 | if (!ret && oact) { | ||
| 322 | ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); | ||
| 323 | ret |= __put_user(ptr_to_compat(old_ka.sa.sa_restorer), &oact->sa_restorer); | ||
| 324 | ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 325 | ret |= __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
| 326 | } | ||
| 327 | |||
| 328 | return ret; | ||
| 329 | } | 215 | } |
| 330 | 216 | ||
| 331 | asmlinkage long compat_sys_rt_sigaction(int sig, | 217 | COMPAT_SYSCALL_DEFINE5(rt_sigaction, int, sig, |
| 332 | struct sigaction32 __user *act, | 218 | struct compat_sigaction __user *,act, |
| 333 | struct sigaction32 __user *oact, | 219 | struct compat_sigaction __user *,oact, |
| 334 | void __user *restorer, | 220 | void __user *,restorer, |
| 335 | compat_size_t sigsetsize) | 221 | compat_size_t,sigsetsize) |
| 336 | { | 222 | { |
| 337 | struct k_sigaction new_ka, old_ka; | 223 | struct k_sigaction new_ka, old_ka; |
| 338 | int ret; | 224 | int ret; |
| @@ -349,12 +235,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig, | |||
| 349 | ret = get_user(u_handler, &act->sa_handler); | 235 | ret = get_user(u_handler, &act->sa_handler); |
| 350 | new_ka.sa.sa_handler = compat_ptr(u_handler); | 236 | new_ka.sa.sa_handler = compat_ptr(u_handler); |
| 351 | ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t)); | 237 | ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t)); |
| 352 | switch (_NSIG_WORDS) { | 238 | sigset_from_compat(&new_ka.sa.sa_mask, &set32); |
| 353 | case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6] | (((long)set32.sig[7]) << 32); | ||
| 354 | case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4] | (((long)set32.sig[5]) << 32); | ||
| 355 | case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2] | (((long)set32.sig[3]) << 32); | ||
| 356 | case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0] | (((long)set32.sig[1]) << 32); | ||
| 357 | } | ||
| 358 | ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); | 239 | ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); |
| 359 | ret |= __get_user(u_restorer, &act->sa_restorer); | 240 | ret |= __get_user(u_restorer, &act->sa_restorer); |
| 360 | new_ka.sa.sa_restorer = compat_ptr(u_restorer); | 241 | new_ka.sa.sa_restorer = compat_ptr(u_restorer); |
| @@ -365,12 +246,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig, | |||
| 365 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | 246 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); |
| 366 | 247 | ||
| 367 | if (!ret && oact) { | 248 | if (!ret && oact) { |
| 368 | switch (_NSIG_WORDS) { | 249 | sigset_to_compat(&set32, &old_ka.sa.sa_mask); |
| 369 | case 4: set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32); set32.sig[6] = old_ka.sa.sa_mask.sig[3]; | ||
| 370 | case 3: set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32); set32.sig[4] = old_ka.sa.sa_mask.sig[2]; | ||
| 371 | case 2: set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32); set32.sig[2] = old_ka.sa.sa_mask.sig[1]; | ||
| 372 | case 1: set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32); set32.sig[0] = old_ka.sa.sa_mask.sig[0]; | ||
| 373 | } | ||
| 374 | ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); | 250 | ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); |
| 375 | ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t)); | 251 | ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t)); |
| 376 | ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | 252 | ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); |
| @@ -382,35 +258,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig, | |||
| 382 | return ret; | 258 | return ret; |
| 383 | } | 259 | } |
| 384 | 260 | ||
| 385 | #ifdef CONFIG_MODULES | ||
| 386 | |||
| 387 | asmlinkage long sys32_init_module(void __user *umod, u32 len, | ||
| 388 | const char __user *uargs) | ||
| 389 | { | ||
| 390 | return sys_init_module(umod, len, uargs); | ||
| 391 | } | ||
| 392 | |||
| 393 | asmlinkage long sys32_delete_module(const char __user *name_user, | ||
| 394 | unsigned int flags) | ||
| 395 | { | ||
| 396 | return sys_delete_module(name_user, flags); | ||
| 397 | } | ||
| 398 | |||
| 399 | #else /* CONFIG_MODULES */ | ||
| 400 | |||
| 401 | asmlinkage long sys32_init_module(const char __user *name_user, | ||
| 402 | struct module __user *mod_user) | ||
| 403 | { | ||
| 404 | return -ENOSYS; | ||
| 405 | } | ||
| 406 | |||
| 407 | asmlinkage long sys32_delete_module(const char __user *name_user) | ||
| 408 | { | ||
| 409 | return -ENOSYS; | ||
| 410 | } | ||
| 411 | |||
| 412 | #endif /* CONFIG_MODULES */ | ||
| 413 | |||
| 414 | asmlinkage compat_ssize_t sys32_pread64(unsigned int fd, | 261 | asmlinkage compat_ssize_t sys32_pread64(unsigned int fd, |
| 415 | char __user *ubuf, | 262 | char __user *ubuf, |
| 416 | compat_size_t count, | 263 | compat_size_t count, |
| @@ -456,16 +303,6 @@ long compat_sys_fadvise64_64(int fd, | |||
| 456 | advice); | 303 | advice); |
| 457 | } | 304 | } |
| 458 | 305 | ||
| 459 | /* This is just a version for 32-bit applications which does | ||
| 460 | * not force O_LARGEFILE on. | ||
| 461 | */ | ||
| 462 | |||
| 463 | asmlinkage long sparc32_open(const char __user *filename, | ||
| 464 | int flags, int mode) | ||
| 465 | { | ||
| 466 | return do_sys_open(AT_FDCWD, filename, flags, mode); | ||
| 467 | } | ||
| 468 | |||
| 469 | long sys32_lookup_dcookie(unsigned long cookie_high, | 306 | long sys32_lookup_dcookie(unsigned long cookie_high, |
| 470 | unsigned long cookie_low, | 307 | unsigned long cookie_low, |
| 471 | char __user *buf, size_t len) | 308 | char __user *buf, size_t len) |
diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index 2da0bdcae52f..3a8d1844402e 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c | |||
| @@ -160,49 +160,19 @@ sparc_breakpoint (struct pt_regs *regs) | |||
| 160 | #endif | 160 | #endif |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | asmlinkage int | 163 | SYSCALL_DEFINE3(sparc_sigaction, int, sig, |
| 164 | sparc_sigaction (int sig, const struct old_sigaction __user *act, | 164 | struct old_sigaction __user *,act, |
| 165 | struct old_sigaction __user *oact) | 165 | struct old_sigaction __user *,oact) |
| 166 | { | 166 | { |
| 167 | struct k_sigaction new_ka, old_ka; | ||
| 168 | int ret; | ||
| 169 | |||
| 170 | WARN_ON_ONCE(sig >= 0); | 167 | WARN_ON_ONCE(sig >= 0); |
| 171 | sig = -sig; | 168 | return sys_sigaction(-sig, act, oact); |
| 172 | |||
| 173 | if (act) { | ||
| 174 | unsigned long mask; | ||
| 175 | |||
| 176 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 177 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 178 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 179 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 180 | __get_user(mask, &act->sa_mask)) | ||
| 181 | return -EFAULT; | ||
| 182 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 183 | new_ka.ka_restorer = NULL; | ||
| 184 | } | ||
| 185 | |||
| 186 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 187 | |||
| 188 | if (!ret && oact) { | ||
| 189 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 190 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 191 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 192 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 193 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 194 | return -EFAULT; | ||
| 195 | } | ||
| 196 | |||
| 197 | return ret; | ||
| 198 | } | 169 | } |
| 199 | 170 | ||
| 200 | asmlinkage long | 171 | SYSCALL_DEFINE5(rt_sigaction, int, sig, |
| 201 | sys_rt_sigaction(int sig, | 172 | const struct sigaction __user *, act, |
| 202 | const struct sigaction __user *act, | 173 | struct sigaction __user *, oact, |
| 203 | struct sigaction __user *oact, | 174 | void __user *, restorer, |
| 204 | void __user *restorer, | 175 | size_t, sigsetsize) |
| 205 | size_t sigsetsize) | ||
| 206 | { | 176 | { |
| 207 | struct k_sigaction new_ka, old_ka; | 177 | struct k_sigaction new_ka, old_ka; |
| 208 | int ret; | 178 | int ret; |
diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S index e0fed7711a94..22a1098961f5 100644 --- a/arch/sparc/kernel/syscalls.S +++ b/arch/sparc/kernel/syscalls.S | |||
| @@ -25,16 +25,10 @@ sys_nis_syscall: | |||
| 25 | sys_memory_ordering: | 25 | sys_memory_ordering: |
| 26 | ba,pt %xcc, sparc_memory_ordering | 26 | ba,pt %xcc, sparc_memory_ordering |
| 27 | add %sp, PTREGS_OFF, %o1 | 27 | add %sp, PTREGS_OFF, %o1 |
| 28 | sys_sigaltstack: | ||
| 29 | ba,pt %xcc, do_sigaltstack | ||
| 30 | add %i6, STACK_BIAS, %o2 | ||
| 31 | #ifdef CONFIG_COMPAT | 28 | #ifdef CONFIG_COMPAT |
| 32 | sys32_sigstack: | 29 | sys32_sigstack: |
| 33 | ba,pt %xcc, do_sys32_sigstack | 30 | ba,pt %xcc, do_sys32_sigstack |
| 34 | mov %i6, %o2 | 31 | mov %i6, %o2 |
| 35 | sys32_sigaltstack: | ||
| 36 | ba,pt %xcc, do_sys32_sigaltstack | ||
| 37 | mov %i6, %o2 | ||
| 38 | #endif | 32 | #endif |
| 39 | .align 32 | 33 | .align 32 |
| 40 | #ifdef CONFIG_COMPAT | 34 | #ifdef CONFIG_COMPAT |
diff --git a/arch/sparc/kernel/systbls.h b/arch/sparc/kernel/systbls.h index 118759cd7342..26e6dd72e92a 100644 --- a/arch/sparc/kernel/systbls.h +++ b/arch/sparc/kernel/systbls.h | |||
| @@ -3,8 +3,8 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/kernel.h> | 4 | #include <linux/kernel.h> |
| 5 | #include <linux/types.h> | 5 | #include <linux/types.h> |
| 6 | #include <linux/signal.h> | ||
| 6 | #include <asm/utrap.h> | 7 | #include <asm/utrap.h> |
| 7 | #include <asm/signal.h> | ||
| 8 | 8 | ||
| 9 | extern asmlinkage unsigned long sys_getpagesize(void); | 9 | extern asmlinkage unsigned long sys_getpagesize(void); |
| 10 | extern asmlinkage long sparc_pipe(struct pt_regs *regs); | 10 | extern asmlinkage long sparc_pipe(struct pt_regs *regs); |
| @@ -36,8 +36,6 @@ extern asmlinkage long sys_rt_sigaction(int sig, | |||
| 36 | 36 | ||
| 37 | extern asmlinkage void sparc64_set_context(struct pt_regs *regs); | 37 | extern asmlinkage void sparc64_set_context(struct pt_regs *regs); |
| 38 | extern asmlinkage void sparc64_get_context(struct pt_regs *regs); | 38 | extern asmlinkage void sparc64_get_context(struct pt_regs *regs); |
| 39 | extern asmlinkage long sys_sigpause(unsigned int set); | ||
| 40 | extern asmlinkage long sys_sigsuspend(old_sigset_t set); | ||
| 41 | extern void do_rt_sigreturn(struct pt_regs *regs); | 39 | extern void do_rt_sigreturn(struct pt_regs *regs); |
| 42 | 40 | ||
| 43 | #endif /* _SYSTBLS_H */ | 41 | #endif /* _SYSTBLS_H */ |
diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 6ac43c36bbbf..7b87171ecf1e 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S | |||
| @@ -55,7 +55,7 @@ sys_call_table: | |||
| 55 | /*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_ni_syscall | 55 | /*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_ni_syscall |
| 56 | /*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname | 56 | /*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname |
| 57 | /*190*/ .long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl | 57 | /*190*/ .long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl |
| 58 | /*195*/ .long sys_epoll_wait, sys_ioprio_set, sys_getppid, sparc_sigaction, sys_sgetmask | 58 | /*195*/ .long sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_sparc_sigaction, sys_sgetmask |
| 59 | /*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, sys_old_readdir | 59 | /*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, sys_old_readdir |
| 60 | /*205*/ .long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 | 60 | /*205*/ .long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64 |
| 61 | /*210*/ .long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo | 61 | /*210*/ .long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo |
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 1009ecb92678..260ddcd412bf 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
| @@ -18,63 +18,63 @@ | |||
| 18 | 18 | ||
| 19 | .globl sys_call_table32 | 19 | .globl sys_call_table32 |
| 20 | sys_call_table32: | 20 | sys_call_table32: |
| 21 | /*0*/ .word sys_restart_syscall, sys32_exit, sys_fork, sys_read, sys_write | 21 | /*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write |
| 22 | /*5*/ .word sys32_open, sys_close, sys32_wait4, sys32_creat, sys_link | 22 | /*5*/ .word compat_sys_open, sys_close, compat_sys_wait4, sys_creat, sys_link |
| 23 | /*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod | 23 | /*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod |
| 24 | /*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys32_lseek | 24 | /*15*/ .word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys_lseek |
| 25 | /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 | 25 | /*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 |
| 26 | /*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys_pause | 26 | /*25*/ .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause |
| 27 | /*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice | 27 | /*30*/ .word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice |
| 28 | .word sys_chown, sys_sync, sys32_kill, compat_sys_newstat, sys32_sendfile | 28 | .word sys_chown, sys_sync, sys_kill, compat_sys_newstat, sys32_sendfile |
| 29 | /*40*/ .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid | 29 | /*40*/ .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid |
| 30 | .word sys32_umount, sys_setgid16, sys_getgid16, sys32_signal, sys_geteuid16 | 30 | .word sys_umount, sys_setgid16, sys_getgid16, sys_signal, sys_geteuid16 |
| 31 | /*50*/ .word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl | 31 | /*50*/ .word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl |
| 32 | .word sys32_reboot, sys32_mmap2, sys_symlink, sys32_readlink, sys32_execve | 32 | .word sys_reboot, sys32_mmap2, sys_symlink, sys_readlink, sys32_execve |
| 33 | /*60*/ .word sys32_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize | 33 | /*60*/ .word sys_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize |
| 34 | .word sys32_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid | 34 | .word sys_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid |
| 35 | /*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect | 35 | /*70*/ .word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect |
| 36 | .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys_getgroups16 | 36 | .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys_getgroups16 |
| 37 | /*80*/ .word sys_setgroups16, sys_getpgrp, sys32_setgroups, sys32_setitimer, sys32_ftruncate64 | 37 | /*80*/ .word sys_setgroups16, sys_getpgrp, sys_setgroups, compat_sys_setitimer, sys32_ftruncate64 |
| 38 | .word sys32_swapon, sys32_getitimer, sys_setuid, sys32_sethostname, sys_setgid | 38 | .word sys_swapon, compat_sys_getitimer, sys_setuid, sys_sethostname, sys_setgid |
| 39 | /*90*/ .word sys_dup2, sys_setfsuid, compat_sys_fcntl, sys32_select, sys_setfsgid | 39 | /*90*/ .word sys_dup2, sys_setfsuid, compat_sys_fcntl, sys32_select, sys_setfsgid |
| 40 | .word sys_fsync, sys32_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall | 40 | .word sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall |
| 41 | /*100*/ .word sys32_getpriority, sys32_rt_sigreturn, sys32_rt_sigaction, sys32_rt_sigprocmask, sys32_rt_sigpending | 41 | /*100*/ .word sys_getpriority, sys32_rt_sigreturn, compat_sys_rt_sigaction, compat_sys_rt_sigprocmask, compat_sys_rt_sigpending |
| 42 | .word compat_sys_rt_sigtimedwait, sys32_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid | 42 | .word compat_sys_rt_sigtimedwait, compat_sys_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid |
| 43 | /*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall | 43 | /*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall |
| 44 | .word sys32_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd | 44 | .word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd |
| 45 | /*120*/ .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod | 45 | /*120*/ .word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod |
| 46 | .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys32_truncate | 46 | .word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys_truncate |
| 47 | /*130*/ .word sys32_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall | 47 | /*130*/ .word sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall |
| 48 | .word sys_nis_syscall, sys32_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 | 48 | .word sys_nis_syscall, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 |
| 49 | /*140*/ .word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit | 49 | /*140*/ .word sys_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit |
| 50 | .word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write | 50 | .word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write |
| 51 | /*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 | 51 | /*150*/ .word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64 |
| 52 | .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount | 52 | .word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount |
| 53 | /*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys32_getdomainname, sys32_setdomainname, sys_nis_syscall | 53 | /*160*/ .word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall |
| 54 | .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys32_setxattr | 54 | .word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys_setxattr |
| 55 | /*170*/ .word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents | 55 | /*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents |
| 56 | .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr | 56 | .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr |
| 57 | /*180*/ .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall | 57 | /*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall |
| 58 | .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sys_newuname | 58 | .word sys_setpgid, sys_fremovexattr, sys_tkill, sparc_exit_group, sys_newuname |
| 59 | /*190*/ .word sys32_init_module, sys_sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl | 59 | /*190*/ .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl |
| 60 | .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask | 60 | .word sys_epoll_wait, sys_ioprio_set, sys_getppid, compat_sys_sparc_sigaction, sys_sgetmask |
| 61 | /*200*/ .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir | 61 | /*200*/ .word sys_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir |
| 62 | .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64 | 62 | .word sys32_readahead, sys32_socketcall, sys_syslog, sys32_lookup_dcookie, sys32_fadvise64 |
| 63 | /*210*/ .word sys32_fadvise64_64, sys32_tgkill, sys32_waitpid, sys_swapoff, compat_sys_sysinfo | 63 | /*210*/ .word sys32_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, compat_sys_sysinfo |
| 64 | .word compat_sys_ipc, sys32_sigreturn, sys_clone, sys32_ioprio_get, compat_sys_adjtimex | 64 | .word compat_sys_ipc, sys32_sigreturn, sys_clone, sys_ioprio_get, compat_sys_adjtimex |
| 65 | /*220*/ .word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid | 65 | /*220*/ .word compat_sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid |
| 66 | .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16 | 66 | .word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16 |
| 67 | /*230*/ .word sys32_select, compat_sys_time, sys32_splice, compat_sys_stime, compat_sys_statfs64 | 67 | /*230*/ .word sys32_select, compat_sys_time, sys_splice, compat_sys_stime, compat_sys_statfs64 |
| 68 | .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys32_mlockall | 68 | .word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall |
| 69 | /*240*/ .word sys_munlockall, sys32_sched_setparam, sys32_sched_getparam, sys32_sched_setscheduler, sys32_sched_getscheduler | 69 | /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler |
| 70 | .word sys_sched_yield, sys32_sched_get_priority_max, sys32_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep | 70 | .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, compat_sys_sched_rr_get_interval, compat_sys_nanosleep |
| 71 | /*250*/ .word sys_mremap, compat_sys_sysctl, sys32_getsid, sys_fdatasync, sys_nis_syscall | 71 | /*250*/ .word sys_mremap, compat_sys_sysctl, sys_getsid, sys_fdatasync, sys_nis_syscall |
| 72 | .word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep | 72 | .word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep |
| 73 | /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun | 73 | /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun |
| 74 | .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy | 74 | .word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy |
| 75 | /*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink | 75 | /*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink |
| 76 | .word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid | 76 | .word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid |
| 77 | /*280*/ .word sys32_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat | 77 | /*280*/ .word sys_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat |
| 78 | .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64 | 78 | .word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64 |
| 79 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat | 79 | /*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat |
| 80 | .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare | 80 | .word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare |
diff --git a/arch/tile/include/asm/compat.h b/arch/tile/include/asm/compat.h index 88f3c227afd9..001d418a8957 100644 --- a/arch/tile/include/asm/compat.h +++ b/arch/tile/include/asm/compat.h | |||
| @@ -272,17 +272,9 @@ extern int compat_setup_rt_frame(int sig, struct k_sigaction *ka, | |||
| 272 | struct pt_regs *regs); | 272 | struct pt_regs *regs); |
| 273 | 273 | ||
| 274 | /* Compat syscalls. */ | 274 | /* Compat syscalls. */ |
| 275 | struct compat_sigaction; | ||
| 276 | struct compat_siginfo; | 275 | struct compat_siginfo; |
| 277 | struct compat_sigaltstack; | 276 | struct compat_sigaltstack; |
| 278 | long compat_sys_rt_sigaction(int sig, struct compat_sigaction __user *act, | ||
| 279 | struct compat_sigaction __user *oact, | ||
| 280 | size_t sigsetsize); | ||
| 281 | long compat_sys_rt_sigqueueinfo(int pid, int sig, | ||
| 282 | struct compat_siginfo __user *uinfo); | ||
| 283 | long compat_sys_rt_sigreturn(void); | 277 | long compat_sys_rt_sigreturn(void); |
| 284 | long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, | ||
| 285 | struct compat_sigaltstack __user *uoss_ptr); | ||
| 286 | long compat_sys_truncate64(char __user *filename, u32 dummy, u32 low, u32 high); | 278 | long compat_sys_truncate64(char __user *filename, u32 dummy, u32 low, u32 high); |
| 287 | long compat_sys_ftruncate64(unsigned int fd, u32 dummy, u32 low, u32 high); | 279 | long compat_sys_ftruncate64(unsigned int fd, u32 dummy, u32 low, u32 high); |
| 288 | long compat_sys_pread64(unsigned int fd, char __user *ubuf, size_t count, | 280 | long compat_sys_pread64(unsigned int fd, char __user *ubuf, size_t count, |
diff --git a/arch/tile/include/asm/syscalls.h b/arch/tile/include/asm/syscalls.h index 4c8462a62cb6..78886e2417a6 100644 --- a/arch/tile/include/asm/syscalls.h +++ b/arch/tile/include/asm/syscalls.h | |||
| @@ -64,9 +64,7 @@ long sys_ftruncate64(unsigned int fd, loff_t length); | |||
| 64 | 64 | ||
| 65 | /* Provide versions of standard syscalls that use current_pt_regs(). */ | 65 | /* Provide versions of standard syscalls that use current_pt_regs(). */ |
| 66 | long sys_rt_sigreturn(void); | 66 | long sys_rt_sigreturn(void); |
| 67 | long sys_sigaltstack(const stack_t __user *, stack_t __user *); | ||
| 68 | #define sys_rt_sigreturn sys_rt_sigreturn | 67 | #define sys_rt_sigreturn sys_rt_sigreturn |
| 69 | #define sys_sigaltstack sys_sigaltstack | ||
| 70 | 68 | ||
| 71 | /* These are the intvec*.S trampolines. */ | 69 | /* These are the intvec*.S trampolines. */ |
| 72 | long _sys_rt_sigreturn(void); | 70 | long _sys_rt_sigreturn(void); |
diff --git a/arch/tile/include/asm/unistd.h b/arch/tile/include/asm/unistd.h index 6ac21034f69a..940831fe9e94 100644 --- a/arch/tile/include/asm/unistd.h +++ b/arch/tile/include/asm/unistd.h | |||
| @@ -14,7 +14,6 @@ | |||
| 14 | /* In compat mode, we use sys_llseek() for compat_sys_llseek(). */ | 14 | /* In compat mode, we use sys_llseek() for compat_sys_llseek(). */ |
| 15 | #ifdef CONFIG_COMPAT | 15 | #ifdef CONFIG_COMPAT |
| 16 | #define __ARCH_WANT_SYS_LLSEEK | 16 | #define __ARCH_WANT_SYS_LLSEEK |
| 17 | #define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL | ||
| 18 | #endif | 17 | #endif |
| 19 | #define __ARCH_WANT_SYS_NEWFSTATAT | 18 | #define __ARCH_WANT_SYS_NEWFSTATAT |
| 20 | #define __ARCH_WANT_SYS_CLONE | 19 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c index 2e4cc69224a6..d0a052e725be 100644 --- a/arch/tile/kernel/compat_signal.c +++ b/arch/tile/kernel/compat_signal.c | |||
| @@ -34,19 +34,6 @@ | |||
| 34 | #include <asm/syscalls.h> | 34 | #include <asm/syscalls.h> |
| 35 | #include <arch/interrupts.h> | 35 | #include <arch/interrupts.h> |
| 36 | 36 | ||
| 37 | struct compat_sigaction { | ||
| 38 | compat_uptr_t sa_handler; | ||
| 39 | compat_ulong_t sa_flags; | ||
| 40 | compat_uptr_t sa_restorer; | ||
| 41 | sigset_t sa_mask __packed; | ||
| 42 | }; | ||
| 43 | |||
| 44 | struct compat_sigaltstack { | ||
| 45 | compat_uptr_t ss_sp; | ||
| 46 | int ss_flags; | ||
| 47 | compat_size_t ss_size; | ||
| 48 | }; | ||
| 49 | |||
| 50 | struct compat_ucontext { | 37 | struct compat_ucontext { |
| 51 | compat_ulong_t uc_flags; | 38 | compat_ulong_t uc_flags; |
| 52 | compat_uptr_t uc_link; | 39 | compat_uptr_t uc_link; |
| @@ -61,63 +48,6 @@ struct compat_rt_sigframe { | |||
| 61 | struct compat_ucontext uc; | 48 | struct compat_ucontext uc; |
| 62 | }; | 49 | }; |
| 63 | 50 | ||
| 64 | long compat_sys_rt_sigaction(int sig, struct compat_sigaction __user *act, | ||
| 65 | struct compat_sigaction __user *oact, | ||
| 66 | size_t sigsetsize) | ||
| 67 | { | ||
| 68 | struct k_sigaction new_sa, old_sa; | ||
| 69 | int ret = -EINVAL; | ||
| 70 | |||
| 71 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 72 | if (sigsetsize != sizeof(sigset_t)) | ||
| 73 | goto out; | ||
| 74 | |||
| 75 | if (act) { | ||
| 76 | compat_uptr_t handler, restorer; | ||
| 77 | |||
| 78 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 79 | __get_user(handler, &act->sa_handler) || | ||
| 80 | __get_user(new_sa.sa.sa_flags, &act->sa_flags) || | ||
| 81 | __get_user(restorer, &act->sa_restorer) || | ||
| 82 | __copy_from_user(&new_sa.sa.sa_mask, &act->sa_mask, | ||
| 83 | sizeof(sigset_t))) | ||
| 84 | return -EFAULT; | ||
| 85 | new_sa.sa.sa_handler = compat_ptr(handler); | ||
| 86 | new_sa.sa.sa_restorer = compat_ptr(restorer); | ||
| 87 | } | ||
| 88 | |||
| 89 | ret = do_sigaction(sig, act ? &new_sa : NULL, oact ? &old_sa : NULL); | ||
| 90 | |||
| 91 | if (!ret && oact) { | ||
| 92 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 93 | __put_user(ptr_to_compat(old_sa.sa.sa_handler), | ||
| 94 | &oact->sa_handler) || | ||
| 95 | __put_user(ptr_to_compat(old_sa.sa.sa_restorer), | ||
| 96 | &oact->sa_restorer) || | ||
| 97 | __put_user(old_sa.sa.sa_flags, &oact->sa_flags) || | ||
| 98 | __copy_to_user(&oact->sa_mask, &old_sa.sa.sa_mask, | ||
| 99 | sizeof(sigset_t))) | ||
| 100 | return -EFAULT; | ||
| 101 | } | ||
| 102 | out: | ||
| 103 | return ret; | ||
| 104 | } | ||
| 105 | |||
| 106 | long compat_sys_rt_sigqueueinfo(int pid, int sig, | ||
| 107 | struct compat_siginfo __user *uinfo) | ||
| 108 | { | ||
| 109 | siginfo_t info; | ||
| 110 | int ret; | ||
| 111 | mm_segment_t old_fs = get_fs(); | ||
| 112 | |||
| 113 | if (copy_siginfo_from_user32(&info, uinfo)) | ||
| 114 | return -EFAULT; | ||
| 115 | set_fs(KERNEL_DS); | ||
| 116 | ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __force __user *)&info); | ||
| 117 | set_fs(old_fs); | ||
| 118 | return ret; | ||
| 119 | } | ||
| 120 | |||
| 121 | int copy_siginfo_to_user32(struct compat_siginfo __user *to, siginfo_t *from) | 51 | int copy_siginfo_to_user32(struct compat_siginfo __user *to, siginfo_t *from) |
| 122 | { | 52 | { |
| 123 | int err; | 53 | int err; |
| @@ -196,40 +126,6 @@ int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from) | |||
| 196 | return err; | 126 | return err; |
| 197 | } | 127 | } |
| 198 | 128 | ||
| 199 | long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr, | ||
| 200 | struct compat_sigaltstack __user *uoss_ptr) | ||
| 201 | { | ||
| 202 | stack_t uss, uoss; | ||
| 203 | int ret; | ||
| 204 | mm_segment_t seg; | ||
| 205 | |||
| 206 | if (uss_ptr) { | ||
| 207 | u32 ptr; | ||
| 208 | |||
| 209 | memset(&uss, 0, sizeof(stack_t)); | ||
| 210 | if (!access_ok(VERIFY_READ, uss_ptr, sizeof(*uss_ptr)) || | ||
| 211 | __get_user(ptr, &uss_ptr->ss_sp) || | ||
| 212 | __get_user(uss.ss_flags, &uss_ptr->ss_flags) || | ||
| 213 | __get_user(uss.ss_size, &uss_ptr->ss_size)) | ||
| 214 | return -EFAULT; | ||
| 215 | uss.ss_sp = compat_ptr(ptr); | ||
| 216 | } | ||
| 217 | seg = get_fs(); | ||
| 218 | set_fs(KERNEL_DS); | ||
| 219 | ret = do_sigaltstack(uss_ptr ? (stack_t __user __force *)&uss : NULL, | ||
| 220 | (stack_t __user __force *)&uoss, | ||
| 221 | (unsigned long)compat_ptr(current_pt_regs()->sp)); | ||
| 222 | set_fs(seg); | ||
| 223 | if (ret >= 0 && uoss_ptr) { | ||
| 224 | if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(*uoss_ptr)) || | ||
| 225 | __put_user(ptr_to_compat(uoss.ss_sp), &uoss_ptr->ss_sp) || | ||
| 226 | __put_user(uoss.ss_flags, &uoss_ptr->ss_flags) || | ||
| 227 | __put_user(uoss.ss_size, &uoss_ptr->ss_size)) | ||
| 228 | ret = -EFAULT; | ||
| 229 | } | ||
| 230 | return ret; | ||
| 231 | } | ||
| 232 | |||
| 233 | /* The assembly shim for this function arranges to ignore the return value. */ | 129 | /* The assembly shim for this function arranges to ignore the return value. */ |
| 234 | long compat_sys_rt_sigreturn(void) | 130 | long compat_sys_rt_sigreturn(void) |
| 235 | { | 131 | { |
| @@ -248,7 +144,7 @@ long compat_sys_rt_sigreturn(void) | |||
| 248 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) | 144 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) |
| 249 | goto badframe; | 145 | goto badframe; |
| 250 | 146 | ||
| 251 | if (compat_sys_sigaltstack(&frame->uc.uc_stack, NULL) == -EFAULT) | 147 | if (compat_restore_altstack(&frame->uc.uc_stack)) |
| 252 | goto badframe; | 148 | goto badframe; |
| 253 | 149 | ||
| 254 | return 0; | 150 | return 0; |
| @@ -325,11 +221,7 @@ int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 325 | err |= __clear_user(&frame->save_area, sizeof(frame->save_area)); | 221 | err |= __clear_user(&frame->save_area, sizeof(frame->save_area)); |
| 326 | err |= __put_user(0, &frame->uc.uc_flags); | 222 | err |= __put_user(0, &frame->uc.uc_flags); |
| 327 | err |= __put_user(0, &frame->uc.uc_link); | 223 | err |= __put_user(0, &frame->uc.uc_link); |
| 328 | err |= __put_user(ptr_to_compat((void *)(current->sas_ss_sp)), | 224 | err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); |
| 329 | &frame->uc.uc_stack.ss_sp); | ||
| 330 | err |= __put_user(sas_ss_flags(regs->sp), | ||
| 331 | &frame->uc.uc_stack.ss_flags); | ||
| 332 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 333 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs); | 225 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs); |
| 334 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 226 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 335 | if (err) | 227 | if (err) |
diff --git a/arch/tile/kernel/signal.c b/arch/tile/kernel/signal.c index 657a7ace4ab4..9531845bf661 100644 --- a/arch/tile/kernel/signal.c +++ b/arch/tile/kernel/signal.c | |||
| @@ -37,13 +37,6 @@ | |||
| 37 | 37 | ||
| 38 | #define DEBUG_SIG 0 | 38 | #define DEBUG_SIG 0 |
| 39 | 39 | ||
| 40 | SYSCALL_DEFINE2(sigaltstack, const stack_t __user *, uss, | ||
| 41 | stack_t __user *, uoss) | ||
| 42 | { | ||
| 43 | return do_sigaltstack(uss, uoss, current_pt_regs()->sp); | ||
| 44 | } | ||
| 45 | |||
| 46 | |||
| 47 | /* | 40 | /* |
| 48 | * Do a signal return; undo the signal stack. | 41 | * Do a signal return; undo the signal stack. |
| 49 | */ | 42 | */ |
| @@ -100,7 +93,7 @@ SYSCALL_DEFINE0(rt_sigreturn) | |||
| 100 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) | 93 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) |
| 101 | goto badframe; | 94 | goto badframe; |
| 102 | 95 | ||
| 103 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) | 96 | if (restore_altstack(&frame->uc.uc_stack)) |
| 104 | goto badframe; | 97 | goto badframe; |
| 105 | 98 | ||
| 106 | return 0; | 99 | return 0; |
| @@ -191,11 +184,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 191 | err |= __clear_user(&frame->save_area, sizeof(frame->save_area)); | 184 | err |= __clear_user(&frame->save_area, sizeof(frame->save_area)); |
| 192 | err |= __put_user(0, &frame->uc.uc_flags); | 185 | err |= __put_user(0, &frame->uc.uc_flags); |
| 193 | err |= __put_user(NULL, &frame->uc.uc_link); | 186 | err |= __put_user(NULL, &frame->uc.uc_link); |
| 194 | err |= __put_user((void __user *)(current->sas_ss_sp), | 187 | err |= __save_altstack(&frame->uc.uc_stack, regs->sp); |
| 195 | &frame->uc.uc_stack.ss_sp); | ||
| 196 | err |= __put_user(sas_ss_flags(regs->sp), | ||
| 197 | &frame->uc.uc_stack.ss_flags); | ||
| 198 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 199 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs); | 188 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs); |
| 200 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 189 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 201 | if (err) | 190 | if (err) |
diff --git a/arch/um/kernel/signal.c b/arch/um/kernel/signal.c index 48ccf718e290..3e831b3fd07b 100644 --- a/arch/um/kernel/signal.c +++ b/arch/um/kernel/signal.c | |||
| @@ -122,13 +122,3 @@ int do_signal(void) | |||
| 122 | { | 122 | { |
| 123 | return kern_do_signal(¤t->thread.regs); | 123 | return kern_do_signal(¤t->thread.regs); |
| 124 | } | 124 | } |
| 125 | |||
| 126 | /* | ||
| 127 | * Atomically swap in the new signal mask, and wait for a signal. | ||
| 128 | */ | ||
| 129 | long sys_sigsuspend(int history0, int history1, old_sigset_t mask) | ||
| 130 | { | ||
| 131 | sigset_t blocked; | ||
| 132 | siginitset(&blocked, mask); | ||
| 133 | return sigsuspend(&blocked); | ||
| 134 | } | ||
diff --git a/arch/unicore32/kernel/entry.S b/arch/unicore32/kernel/entry.S index 581630d91444..bcdedd80890e 100644 --- a/arch/unicore32/kernel/entry.S +++ b/arch/unicore32/kernel/entry.S | |||
| @@ -674,11 +674,6 @@ ENTRY(sys_rt_sigreturn) | |||
| 674 | b __sys_rt_sigreturn | 674 | b __sys_rt_sigreturn |
| 675 | ENDPROC(sys_rt_sigreturn) | 675 | ENDPROC(sys_rt_sigreturn) |
| 676 | 676 | ||
| 677 | ENTRY(sys_sigaltstack) | ||
| 678 | ldw r2, [sp+], #S_OFF + S_SP | ||
| 679 | b do_sigaltstack | ||
| 680 | ENDPROC(sys_sigaltstack) | ||
| 681 | |||
| 682 | __INIT | 677 | __INIT |
| 683 | 678 | ||
| 684 | /* | 679 | /* |
diff --git a/arch/unicore32/kernel/signal.c b/arch/unicore32/kernel/signal.c index b8b2ffd774d6..6905f0ebdc77 100644 --- a/arch/unicore32/kernel/signal.c +++ b/arch/unicore32/kernel/signal.c | |||
| @@ -123,8 +123,7 @@ asmlinkage int __sys_rt_sigreturn(struct pt_regs *regs) | |||
| 123 | if (restore_sigframe(regs, &frame->sig)) | 123 | if (restore_sigframe(regs, &frame->sig)) |
| 124 | goto badframe; | 124 | goto badframe; |
| 125 | 125 | ||
| 126 | if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->UCreg_sp) | 126 | if (restore_altstack(&frame->sig.uc.uc_stack)) |
| 127 | == -EFAULT) | ||
| 128 | goto badframe; | 127 | goto badframe; |
| 129 | 128 | ||
| 130 | return regs->UCreg_00; | 129 | return regs->UCreg_00; |
| @@ -265,7 +264,6 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, | |||
| 265 | { | 264 | { |
| 266 | struct rt_sigframe __user *frame = | 265 | struct rt_sigframe __user *frame = |
| 267 | get_sigframe(ka, regs, sizeof(*frame)); | 266 | get_sigframe(ka, regs, sizeof(*frame)); |
| 268 | stack_t stack; | ||
| 269 | int err = 0; | 267 | int err = 0; |
| 270 | 268 | ||
| 271 | if (!frame) | 269 | if (!frame) |
| @@ -275,13 +273,7 @@ static int setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, | |||
| 275 | 273 | ||
| 276 | err |= __put_user(0, &frame->sig.uc.uc_flags); | 274 | err |= __put_user(0, &frame->sig.uc.uc_flags); |
| 277 | err |= __put_user(NULL, &frame->sig.uc.uc_link); | 275 | err |= __put_user(NULL, &frame->sig.uc.uc_link); |
| 278 | 276 | err |= __save_altstack(&frame->sig.uc.uc_stack, regs->UCreg_sp); | |
| 279 | memset(&stack, 0, sizeof(stack)); | ||
| 280 | stack.ss_sp = (void __user *)current->sas_ss_sp; | ||
| 281 | stack.ss_flags = sas_ss_flags(regs->UCreg_sp); | ||
| 282 | stack.ss_size = current->sas_ss_size; | ||
| 283 | err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack)); | ||
| 284 | |||
| 285 | err |= setup_sigframe(&frame->sig, regs, set); | 277 | err |= setup_sigframe(&frame->sig, regs, set); |
| 286 | if (err == 0) | 278 | if (err == 0) |
| 287 | err |= setup_return(regs, ka, frame->sig.retcode, frame, usig); | 279 | err |= setup_return(regs, ka, frame->sig.retcode, frame, usig); |
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 | } | ||
diff --git a/arch/xtensa/include/asm/signal.h b/arch/xtensa/include/asm/signal.h index 6f586bd90e18..de169b4eaeef 100644 --- a/arch/xtensa/include/asm/signal.h +++ b/arch/xtensa/include/asm/signal.h | |||
| @@ -15,16 +15,7 @@ | |||
| 15 | #include <uapi/asm/signal.h> | 15 | #include <uapi/asm/signal.h> |
| 16 | 16 | ||
| 17 | #ifndef __ASSEMBLY__ | 17 | #ifndef __ASSEMBLY__ |
| 18 | struct sigaction { | 18 | #define __ARCH_HAS_SA_RESTORER |
| 19 | __sighandler_t sa_handler; | ||
| 20 | unsigned long sa_flags; | ||
| 21 | void (*sa_restorer)(void); | ||
| 22 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 23 | }; | ||
| 24 | |||
| 25 | struct k_sigaction { | ||
| 26 | struct sigaction sa; | ||
| 27 | }; | ||
| 28 | 19 | ||
| 29 | #include <asm/sigcontext.h> | 20 | #include <asm/sigcontext.h> |
| 30 | 21 | ||
diff --git a/arch/xtensa/include/asm/syscall.h b/arch/xtensa/include/asm/syscall.h index 8d5e47fad095..3673ff1f1bc5 100644 --- a/arch/xtensa/include/asm/syscall.h +++ b/arch/xtensa/include/asm/syscall.h | |||
| @@ -9,15 +9,9 @@ | |||
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | struct pt_regs; | 11 | struct pt_regs; |
| 12 | struct sigaction; | ||
| 13 | asmlinkage long xtensa_ptrace(long, long, long, long); | 12 | asmlinkage long xtensa_ptrace(long, long, long, long); |
| 14 | asmlinkage long xtensa_sigreturn(struct pt_regs*); | 13 | asmlinkage long xtensa_sigreturn(struct pt_regs*); |
| 15 | asmlinkage long xtensa_rt_sigreturn(struct pt_regs*); | 14 | asmlinkage long xtensa_rt_sigreturn(struct pt_regs*); |
| 16 | asmlinkage long xtensa_sigaltstack(struct pt_regs *regs); | ||
| 17 | asmlinkage long sys_rt_sigaction(int, | ||
| 18 | const struct sigaction __user *, | ||
| 19 | struct sigaction __user *, | ||
| 20 | size_t); | ||
| 21 | asmlinkage long xtensa_shmat(int, char __user *, int); | 15 | asmlinkage long xtensa_shmat(int, char __user *, int); |
| 22 | asmlinkage long xtensa_fadvise64_64(int, int, | 16 | asmlinkage long xtensa_fadvise64_64(int, int, |
| 23 | unsigned long long, unsigned long long); | 17 | unsigned long long, unsigned long long); |
| @@ -31,4 +25,3 @@ asmlinkage long sys_ppoll(struct pollfd __user *ufds, unsigned int nfds, | |||
| 31 | struct timespec __user *tsp, | 25 | struct timespec __user *tsp, |
| 32 | const sigset_t __user *sigmask, | 26 | const sigset_t __user *sigmask, |
| 33 | size_t sigsetsize); | 27 | size_t sigsetsize); |
| 34 | asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize); | ||
diff --git a/arch/xtensa/include/asm/unistd.h b/arch/xtensa/include/asm/unistd.h index eb63ea87815c..c38834de9ac7 100644 --- a/arch/xtensa/include/asm/unistd.h +++ b/arch/xtensa/include/asm/unistd.h | |||
| @@ -15,8 +15,6 @@ | |||
| 15 | #define __ARCH_WANT_STAT64 | 15 | #define __ARCH_WANT_STAT64 |
| 16 | #define __ARCH_WANT_SYS_UTIME | 16 | #define __ARCH_WANT_SYS_UTIME |
| 17 | #define __ARCH_WANT_SYS_LLSEEK | 17 | #define __ARCH_WANT_SYS_LLSEEK |
| 18 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 19 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 20 | #define __ARCH_WANT_SYS_GETPGRP | 18 | #define __ARCH_WANT_SYS_GETPGRP |
| 21 | 19 | ||
| 22 | /* | 20 | /* |
diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h index 5162418c5d90..19fac3f543a2 100644 --- a/arch/xtensa/include/uapi/asm/unistd.h +++ b/arch/xtensa/include/uapi/asm/unistd.h | |||
| @@ -483,7 +483,7 @@ __SYSCALL(222, sys_ni_syscall, 0) | |||
| 483 | #define __NR_restart_syscall 223 | 483 | #define __NR_restart_syscall 223 |
| 484 | __SYSCALL(223, sys_restart_syscall, 0) | 484 | __SYSCALL(223, sys_restart_syscall, 0) |
| 485 | #define __NR_sigaltstack 224 | 485 | #define __NR_sigaltstack 224 |
| 486 | __SYSCALL(224, xtensa_sigaltstack, 2) | 486 | __SYSCALL(224, sys_sigaltstack, 2) |
| 487 | #define __NR_rt_sigreturn 225 | 487 | #define __NR_rt_sigreturn 225 |
| 488 | __SYSCALL(225, xtensa_rt_sigreturn, 1) | 488 | __SYSCALL(225, xtensa_rt_sigreturn, 1) |
| 489 | #define __NR_rt_sigaction 226 | 489 | #define __NR_rt_sigaction 226 |
diff --git a/arch/xtensa/kernel/signal.c b/arch/xtensa/kernel/signal.c index de34d6be91cd..d7590dddd084 100644 --- a/arch/xtensa/kernel/signal.c +++ b/arch/xtensa/kernel/signal.c | |||
| @@ -265,7 +265,7 @@ asmlinkage long xtensa_rt_sigreturn(long a0, long a1, long a2, long a3, | |||
| 265 | 265 | ||
| 266 | ret = regs->areg[2]; | 266 | ret = regs->areg[2]; |
| 267 | 267 | ||
| 268 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->areg[1]) == -EFAULT) | 268 | if (restore_altstack(&frame->uc.uc_stack)) |
| 269 | goto badframe; | 269 | goto badframe; |
| 270 | 270 | ||
| 271 | return ret; | 271 | return ret; |
| @@ -368,11 +368,7 @@ static int setup_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 368 | 368 | ||
| 369 | err |= __put_user(0, &frame->uc.uc_flags); | 369 | err |= __put_user(0, &frame->uc.uc_flags); |
| 370 | err |= __put_user(0, &frame->uc.uc_link); | 370 | err |= __put_user(0, &frame->uc.uc_link); |
| 371 | err |= __put_user((void *)current->sas_ss_sp, | 371 | err |= __save_altstack(&frame->uc.uc_stack, regs->areg[1]); |
| 372 | &frame->uc.uc_stack.ss_sp); | ||
| 373 | err |= __put_user(sas_ss_flags(regs->areg[1]), | ||
| 374 | &frame->uc.uc_stack.ss_flags); | ||
| 375 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 376 | err |= setup_sigcontext(frame, regs); | 372 | err |= setup_sigcontext(frame, regs); |
| 377 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 373 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 378 | 374 | ||
| @@ -424,16 +420,6 @@ give_sigsegv: | |||
| 424 | return -EFAULT; | 420 | return -EFAULT; |
| 425 | } | 421 | } |
| 426 | 422 | ||
| 427 | asmlinkage long xtensa_sigaltstack(const stack_t __user *uss, | ||
| 428 | stack_t __user *uoss, | ||
| 429 | long a2, long a3, long a4, long a5, | ||
| 430 | struct pt_regs *regs) | ||
| 431 | { | ||
| 432 | return do_sigaltstack(uss, uoss, regs->areg[1]); | ||
| 433 | } | ||
| 434 | |||
| 435 | |||
| 436 | |||
| 437 | /* | 423 | /* |
| 438 | * Note that 'init' is a special process: it doesn't get signals it doesn't | 424 | * Note that 'init' is a special process: it doesn't get signals it doesn't |
| 439 | * want to handle. Thus you cannot kill init even with a SIGKILL even by | 425 | * want to handle. Thus you cannot kill init even with a SIGKILL even by |
diff --git a/fs/compat.c b/fs/compat.c index 015e1e1f87c6..fe40fde29111 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -1278,8 +1278,7 @@ compat_sys_vmsplice(int fd, const struct compat_iovec __user *iov32, | |||
| 1278 | * Exactly like fs/open.c:sys_open(), except that it doesn't set the | 1278 | * Exactly like fs/open.c:sys_open(), except that it doesn't set the |
| 1279 | * O_LARGEFILE flag. | 1279 | * O_LARGEFILE flag. |
| 1280 | */ | 1280 | */ |
| 1281 | asmlinkage long | 1281 | COMPAT_SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) |
| 1282 | compat_sys_open(const char __user *filename, int flags, umode_t mode) | ||
| 1283 | { | 1282 | { |
| 1284 | return do_sys_open(AT_FDCWD, filename, flags, mode); | 1283 | return do_sys_open(AT_FDCWD, filename, flags, mode); |
| 1285 | } | 1284 | } |
| @@ -1288,8 +1287,7 @@ compat_sys_open(const char __user *filename, int flags, umode_t mode) | |||
| 1288 | * Exactly like fs/open.c:sys_openat(), except that it doesn't set the | 1287 | * Exactly like fs/open.c:sys_openat(), except that it doesn't set the |
| 1289 | * O_LARGEFILE flag. | 1288 | * O_LARGEFILE flag. |
| 1290 | */ | 1289 | */ |
| 1291 | asmlinkage long | 1290 | COMPAT_SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags, umode_t, mode) |
| 1292 | compat_sys_openat(unsigned int dfd, const char __user *filename, int flags, umode_t mode) | ||
| 1293 | { | 1291 | { |
| 1294 | return do_sys_open(dfd, filename, flags, mode); | 1292 | return do_sys_open(dfd, filename, flags, mode); |
| 1295 | } | 1293 | } |
| @@ -1739,55 +1737,13 @@ asmlinkage long compat_sys_signalfd(int ufd, | |||
| 1739 | } | 1737 | } |
| 1740 | #endif /* CONFIG_SIGNALFD */ | 1738 | #endif /* CONFIG_SIGNALFD */ |
| 1741 | 1739 | ||
| 1742 | #ifdef CONFIG_TIMERFD | ||
| 1743 | |||
| 1744 | asmlinkage long compat_sys_timerfd_settime(int ufd, int flags, | ||
| 1745 | const struct compat_itimerspec __user *utmr, | ||
| 1746 | struct compat_itimerspec __user *otmr) | ||
| 1747 | { | ||
| 1748 | int error; | ||
| 1749 | struct itimerspec t; | ||
| 1750 | struct itimerspec __user *ut; | ||
| 1751 | |||
| 1752 | if (get_compat_itimerspec(&t, utmr)) | ||
| 1753 | return -EFAULT; | ||
| 1754 | ut = compat_alloc_user_space(2 * sizeof(struct itimerspec)); | ||
| 1755 | if (copy_to_user(&ut[0], &t, sizeof(t))) | ||
| 1756 | return -EFAULT; | ||
| 1757 | error = sys_timerfd_settime(ufd, flags, &ut[0], &ut[1]); | ||
| 1758 | if (!error && otmr) | ||
| 1759 | error = (copy_from_user(&t, &ut[1], sizeof(struct itimerspec)) || | ||
| 1760 | put_compat_itimerspec(otmr, &t)) ? -EFAULT: 0; | ||
| 1761 | |||
| 1762 | return error; | ||
| 1763 | } | ||
| 1764 | |||
| 1765 | asmlinkage long compat_sys_timerfd_gettime(int ufd, | ||
| 1766 | struct compat_itimerspec __user *otmr) | ||
| 1767 | { | ||
| 1768 | int error; | ||
| 1769 | struct itimerspec t; | ||
| 1770 | struct itimerspec __user *ut; | ||
| 1771 | |||
| 1772 | ut = compat_alloc_user_space(sizeof(struct itimerspec)); | ||
| 1773 | error = sys_timerfd_gettime(ufd, ut); | ||
| 1774 | if (!error) | ||
| 1775 | error = (copy_from_user(&t, ut, sizeof(struct itimerspec)) || | ||
| 1776 | put_compat_itimerspec(otmr, &t)) ? -EFAULT: 0; | ||
| 1777 | |||
| 1778 | return error; | ||
| 1779 | } | ||
| 1780 | |||
| 1781 | #endif /* CONFIG_TIMERFD */ | ||
| 1782 | |||
| 1783 | #ifdef CONFIG_FHANDLE | 1740 | #ifdef CONFIG_FHANDLE |
| 1784 | /* | 1741 | /* |
| 1785 | * Exactly like fs/open.c:sys_open_by_handle_at(), except that it | 1742 | * Exactly like fs/open.c:sys_open_by_handle_at(), except that it |
| 1786 | * doesn't set the O_LARGEFILE flag. | 1743 | * doesn't set the O_LARGEFILE flag. |
| 1787 | */ | 1744 | */ |
| 1788 | asmlinkage long | 1745 | COMPAT_SYSCALL_DEFINE3(open_by_handle_at, int, mountdirfd, |
| 1789 | compat_sys_open_by_handle_at(int mountdirfd, | 1746 | struct file_handle __user *, handle, int, flags) |
| 1790 | struct file_handle __user *handle, int flags) | ||
| 1791 | { | 1747 | { |
| 1792 | return do_handle_open(mountdirfd, handle, flags); | 1748 | return do_handle_open(mountdirfd, handle, flags); |
| 1793 | } | 1749 | } |
diff --git a/fs/timerfd.c b/fs/timerfd.c index d03822bbf190..0e606b12a59d 100644 --- a/fs/timerfd.c +++ b/fs/timerfd.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/anon_inodes.h> | 22 | #include <linux/anon_inodes.h> |
| 23 | #include <linux/timerfd.h> | 23 | #include <linux/timerfd.h> |
| 24 | #include <linux/syscalls.h> | 24 | #include <linux/syscalls.h> |
| 25 | #include <linux/compat.h> | ||
| 25 | #include <linux/rcupdate.h> | 26 | #include <linux/rcupdate.h> |
| 26 | 27 | ||
| 27 | struct timerfd_ctx { | 28 | struct timerfd_ctx { |
| @@ -278,21 +279,17 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags) | |||
| 278 | return ufd; | 279 | return ufd; |
| 279 | } | 280 | } |
| 280 | 281 | ||
| 281 | SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags, | 282 | static int do_timerfd_settime(int ufd, int flags, |
| 282 | const struct itimerspec __user *, utmr, | 283 | const struct itimerspec *new, |
| 283 | struct itimerspec __user *, otmr) | 284 | struct itimerspec *old) |
| 284 | { | 285 | { |
| 285 | struct fd f; | 286 | struct fd f; |
| 286 | struct timerfd_ctx *ctx; | 287 | struct timerfd_ctx *ctx; |
| 287 | struct itimerspec ktmr, kotmr; | ||
| 288 | int ret; | 288 | int ret; |
| 289 | 289 | ||
| 290 | if (copy_from_user(&ktmr, utmr, sizeof(ktmr))) | ||
| 291 | return -EFAULT; | ||
| 292 | |||
| 293 | if ((flags & ~TFD_SETTIME_FLAGS) || | 290 | if ((flags & ~TFD_SETTIME_FLAGS) || |
| 294 | !timespec_valid(&ktmr.it_value) || | 291 | !timespec_valid(&new->it_value) || |
| 295 | !timespec_valid(&ktmr.it_interval)) | 292 | !timespec_valid(&new->it_interval)) |
| 296 | return -EINVAL; | 293 | return -EINVAL; |
| 297 | 294 | ||
| 298 | ret = timerfd_fget(ufd, &f); | 295 | ret = timerfd_fget(ufd, &f); |
| @@ -323,27 +320,23 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags, | |||
| 323 | if (ctx->expired && ctx->tintv.tv64) | 320 | if (ctx->expired && ctx->tintv.tv64) |
| 324 | hrtimer_forward_now(&ctx->tmr, ctx->tintv); | 321 | hrtimer_forward_now(&ctx->tmr, ctx->tintv); |
| 325 | 322 | ||
| 326 | kotmr.it_value = ktime_to_timespec(timerfd_get_remaining(ctx)); | 323 | old->it_value = ktime_to_timespec(timerfd_get_remaining(ctx)); |
| 327 | kotmr.it_interval = ktime_to_timespec(ctx->tintv); | 324 | old->it_interval = ktime_to_timespec(ctx->tintv); |
| 328 | 325 | ||
| 329 | /* | 326 | /* |
| 330 | * Re-program the timer to the new value ... | 327 | * Re-program the timer to the new value ... |
| 331 | */ | 328 | */ |
| 332 | ret = timerfd_setup(ctx, flags, &ktmr); | 329 | ret = timerfd_setup(ctx, flags, new); |
| 333 | 330 | ||
| 334 | spin_unlock_irq(&ctx->wqh.lock); | 331 | spin_unlock_irq(&ctx->wqh.lock); |
| 335 | fdput(f); | 332 | fdput(f); |
| 336 | if (otmr && copy_to_user(otmr, &kotmr, sizeof(kotmr))) | ||
| 337 | return -EFAULT; | ||
| 338 | |||
| 339 | return ret; | 333 | return ret; |
| 340 | } | 334 | } |
| 341 | 335 | ||
| 342 | SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr) | 336 | static int do_timerfd_gettime(int ufd, struct itimerspec *t) |
| 343 | { | 337 | { |
| 344 | struct fd f; | 338 | struct fd f; |
| 345 | struct timerfd_ctx *ctx; | 339 | struct timerfd_ctx *ctx; |
| 346 | struct itimerspec kotmr; | ||
| 347 | int ret = timerfd_fget(ufd, &f); | 340 | int ret = timerfd_fget(ufd, &f); |
| 348 | if (ret) | 341 | if (ret) |
| 349 | return ret; | 342 | return ret; |
| @@ -356,11 +349,65 @@ SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr) | |||
| 356 | hrtimer_forward_now(&ctx->tmr, ctx->tintv) - 1; | 349 | hrtimer_forward_now(&ctx->tmr, ctx->tintv) - 1; |
| 357 | hrtimer_restart(&ctx->tmr); | 350 | hrtimer_restart(&ctx->tmr); |
| 358 | } | 351 | } |
| 359 | kotmr.it_value = ktime_to_timespec(timerfd_get_remaining(ctx)); | 352 | t->it_value = ktime_to_timespec(timerfd_get_remaining(ctx)); |
| 360 | kotmr.it_interval = ktime_to_timespec(ctx->tintv); | 353 | t->it_interval = ktime_to_timespec(ctx->tintv); |
| 361 | spin_unlock_irq(&ctx->wqh.lock); | 354 | spin_unlock_irq(&ctx->wqh.lock); |
| 362 | fdput(f); | 355 | fdput(f); |
| 356 | return 0; | ||
| 357 | } | ||
| 358 | |||
| 359 | SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags, | ||
| 360 | const struct itimerspec __user *, utmr, | ||
| 361 | struct itimerspec __user *, otmr) | ||
| 362 | { | ||
| 363 | struct itimerspec new, old; | ||
| 364 | int ret; | ||
| 365 | |||
| 366 | if (copy_from_user(&new, utmr, sizeof(new))) | ||
| 367 | return -EFAULT; | ||
| 368 | ret = do_timerfd_settime(ufd, flags, &new, &old); | ||
| 369 | if (ret) | ||
| 370 | return ret; | ||
| 371 | if (otmr && copy_to_user(otmr, &old, sizeof(old))) | ||
| 372 | return -EFAULT; | ||
| 373 | |||
| 374 | return ret; | ||
| 375 | } | ||
| 363 | 376 | ||
| 377 | SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr) | ||
| 378 | { | ||
| 379 | struct itimerspec kotmr; | ||
| 380 | int ret = do_timerfd_gettime(ufd, &kotmr); | ||
| 381 | if (ret) | ||
| 382 | return ret; | ||
| 364 | return copy_to_user(otmr, &kotmr, sizeof(kotmr)) ? -EFAULT: 0; | 383 | return copy_to_user(otmr, &kotmr, sizeof(kotmr)) ? -EFAULT: 0; |
| 365 | } | 384 | } |
| 366 | 385 | ||
| 386 | #ifdef COMPAT | ||
| 387 | COMPAT_SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags, | ||
| 388 | const struct itimerspec __user *, utmr, | ||
| 389 | struct itimerspec __user *, otmr) | ||
| 390 | { | ||
| 391 | struct itimerspec new, old; | ||
| 392 | int ret; | ||
| 393 | |||
| 394 | if (get_compat_itimerspec(&new, utmr)) | ||
| 395 | return -EFAULT; | ||
| 396 | ret = do_timerfd_settime(ufd, flags, &new, &old); | ||
| 397 | if (ret) | ||
| 398 | return ret; | ||
| 399 | if (otmr && put_compat_itimerspec(otmr, &old)) | ||
| 400 | return -EFAULT; | ||
| 401 | return ret; | ||
| 402 | } | ||
| 403 | |||
| 404 | COMPAT_SYSCALL_DEFINE2(timerfd_gettime, int, ufd, | ||
| 405 | struct itimerspec __user *, otmr) | ||
| 406 | { | ||
| 407 | struct itimerspec kotmr; | ||
| 408 | int ret = do_timerfd_gettime(ufd, &kotmr); | ||
| 409 | if (ret) | ||
| 410 | return ret; | ||
| 411 | return put_compat_itimerspec(otmr, &t) ? -EFAULT: 0; | ||
| 412 | } | ||
| 413 | #endif | ||
diff --git a/include/asm-generic/syscalls.h b/include/asm-generic/syscalls.h index 1db51b8524e9..1f74be5113b2 100644 --- a/include/asm-generic/syscalls.h +++ b/include/asm-generic/syscalls.h | |||
| @@ -21,24 +21,8 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len, | |||
| 21 | unsigned long fd, off_t pgoff); | 21 | unsigned long fd, off_t pgoff); |
| 22 | #endif | 22 | #endif |
| 23 | 23 | ||
| 24 | #ifndef CONFIG_GENERIC_SIGALTSTACK | ||
| 25 | #ifndef sys_sigaltstack | ||
| 26 | asmlinkage long sys_sigaltstack(const stack_t __user *, stack_t __user *, | ||
| 27 | struct pt_regs *); | ||
| 28 | #endif | ||
| 29 | #endif | ||
| 30 | |||
| 31 | #ifndef sys_rt_sigreturn | 24 | #ifndef sys_rt_sigreturn |
| 32 | asmlinkage long sys_rt_sigreturn(struct pt_regs *regs); | 25 | asmlinkage long sys_rt_sigreturn(struct pt_regs *regs); |
| 33 | #endif | 26 | #endif |
| 34 | 27 | ||
| 35 | #ifndef sys_rt_sigsuspend | ||
| 36 | asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize); | ||
| 37 | #endif | ||
| 38 | |||
| 39 | #ifndef sys_rt_sigaction | ||
| 40 | asmlinkage long sys_rt_sigaction(int sig, const struct sigaction __user *act, | ||
| 41 | struct sigaction __user *oact, size_t sigsetsize); | ||
| 42 | #endif | ||
| 43 | |||
| 44 | #endif /* __ASM_GENERIC_SYSCALLS_H */ | 28 | #endif /* __ASM_GENERIC_SYSCALLS_H */ |
diff --git a/include/asm-generic/unistd.h b/include/asm-generic/unistd.h index a36991ab334e..257c55ec4f77 100644 --- a/include/asm-generic/unistd.h +++ b/include/asm-generic/unistd.h | |||
| @@ -9,9 +9,6 @@ | |||
| 9 | #define __ARCH_WANT_STAT64 | 9 | #define __ARCH_WANT_STAT64 |
| 10 | #define __ARCH_WANT_SYS_LLSEEK | 10 | #define __ARCH_WANT_SYS_LLSEEK |
| 11 | #endif | 11 | #endif |
| 12 | #define __ARCH_WANT_SYS_RT_SIGACTION | ||
| 13 | #define __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 14 | #define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | ||
| 15 | 12 | ||
| 16 | /* | 13 | /* |
| 17 | * "Conditional" syscalls | 14 | * "Conditional" syscalls |
diff --git a/include/linux/compat.h b/include/linux/compat.h index dec7e2d18875..de095b0462a7 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h | |||
| @@ -68,7 +68,6 @@ | |||
| 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 | #ifdef CONFIG_GENERIC_SIGALTSTACK | ||
| 72 | #ifndef compat_sigaltstack /* we'll need that for MIPS */ | 71 | #ifndef compat_sigaltstack /* we'll need that for MIPS */ |
| 73 | typedef struct compat_sigaltstack { | 72 | typedef struct compat_sigaltstack { |
| 74 | compat_uptr_t ss_sp; | 73 | compat_uptr_t ss_sp; |
| @@ -76,7 +75,6 @@ typedef struct compat_sigaltstack { | |||
| 76 | compat_size_t ss_size; | 75 | compat_size_t ss_size; |
| 77 | } compat_stack_t; | 76 | } compat_stack_t; |
| 78 | #endif | 77 | #endif |
| 79 | #endif | ||
| 80 | 78 | ||
| 81 | #define compat_jiffies_to_clock_t(x) \ | 79 | #define compat_jiffies_to_clock_t(x) \ |
| 82 | (((unsigned long)(x) * COMPAT_USER_HZ) / HZ) | 80 | (((unsigned long)(x) * COMPAT_USER_HZ) / HZ) |
| @@ -142,6 +140,20 @@ typedef struct { | |||
| 142 | compat_sigset_word sig[_COMPAT_NSIG_WORDS]; | 140 | compat_sigset_word sig[_COMPAT_NSIG_WORDS]; |
| 143 | } compat_sigset_t; | 141 | } compat_sigset_t; |
| 144 | 142 | ||
| 143 | struct compat_sigaction { | ||
| 144 | #ifndef __ARCH_HAS_ODD_SIGACTION | ||
| 145 | compat_uptr_t sa_handler; | ||
| 146 | compat_ulong_t sa_flags; | ||
| 147 | #else | ||
| 148 | compat_ulong_t sa_flags; | ||
| 149 | compat_uptr_t sa_handler; | ||
| 150 | #endif | ||
| 151 | #ifdef __ARCH_HAS_SA_RESTORER | ||
| 152 | compat_uptr_t sa_restorer; | ||
| 153 | #endif | ||
| 154 | compat_sigset_t sa_mask __packed; | ||
| 155 | }; | ||
| 156 | |||
| 145 | /* | 157 | /* |
| 146 | * These functions operate strictly on struct compat_time* | 158 | * These functions operate strictly on struct compat_time* |
| 147 | */ | 159 | */ |
| @@ -283,6 +295,15 @@ struct compat_robust_list_head { | |||
| 283 | compat_uptr_t list_op_pending; | 295 | compat_uptr_t list_op_pending; |
| 284 | }; | 296 | }; |
| 285 | 297 | ||
| 298 | #ifdef CONFIG_COMPAT_OLD_SIGACTION | ||
| 299 | struct compat_old_sigaction { | ||
| 300 | compat_uptr_t sa_handler; | ||
| 301 | compat_old_sigset_t sa_mask; | ||
| 302 | compat_ulong_t sa_flags; | ||
| 303 | compat_uptr_t sa_restorer; | ||
| 304 | }; | ||
| 305 | #endif | ||
| 306 | |||
| 286 | struct compat_statfs; | 307 | struct compat_statfs; |
| 287 | struct compat_statfs64; | 308 | struct compat_statfs64; |
| 288 | struct compat_old_linux_dirent; | 309 | struct compat_old_linux_dirent; |
| @@ -367,6 +388,11 @@ int get_compat_sigevent(struct sigevent *event, | |||
| 367 | const struct compat_sigevent __user *u_event); | 388 | const struct compat_sigevent __user *u_event); |
| 368 | long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig, | 389 | long compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig, |
| 369 | struct compat_siginfo __user *uinfo); | 390 | struct compat_siginfo __user *uinfo); |
| 391 | #ifdef CONFIG_COMPAT_OLD_SIGACTION | ||
| 392 | asmlinkage long compat_sys_sigaction(int sig, | ||
| 393 | const struct compat_old_sigaction __user *act, | ||
| 394 | struct compat_old_sigaction __user *oact); | ||
| 395 | #endif | ||
| 370 | 396 | ||
| 371 | static inline int compat_timeval_compare(struct compat_timeval *lhs, | 397 | static inline int compat_timeval_compare(struct compat_timeval *lhs, |
| 372 | struct compat_timeval *rhs) | 398 | struct compat_timeval *rhs) |
| @@ -401,7 +427,8 @@ asmlinkage long compat_sys_settimeofday(struct compat_timeval __user *tv, | |||
| 401 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); | 427 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp); |
| 402 | 428 | ||
| 403 | extern int compat_printk(const char *fmt, ...); | 429 | extern int compat_printk(const char *fmt, ...); |
| 404 | extern void sigset_from_compat(sigset_t *set, compat_sigset_t *compat); | 430 | extern void sigset_from_compat(sigset_t *set, const compat_sigset_t *compat); |
| 431 | extern void sigset_to_compat(compat_sigset_t *compat, const sigset_t *set); | ||
| 405 | 432 | ||
| 406 | asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, | 433 | asmlinkage long compat_sys_migrate_pages(compat_pid_t pid, |
| 407 | compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes, | 434 | compat_ulong_t maxnode, const compat_ulong_t __user *old_nodes, |
| @@ -503,7 +530,7 @@ asmlinkage long compat_sys_vmsplice(int fd, const struct compat_iovec __user *, | |||
| 503 | unsigned int nr_segs, unsigned int flags); | 530 | unsigned int nr_segs, unsigned int flags); |
| 504 | asmlinkage long compat_sys_open(const char __user *filename, int flags, | 531 | asmlinkage long compat_sys_open(const char __user *filename, int flags, |
| 505 | umode_t mode); | 532 | umode_t mode); |
| 506 | asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename, | 533 | asmlinkage long compat_sys_openat(int dfd, const char __user *filename, |
| 507 | int flags, umode_t mode); | 534 | int flags, umode_t mode); |
| 508 | asmlinkage long compat_sys_open_by_handle_at(int mountdirfd, | 535 | asmlinkage long compat_sys_open_by_handle_at(int mountdirfd, |
| 509 | struct file_handle __user *handle, | 536 | struct file_handle __user *handle, |
| @@ -592,6 +619,19 @@ asmlinkage long compat_sys_rt_sigtimedwait(compat_sigset_t __user *uthese, | |||
| 592 | struct compat_timespec __user *uts, compat_size_t sigsetsize); | 619 | struct compat_timespec __user *uts, compat_size_t sigsetsize); |
| 593 | asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, | 620 | asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, |
| 594 | compat_size_t sigsetsize); | 621 | compat_size_t sigsetsize); |
| 622 | asmlinkage long compat_sys_rt_sigprocmask(int how, compat_sigset_t __user *set, | ||
| 623 | compat_sigset_t __user *oset, | ||
| 624 | compat_size_t sigsetsize); | ||
| 625 | asmlinkage long compat_sys_rt_sigpending(compat_sigset_t __user *uset, | ||
| 626 | compat_size_t sigsetsize); | ||
| 627 | #ifndef CONFIG_ODD_RT_SIGACTION | ||
| 628 | asmlinkage long compat_sys_rt_sigaction(int, | ||
| 629 | const struct compat_sigaction __user *, | ||
| 630 | struct compat_sigaction __user *, | ||
| 631 | compat_size_t); | ||
| 632 | #endif | ||
| 633 | asmlinkage long compat_sys_rt_sigqueueinfo(compat_pid_t pid, int sig, | ||
| 634 | struct compat_siginfo __user *uinfo); | ||
| 595 | asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info); | 635 | asmlinkage long compat_sys_sysinfo(struct compat_sysinfo __user *info); |
| 596 | asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, | 636 | asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, |
| 597 | unsigned long arg); | 637 | unsigned long arg); |
| @@ -642,13 +682,11 @@ asmlinkage ssize_t compat_sys_process_vm_writev(compat_pid_t pid, | |||
| 642 | 682 | ||
| 643 | asmlinkage long compat_sys_sendfile(int out_fd, int in_fd, | 683 | asmlinkage long compat_sys_sendfile(int out_fd, int in_fd, |
| 644 | compat_off_t __user *offset, compat_size_t count); | 684 | compat_off_t __user *offset, compat_size_t count); |
| 645 | #ifdef CONFIG_GENERIC_SIGALTSTACK | ||
| 646 | asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr, | 685 | asmlinkage long compat_sys_sigaltstack(const compat_stack_t __user *uss_ptr, |
| 647 | compat_stack_t __user *uoss_ptr); | 686 | compat_stack_t __user *uoss_ptr); |
| 648 | 687 | ||
| 649 | int compat_restore_altstack(const compat_stack_t __user *uss); | 688 | int compat_restore_altstack(const compat_stack_t __user *uss); |
| 650 | int __compat_save_altstack(compat_stack_t __user *, unsigned long); | 689 | int __compat_save_altstack(compat_stack_t __user *, unsigned long); |
| 651 | #endif | ||
| 652 | 690 | ||
| 653 | asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, | 691 | asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, |
| 654 | struct compat_timespec __user *interval); | 692 | struct compat_timespec __user *interval); |
diff --git a/include/linux/sched.h b/include/linux/sched.h index c2182b53dace..0655570c67eb 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -2182,7 +2182,6 @@ extern struct sigqueue *sigqueue_alloc(void); | |||
| 2182 | extern void sigqueue_free(struct sigqueue *); | 2182 | extern void sigqueue_free(struct sigqueue *); |
| 2183 | extern int send_sigqueue(struct sigqueue *, struct task_struct *, int group); | 2183 | extern int send_sigqueue(struct sigqueue *, struct task_struct *, int group); |
| 2184 | extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *); | 2184 | extern int do_sigaction(int, struct k_sigaction *, struct k_sigaction *); |
| 2185 | extern int do_sigaltstack(const stack_t __user *, stack_t __user *, unsigned long); | ||
| 2186 | 2185 | ||
| 2187 | static inline void restore_saved_sigmask(void) | 2186 | static inline void restore_saved_sigmask(void) |
| 2188 | { | 2187 | { |
| @@ -2228,6 +2227,17 @@ static inline int sas_ss_flags(unsigned long sp) | |||
| 2228 | : on_sig_stack(sp) ? SS_ONSTACK : 0); | 2227 | : on_sig_stack(sp) ? SS_ONSTACK : 0); |
| 2229 | } | 2228 | } |
| 2230 | 2229 | ||
| 2230 | static inline unsigned long sigsp(unsigned long sp, struct ksignal *ksig) | ||
| 2231 | { | ||
| 2232 | if (unlikely((ksig->ka.sa.sa_flags & SA_ONSTACK)) && ! sas_ss_flags(sp)) | ||
| 2233 | #ifdef CONFIG_STACK_GROWSUP | ||
| 2234 | return current->sas_ss_sp; | ||
| 2235 | #else | ||
| 2236 | return current->sas_ss_sp + current->sas_ss_size; | ||
| 2237 | #endif | ||
| 2238 | return sp; | ||
| 2239 | } | ||
| 2240 | |||
| 2231 | /* | 2241 | /* |
| 2232 | * Routines for handling mm_structs | 2242 | * Routines for handling mm_structs |
| 2233 | */ | 2243 | */ |
diff --git a/include/linux/signal.h b/include/linux/signal.h index 0a89ffc48466..a2dcb94ea49d 100644 --- a/include/linux/signal.h +++ b/include/linux/signal.h | |||
| @@ -241,9 +241,6 @@ 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 long do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, | ||
| 245 | siginfo_t *info); | ||
| 246 | extern long do_sigpending(void __user *, unsigned long); | ||
| 247 | extern int do_sigtimedwait(const sigset_t *, siginfo_t *, | 244 | extern int do_sigtimedwait(const sigset_t *, siginfo_t *, |
| 248 | const struct timespec *); | 245 | const struct timespec *); |
| 249 | extern int sigprocmask(int, sigset_t *, sigset_t *); | 246 | extern int sigprocmask(int, sigset_t *, sigset_t *); |
| @@ -252,10 +249,59 @@ extern void __set_current_blocked(const sigset_t *); | |||
| 252 | extern int show_unhandled_signals; | 249 | extern int show_unhandled_signals; |
| 253 | extern int sigsuspend(sigset_t *); | 250 | extern int sigsuspend(sigset_t *); |
| 254 | 251 | ||
| 252 | struct sigaction { | ||
| 253 | #ifndef __ARCH_HAS_ODD_SIGACTION | ||
| 254 | __sighandler_t sa_handler; | ||
| 255 | unsigned long sa_flags; | ||
| 256 | #else | ||
| 257 | unsigned long sa_flags; | ||
| 258 | __sighandler_t sa_handler; | ||
| 259 | #endif | ||
| 260 | #ifdef __ARCH_HAS_SA_RESTORER | ||
| 261 | __sigrestore_t sa_restorer; | ||
| 262 | #endif | ||
| 263 | sigset_t sa_mask; /* mask last for extensibility */ | ||
| 264 | }; | ||
| 265 | |||
| 266 | struct k_sigaction { | ||
| 267 | struct sigaction sa; | ||
| 268 | #ifdef __ARCH_HAS_KA_RESTORER | ||
| 269 | __sigrestore_t ka_restorer; | ||
| 270 | #endif | ||
| 271 | }; | ||
| 272 | |||
| 273 | #ifdef CONFIG_OLD_SIGACTION | ||
| 274 | struct old_sigaction { | ||
| 275 | __sighandler_t sa_handler; | ||
| 276 | old_sigset_t sa_mask; | ||
| 277 | unsigned long sa_flags; | ||
| 278 | __sigrestore_t sa_restorer; | ||
| 279 | }; | ||
| 280 | #endif | ||
| 281 | |||
| 282 | struct ksignal { | ||
| 283 | struct k_sigaction ka; | ||
| 284 | siginfo_t info; | ||
| 285 | int sig; | ||
| 286 | }; | ||
| 287 | |||
| 255 | 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); | ||
| 256 | 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); |
| 257 | extern void exit_signals(struct task_struct *tsk); | 291 | extern void exit_signals(struct task_struct *tsk); |
| 258 | 292 | ||
| 293 | /* | ||
| 294 | * Eventually that'll replace get_signal_to_deliver(); macro for now, | ||
| 295 | * to avoid nastiness with include order. | ||
| 296 | */ | ||
| 297 | #define get_signal(ksig) \ | ||
| 298 | ({ \ | ||
| 299 | struct ksignal *p = (ksig); \ | ||
| 300 | p->sig = get_signal_to_deliver(&p->info, &p->ka, \ | ||
| 301 | signal_pt_regs(), NULL);\ | ||
| 302 | p->sig > 0; \ | ||
| 303 | }) | ||
| 304 | |||
| 259 | extern struct kmem_cache *sighand_cachep; | 305 | extern struct kmem_cache *sighand_cachep; |
| 260 | 306 | ||
| 261 | int unhandled_signal(struct task_struct *tsk, int sig); | 307 | int unhandled_signal(struct task_struct *tsk, int sig); |
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 45e2db270255..313a8e0a6553 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h | |||
| @@ -68,11 +68,11 @@ struct sigaltstack; | |||
| 68 | #include <linux/types.h> | 68 | #include <linux/types.h> |
| 69 | #include <linux/aio_abi.h> | 69 | #include <linux/aio_abi.h> |
| 70 | #include <linux/capability.h> | 70 | #include <linux/capability.h> |
| 71 | #include <linux/signal.h> | ||
| 71 | #include <linux/list.h> | 72 | #include <linux/list.h> |
| 72 | #include <linux/bug.h> | 73 | #include <linux/bug.h> |
| 73 | #include <linux/sem.h> | 74 | #include <linux/sem.h> |
| 74 | #include <asm/siginfo.h> | 75 | #include <asm/siginfo.h> |
| 75 | #include <asm/signal.h> | ||
| 76 | #include <linux/unistd.h> | 76 | #include <linux/unistd.h> |
| 77 | #include <linux/quota.h> | 77 | #include <linux/quota.h> |
| 78 | #include <linux/key.h> | 78 | #include <linux/key.h> |
| @@ -300,10 +300,8 @@ asmlinkage long sys_personality(unsigned int personality); | |||
| 300 | asmlinkage long sys_sigpending(old_sigset_t __user *set); | 300 | asmlinkage long sys_sigpending(old_sigset_t __user *set); |
| 301 | asmlinkage long sys_sigprocmask(int how, old_sigset_t __user *set, | 301 | asmlinkage long sys_sigprocmask(int how, old_sigset_t __user *set, |
| 302 | old_sigset_t __user *oset); | 302 | old_sigset_t __user *oset); |
| 303 | #ifdef CONFIG_GENERIC_SIGALTSTACK | ||
| 304 | asmlinkage long sys_sigaltstack(const struct sigaltstack __user *uss, | 303 | asmlinkage long sys_sigaltstack(const struct sigaltstack __user *uss, |
| 305 | struct sigaltstack __user *uoss); | 304 | struct sigaltstack __user *uoss); |
| 306 | #endif | ||
| 307 | 305 | ||
| 308 | asmlinkage long sys_getitimer(int which, struct itimerval __user *value); | 306 | asmlinkage long sys_getitimer(int which, struct itimerval __user *value); |
| 309 | asmlinkage long sys_setitimer(int which, | 307 | asmlinkage long sys_setitimer(int which, |
| @@ -377,6 +375,27 @@ asmlinkage long sys_init_module(void __user *umod, unsigned long len, | |||
| 377 | asmlinkage long sys_delete_module(const char __user *name_user, | 375 | asmlinkage long sys_delete_module(const char __user *name_user, |
| 378 | unsigned int flags); | 376 | unsigned int flags); |
| 379 | 377 | ||
| 378 | #ifdef CONFIG_OLD_SIGSUSPEND | ||
| 379 | asmlinkage long sys_sigsuspend(old_sigset_t mask); | ||
| 380 | #endif | ||
| 381 | |||
| 382 | #ifdef CONFIG_OLD_SIGSUSPEND3 | ||
| 383 | asmlinkage long sys_sigsuspend(int unused1, int unused2, old_sigset_t mask); | ||
| 384 | #endif | ||
| 385 | |||
| 386 | asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize); | ||
| 387 | |||
| 388 | #ifdef CONFIG_OLD_SIGACTION | ||
| 389 | asmlinkage long sys_sigaction(int, const struct old_sigaction __user *, | ||
| 390 | struct old_sigaction __user *); | ||
| 391 | #endif | ||
| 392 | |||
| 393 | #ifndef CONFIG_ODD_RT_SIGACTION | ||
| 394 | asmlinkage long sys_rt_sigaction(int, | ||
| 395 | const struct sigaction __user *, | ||
| 396 | struct sigaction __user *, | ||
| 397 | size_t); | ||
| 398 | #endif | ||
| 380 | asmlinkage long sys_rt_sigprocmask(int how, sigset_t __user *set, | 399 | asmlinkage long sys_rt_sigprocmask(int how, sigset_t __user *set, |
| 381 | sigset_t __user *oset, size_t sigsetsize); | 400 | sigset_t __user *oset, size_t sigsetsize); |
| 382 | asmlinkage long sys_rt_sigpending(sigset_t __user *set, size_t sigsetsize); | 401 | asmlinkage long sys_rt_sigpending(sigset_t __user *set, size_t sigsetsize); |
diff --git a/include/uapi/asm-generic/signal.h b/include/uapi/asm-generic/signal.h index 6fae30fd16ab..9df61f1edb0f 100644 --- a/include/uapi/asm-generic/signal.h +++ b/include/uapi/asm-generic/signal.h | |||
| @@ -93,6 +93,11 @@ typedef unsigned long old_sigset_t; | |||
| 93 | 93 | ||
| 94 | #include <asm-generic/signal-defs.h> | 94 | #include <asm-generic/signal-defs.h> |
| 95 | 95 | ||
| 96 | #ifdef SA_RESTORER | ||
| 97 | #define __ARCH_HAS_SA_RESTORER | ||
| 98 | #endif | ||
| 99 | |||
| 100 | #ifndef __KERNEL__ | ||
| 96 | struct sigaction { | 101 | struct sigaction { |
| 97 | __sighandler_t sa_handler; | 102 | __sighandler_t sa_handler; |
| 98 | unsigned long sa_flags; | 103 | unsigned long sa_flags; |
| @@ -101,10 +106,7 @@ struct sigaction { | |||
| 101 | #endif | 106 | #endif |
| 102 | sigset_t sa_mask; /* mask last for extensibility */ | 107 | sigset_t sa_mask; /* mask last for extensibility */ |
| 103 | }; | 108 | }; |
| 104 | 109 | #endif | |
| 105 | struct k_sigaction { | ||
| 106 | struct sigaction sa; | ||
| 107 | }; | ||
| 108 | 110 | ||
| 109 | typedef struct sigaltstack { | 111 | typedef struct sigaltstack { |
| 110 | void __user *ss_sp; | 112 | void __user *ss_sp; |
diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/unistd.h index 2c531f478410..0cc74c4403e4 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h | |||
| @@ -402,9 +402,9 @@ __SC_COMP(__NR_rt_sigsuspend, sys_rt_sigsuspend, compat_sys_rt_sigsuspend) | |||
| 402 | #define __NR_rt_sigaction 134 | 402 | #define __NR_rt_sigaction 134 |
| 403 | __SC_COMP(__NR_rt_sigaction, sys_rt_sigaction, compat_sys_rt_sigaction) | 403 | __SC_COMP(__NR_rt_sigaction, sys_rt_sigaction, compat_sys_rt_sigaction) |
| 404 | #define __NR_rt_sigprocmask 135 | 404 | #define __NR_rt_sigprocmask 135 |
| 405 | __SYSCALL(__NR_rt_sigprocmask, sys_rt_sigprocmask) | 405 | __SC_COMP(__NR_rt_sigprocmask, sys_rt_sigprocmask, compat_sys_rt_sigprocmask) |
| 406 | #define __NR_rt_sigpending 136 | 406 | #define __NR_rt_sigpending 136 |
| 407 | __SYSCALL(__NR_rt_sigpending, sys_rt_sigpending) | 407 | __SC_COMP(__NR_rt_sigpending, sys_rt_sigpending, compat_sys_rt_sigpending) |
| 408 | #define __NR_rt_sigtimedwait 137 | 408 | #define __NR_rt_sigtimedwait 137 |
| 409 | __SC_COMP(__NR_rt_sigtimedwait, sys_rt_sigtimedwait, \ | 409 | __SC_COMP(__NR_rt_sigtimedwait, sys_rt_sigtimedwait, \ |
| 410 | compat_sys_rt_sigtimedwait) | 410 | compat_sys_rt_sigtimedwait) |
diff --git a/kernel/compat.c b/kernel/compat.c index f4bddb900186..19971d8c7299 100644 --- a/kernel/compat.c +++ b/kernel/compat.c | |||
| @@ -290,8 +290,8 @@ static inline long put_compat_itimerval(struct compat_itimerval __user *o, | |||
| 290 | __put_user(i->it_value.tv_usec, &o->it_value.tv_usec))); | 290 | __put_user(i->it_value.tv_usec, &o->it_value.tv_usec))); |
| 291 | } | 291 | } |
| 292 | 292 | ||
| 293 | asmlinkage long compat_sys_getitimer(int which, | 293 | COMPAT_SYSCALL_DEFINE2(getitimer, int, which, |
| 294 | struct compat_itimerval __user *it) | 294 | struct compat_itimerval __user *, it) |
| 295 | { | 295 | { |
| 296 | struct itimerval kit; | 296 | struct itimerval kit; |
| 297 | int error; | 297 | int error; |
| @@ -302,9 +302,9 @@ asmlinkage long compat_sys_getitimer(int which, | |||
| 302 | return error; | 302 | return error; |
| 303 | } | 303 | } |
| 304 | 304 | ||
| 305 | asmlinkage long compat_sys_setitimer(int which, | 305 | COMPAT_SYSCALL_DEFINE3(setitimer, int, which, |
| 306 | struct compat_itimerval __user *in, | 306 | struct compat_itimerval __user *, in, |
| 307 | struct compat_itimerval __user *out) | 307 | struct compat_itimerval __user *, out) |
| 308 | { | 308 | { |
| 309 | struct itimerval kin, kout; | 309 | struct itimerval kin, kout; |
| 310 | int error; | 310 | int error; |
| @@ -381,9 +381,9 @@ static inline void compat_sig_setmask(sigset_t *blocked, compat_sigset_word set) | |||
| 381 | memcpy(blocked->sig, &set, sizeof(set)); | 381 | memcpy(blocked->sig, &set, sizeof(set)); |
| 382 | } | 382 | } |
| 383 | 383 | ||
| 384 | asmlinkage long compat_sys_sigprocmask(int how, | 384 | COMPAT_SYSCALL_DEFINE3(sigprocmask, int, how, |
| 385 | compat_old_sigset_t __user *nset, | 385 | compat_old_sigset_t __user *, nset, |
| 386 | compat_old_sigset_t __user *oset) | 386 | compat_old_sigset_t __user *, oset) |
| 387 | { | 387 | { |
| 388 | old_sigset_t old_set, new_set; | 388 | old_sigset_t old_set, new_set; |
| 389 | sigset_t new_blocked; | 389 | sigset_t new_blocked; |
| @@ -971,7 +971,7 @@ long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask, | |||
| 971 | } | 971 | } |
| 972 | 972 | ||
| 973 | void | 973 | void |
| 974 | sigset_from_compat (sigset_t *set, compat_sigset_t *compat) | 974 | sigset_from_compat(sigset_t *set, const compat_sigset_t *compat) |
| 975 | { | 975 | { |
| 976 | switch (_NSIG_WORDS) { | 976 | switch (_NSIG_WORDS) { |
| 977 | case 4: set->sig[3] = compat->sig[6] | (((long)compat->sig[7]) << 32 ); | 977 | case 4: set->sig[3] = compat->sig[6] | (((long)compat->sig[7]) << 32 ); |
| @@ -982,10 +982,20 @@ sigset_from_compat (sigset_t *set, compat_sigset_t *compat) | |||
| 982 | } | 982 | } |
| 983 | EXPORT_SYMBOL_GPL(sigset_from_compat); | 983 | EXPORT_SYMBOL_GPL(sigset_from_compat); |
| 984 | 984 | ||
| 985 | asmlinkage long | 985 | void |
| 986 | compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese, | 986 | sigset_to_compat(compat_sigset_t *compat, const sigset_t *set) |
| 987 | struct compat_siginfo __user *uinfo, | 987 | { |
| 988 | struct compat_timespec __user *uts, compat_size_t sigsetsize) | 988 | switch (_NSIG_WORDS) { |
| 989 | case 4: compat->sig[7] = (set->sig[3] >> 32); compat->sig[6] = set->sig[3]; | ||
| 990 | case 3: compat->sig[5] = (set->sig[2] >> 32); compat->sig[4] = set->sig[2]; | ||
| 991 | case 2: compat->sig[3] = (set->sig[1] >> 32); compat->sig[2] = set->sig[1]; | ||
| 992 | case 1: compat->sig[1] = (set->sig[0] >> 32); compat->sig[0] = set->sig[0]; | ||
| 993 | } | ||
| 994 | } | ||
| 995 | |||
| 996 | COMPAT_SYSCALL_DEFINE4(rt_sigtimedwait, compat_sigset_t __user *, uthese, | ||
| 997 | struct compat_siginfo __user *, uinfo, | ||
| 998 | struct compat_timespec __user *, uts, compat_size_t, sigsetsize) | ||
| 989 | { | 999 | { |
| 990 | compat_sigset_t s32; | 1000 | compat_sigset_t s32; |
| 991 | sigset_t s; | 1001 | sigset_t s; |
| @@ -1013,18 +1023,6 @@ compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese, | |||
| 1013 | } | 1023 | } |
| 1014 | 1024 | ||
| 1015 | return ret; | 1025 | return ret; |
| 1016 | |||
| 1017 | } | ||
| 1018 | |||
| 1019 | asmlinkage long | ||
| 1020 | compat_sys_rt_tgsigqueueinfo(compat_pid_t tgid, compat_pid_t pid, int sig, | ||
| 1021 | struct compat_siginfo __user *uinfo) | ||
| 1022 | { | ||
| 1023 | siginfo_t info; | ||
| 1024 | |||
| 1025 | if (copy_siginfo_from_user32(&info, uinfo)) | ||
| 1026 | return -EFAULT; | ||
| 1027 | return do_rt_tgsigqueueinfo(tgid, pid, sig, &info); | ||
| 1028 | } | 1026 | } |
| 1029 | 1027 | ||
| 1030 | #ifdef __ARCH_WANT_COMPAT_SYS_TIME | 1028 | #ifdef __ARCH_WANT_COMPAT_SYS_TIME |
| @@ -1067,23 +1065,6 @@ asmlinkage long compat_sys_stime(compat_time_t __user *tptr) | |||
| 1067 | 1065 | ||
| 1068 | #endif /* __ARCH_WANT_COMPAT_SYS_TIME */ | 1066 | #endif /* __ARCH_WANT_COMPAT_SYS_TIME */ |
| 1069 | 1067 | ||
| 1070 | #ifdef __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | ||
| 1071 | asmlinkage long compat_sys_rt_sigsuspend(compat_sigset_t __user *unewset, compat_size_t sigsetsize) | ||
| 1072 | { | ||
| 1073 | sigset_t newset; | ||
| 1074 | compat_sigset_t newset32; | ||
| 1075 | |||
| 1076 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 1077 | if (sigsetsize != sizeof(sigset_t)) | ||
| 1078 | return -EINVAL; | ||
| 1079 | |||
| 1080 | if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t))) | ||
| 1081 | return -EFAULT; | ||
| 1082 | sigset_from_compat(&newset, &newset32); | ||
| 1083 | return sigsuspend(&newset); | ||
| 1084 | } | ||
| 1085 | #endif /* __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND */ | ||
| 1086 | |||
| 1087 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp) | 1068 | asmlinkage long compat_sys_adjtimex(struct compat_timex __user *utp) |
| 1088 | { | 1069 | { |
| 1089 | struct timex txc; | 1070 | struct timex txc; |
| @@ -1222,9 +1203,9 @@ compat_sys_sysinfo(struct compat_sysinfo __user *info) | |||
| 1222 | return 0; | 1203 | return 0; |
| 1223 | } | 1204 | } |
| 1224 | 1205 | ||
| 1225 | #ifdef __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL | 1206 | COMPAT_SYSCALL_DEFINE2(sched_rr_get_interval, |
| 1226 | asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, | 1207 | compat_pid_t, pid, |
| 1227 | struct compat_timespec __user *interval) | 1208 | struct compat_timespec __user *, interval) |
| 1228 | { | 1209 | { |
| 1229 | struct timespec t; | 1210 | struct timespec t; |
| 1230 | int ret; | 1211 | int ret; |
| @@ -1237,7 +1218,6 @@ asmlinkage long compat_sys_sched_rr_get_interval(compat_pid_t pid, | |||
| 1237 | return -EFAULT; | 1218 | return -EFAULT; |
| 1238 | return ret; | 1219 | return ret; |
| 1239 | } | 1220 | } |
| 1240 | #endif /* __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL */ | ||
| 1241 | 1221 | ||
| 1242 | /* | 1222 | /* |
| 1243 | * Allocate user-space memory for the duration of a single system call, | 1223 | * Allocate user-space memory for the duration of a single system call, |
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index a9642d528630..f9f44fd4d34d 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/nsproxy.h> | 11 | #include <linux/nsproxy.h> |
| 12 | #include <linux/futex.h> | 12 | #include <linux/futex.h> |
| 13 | #include <linux/ptrace.h> | 13 | #include <linux/ptrace.h> |
| 14 | #include <linux/syscalls.h> | ||
| 14 | 15 | ||
| 15 | #include <asm/uaccess.h> | 16 | #include <asm/uaccess.h> |
| 16 | 17 | ||
| @@ -116,9 +117,9 @@ void compat_exit_robust_list(struct task_struct *curr) | |||
| 116 | } | 117 | } |
| 117 | } | 118 | } |
| 118 | 119 | ||
| 119 | asmlinkage long | 120 | COMPAT_SYSCALL_DEFINE2(set_robust_list, |
| 120 | compat_sys_set_robust_list(struct compat_robust_list_head __user *head, | 121 | struct compat_robust_list_head __user *, head, |
| 121 | compat_size_t len) | 122 | compat_size_t, len) |
| 122 | { | 123 | { |
| 123 | if (!futex_cmpxchg_enabled) | 124 | if (!futex_cmpxchg_enabled) |
| 124 | return -ENOSYS; | 125 | return -ENOSYS; |
| @@ -131,9 +132,9 @@ compat_sys_set_robust_list(struct compat_robust_list_head __user *head, | |||
| 131 | return 0; | 132 | return 0; |
| 132 | } | 133 | } |
| 133 | 134 | ||
| 134 | asmlinkage long | 135 | COMPAT_SYSCALL_DEFINE3(get_robust_list, int, pid, |
| 135 | compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr, | 136 | compat_uptr_t __user *, head_ptr, |
| 136 | compat_size_t __user *len_ptr) | 137 | compat_size_t __user *, len_ptr) |
| 137 | { | 138 | { |
| 138 | struct compat_robust_list_head __user *head; | 139 | struct compat_robust_list_head __user *head; |
| 139 | unsigned long ret; | 140 | unsigned long ret; |
| @@ -170,9 +171,9 @@ err_unlock: | |||
| 170 | return ret; | 171 | return ret; |
| 171 | } | 172 | } |
| 172 | 173 | ||
| 173 | asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val, | 174 | COMPAT_SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val, |
| 174 | struct compat_timespec __user *utime, u32 __user *uaddr2, | 175 | struct compat_timespec __user *, utime, u32 __user *, uaddr2, |
| 175 | u32 val3) | 176 | u32, val3) |
| 176 | { | 177 | { |
| 177 | struct timespec ts; | 178 | struct timespec ts; |
| 178 | ktime_t t, *tp = NULL; | 179 | ktime_t t, *tp = NULL; |
diff --git a/kernel/signal.c b/kernel/signal.c index 7f82adbad480..2a7ae2963185 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
| @@ -2399,6 +2399,15 @@ void signal_delivered(int sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 2399 | tracehook_signal_handler(sig, info, ka, regs, stepping); | 2399 | tracehook_signal_handler(sig, info, ka, regs, stepping); |
| 2400 | } | 2400 | } |
| 2401 | 2401 | ||
| 2402 | void signal_setup_done(int failed, struct ksignal *ksig, int stepping) | ||
| 2403 | { | ||
| 2404 | if (failed) | ||
| 2405 | force_sigsegv(ksig->sig, current); | ||
| 2406 | else | ||
| 2407 | signal_delivered(ksig->sig, &ksig->info, &ksig->ka, | ||
| 2408 | signal_pt_regs(), stepping); | ||
| 2409 | } | ||
| 2410 | |||
| 2402 | /* | 2411 | /* |
| 2403 | * It could be that complete_signal() picked us to notify about the | 2412 | * It could be that complete_signal() picked us to notify about the |
| 2404 | * group-wide signal. Other threads should be notified now to take | 2413 | * group-wide signal. Other threads should be notified now to take |
| @@ -2616,28 +2625,58 @@ SYSCALL_DEFINE4(rt_sigprocmask, int, how, sigset_t __user *, nset, | |||
| 2616 | return 0; | 2625 | return 0; |
| 2617 | } | 2626 | } |
| 2618 | 2627 | ||
| 2619 | long do_sigpending(void __user *set, unsigned long sigsetsize) | 2628 | #ifdef CONFIG_COMPAT |
| 2629 | COMPAT_SYSCALL_DEFINE4(rt_sigprocmask, int, how, compat_sigset_t __user *, nset, | ||
| 2630 | compat_sigset_t __user *, oset, compat_size_t, sigsetsize) | ||
| 2620 | { | 2631 | { |
| 2621 | long error = -EINVAL; | 2632 | #ifdef __BIG_ENDIAN |
| 2622 | sigset_t pending; | 2633 | sigset_t old_set = current->blocked; |
| 2634 | |||
| 2635 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 2636 | if (sigsetsize != sizeof(sigset_t)) | ||
| 2637 | return -EINVAL; | ||
| 2638 | |||
| 2639 | if (nset) { | ||
| 2640 | compat_sigset_t new32; | ||
| 2641 | sigset_t new_set; | ||
| 2642 | int error; | ||
| 2643 | if (copy_from_user(&new32, nset, sizeof(compat_sigset_t))) | ||
| 2644 | return -EFAULT; | ||
| 2645 | |||
| 2646 | sigset_from_compat(&new_set, &new32); | ||
| 2647 | sigdelsetmask(&new_set, sigmask(SIGKILL)|sigmask(SIGSTOP)); | ||
| 2648 | |||
| 2649 | error = sigprocmask(how, &new_set, NULL); | ||
| 2650 | if (error) | ||
| 2651 | return error; | ||
| 2652 | } | ||
| 2653 | if (oset) { | ||
| 2654 | compat_sigset_t old32; | ||
| 2655 | sigset_to_compat(&old32, &old_set); | ||
| 2656 | if (copy_to_user(oset, &old_set, sizeof(sigset_t))) | ||
| 2657 | return -EFAULT; | ||
| 2658 | } | ||
| 2659 | return 0; | ||
| 2660 | #else | ||
| 2661 | return sys_rt_sigprocmask(how, (sigset_t __user *)nset, | ||
| 2662 | (sigset_t __user *)oset, sigsetsize); | ||
| 2663 | #endif | ||
| 2664 | } | ||
| 2665 | #endif | ||
| 2623 | 2666 | ||
| 2667 | static int do_sigpending(void *set, unsigned long sigsetsize) | ||
| 2668 | { | ||
| 2624 | if (sigsetsize > sizeof(sigset_t)) | 2669 | if (sigsetsize > sizeof(sigset_t)) |
| 2625 | goto out; | 2670 | return -EINVAL; |
| 2626 | 2671 | ||
| 2627 | spin_lock_irq(¤t->sighand->siglock); | 2672 | spin_lock_irq(¤t->sighand->siglock); |
| 2628 | sigorsets(&pending, ¤t->pending.signal, | 2673 | sigorsets(set, ¤t->pending.signal, |
| 2629 | ¤t->signal->shared_pending.signal); | 2674 | ¤t->signal->shared_pending.signal); |
| 2630 | spin_unlock_irq(¤t->sighand->siglock); | 2675 | spin_unlock_irq(¤t->sighand->siglock); |
| 2631 | 2676 | ||
| 2632 | /* Outside the lock because only this thread touches it. */ | 2677 | /* Outside the lock because only this thread touches it. */ |
| 2633 | sigandsets(&pending, ¤t->blocked, &pending); | 2678 | sigandsets(set, ¤t->blocked, set); |
| 2634 | 2679 | return 0; | |
| 2635 | error = -EFAULT; | ||
| 2636 | if (!copy_to_user(set, &pending, sigsetsize)) | ||
| 2637 | error = 0; | ||
| 2638 | |||
| 2639 | out: | ||
| 2640 | return error; | ||
| 2641 | } | 2680 | } |
| 2642 | 2681 | ||
| 2643 | /** | 2682 | /** |
| @@ -2646,10 +2685,35 @@ out: | |||
| 2646 | * @set: stores pending signals | 2685 | * @set: stores pending signals |
| 2647 | * @sigsetsize: size of sigset_t type or larger | 2686 | * @sigsetsize: size of sigset_t type or larger |
| 2648 | */ | 2687 | */ |
| 2649 | SYSCALL_DEFINE2(rt_sigpending, sigset_t __user *, set, size_t, sigsetsize) | 2688 | SYSCALL_DEFINE2(rt_sigpending, sigset_t __user *, uset, size_t, sigsetsize) |
| 2650 | { | 2689 | { |
| 2651 | return do_sigpending(set, sigsetsize); | 2690 | sigset_t set; |
| 2691 | int err = do_sigpending(&set, sigsetsize); | ||
| 2692 | if (!err && copy_to_user(uset, &set, sigsetsize)) | ||
| 2693 | err = -EFAULT; | ||
| 2694 | return err; | ||
| 2695 | } | ||
| 2696 | |||
| 2697 | #ifdef CONFIG_COMPAT | ||
| 2698 | COMPAT_SYSCALL_DEFINE2(rt_sigpending, compat_sigset_t __user *, uset, | ||
| 2699 | compat_size_t, sigsetsize) | ||
| 2700 | { | ||
| 2701 | #ifdef __BIG_ENDIAN | ||
| 2702 | sigset_t set; | ||
| 2703 | int err = do_sigpending(&set, sigsetsize); | ||
| 2704 | if (!err) { | ||
| 2705 | compat_sigset_t set32; | ||
| 2706 | sigset_to_compat(&set32, &set); | ||
| 2707 | /* we can get here only if sigsetsize <= sizeof(set) */ | ||
| 2708 | if (copy_to_user(uset, &set32, sigsetsize)) | ||
| 2709 | err = -EFAULT; | ||
| 2710 | } | ||
| 2711 | return err; | ||
| 2712 | #else | ||
| 2713 | return sys_rt_sigpending((sigset_t __user *)uset, sigsetsize); | ||
| 2714 | #endif | ||
| 2652 | } | 2715 | } |
| 2716 | #endif | ||
| 2653 | 2717 | ||
| 2654 | #ifndef HAVE_ARCH_COPY_SIGINFO_TO_USER | 2718 | #ifndef HAVE_ARCH_COPY_SIGINFO_TO_USER |
| 2655 | 2719 | ||
| @@ -2927,6 +2991,22 @@ SYSCALL_DEFINE2(tkill, pid_t, pid, int, sig) | |||
| 2927 | return do_tkill(0, pid, sig); | 2991 | return do_tkill(0, pid, sig); |
| 2928 | } | 2992 | } |
| 2929 | 2993 | ||
| 2994 | static int do_rt_sigqueueinfo(pid_t pid, int sig, siginfo_t *info) | ||
| 2995 | { | ||
| 2996 | /* Not even root can pretend to send signals from the kernel. | ||
| 2997 | * Nor can they impersonate a kill()/tgkill(), which adds source info. | ||
| 2998 | */ | ||
| 2999 | if (info->si_code >= 0 || info->si_code == SI_TKILL) { | ||
| 3000 | /* We used to allow any < 0 si_code */ | ||
| 3001 | WARN_ON_ONCE(info->si_code < 0); | ||
| 3002 | return -EPERM; | ||
| 3003 | } | ||
| 3004 | info->si_signo = sig; | ||
| 3005 | |||
| 3006 | /* POSIX.1b doesn't mention process groups. */ | ||
| 3007 | return kill_proc_info(sig, info, pid); | ||
| 3008 | } | ||
| 3009 | |||
| 2930 | /** | 3010 | /** |
| 2931 | * sys_rt_sigqueueinfo - send signal information to a signal | 3011 | * sys_rt_sigqueueinfo - send signal information to a signal |
| 2932 | * @pid: the PID of the thread | 3012 | * @pid: the PID of the thread |
| @@ -2937,25 +3017,26 @@ SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig, | |||
| 2937 | siginfo_t __user *, uinfo) | 3017 | siginfo_t __user *, uinfo) |
| 2938 | { | 3018 | { |
| 2939 | siginfo_t info; | 3019 | siginfo_t info; |
| 2940 | |||
| 2941 | if (copy_from_user(&info, uinfo, sizeof(siginfo_t))) | 3020 | if (copy_from_user(&info, uinfo, sizeof(siginfo_t))) |
| 2942 | return -EFAULT; | 3021 | return -EFAULT; |
| 3022 | return do_rt_sigqueueinfo(pid, sig, &info); | ||
| 3023 | } | ||
| 2943 | 3024 | ||
| 2944 | /* Not even root can pretend to send signals from the kernel. | 3025 | #ifdef CONFIG_COMPAT |
| 2945 | * Nor can they impersonate a kill()/tgkill(), which adds source info. | 3026 | COMPAT_SYSCALL_DEFINE3(rt_sigqueueinfo, |
| 2946 | */ | 3027 | compat_pid_t, pid, |
| 2947 | if (info.si_code >= 0 || info.si_code == SI_TKILL) { | 3028 | int, sig, |
| 2948 | /* We used to allow any < 0 si_code */ | 3029 | struct compat_siginfo __user *, uinfo) |
| 2949 | WARN_ON_ONCE(info.si_code < 0); | 3030 | { |
| 2950 | return -EPERM; | 3031 | siginfo_t info; |
| 2951 | } | 3032 | int ret = copy_siginfo_from_user32(&info, uinfo); |
| 2952 | info.si_signo = sig; | 3033 | if (unlikely(ret)) |
| 2953 | 3034 | return ret; | |
| 2954 | /* POSIX.1b doesn't mention process groups. */ | 3035 | return do_rt_sigqueueinfo(pid, sig, &info); |
| 2955 | return kill_proc_info(sig, &info, pid); | ||
| 2956 | } | 3036 | } |
| 3037 | #endif | ||
| 2957 | 3038 | ||
| 2958 | long do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, siginfo_t *info) | 3039 | static int do_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig, siginfo_t *info) |
| 2959 | { | 3040 | { |
| 2960 | /* This is only valid for single tasks */ | 3041 | /* This is only valid for single tasks */ |
| 2961 | if (pid <= 0 || tgid <= 0) | 3042 | if (pid <= 0 || tgid <= 0) |
| @@ -2985,6 +3066,21 @@ SYSCALL_DEFINE4(rt_tgsigqueueinfo, pid_t, tgid, pid_t, pid, int, sig, | |||
| 2985 | return do_rt_tgsigqueueinfo(tgid, pid, sig, &info); | 3066 | return do_rt_tgsigqueueinfo(tgid, pid, sig, &info); |
| 2986 | } | 3067 | } |
| 2987 | 3068 | ||
| 3069 | #ifdef CONFIG_COMPAT | ||
| 3070 | COMPAT_SYSCALL_DEFINE4(rt_tgsigqueueinfo, | ||
| 3071 | compat_pid_t, tgid, | ||
| 3072 | compat_pid_t, pid, | ||
| 3073 | int, sig, | ||
| 3074 | struct compat_siginfo __user *, uinfo) | ||
| 3075 | { | ||
| 3076 | siginfo_t info; | ||
| 3077 | |||
| 3078 | if (copy_siginfo_from_user32(&info, uinfo)) | ||
| 3079 | return -EFAULT; | ||
| 3080 | return do_rt_tgsigqueueinfo(tgid, pid, sig, &info); | ||
| 3081 | } | ||
| 3082 | #endif | ||
| 3083 | |||
| 2988 | int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) | 3084 | int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) |
| 2989 | { | 3085 | { |
| 2990 | struct task_struct *t = current; | 3086 | struct task_struct *t = current; |
| @@ -3030,7 +3126,7 @@ int do_sigaction(int sig, struct k_sigaction *act, struct k_sigaction *oact) | |||
| 3030 | return 0; | 3126 | return 0; |
| 3031 | } | 3127 | } |
| 3032 | 3128 | ||
| 3033 | int | 3129 | static int |
| 3034 | do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long sp) | 3130 | do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long sp) |
| 3035 | { | 3131 | { |
| 3036 | stack_t oss; | 3132 | stack_t oss; |
| @@ -3095,12 +3191,10 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s | |||
| 3095 | out: | 3191 | out: |
| 3096 | return error; | 3192 | return error; |
| 3097 | } | 3193 | } |
| 3098 | #ifdef CONFIG_GENERIC_SIGALTSTACK | ||
| 3099 | SYSCALL_DEFINE2(sigaltstack,const stack_t __user *,uss, stack_t __user *,uoss) | 3194 | SYSCALL_DEFINE2(sigaltstack,const stack_t __user *,uss, stack_t __user *,uoss) |
| 3100 | { | 3195 | { |
| 3101 | return do_sigaltstack(uss, uoss, current_user_stack_pointer()); | 3196 | return do_sigaltstack(uss, uoss, current_user_stack_pointer()); |
| 3102 | } | 3197 | } |
| 3103 | #endif | ||
| 3104 | 3198 | ||
| 3105 | int restore_altstack(const stack_t __user *uss) | 3199 | int restore_altstack(const stack_t __user *uss) |
| 3106 | { | 3200 | { |
| @@ -3118,7 +3212,6 @@ int __save_altstack(stack_t __user *uss, unsigned long sp) | |||
| 3118 | } | 3212 | } |
| 3119 | 3213 | ||
| 3120 | #ifdef CONFIG_COMPAT | 3214 | #ifdef CONFIG_COMPAT |
| 3121 | #ifdef CONFIG_GENERIC_SIGALTSTACK | ||
| 3122 | COMPAT_SYSCALL_DEFINE2(sigaltstack, | 3215 | COMPAT_SYSCALL_DEFINE2(sigaltstack, |
| 3123 | const compat_stack_t __user *, uss_ptr, | 3216 | const compat_stack_t __user *, uss_ptr, |
| 3124 | compat_stack_t __user *, uoss_ptr) | 3217 | compat_stack_t __user *, uoss_ptr) |
| @@ -3168,7 +3261,6 @@ int __compat_save_altstack(compat_stack_t __user *uss, unsigned long sp) | |||
| 3168 | __put_user(t->sas_ss_size, &uss->ss_size); | 3261 | __put_user(t->sas_ss_size, &uss->ss_size); |
| 3169 | } | 3262 | } |
| 3170 | #endif | 3263 | #endif |
| 3171 | #endif | ||
| 3172 | 3264 | ||
| 3173 | #ifdef __ARCH_WANT_SYS_SIGPENDING | 3265 | #ifdef __ARCH_WANT_SYS_SIGPENDING |
| 3174 | 3266 | ||
| @@ -3178,7 +3270,7 @@ int __compat_save_altstack(compat_stack_t __user *uss, unsigned long sp) | |||
| 3178 | */ | 3270 | */ |
| 3179 | SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set) | 3271 | SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set) |
| 3180 | { | 3272 | { |
| 3181 | return do_sigpending(set, sizeof(*set)); | 3273 | return sys_rt_sigpending((sigset_t __user *)set, sizeof(old_sigset_t)); |
| 3182 | } | 3274 | } |
| 3183 | 3275 | ||
| 3184 | #endif | 3276 | #endif |
| @@ -3234,7 +3326,7 @@ SYSCALL_DEFINE3(sigprocmask, int, how, old_sigset_t __user *, nset, | |||
| 3234 | } | 3326 | } |
| 3235 | #endif /* __ARCH_WANT_SYS_SIGPROCMASK */ | 3327 | #endif /* __ARCH_WANT_SYS_SIGPROCMASK */ |
| 3236 | 3328 | ||
| 3237 | #ifdef __ARCH_WANT_SYS_RT_SIGACTION | 3329 | #ifndef CONFIG_ODD_RT_SIGACTION |
| 3238 | /** | 3330 | /** |
| 3239 | * sys_rt_sigaction - alter an action taken by a process | 3331 | * sys_rt_sigaction - alter an action taken by a process |
| 3240 | * @sig: signal to be sent | 3332 | * @sig: signal to be sent |
| @@ -3268,7 +3360,132 @@ SYSCALL_DEFINE4(rt_sigaction, int, sig, | |||
| 3268 | out: | 3360 | out: |
| 3269 | return ret; | 3361 | return ret; |
| 3270 | } | 3362 | } |
| 3271 | #endif /* __ARCH_WANT_SYS_RT_SIGACTION */ | 3363 | #ifdef CONFIG_COMPAT |
| 3364 | COMPAT_SYSCALL_DEFINE4(rt_sigaction, int, sig, | ||
| 3365 | const struct compat_sigaction __user *, act, | ||
| 3366 | struct compat_sigaction __user *, oact, | ||
| 3367 | compat_size_t, sigsetsize) | ||
| 3368 | { | ||
| 3369 | struct k_sigaction new_ka, old_ka; | ||
| 3370 | compat_sigset_t mask; | ||
| 3371 | #ifdef __ARCH_HAS_SA_RESTORER | ||
| 3372 | compat_uptr_t restorer; | ||
| 3373 | #endif | ||
| 3374 | int ret; | ||
| 3375 | |||
| 3376 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 3377 | if (sigsetsize != sizeof(compat_sigset_t)) | ||
| 3378 | return -EINVAL; | ||
| 3379 | |||
| 3380 | if (act) { | ||
| 3381 | compat_uptr_t handler; | ||
| 3382 | ret = get_user(handler, &act->sa_handler); | ||
| 3383 | new_ka.sa.sa_handler = compat_ptr(handler); | ||
| 3384 | #ifdef __ARCH_HAS_SA_RESTORER | ||
| 3385 | ret |= get_user(restorer, &act->sa_restorer); | ||
| 3386 | new_ka.sa.sa_restorer = compat_ptr(restorer); | ||
| 3387 | #endif | ||
| 3388 | ret |= copy_from_user(&mask, &act->sa_mask, sizeof(mask)); | ||
| 3389 | ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 3390 | if (ret) | ||
| 3391 | return -EFAULT; | ||
| 3392 | sigset_from_compat(&new_ka.sa.sa_mask, &mask); | ||
| 3393 | } | ||
| 3394 | |||
| 3395 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 3396 | if (!ret && oact) { | ||
| 3397 | sigset_to_compat(&mask, &old_ka.sa.sa_mask); | ||
| 3398 | ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), | ||
| 3399 | &oact->sa_handler); | ||
| 3400 | ret |= copy_to_user(&oact->sa_mask, &mask, sizeof(mask)); | ||
| 3401 | ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 3402 | #ifdef __ARCH_HAS_SA_RESTORER | ||
| 3403 | ret |= put_user(ptr_to_compat(old_ka.sa.sa_restorer), | ||
| 3404 | &oact->sa_restorer); | ||
| 3405 | #endif | ||
| 3406 | } | ||
| 3407 | return ret; | ||
| 3408 | } | ||
| 3409 | #endif | ||
| 3410 | #endif /* !CONFIG_ODD_RT_SIGACTION */ | ||
| 3411 | |||
| 3412 | #ifdef CONFIG_OLD_SIGACTION | ||
| 3413 | SYSCALL_DEFINE3(sigaction, int, sig, | ||
| 3414 | const struct old_sigaction __user *, act, | ||
| 3415 | struct old_sigaction __user *, oact) | ||
| 3416 | { | ||
| 3417 | struct k_sigaction new_ka, old_ka; | ||
| 3418 | int ret; | ||
| 3419 | |||
| 3420 | if (act) { | ||
| 3421 | old_sigset_t mask; | ||
| 3422 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 3423 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 3424 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || | ||
| 3425 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 3426 | __get_user(mask, &act->sa_mask)) | ||
| 3427 | return -EFAULT; | ||
| 3428 | #ifdef __ARCH_HAS_KA_RESTORER | ||
| 3429 | new_ka.ka_restorer = NULL; | ||
| 3430 | #endif | ||
| 3431 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 3432 | } | ||
| 3433 | |||
| 3434 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 3435 | |||
| 3436 | if (!ret && oact) { | ||
| 3437 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 3438 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 3439 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || | ||
| 3440 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 3441 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 3442 | return -EFAULT; | ||
| 3443 | } | ||
| 3444 | |||
| 3445 | return ret; | ||
| 3446 | } | ||
| 3447 | #endif | ||
| 3448 | #ifdef CONFIG_COMPAT_OLD_SIGACTION | ||
| 3449 | COMPAT_SYSCALL_DEFINE3(sigaction, int, sig, | ||
| 3450 | const struct compat_old_sigaction __user *, act, | ||
| 3451 | struct compat_old_sigaction __user *, oact) | ||
| 3452 | { | ||
| 3453 | struct k_sigaction new_ka, old_ka; | ||
| 3454 | int ret; | ||
| 3455 | compat_old_sigset_t mask; | ||
| 3456 | compat_uptr_t handler, restorer; | ||
| 3457 | |||
| 3458 | if (act) { | ||
| 3459 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | ||
| 3460 | __get_user(handler, &act->sa_handler) || | ||
| 3461 | __get_user(restorer, &act->sa_restorer) || | ||
| 3462 | __get_user(new_ka.sa.sa_flags, &act->sa_flags) || | ||
| 3463 | __get_user(mask, &act->sa_mask)) | ||
| 3464 | return -EFAULT; | ||
| 3465 | |||
| 3466 | #ifdef __ARCH_HAS_KA_RESTORER | ||
| 3467 | new_ka.ka_restorer = NULL; | ||
| 3468 | #endif | ||
| 3469 | new_ka.sa.sa_handler = compat_ptr(handler); | ||
| 3470 | new_ka.sa.sa_restorer = compat_ptr(restorer); | ||
| 3471 | siginitset(&new_ka.sa.sa_mask, mask); | ||
| 3472 | } | ||
| 3473 | |||
| 3474 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | ||
| 3475 | |||
| 3476 | if (!ret && oact) { | ||
| 3477 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | ||
| 3478 | __put_user(ptr_to_compat(old_ka.sa.sa_handler), | ||
| 3479 | &oact->sa_handler) || | ||
| 3480 | __put_user(ptr_to_compat(old_ka.sa.sa_restorer), | ||
| 3481 | &oact->sa_restorer) || | ||
| 3482 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || | ||
| 3483 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) | ||
| 3484 | return -EFAULT; | ||
| 3485 | } | ||
| 3486 | return ret; | ||
| 3487 | } | ||
| 3488 | #endif | ||
| 3272 | 3489 | ||
| 3273 | #ifdef __ARCH_WANT_SYS_SGETMASK | 3490 | #ifdef __ARCH_WANT_SYS_SGETMASK |
| 3274 | 3491 | ||
| @@ -3336,7 +3553,6 @@ int sigsuspend(sigset_t *set) | |||
| 3336 | return -ERESTARTNOHAND; | 3553 | return -ERESTARTNOHAND; |
| 3337 | } | 3554 | } |
| 3338 | 3555 | ||
| 3339 | #ifdef __ARCH_WANT_SYS_RT_SIGSUSPEND | ||
| 3340 | /** | 3556 | /** |
| 3341 | * sys_rt_sigsuspend - replace the signal mask for a value with the | 3557 | * sys_rt_sigsuspend - replace the signal mask for a value with the |
| 3342 | * @unewset value until a signal is received | 3558 | * @unewset value until a signal is received |
| @@ -3355,7 +3571,45 @@ SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize) | |||
| 3355 | return -EFAULT; | 3571 | return -EFAULT; |
| 3356 | return sigsuspend(&newset); | 3572 | return sigsuspend(&newset); |
| 3357 | } | 3573 | } |
| 3358 | #endif /* __ARCH_WANT_SYS_RT_SIGSUSPEND */ | 3574 | |
| 3575 | #ifdef CONFIG_COMPAT | ||
| 3576 | COMPAT_SYSCALL_DEFINE2(rt_sigsuspend, compat_sigset_t __user *, unewset, compat_size_t, sigsetsize) | ||
| 3577 | { | ||
| 3578 | #ifdef __BIG_ENDIAN | ||
| 3579 | sigset_t newset; | ||
| 3580 | compat_sigset_t newset32; | ||
| 3581 | |||
| 3582 | /* XXX: Don't preclude handling different sized sigset_t's. */ | ||
| 3583 | if (sigsetsize != sizeof(sigset_t)) | ||
| 3584 | return -EINVAL; | ||
| 3585 | |||
| 3586 | if (copy_from_user(&newset32, unewset, sizeof(compat_sigset_t))) | ||
| 3587 | return -EFAULT; | ||
| 3588 | sigset_from_compat(&newset, &newset32); | ||
| 3589 | return sigsuspend(&newset); | ||
| 3590 | #else | ||
| 3591 | /* on little-endian bitmaps don't care about granularity */ | ||
| 3592 | return sys_rt_sigsuspend((sigset_t __user *)unewset, sigsetsize); | ||
| 3593 | #endif | ||
| 3594 | } | ||
| 3595 | #endif | ||
| 3596 | |||
| 3597 | #ifdef CONFIG_OLD_SIGSUSPEND | ||
| 3598 | SYSCALL_DEFINE1(sigsuspend, old_sigset_t, mask) | ||
| 3599 | { | ||
| 3600 | sigset_t blocked; | ||
| 3601 | siginitset(&blocked, mask); | ||
| 3602 | return sigsuspend(&blocked); | ||
| 3603 | } | ||
| 3604 | #endif | ||
| 3605 | #ifdef CONFIG_OLD_SIGSUSPEND3 | ||
| 3606 | SYSCALL_DEFINE3(sigsuspend, int, unused1, int, unused2, old_sigset_t, mask) | ||
| 3607 | { | ||
| 3608 | sigset_t blocked; | ||
| 3609 | siginitset(&blocked, mask); | ||
| 3610 | return sigsuspend(&blocked); | ||
| 3611 | } | ||
| 3612 | #endif | ||
| 3359 | 3613 | ||
| 3360 | __attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma) | 3614 | __attribute__((weak)) const char *arch_vma_name(struct vm_area_struct *vma) |
| 3361 | { | 3615 | { |
