|
@@ -205,6 +205,39 @@ int __compute_return_epc(struct pt_regs *regs)
|
|
|
break;
|
|
|
}
|
|
|
break;
|
|
|
+#ifdef CONFIG_CPU_CAVIUM_OCTEON
|
|
|
+ case lwc2_op: /* This is bbit0 on Octeon */
|
|
|
+ if ((regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt))
|
|
|
+ == 0)
|
|
|
+ epc = epc + 4 + (insn.i_format.simmediate << 2);
|
|
|
+ else
|
|
|
+ epc += 8;
|
|
|
+ regs->cp0_epc = epc;
|
|
|
+ break;
|
|
|
+ case ldc2_op: /* This is bbit032 on Octeon */
|
|
|
+ if ((regs->regs[insn.i_format.rs] &
|
|
|
+ (1ull<<(insn.i_format.rt+32))) == 0)
|
|
|
+ epc = epc + 4 + (insn.i_format.simmediate << 2);
|
|
|
+ else
|
|
|
+ epc += 8;
|
|
|
+ regs->cp0_epc = epc;
|
|
|
+ break;
|
|
|
+ case swc2_op: /* This is bbit1 on Octeon */
|
|
|
+ if (regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt))
|
|
|
+ epc = epc + 4 + (insn.i_format.simmediate << 2);
|
|
|
+ else
|
|
|
+ epc += 8;
|
|
|
+ regs->cp0_epc = epc;
|
|
|
+ break;
|
|
|
+ case sdc2_op: /* This is bbit132 on Octeon */
|
|
|
+ if (regs->regs[insn.i_format.rs] &
|
|
|
+ (1ull<<(insn.i_format.rt+32)))
|
|
|
+ epc = epc + 4 + (insn.i_format.simmediate << 2);
|
|
|
+ else
|
|
|
+ epc += 8;
|
|
|
+ regs->cp0_epc = epc;
|
|
|
+ break;
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
return 0;
|