diff options
-rw-r--r-- | arch/x86/ia32/ia32_signal.c | 6 | ||||
-rw-r--r-- | arch/x86/ia32/ia32entry.S | 11 | ||||
-rw-r--r-- | arch/x86/include/asm/sys_ia32.h | 4 | ||||
-rw-r--r-- | arch/x86/include/asm/syscalls.h | 4 | ||||
-rw-r--r-- | arch/x86/kernel/entry_32.S | 23 | ||||
-rw-r--r-- | arch/x86/kernel/entry_64.S | 2 | ||||
-rw-r--r-- | arch/x86/kernel/signal.c | 9 | ||||
-rw-r--r-- | arch/x86/syscalls/syscall_32.tbl | 4 | ||||
-rw-r--r-- | arch/x86/um/signal.c | 15 |
9 files changed, 23 insertions, 55 deletions
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index a1daf4a65009..15fdb3f57d8c 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
@@ -215,8 +215,9 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, | |||
215 | return err; | 215 | return err; |
216 | } | 216 | } |
217 | 217 | ||
218 | asmlinkage long sys32_sigreturn(struct pt_regs *regs) | 218 | asmlinkage long sys32_sigreturn(void) |
219 | { | 219 | { |
220 | struct pt_regs *regs = current_pt_regs(); | ||
220 | struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8); | 221 | struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8); |
221 | sigset_t set; | 222 | sigset_t set; |
222 | unsigned int ax; | 223 | unsigned int ax; |
@@ -241,8 +242,9 @@ badframe: | |||
241 | return 0; | 242 | return 0; |
242 | } | 243 | } |
243 | 244 | ||
244 | asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs) | 245 | asmlinkage long sys32_rt_sigreturn(void) |
245 | { | 246 | { |
247 | struct pt_regs *regs = current_pt_regs(); | ||
246 | struct rt_sigframe_ia32 __user *frame; | 248 | struct rt_sigframe_ia32 __user *frame; |
247 | sigset_t set; | 249 | sigset_t set; |
248 | unsigned int ax; | 250 | unsigned int ax; |
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 74bc91e3612b..c05e16b4536b 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
@@ -456,17 +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 | 469 | ||
471 | ALIGN | 470 | ALIGN |
472 | GLOBAL(stub32_clone) | 471 | GLOBAL(stub32_clone) |
diff --git a/arch/x86/include/asm/sys_ia32.h b/arch/x86/include/asm/sys_ia32.h index 31f61f96e0fb..93e142a719bc 100644 --- a/arch/x86/include/asm/sys_ia32.h +++ b/arch/x86/include/asm/sys_ia32.h | |||
@@ -69,8 +69,8 @@ asmlinkage long sys32_fallocate(int, int, unsigned, | |||
69 | 69 | ||
70 | /* ia32/ia32_signal.c */ | 70 | /* ia32/ia32_signal.c */ |
71 | asmlinkage long sys32_sigsuspend(int, int, old_sigset_t); | 71 | asmlinkage long sys32_sigsuspend(int, int, old_sigset_t); |
72 | asmlinkage long sys32_sigreturn(struct pt_regs *); | 72 | asmlinkage long sys32_sigreturn(void); |
73 | asmlinkage long sys32_rt_sigreturn(struct pt_regs *); | 73 | asmlinkage long sys32_rt_sigreturn(void); |
74 | 74 | ||
75 | /* ia32/ipc32.c */ | 75 | /* ia32/ipc32.c */ |
76 | asmlinkage long sys32_ipc(u32, int, int, int, compat_uptr_t, u32); | 76 | 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 76be6f2d980c..de2e1ab913bb 100644 --- a/arch/x86/include/asm/syscalls.h +++ b/arch/x86/include/asm/syscalls.h | |||
@@ -24,7 +24,7 @@ asmlinkage long sys_iopl(unsigned int); | |||
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 *); |
@@ -37,7 +37,7 @@ asmlinkage int sys_get_thread_area(struct user_desc __user *); | |||
37 | asmlinkage int sys_sigsuspend(int, int, old_sigset_t); | 37 | asmlinkage int sys_sigsuspend(int, int, old_sigset_t); |
38 | asmlinkage int sys_sigaction(int, const struct old_sigaction __user *, | 38 | asmlinkage int sys_sigaction(int, const struct old_sigaction __user *, |
39 | struct old_sigaction __user *); | 39 | struct old_sigaction __user *); |
40 | unsigned long sys_sigreturn(struct pt_regs *); | 40 | unsigned long sys_sigreturn(void); |
41 | 41 | ||
42 | /* kernel/vm86_32.c */ | 42 | /* kernel/vm86_32.c */ |
43 | int sys_vm86old(struct vm86_struct __user *, struct pt_regs *); | 43 | int sys_vm86old(struct vm86_struct __user *, struct pt_regs *); |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 415c6346d8bf..e132cf6ea140 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -702,12 +702,6 @@ END(syscall_badsys) | |||
702 | /* | 702 | /* |
703 | * System calls that need a pt_regs pointer. | 703 | * System calls that need a pt_regs pointer. |
704 | */ | 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) \ | 705 | #define PTREGSCALL1(name) \ |
712 | ENTRY(ptregs_##name) ; \ | 706 | ENTRY(ptregs_##name) ; \ |
713 | leal 4(%esp),%edx; \ | 707 | leal 4(%esp),%edx; \ |
@@ -723,23 +717,6 @@ ENTRY(ptregs_##name) ; \ | |||
723 | jmp sys_##name; \ | 717 | jmp sys_##name; \ |
724 | ENDPROC(ptregs_##name) | 718 | ENDPROC(ptregs_##name) |
725 | 719 | ||
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 | PTREGSCALL0(sigreturn) | ||
742 | PTREGSCALL0(rt_sigreturn) | ||
743 | PTREGSCALL2(vm86) | 720 | PTREGSCALL2(vm86) |
744 | PTREGSCALL1(vm86old) | 721 | PTREGSCALL1(vm86old) |
745 | 722 | ||
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 4486fee3999f..197512242e3b 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -896,7 +896,6 @@ ENTRY(stub_rt_sigreturn) | |||
896 | addq $8, %rsp | 896 | addq $8, %rsp |
897 | PARTIAL_FRAME 0 | 897 | PARTIAL_FRAME 0 |
898 | SAVE_REST | 898 | SAVE_REST |
899 | movq %rsp,%rdi | ||
900 | FIXUP_TOP_OF_STACK %r11 | 899 | FIXUP_TOP_OF_STACK %r11 |
901 | call sys_rt_sigreturn | 900 | call sys_rt_sigreturn |
902 | 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 |
@@ -911,7 +910,6 @@ ENTRY(stub_x32_rt_sigreturn) | |||
911 | addq $8, %rsp | 910 | addq $8, %rsp |
912 | PARTIAL_FRAME 0 | 911 | PARTIAL_FRAME 0 |
913 | SAVE_REST | 912 | SAVE_REST |
914 | movq %rsp,%rdi | ||
915 | FIXUP_TOP_OF_STACK %r11 | 913 | FIXUP_TOP_OF_STACK %r11 |
916 | call sys32_x32_rt_sigreturn | 914 | call sys32_x32_rt_sigreturn |
917 | 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/signal.c b/arch/x86/kernel/signal.c index d6bf1f34a6e9..38ba7e56e161 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c | |||
@@ -597,8 +597,9 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
597 | * Do a signal return; undo the signal stack. | 597 | * Do a signal return; undo the signal stack. |
598 | */ | 598 | */ |
599 | #ifdef CONFIG_X86_32 | 599 | #ifdef CONFIG_X86_32 |
600 | unsigned long sys_sigreturn(struct pt_regs *regs) | 600 | unsigned long sys_sigreturn(void) |
601 | { | 601 | { |
602 | struct pt_regs *regs = current_pt_regs(); | ||
602 | struct sigframe __user *frame; | 603 | struct sigframe __user *frame; |
603 | unsigned long ax; | 604 | unsigned long ax; |
604 | sigset_t set; | 605 | sigset_t set; |
@@ -625,8 +626,9 @@ badframe: | |||
625 | } | 626 | } |
626 | #endif /* CONFIG_X86_32 */ | 627 | #endif /* CONFIG_X86_32 */ |
627 | 628 | ||
628 | long sys_rt_sigreturn(struct pt_regs *regs) | 629 | long sys_rt_sigreturn(void) |
629 | { | 630 | { |
631 | struct pt_regs *regs = current_pt_regs(); | ||
630 | struct rt_sigframe __user *frame; | 632 | struct rt_sigframe __user *frame; |
631 | unsigned long ax; | 633 | unsigned long ax; |
632 | sigset_t set; | 634 | sigset_t set; |
@@ -843,8 +845,9 @@ void signal_fault(struct pt_regs *regs, void __user *frame, char *where) | |||
843 | } | 845 | } |
844 | 846 | ||
845 | #ifdef CONFIG_X86_X32_ABI | 847 | #ifdef CONFIG_X86_X32_ABI |
846 | asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs) | 848 | asmlinkage long sys32_x32_rt_sigreturn(void) |
847 | { | 849 | { |
850 | struct pt_regs *regs = current_pt_regs(); | ||
848 | struct rt_sigframe_x32 __user *frame; | 851 | struct rt_sigframe_x32 __user *frame; |
849 | sigset_t set; | 852 | sigset_t set; |
850 | unsigned long ax; | 853 | unsigned long ax; |
diff --git a/arch/x86/syscalls/syscall_32.tbl b/arch/x86/syscalls/syscall_32.tbl index aa15a7a94cf7..4e8ab081ee3d 100644 --- a/arch/x86/syscalls/syscall_32.tbl +++ b/arch/x86/syscalls/syscall_32.tbl | |||
@@ -125,7 +125,7 @@ | |||
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 |
@@ -179,7 +179,7 @@ | |||
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 sys32_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 sys32_rt_sigpending |
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 | ||