RT-AC56 3.0.0.4.374.37 core
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / arch / mips / kernel / branch.c
blob9011de2f79bef8f7834c6ba8c4fbb3027cb9cb71
1 /*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
6 * Copyright (C) 1996, 97, 2000, 2001 by Ralf Baechle
7 * Copyright (C) 2001 MIPS Technologies, Inc.
8 */
9 #include <linux/kernel.h>
10 #include <linux/sched.h>
11 #include <linux/signal.h>
12 #include <asm/branch.h>
13 #include <asm/cpu.h>
14 #include <asm/cpu-features.h>
15 #include <asm/fpu.h>
16 #include <asm/fpu_emulator.h>
17 #include <asm/inst.h>
18 #include <asm/ptrace.h>
19 #include <asm/uaccess.h>
22 * Calculate and return exception epc in case of
23 * branch delay slot for microMIPS/MIPS16e
24 * It doesn't clear ISA mode bit.
26 int __isa_exception_epc(struct pt_regs *regs)
28 long epc;
29 union mips16e_instruction inst;
31 /* calc exception pc in branch delay slot */
32 epc = regs->cp0_epc;
33 if (__get_user(inst.full, (u16 __user *) (epc & ~MIPS_ISA_MODE))) {
34 /* it should never happens... because delay slot was checked */
35 force_sig(SIGSEGV, current);
36 return epc;
38 if (cpu_has_mips16) {
39 if (inst.ri.opcode == MIPS16e_jal_op)
40 epc += 4;
41 else
42 epc += 2;
43 } else if (mm_is16bit(inst.full))
44 epc += 2;
45 else
46 epc += 4;
48 return epc;
52 * Compute the return address and do emulate branch simulation in MIPS16e mode,
53 * if required.
54 * After exception only - doesn't do 'compact' branch/jumps and can't be used
55 * during interrupt (compact B/J doesn't do exception)
57 int __MIPS16e_compute_return_epc(struct pt_regs *regs)
59 u16 __user *addr;
60 union mips16e_instruction inst;
61 u16 inst2;
62 u32 fullinst;
63 long epc;
65 epc = regs->cp0_epc;
67 * Read the instruction
69 addr = (u16 __user *) (epc & ~MIPS_ISA_MODE);
70 if (__get_user(inst.full, addr)) {
71 force_sig(SIGSEGV, current);
72 return -EFAULT;
75 switch (inst.ri.opcode) {
76 case MIPS16e_extend_op:
77 regs->cp0_epc += 4;
78 return 0;
81 * JAL and JALX in MIPS16e mode
83 case MIPS16e_jal_op:
84 addr += 1;
85 if (__get_user(inst2, addr)) {
86 force_sig(SIGSEGV, current);
87 return -EFAULT;
89 fullinst = ((unsigned)inst.full << 16) | inst2;
90 regs->regs[31] = epc + 6;
91 epc += 4;
92 epc >>= 28;
93 epc <<= 28;
95 * JAL:5 X:1 TARGET[20-16]:5 TARGET[25:21]:5 TARGET[15:0]:16
97 * ......TARGET[15:0].................TARGET[20:16]...........
98 * ......TARGET[25:21]
100 epc |=
101 ((fullinst & 0xffff) << 2) | ((fullinst & 0x3e00000) >> 3) |
102 ((fullinst & 0x1f0000) << 7);
103 if (!inst.jal.x)
104 epc |= MIPS_ISA_MODE; /* set ISA mode 1 */
105 regs->cp0_epc = epc;
106 return 0;
109 * J(AL)R(C)
111 case MIPS16e_rr_op:
112 if (inst.rr.func == MIPS16e_jr_func) {
114 if (inst.rr.ra)
115 regs->cp0_epc = regs->regs[31];
116 else
117 regs->cp0_epc =
118 regs->regs[mips16e_reg2gpr[inst.rr.rx]];
120 if (inst.rr.l) {
121 if (inst.rr.nd)
122 regs->regs[31] = epc + 2;
123 else
124 regs->regs[31] = epc + 4;
126 return 0;
128 break;
131 /* all other cases have no branch delay slot and are 16bits,
132 and branches do not do exception */
133 regs->cp0_epc += 2;
135 return 0;
139 * Compute the return address and do emulate branch simulation in
140 * microMIPS mode, if required.
141 * After exception only - doesn't do 'compact' branch/jumps and can't be used
142 * during interrupt (compact B/J doesn't do exception)
144 int __microMIPS_compute_return_epc(struct pt_regs *regs)
146 u16 __user *pc16;
147 u16 halfword;
148 unsigned int word;
149 unsigned long contpc;
150 struct decoded_instn mminst = { 0 };
152 mminst.micro_mips_mode = 1;
155 * This load never faults.
157 pc16 = (unsigned short __user *)(regs->cp0_epc & ~MIPS_ISA_MODE);
158 __get_user(halfword, pc16);
159 pc16++;
160 contpc = regs->cp0_epc + 2;
161 word = ((unsigned int)halfword << 16);
162 mminst.pc_inc = 2;
164 if (!mm_is16bit(halfword)) {
165 __get_user(halfword, pc16);
166 pc16++;
167 contpc = regs->cp0_epc + 4;
168 mminst.pc_inc = 4;
169 word |= halfword;
171 mminst.insn = word;
173 if (get_user(halfword, pc16))
174 goto sigsegv;
175 mminst.next_pc_inc = 2;
176 word = ((unsigned int)halfword << 16);
178 if (!mm_is16bit(halfword)) {
179 pc16++;
180 if (get_user(halfword, pc16))
181 goto sigsegv;
182 mminst.next_pc_inc = 4;
183 word |= halfword;
185 mminst.next_insn = word;
187 mm_isBranchInstr(regs, mminst, &contpc);
189 regs->cp0_epc = contpc;
191 return 0;
193 sigsegv:
194 force_sig(SIGSEGV, current);
195 return -EFAULT;
199 * Compute the return address and do emulate branch simulation, if required.
200 * This function should be called only in branch delay slot active.
202 int __compute_return_epc(struct pt_regs *regs)
204 unsigned int __user *addr;
205 unsigned int bit, fcr31, dspcontrol;
206 long epc;
207 union mips_instruction insn;
209 epc = regs->cp0_epc;
210 if (epc & 3)
211 goto unaligned;
214 * Read the instruction
216 addr = (unsigned int __user *) epc;
217 if (__get_user(insn.word, addr)) {
218 force_sig(SIGSEGV, current);
219 return -EFAULT;
222 switch (insn.i_format.opcode) {
224 * jr and jalr are in r_format format.
226 case spec_op:
227 switch (insn.r_format.func) {
228 case jalr_op:
229 regs->regs[insn.r_format.rd] = epc + 8;
230 /* Fall through */
231 case jr_op:
232 regs->cp0_epc = regs->regs[insn.r_format.rs];
233 break;
235 break;
238 * This group contains:
239 * bltz_op, bgez_op, bltzl_op, bgezl_op,
240 * bltzal_op, bgezal_op, bltzall_op, bgezall_op.
242 case bcond_op:
243 switch (insn.i_format.rt) {
244 case bltz_op:
245 case bltzl_op:
246 if ((long)regs->regs[insn.i_format.rs] < 0)
247 epc = epc + 4 + (insn.i_format.simmediate << 2);
248 else
249 epc += 8;
250 regs->cp0_epc = epc;
251 break;
253 case bgez_op:
254 case bgezl_op:
255 if ((long)regs->regs[insn.i_format.rs] >= 0)
256 epc = epc + 4 + (insn.i_format.simmediate << 2);
257 else
258 epc += 8;
259 regs->cp0_epc = epc;
260 break;
262 case bltzal_op:
263 case bltzall_op:
264 regs->regs[31] = epc + 8;
265 if ((long)regs->regs[insn.i_format.rs] < 0)
266 epc = epc + 4 + (insn.i_format.simmediate << 2);
267 else
268 epc += 8;
269 regs->cp0_epc = epc;
270 break;
272 case bgezal_op:
273 case bgezall_op:
274 regs->regs[31] = epc + 8;
275 if ((long)regs->regs[insn.i_format.rs] >= 0)
276 epc = epc + 4 + (insn.i_format.simmediate << 2);
277 else
278 epc += 8;
279 regs->cp0_epc = epc;
280 break;
281 case bposge32_op:
282 if (!cpu_has_dsp)
283 goto sigill;
285 dspcontrol = rddsp(0x01);
287 if (dspcontrol >= 32) {
288 epc = epc + 4 + (insn.i_format.simmediate << 2);
289 } else
290 epc += 8;
291 regs->cp0_epc = epc;
292 break;
294 break;
297 * These are unconditional and in j_format.
299 case jal_op:
300 regs->regs[31] = regs->cp0_epc + 8;
301 case j_op:
302 epc += 4;
303 epc >>= 28;
304 epc <<= 28;
305 epc |= (insn.j_format.target << 2);
306 regs->cp0_epc = epc;
307 if (insn.i_format.opcode == jalx_op)
308 regs->cp0_epc |= MIPS_ISA_MODE;
309 break;
312 * These are conditional and in i_format.
314 case beq_op:
315 case beql_op:
316 if (regs->regs[insn.i_format.rs] ==
317 regs->regs[insn.i_format.rt])
318 epc = epc + 4 + (insn.i_format.simmediate << 2);
319 else
320 epc += 8;
321 regs->cp0_epc = epc;
322 break;
324 case bne_op:
325 case bnel_op:
326 if (regs->regs[insn.i_format.rs] !=
327 regs->regs[insn.i_format.rt])
328 epc = epc + 4 + (insn.i_format.simmediate << 2);
329 else
330 epc += 8;
331 regs->cp0_epc = epc;
332 break;
334 case blez_op: /* not really i_format */
335 case blezl_op:
336 /* rt field assumed to be zero */
337 if ((long)regs->regs[insn.i_format.rs] <= 0)
338 epc = epc + 4 + (insn.i_format.simmediate << 2);
339 else
340 epc += 8;
341 regs->cp0_epc = epc;
342 break;
344 case bgtz_op:
345 case bgtzl_op:
346 /* rt field assumed to be zero */
347 if ((long)regs->regs[insn.i_format.rs] > 0)
348 epc = epc + 4 + (insn.i_format.simmediate << 2);
349 else
350 epc += 8;
351 regs->cp0_epc = epc;
352 break;
355 * And now the FPA/cp1 branch instructions.
357 case cop1_op:
358 preempt_disable();
359 if (is_fpu_owner())
360 asm volatile("cfc1\t%0,$31" : "=r" (fcr31));
361 else
362 fcr31 = current->thread.fpu.fcr31;
363 preempt_enable();
365 bit = (insn.i_format.rt >> 2);
366 bit += (bit != 0);
367 bit += 23;
368 switch (insn.i_format.rt & 3) {
369 case 0: /* bc1f */
370 case 2: /* bc1fl */
371 if (~fcr31 & (1 << bit))
372 epc = epc + 4 + (insn.i_format.simmediate << 2);
373 else
374 epc += 8;
375 regs->cp0_epc = epc;
376 break;
378 case 1: /* bc1t */
379 case 3: /* bc1tl */
380 if (fcr31 & (1 << bit))
381 epc = epc + 4 + (insn.i_format.simmediate << 2);
382 else
383 epc += 8;
384 regs->cp0_epc = epc;
385 break;
387 break;
388 #ifdef CONFIG_CPU_CAVIUM_OCTEON
389 case lwc2_op: /* This is bbit0 on Octeon */
390 if ((regs->regs[insn.i_format.rs] & (1ull << insn.i_format.rt))
391 == 0)
392 epc = epc + 4 + (insn.i_format.simmediate << 2);
393 else
394 epc += 8;
395 regs->cp0_epc = epc;
396 break;
397 case ldc2_op: /* This is bbit032 on Octeon */
398 if ((regs->regs[insn.i_format.rs] &
399 (1ull << (insn.i_format.rt + 32))) == 0)
400 epc = epc + 4 + (insn.i_format.simmediate << 2);
401 else
402 epc += 8;
403 regs->cp0_epc = epc;
404 break;
405 case swc2_op: /* This is bbit1 on Octeon */
406 if (regs->regs[insn.i_format.rs] & (1ull << insn.i_format.rt))
407 epc = epc + 4 + (insn.i_format.simmediate << 2);
408 else
409 epc += 8;
410 regs->cp0_epc = epc;
411 break;
412 case sdc2_op: /* This is bbit132 on Octeon */
413 if (regs->regs[insn.i_format.rs] &
414 (1ull << (insn.i_format.rt + 32)))
415 epc = epc + 4 + (insn.i_format.simmediate << 2);
416 else
417 epc += 8;
418 regs->cp0_epc = epc;
419 break;
420 #endif
423 return 0;
425 unaligned:
426 printk("%s: unaligned epc - sending SIGBUS.\n", current->comm);
427 force_sig(SIGBUS, current);
428 return -EFAULT;
430 sigill:
431 printk("%s: DSP branch but not DSP ASE - sending SIGBUS.\n", current->comm);
432 force_sig(SIGBUS, current);
433 return -EFAULT;