Support the MIPS32 / MIPS64 DSP ASE.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
*/
|
||||
int __compute_return_epc(struct pt_regs *regs)
|
||||
{
|
||||
unsigned int *addr, bit, fcr31;
|
||||
unsigned int *addr, bit, fcr31, dspcontrol;
|
||||
long epc;
|
||||
union mips_instruction insn;
|
||||
|
||||
@@ -99,6 +99,18 @@ int __compute_return_epc(struct pt_regs *regs)
|
||||
epc += 8;
|
||||
regs->cp0_epc = epc;
|
||||
break;
|
||||
case bposge32_op:
|
||||
if (!cpu_has_dsp)
|
||||
goto sigill;
|
||||
|
||||
dspcontrol = rddsp(0x01);
|
||||
|
||||
if (dspcontrol >= 32) {
|
||||
epc = epc + 4 + (insn.i_format.simmediate << 2);
|
||||
} else
|
||||
epc += 8;
|
||||
regs->cp0_epc = epc;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -200,4 +212,9 @@ unaligned:
|
||||
printk("%s: unaligned epc - sending SIGBUS.\n", current->comm);
|
||||
force_sig(SIGBUS, current);
|
||||
return -EFAULT;
|
||||
|
||||
sigill:
|
||||
printk("%s: DSP branch but not DSP ASE - sending SIGBUS.\n", current->comm);
|
||||
force_sig(SIGBUS, current);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user