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; |
