aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-12-23 03:22:04 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2013-02-03 18:16:05 -0500
commit6e26aab98ce8a818fb1ec47f8f727a8480a9011b (patch)
tree3579b895d5b4ff1343b54686d91381d16a1313f0
parent0aa0203fb43f04714004b2c4ad33b858e240555d (diff)
parisc: switch to generic sigaltstack
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--arch/parisc/Kconfig1
-rw-r--r--arch/parisc/kernel/entry.S38
-rw-r--r--arch/parisc/kernel/signal.c19
-rw-r--r--arch/parisc/kernel/signal32.c35
-rw-r--r--arch/parisc/kernel/signal32.h8
-rw-r--r--arch/parisc/kernel/syscall_table.S2
6 files changed, 6 insertions, 97 deletions
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig
index b77feffbadea..9804a9e34979 100644
--- a/arch/parisc/Kconfig
+++ b/arch/parisc/Kconfig
@@ -23,6 +23,7 @@ config PARISC
23 select HAVE_MOD_ARCH_SPECIFIC 23 select HAVE_MOD_ARCH_SPECIFIC
24 select MODULES_USE_ELF_RELA 24 select MODULES_USE_ELF_RELA
25 select CLONE_BACKWARDS 25 select CLONE_BACKWARDS
26 select GENERIC_SIGALTSTACK
26 27
27 help 28 help
28 The PA-RISC microprocessor is designed by Hewlett-Packard and used 29 The PA-RISC microprocessor is designed by Hewlett-Packard and used
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
index bfb44247d7a7..240d153daec3 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 */
1749ENDPROC(sys_rt_sigreturn_wrapper) 1749ENDPROC(sys_rt_sigreturn_wrapper)
1750 1750
1751ENTRY(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
1770ENDPROC(sys_sigaltstack_wrapper)
1771
1772#ifdef CONFIG_64BIT
1773ENTRY(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
1786ENDPROC(sys32_sigaltstack_wrapper)
1787#endif
1788
1789ENTRY(syscall_exit) 1751ENTRY(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 537996955998..64d315f6d2a4 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
@@ -260,15 +260,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
260 if (is_compat_task()) { 260 if (is_compat_task()) {
261 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info); 261 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
262 err |= copy_siginfo_to_user32(&compat_frame->info, info); 262 err |= copy_siginfo_to_user32(&compat_frame->info, info);
263 DBG(1,"SETUP_RT_FRAME: 1\n"); 263 err |= __compat_save_altstack( &compat_frame->uc.uc_stack, regs->gr[30]);
264 compat_val = (compat_int_t)current->sas_ss_sp;
265 err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp);
266 DBG(1,"SETUP_RT_FRAME: 2\n");
267 compat_val = (compat_int_t)current->sas_ss_size;
268 err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_size);
269 DBG(1,"SETUP_RT_FRAME: 3\n");
270 compat_val = sas_ss_flags(regs->gr[30]);
271 err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_flags);
272 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc); 264 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
273 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext); 265 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
274 err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext, 266 err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext,
@@ -280,10 +272,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
280 { 272 {
281 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info); 273 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
282 err |= copy_siginfo_to_user(&frame->info, info); 274 err |= copy_siginfo_to_user(&frame->info, info);
283 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); 275 err |= __save_altstack(&frame->uc.uc_stack, regs->gr[30]);
284 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
285 err |= __put_user(sas_ss_flags(regs->gr[30]),
286 &frame->uc.uc_stack.ss_flags);
287 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc); 276 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
288 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext); 277 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
289 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall); 278 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 5dede04f2f3e..df79070c3715 100644
--- a/arch/parisc/kernel/signal32.c
+++ b/arch/parisc/kernel/signal32.c
@@ -148,41 +148,6 @@ sys32_rt_sigaction(int sig, const struct sigaction32 __user *act, struct sigacti
148 return ret; 148 return ret;
149} 149}
150 150
151int
152do_sigaltstack32 (const compat_stack_t __user *uss32, compat_stack_t __user *uoss32, unsigned long sp)
153{
154 compat_stack_t ss32, oss32;
155 stack_t ss, oss;
156 stack_t *ssp = NULL, *ossp = NULL;
157 int ret;
158
159 if (uss32) {
160 if (copy_from_user(&ss32, uss32, sizeof ss32))
161 return -EFAULT;
162
163 ss.ss_sp = (void __user *)(unsigned long)ss32.ss_sp;
164 ss.ss_flags = ss32.ss_flags;
165 ss.ss_size = ss32.ss_size;
166
167 ssp = &ss;
168 }
169
170 if (uoss32)
171 ossp = &oss;
172
173 KERNEL_SYSCALL(ret, do_sigaltstack, (const stack_t __user *)ssp, (stack_t __user *)ossp, sp);
174
175 if (!ret && uoss32) {
176 oss32.ss_sp = (unsigned int)(unsigned long)oss.ss_sp;
177 oss32.ss_flags = oss.ss_flags;
178 oss32.ss_size = oss.ss_size;
179 if (copy_to_user(uoss32, &oss32, sizeof *uoss32))
180 return -EFAULT;
181 }
182
183 return ret;
184}
185
186long 151long
187restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf, 152restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf,
188 struct pt_regs *regs) 153 struct pt_regs *regs)
diff --git a/arch/parisc/kernel/signal32.h b/arch/parisc/kernel/signal32.h
index 08a88b5349a2..640dc3ec8f5d 100644
--- a/arch/parisc/kernel/signal32.h
+++ b/arch/parisc/kernel/signal32.h
@@ -23,12 +23,6 @@
23 23
24typedef compat_uptr_t compat_sighandler_t; 24typedef compat_uptr_t compat_sighandler_t;
25 25
26typedef 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 26/* Most things should be clean enough to redefine this at will, if care
33 is taken to make libc match. */ 27 is taken to make libc match. */
34 28
@@ -102,8 +96,6 @@ struct compat_rt_sigframe {
102 96
103void sigset_32to64(sigset_t *s64, compat_sigset_t *s32); 97void sigset_32to64(sigset_t *s64, compat_sigset_t *s32);
104void sigset_64to32(compat_sigset_t *s32, sigset_t *s64); 98void sigset_64to32(compat_sigset_t *s32, sigset_t *s64);
105int do_sigaltstack32 (const compat_stack_t __user *uss32,
106 compat_stack_t __user *uoss32, unsigned long sp);
107long restore_sigcontext32(struct compat_sigcontext __user *sc, 99long restore_sigcontext32(struct compat_sigcontext __user *sc,
108 struct compat_regfile __user *rf, 100 struct compat_regfile __user *rf,
109 struct pt_regs *regs); 101 struct pt_regs *regs);
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S
index 54d950b067b7..46dd6efacaaa 100644
--- a/arch/parisc/kernel/syscall_table.S
+++ b/arch/parisc/kernel/syscall_table.S
@@ -255,7 +255,7 @@
255 ENTRY_SAME(mremap) 255 ENTRY_SAME(mremap)
256 ENTRY_SAME(setresuid) 256 ENTRY_SAME(setresuid)
257 ENTRY_SAME(getresuid) /* 165 */ 257 ENTRY_SAME(getresuid) /* 165 */
258 ENTRY_DIFF(sigaltstack_wrapper) 258 ENTRY_COMP(sigaltstack)
259 ENTRY_SAME(ni_syscall) /* query_module */ 259 ENTRY_SAME(ni_syscall) /* query_module */
260 ENTRY_SAME(poll) 260 ENTRY_SAME(poll)
261 /* structs contain pointers and an in_addr... */ 261 /* structs contain pointers and an in_addr... */