forked from Minki/linux
MIPS: Send SIGILL for R6 branches in `__compute_return_epc_for_insn'
Fix: * commit8467ca0122
("MIPS: Emulate the new MIPS R6 branch compact (BC) instruction"), * commit84fef63012
("MIPS: Emulate the new MIPS R6 BALC instruction"), * commit69b9a2fd05
("MIPS: Emulate the new MIPS R6 BEQZC and JIC instructions"), * commit28d6f93d20
("MIPS: Emulate the new MIPS R6 BNEZC and JIALC instructions"), * commitc893ce38b2
("MIPS: Emulate the new MIPS R6 BOVC, BEQC and BEQZALC instructions") and send SIGILL rather than returning -SIGILL for R6 branch and jump instructions. Returning -SIGILL is never correct as the API defines this function's result upon error to be -EFAULT and a signal actually issued. Fixes:8467ca0122
("MIPS: Emulate the new MIPS R6 branch compact (BC) instruction") Fixes:84fef63012
("MIPS: Emulate the new MIPS R6 BALC instruction") Fixes:69b9a2fd05
("MIPS: Emulate the new MIPS R6 BEQZC and JIC instructions") Fixes:28d6f93d20
("MIPS: Emulate the new MIPS R6 BNEZC and JIALC instructions") Fixes:c893ce38b2
("MIPS: Emulate the new MIPS R6 BOVC, BEQC and BEQZALC instructions") Signed-off-by: Maciej W. Rozycki <macro@imgtec.com> Cc: James Hogan <james.hogan@imgtec.com> Cc: linux-mips@linux-mips.org Cc: stable@vger.kernel.org # 3.19+ Patchwork: https://patchwork.linux-mips.org/patch/16399/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
fef40be6da
commit
a60b1a5bf8
@ -771,35 +771,27 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
|
||||
#else
|
||||
case bc6_op:
|
||||
/* Only valid for MIPS R6 */
|
||||
if (!cpu_has_mips_r6) {
|
||||
ret = -SIGILL;
|
||||
break;
|
||||
}
|
||||
if (!cpu_has_mips_r6)
|
||||
goto sigill_r6;
|
||||
regs->cp0_epc += 8;
|
||||
break;
|
||||
case balc6_op:
|
||||
if (!cpu_has_mips_r6) {
|
||||
ret = -SIGILL;
|
||||
break;
|
||||
}
|
||||
if (!cpu_has_mips_r6)
|
||||
goto sigill_r6;
|
||||
/* Compact branch: BALC */
|
||||
regs->regs[31] = epc + 4;
|
||||
epc += 4 + (insn.i_format.simmediate << 2);
|
||||
regs->cp0_epc = epc;
|
||||
break;
|
||||
case pop66_op:
|
||||
if (!cpu_has_mips_r6) {
|
||||
ret = -SIGILL;
|
||||
break;
|
||||
}
|
||||
if (!cpu_has_mips_r6)
|
||||
goto sigill_r6;
|
||||
/* Compact branch: BEQZC || JIC */
|
||||
regs->cp0_epc += 8;
|
||||
break;
|
||||
case pop76_op:
|
||||
if (!cpu_has_mips_r6) {
|
||||
ret = -SIGILL;
|
||||
break;
|
||||
}
|
||||
if (!cpu_has_mips_r6)
|
||||
goto sigill_r6;
|
||||
/* Compact branch: BNEZC || JIALC */
|
||||
if (!insn.i_format.rs) {
|
||||
/* JIALC: set $31/ra */
|
||||
@ -811,10 +803,8 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
|
||||
case pop10_op:
|
||||
case pop30_op:
|
||||
/* Only valid for MIPS R6 */
|
||||
if (!cpu_has_mips_r6) {
|
||||
ret = -SIGILL;
|
||||
break;
|
||||
}
|
||||
if (!cpu_has_mips_r6)
|
||||
goto sigill_r6;
|
||||
/*
|
||||
* Compact branches:
|
||||
* bovc, beqc, beqzalc, bnvc, bnec, bnezlac
|
||||
@ -837,6 +827,11 @@ sigill_r2r6:
|
||||
current->comm);
|
||||
force_sig(SIGILL, current);
|
||||
return -EFAULT;
|
||||
sigill_r6:
|
||||
pr_info("%s: R6 branch but no MIPSr6 ISA support - sending SIGILL.\n",
|
||||
current->comm);
|
||||
force_sig(SIGILL, current);
|
||||
return -EFAULT;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__compute_return_epc_for_insn);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user