diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2012-12-23 03:22:04 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-02-03 18:16:05 -0500 |
commit | 6e26aab98ce8a818fb1ec47f8f727a8480a9011b (patch) | |
tree | 3579b895d5b4ff1343b54686d91381d16a1313f0 | |
parent | 0aa0203fb43f04714004b2c4ad33b858e240555d (diff) |
parisc: switch to generic sigaltstack
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | arch/parisc/Kconfig | 1 | ||||
-rw-r--r-- | arch/parisc/kernel/entry.S | 38 | ||||
-rw-r--r-- | arch/parisc/kernel/signal.c | 19 | ||||
-rw-r--r-- | arch/parisc/kernel/signal32.c | 35 | ||||
-rw-r--r-- | arch/parisc/kernel/signal32.h | 8 | ||||
-rw-r--r-- | arch/parisc/kernel/syscall_table.S | 2 |
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 */ |
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 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 | ||
151 | int | ||
152 | do_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 | |||
186 | long | 151 | long |
187 | restore_sigcontext32(struct compat_sigcontext __user *sc, struct compat_regfile __user * rf, | 152 | restore_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 | ||
24 | typedef compat_uptr_t compat_sighandler_t; | 24 | typedef compat_uptr_t compat_sighandler_t; |
25 | 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 | 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 | ||
103 | void sigset_32to64(sigset_t *s64, compat_sigset_t *s32); | 97 | void sigset_32to64(sigset_t *s64, compat_sigset_t *s32); |
104 | void sigset_64to32(compat_sigset_t *s32, sigset_t *s64); | 98 | 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, | 99 | long 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... */ |