diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-20 21:05:28 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-12-20 21:05:28 -0500 |
commit | 54d46ea993744c5408e39ce0cb4851e13cbea716 (patch) | |
tree | 8e38fa92cc2ae72e0353c44e1e68be9bf5a7a058 /arch/x86/kernel | |
parent | f59dc2bb5a50b26ea751f9eac1c81e4cc7de5257 (diff) | |
parent | 50ececcfa7d1acee085b2c518cad495062db6379 (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal
Pull signal handling cleanups from Al Viro:
"sigaltstack infrastructure + conversion for x86, alpha and um,
COMPAT_SYSCALL_DEFINE infrastructure.
Note that there are several conflicts between "unify
SS_ONSTACK/SS_DISABLE definitions" and UAPI patches in mainline;
resolution is trivial - just remove definitions of SS_ONSTACK and
SS_DISABLED from arch/*/uapi/asm/signal.h; they are all identical and
include/uapi/linux/signal.h contains the unified variant."
Fixed up conflicts as per Al.
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/signal:
alpha: switch to generic sigaltstack
new helpers: __save_altstack/__compat_save_altstack, switch x86 and um to those
generic compat_sys_sigaltstack()
introduce generic sys_sigaltstack(), switch x86 and um to it
new helper: compat_user_stack_pointer()
new helper: restore_altstack()
unify SS_ONSTACK/SS_DISABLE definitions
new helper: current_user_stack_pointer()
missing user_stack_pointer() instances
Bury the conditionals from kernel_thread/kernel_execve series
COMPAT_SYSCALL_DEFINE: infrastructure
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/entry_32.S | 1 | ||||
-rw-r--r-- | arch/x86/kernel/entry_64.S | 3 | ||||
-rw-r--r-- | arch/x86/kernel/signal.c | 29 |
3 files changed, 5 insertions, 28 deletions
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index c763116c5359..ff84d5469d77 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -739,7 +739,6 @@ ENTRY(ptregs_##name) ; \ | |||
739 | ENDPROC(ptregs_##name) | 739 | ENDPROC(ptregs_##name) |
740 | 740 | ||
741 | PTREGSCALL1(iopl) | 741 | PTREGSCALL1(iopl) |
742 | PTREGSCALL2(sigaltstack) | ||
743 | PTREGSCALL0(sigreturn) | 742 | PTREGSCALL0(sigreturn) |
744 | PTREGSCALL0(rt_sigreturn) | 743 | PTREGSCALL0(rt_sigreturn) |
745 | PTREGSCALL2(vm86) | 744 | PTREGSCALL2(vm86) |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 70641aff0c25..07a7a04529bc 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -864,7 +864,6 @@ END(stub_\func) | |||
864 | FORK_LIKE clone | 864 | FORK_LIKE clone |
865 | FORK_LIKE fork | 865 | FORK_LIKE fork |
866 | FORK_LIKE vfork | 866 | FORK_LIKE vfork |
867 | PTREGSCALL stub_sigaltstack, sys_sigaltstack, %rdx | ||
868 | PTREGSCALL stub_iopl, sys_iopl, %rsi | 867 | PTREGSCALL stub_iopl, sys_iopl, %rsi |
869 | 868 | ||
870 | ENTRY(ptregscall_common) | 869 | ENTRY(ptregscall_common) |
@@ -913,8 +912,6 @@ ENTRY(stub_rt_sigreturn) | |||
913 | END(stub_rt_sigreturn) | 912 | END(stub_rt_sigreturn) |
914 | 913 | ||
915 | #ifdef CONFIG_X86_X32_ABI | 914 | #ifdef CONFIG_X86_X32_ABI |
916 | PTREGSCALL stub_x32_sigaltstack, sys32_sigaltstack, %rdx | ||
917 | |||
918 | ENTRY(stub_x32_rt_sigreturn) | 915 | ENTRY(stub_x32_rt_sigreturn) |
919 | CFI_STARTPROC | 916 | CFI_STARTPROC |
920 | addq $8, %rsp | 917 | addq $8, %rsp |
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index fbbb604313a2..d6bf1f34a6e9 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c | |||
@@ -364,10 +364,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
364 | else | 364 | else |
365 | put_user_ex(0, &frame->uc.uc_flags); | 365 | put_user_ex(0, &frame->uc.uc_flags); |
366 | put_user_ex(0, &frame->uc.uc_link); | 366 | put_user_ex(0, &frame->uc.uc_link); |
367 | put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 367 | err |= __save_altstack(&frame->uc.uc_stack, regs->sp); |
368 | put_user_ex(sas_ss_flags(regs->sp), | ||
369 | &frame->uc.uc_stack.ss_flags); | ||
370 | put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
371 | 368 | ||
372 | /* Set up to return from userspace. */ | 369 | /* Set up to return from userspace. */ |
373 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); | 370 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); |
@@ -414,7 +411,6 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
414 | struct rt_sigframe __user *frame; | 411 | struct rt_sigframe __user *frame; |
415 | void __user *fp = NULL; | 412 | void __user *fp = NULL; |
416 | int err = 0; | 413 | int err = 0; |
417 | struct task_struct *me = current; | ||
418 | 414 | ||
419 | frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp); | 415 | frame = get_sigframe(ka, regs, sizeof(struct rt_sigframe), &fp); |
420 | 416 | ||
@@ -433,10 +429,7 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
433 | else | 429 | else |
434 | put_user_ex(0, &frame->uc.uc_flags); | 430 | put_user_ex(0, &frame->uc.uc_flags); |
435 | put_user_ex(0, &frame->uc.uc_link); | 431 | put_user_ex(0, &frame->uc.uc_link); |
436 | put_user_ex(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 432 | err |= __save_altstack(&frame->uc.uc_stack, regs->sp); |
437 | put_user_ex(sas_ss_flags(regs->sp), | ||
438 | &frame->uc.uc_stack.ss_flags); | ||
439 | put_user_ex(me->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
440 | 433 | ||
441 | /* Set up to return from userspace. If provided, use a stub | 434 | /* Set up to return from userspace. If provided, use a stub |
442 | already in userspace. */ | 435 | already in userspace. */ |
@@ -503,10 +496,7 @@ static int x32_setup_rt_frame(int sig, struct k_sigaction *ka, | |||
503 | else | 496 | else |
504 | put_user_ex(0, &frame->uc.uc_flags); | 497 | put_user_ex(0, &frame->uc.uc_flags); |
505 | put_user_ex(0, &frame->uc.uc_link); | 498 | put_user_ex(0, &frame->uc.uc_link); |
506 | put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 499 | err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); |
507 | put_user_ex(sas_ss_flags(regs->sp), | ||
508 | &frame->uc.uc_stack.ss_flags); | ||
509 | put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
510 | put_user_ex(0, &frame->uc.uc__pad0); | 500 | put_user_ex(0, &frame->uc.uc__pad0); |
511 | 501 | ||
512 | if (ka->sa.sa_flags & SA_RESTORER) { | 502 | if (ka->sa.sa_flags & SA_RESTORER) { |
@@ -603,13 +593,6 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
603 | } | 593 | } |
604 | #endif /* CONFIG_X86_32 */ | 594 | #endif /* CONFIG_X86_32 */ |
605 | 595 | ||
606 | long | ||
607 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | ||
608 | struct pt_regs *regs) | ||
609 | { | ||
610 | return do_sigaltstack(uss, uoss, regs->sp); | ||
611 | } | ||
612 | |||
613 | /* | 596 | /* |
614 | * Do a signal return; undo the signal stack. | 597 | * Do a signal return; undo the signal stack. |
615 | */ | 598 | */ |
@@ -659,7 +642,7 @@ long sys_rt_sigreturn(struct pt_regs *regs) | |||
659 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | 642 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) |
660 | goto badframe; | 643 | goto badframe; |
661 | 644 | ||
662 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) | 645 | if (restore_altstack(&frame->uc.uc_stack)) |
663 | goto badframe; | 646 | goto badframe; |
664 | 647 | ||
665 | return ax; | 648 | return ax; |
@@ -865,7 +848,6 @@ asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs) | |||
865 | struct rt_sigframe_x32 __user *frame; | 848 | struct rt_sigframe_x32 __user *frame; |
866 | sigset_t set; | 849 | sigset_t set; |
867 | unsigned long ax; | 850 | unsigned long ax; |
868 | struct pt_regs tregs; | ||
869 | 851 | ||
870 | frame = (struct rt_sigframe_x32 __user *)(regs->sp - 8); | 852 | frame = (struct rt_sigframe_x32 __user *)(regs->sp - 8); |
871 | 853 | ||
@@ -879,8 +861,7 @@ asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs) | |||
879 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | 861 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) |
880 | goto badframe; | 862 | goto badframe; |
881 | 863 | ||
882 | tregs = *regs; | 864 | if (compat_restore_altstack(&frame->uc.uc_stack)) |
883 | if (sys32_sigaltstack(&frame->uc.uc_stack, NULL, &tregs) == -EFAULT) | ||
884 | goto badframe; | 865 | goto badframe; |
885 | 866 | ||
886 | return ax; | 867 | return ax; |