| From: "Maciej W. Rozycki" <macro@linux-mips.org> |
| Date: Fri, 3 Apr 2015 23:25:08 +0100 |
| Subject: MIPS: Normalise code flow in the CpU exception handler |
| |
| commit 27e28e8ec47a5ce335ebf25d34ca356c80635908 upstream. |
| |
| Changes applied to `do_cpu' over time reduced the use of the SIGILL |
| issued with `force_sig' at the end to a single CU3 case only in the |
| switch statement there. Move that `force_sig' call over to right where |
| required then and toss out the pile of gotos now not needed to skip over |
| the call, replacing them with regular breaks out of the switch. |
| |
| Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org> |
| Cc: linux-mips@linux-mips.org |
| Patchwork: https://patchwork.linux-mips.org/patch/9683/ |
| Signed-off-by: Ralf Baechle <ralf@linux-mips.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/mips/kernel/traps.c | 15 +++++++-------- |
| 1 file changed, 7 insertions(+), 8 deletions(-) |
| |
| --- a/arch/mips/kernel/traps.c |
| +++ b/arch/mips/kernel/traps.c |
| @@ -1247,7 +1247,7 @@ asmlinkage void do_cpu(struct pt_regs *r |
| status = -1; |
| |
| if (unlikely(compute_return_epc(regs) < 0)) |
| - goto out; |
| + break; |
| |
| if (get_isa16_mode(regs->cp0_epc)) { |
| unsigned short mmop[2] = { 0 }; |
| @@ -1280,7 +1280,7 @@ asmlinkage void do_cpu(struct pt_regs *r |
| force_sig(status, current); |
| } |
| |
| - goto out; |
| + break; |
| |
| case 3: |
| /* |
| @@ -1296,8 +1296,10 @@ asmlinkage void do_cpu(struct pt_regs *r |
| * erroneously too, so they are covered by this choice |
| * as well. |
| */ |
| - if (raw_cpu_has_fpu) |
| + if (raw_cpu_has_fpu) { |
| + force_sig(SIGILL, current); |
| break; |
| + } |
| /* Fall through. */ |
| |
| case 1: |
| @@ -1320,16 +1322,13 @@ asmlinkage void do_cpu(struct pt_regs *r |
| if (!process_fpemu_return(sig, fault_addr, fcr31) && !err) |
| mt_ase_fp_affinity(); |
| |
| - goto out; |
| + break; |
| |
| case 2: |
| raw_notifier_call_chain(&cu2_chain, CU2_EXCEPTION, regs); |
| - goto out; |
| + break; |
| } |
| |
| - force_sig(SIGILL, current); |
| - |
| -out: |
| exception_exit(prev_state); |
| } |
| |