| From 13eb192d10bcc9ac518d57356179071d603bcb4e Mon Sep 17 00:00:00 2001 |
| From: James Hogan <james.hogan@imgtec.com> |
| Date: Tue, 24 May 2016 09:35:10 +0100 |
| Subject: MIPS: Fix sigreturn via VDSO on microMIPS kernel |
| |
| From: James Hogan <james.hogan@imgtec.com> |
| |
| commit 13eb192d10bcc9ac518d57356179071d603bcb4e upstream. |
| |
| In microMIPS kernels, handle_signal() sets the isa16 mode bit in the |
| vdso address so that the sigreturn trampolines (which are offset from |
| the VDSO) get executed as microMIPS. |
| |
| However commit ebb5e78cc634 ("MIPS: Initial implementation of a VDSO") |
| changed the offsets to come from the VDSO image, which already have the |
| isa16 mode bit set correctly since they're extracted from the VDSO |
| shared library symbol table. |
| |
| Drop the isa16 mode bit handling from handle_signal() to fix sigreturn |
| for cores which support both microMIPS and normal MIPS. This doesn't fix |
| microMIPS only cores, since the VDSO is still built for normal MIPS, but |
| thats a separate problem. |
| |
| Fixes: ebb5e78cc634 ("MIPS: Initial implementation of a VDSO") |
| Signed-off-by: James Hogan <james.hogan@imgtec.com> |
| Cc: Paul Burton <paul.burton@imgtec.com> |
| Cc: linux-mips@linux-mips.org |
| Patchwork: https://patchwork.linux-mips.org/patch/13348/ |
| Signed-off-by: Ralf Baechle <ralf@linux-mips.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/mips/kernel/signal.c | 8 -------- |
| 1 file changed, 8 deletions(-) |
| |
| --- a/arch/mips/kernel/signal.c |
| +++ b/arch/mips/kernel/signal.c |
| @@ -770,15 +770,7 @@ static void handle_signal(struct ksignal |
| sigset_t *oldset = sigmask_to_save(); |
| int ret; |
| struct mips_abi *abi = current->thread.abi; |
| -#ifdef CONFIG_CPU_MICROMIPS |
| - void *vdso; |
| - unsigned long tmp = (unsigned long)current->mm->context.vdso; |
| - |
| - set_isa16_mode(tmp); |
| - vdso = (void *)tmp; |
| -#else |
| void *vdso = current->mm->context.vdso; |
| -#endif |
| |
| if (regs->regs[0]) { |
| switch(regs->regs[2]) { |