aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/ia32/ia32_signal.c6
-rw-r--r--arch/x86/ia32/ia32entry.S11
-rw-r--r--arch/x86/include/asm/sys_ia32.h4
-rw-r--r--arch/x86/include/asm/syscalls.h4
-rw-r--r--arch/x86/kernel/entry_32.S23
-rw-r--r--arch/x86/kernel/entry_64.S2
-rw-r--r--arch/x86/kernel/signal.c9
-rw-r--r--arch/x86/syscalls/syscall_32.tbl4
-rw-r--r--arch/x86/um/signal.c15
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
218asmlinkage long sys32_sigreturn(struct pt_regs *regs) 218asmlinkage 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
244asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs) 245asmlinkage 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
457GLOBAL(\label) 457GLOBAL(\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
472GLOBAL(stub32_clone) 471GLOBAL(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 */
71asmlinkage long sys32_sigsuspend(int, int, old_sigset_t); 71asmlinkage long sys32_sigsuspend(int, int, old_sigset_t);
72asmlinkage long sys32_sigreturn(struct pt_regs *); 72asmlinkage long sys32_sigreturn(void);
73asmlinkage long sys32_rt_sigreturn(struct pt_regs *); 73asmlinkage long sys32_rt_sigreturn(void);
74 74
75/* ia32/ipc32.c */ 75/* ia32/ipc32.c */
76asmlinkage long sys32_ipc(u32, int, int, int, compat_uptr_t, u32); 76asmlinkage 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);
24asmlinkage int sys_modify_ldt(int, void __user *, unsigned long); 24asmlinkage int sys_modify_ldt(int, void __user *, unsigned long);
25 25
26/* kernel/signal.c */ 26/* kernel/signal.c */
27long sys_rt_sigreturn(struct pt_regs *); 27long sys_rt_sigreturn(void);
28 28
29/* kernel/tls.c */ 29/* kernel/tls.c */
30asmlinkage int sys_set_thread_area(struct user_desc __user *); 30asmlinkage int sys_set_thread_area(struct user_desc __user *);
@@ -37,7 +37,7 @@ asmlinkage int sys_get_thread_area(struct user_desc __user *);
37asmlinkage int sys_sigsuspend(int, int, old_sigset_t); 37asmlinkage int sys_sigsuspend(int, int, old_sigset_t);
38asmlinkage int sys_sigaction(int, const struct old_sigaction __user *, 38asmlinkage int sys_sigaction(int, const struct old_sigaction __user *,
39 struct old_sigaction __user *); 39 struct old_sigaction __user *);
40unsigned long sys_sigreturn(struct pt_regs *); 40unsigned long sys_sigreturn(void);
41 41
42/* kernel/vm86_32.c */ 42/* kernel/vm86_32.c */
43int sys_vm86old(struct vm86_struct __user *, struct pt_regs *); 43int 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) \
706ENTRY(ptregs_##name) ; \
707 leal 4(%esp),%eax; \
708 jmp sys_##name; \
709ENDPROC(ptregs_##name)
710
711#define PTREGSCALL1(name) \ 705#define PTREGSCALL1(name) \
712ENTRY(ptregs_##name) ; \ 706ENTRY(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; \
724ENDPROC(ptregs_##name) 718ENDPROC(ptregs_##name)
725 719
726#define PTREGSCALL3(name) \
727ENTRY(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; \
739ENDPROC(ptregs_##name)
740
741PTREGSCALL0(sigreturn)
742PTREGSCALL0(rt_sigreturn)
743PTREGSCALL2(vm86) 720PTREGSCALL2(vm86)
744PTREGSCALL1(vm86old) 721PTREGSCALL1(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
600unsigned long sys_sigreturn(struct pt_regs *regs) 600unsigned 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
628long sys_rt_sigreturn(struct pt_regs *regs) 629long 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
846asmlinkage long sys32_x32_rt_sigreturn(struct pt_regs *regs) 848asmlinkage 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 @@
125116 i386 sysinfo sys_sysinfo compat_sys_sysinfo 125116 i386 sysinfo sys_sysinfo compat_sys_sysinfo
126117 i386 ipc sys_ipc sys32_ipc 126117 i386 ipc sys_ipc sys32_ipc
127118 i386 fsync sys_fsync 127118 i386 fsync sys_fsync
128119 i386 sigreturn ptregs_sigreturn stub32_sigreturn 128119 i386 sigreturn sys_sigreturn stub32_sigreturn
129120 i386 clone sys_clone stub32_clone 129120 i386 clone sys_clone stub32_clone
130121 i386 setdomainname sys_setdomainname 130121 i386 setdomainname sys_setdomainname
131122 i386 uname sys_newuname 131122 i386 uname sys_newuname
@@ -179,7 +179,7 @@
179170 i386 setresgid sys_setresgid16 179170 i386 setresgid sys_setresgid16
180171 i386 getresgid sys_getresgid16 180171 i386 getresgid sys_getresgid16
181172 i386 prctl sys_prctl 181172 i386 prctl sys_prctl
182173 i386 rt_sigreturn ptregs_rt_sigreturn stub32_rt_sigreturn 182173 i386 rt_sigreturn sys_rt_sigreturn stub32_rt_sigreturn
183174 i386 rt_sigaction sys_rt_sigaction sys32_rt_sigaction 183174 i386 rt_sigaction sys_rt_sigaction sys32_rt_sigaction
184175 i386 rt_sigprocmask sys_rt_sigprocmask 184175 i386 rt_sigprocmask sys_rt_sigprocmask
185176 i386 rt_sigpending sys_rt_sigpending sys32_rt_sigpending 185176 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
467long sys_sigreturn(struct pt_regs *regs) 467long sys_sigreturn(void)
468{ 468{
469 unsigned long sp = PT_REGS_SP(&current->thread.regs); 469 unsigned long sp = PT_REGS_SP(&current->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
580long sys_rt_sigreturn(struct pt_regs *regs) 580long sys_rt_sigreturn(void)
581{ 581{
582 unsigned long sp = PT_REGS_SP(&current->thread.regs); 582 unsigned long sp = PT_REGS_SP(&current->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
606long ptregs_sigreturn(void)
607{
608 return sys_sigreturn(NULL);
609}
610long ptregs_rt_sigreturn(void)
611{
612 return sys_rt_sigreturn(NULL);
613}
614#endif