diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2005-05-31 07:49:19 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2005-10-29 14:31:17 -0400 |
commit | e50c0a8fa60da9ac0e0a70caa8a3a803815c1f2f (patch) | |
tree | 1928e8b0a4b7fb615e5a9f65dc934ba2e74cb9cd /arch/mips/kernel/branch.c | |
parent | 10f650db1bcc193ea07d4f8c2f07315da38ea0c4 (diff) |
Support the MIPS32 / MIPS64 DSP ASE.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/kernel/branch.c')
-rw-r--r-- | arch/mips/kernel/branch.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/arch/mips/kernel/branch.c b/arch/mips/kernel/branch.c index 56aea5f526a7..374de839558d 100644 --- a/arch/mips/kernel/branch.c +++ b/arch/mips/kernel/branch.c | |||
@@ -22,7 +22,7 @@ | |||
22 | */ | 22 | */ |
23 | int __compute_return_epc(struct pt_regs *regs) | 23 | int __compute_return_epc(struct pt_regs *regs) |
24 | { | 24 | { |
25 | unsigned int *addr, bit, fcr31; | 25 | unsigned int *addr, bit, fcr31, dspcontrol; |
26 | long epc; | 26 | long epc; |
27 | union mips_instruction insn; | 27 | union mips_instruction insn; |
28 | 28 | ||
@@ -99,6 +99,18 @@ int __compute_return_epc(struct pt_regs *regs) | |||
99 | epc += 8; | 99 | epc += 8; |
100 | regs->cp0_epc = epc; | 100 | regs->cp0_epc = epc; |
101 | break; | 101 | break; |
102 | case bposge32_op: | ||
103 | if (!cpu_has_dsp) | ||
104 | goto sigill; | ||
105 | |||
106 | dspcontrol = rddsp(0x01); | ||
107 | |||
108 | if (dspcontrol >= 32) { | ||
109 | epc = epc + 4 + (insn.i_format.simmediate << 2); | ||
110 | } else | ||
111 | epc += 8; | ||
112 | regs->cp0_epc = epc; | ||
113 | break; | ||
102 | } | 114 | } |
103 | break; | 115 | break; |
104 | 116 | ||
@@ -200,4 +212,9 @@ unaligned: | |||
200 | printk("%s: unaligned epc - sending SIGBUS.\n", current->comm); | 212 | printk("%s: unaligned epc - sending SIGBUS.\n", current->comm); |
201 | force_sig(SIGBUS, current); | 213 | force_sig(SIGBUS, current); |
202 | return -EFAULT; | 214 | return -EFAULT; |
215 | |||
216 | sigill: | ||
217 | printk("%s: DSP branch but not DSP ASE - sending SIGBUS.\n", current->comm); | ||
218 | force_sig(SIGBUS, current); | ||
219 | return -EFAULT; | ||
203 | } | 220 | } |