diff options
Diffstat (limited to 'arch/mips/kernel/branch.c')
-rw-r--r-- | arch/mips/kernel/branch.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/arch/mips/kernel/branch.c b/arch/mips/kernel/branch.c index 6b5df8bfab85..0176ed015c89 100644 --- a/arch/mips/kernel/branch.c +++ b/arch/mips/kernel/branch.c | |||
@@ -205,6 +205,39 @@ int __compute_return_epc(struct pt_regs *regs) | |||
205 | break; | 205 | break; |
206 | } | 206 | } |
207 | break; | 207 | break; |
208 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||
209 | case lwc2_op: /* This is bbit0 on Octeon */ | ||
210 | if ((regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt)) | ||
211 | == 0) | ||
212 | epc = epc + 4 + (insn.i_format.simmediate << 2); | ||
213 | else | ||
214 | epc += 8; | ||
215 | regs->cp0_epc = epc; | ||
216 | break; | ||
217 | case ldc2_op: /* This is bbit032 on Octeon */ | ||
218 | if ((regs->regs[insn.i_format.rs] & | ||
219 | (1ull<<(insn.i_format.rt+32))) == 0) | ||
220 | epc = epc + 4 + (insn.i_format.simmediate << 2); | ||
221 | else | ||
222 | epc += 8; | ||
223 | regs->cp0_epc = epc; | ||
224 | break; | ||
225 | case swc2_op: /* This is bbit1 on Octeon */ | ||
226 | if (regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt)) | ||
227 | epc = epc + 4 + (insn.i_format.simmediate << 2); | ||
228 | else | ||
229 | epc += 8; | ||
230 | regs->cp0_epc = epc; | ||
231 | break; | ||
232 | case sdc2_op: /* This is bbit132 on Octeon */ | ||
233 | if (regs->regs[insn.i_format.rs] & | ||
234 | (1ull<<(insn.i_format.rt+32))) | ||
235 | epc = epc + 4 + (insn.i_format.simmediate << 2); | ||
236 | else | ||
237 | epc += 8; | ||
238 | regs->cp0_epc = epc; | ||
239 | break; | ||
240 | #endif | ||
208 | } | 241 | } |
209 | 242 | ||
210 | return 0; | 243 | return 0; |