Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/mips/kernel/branch.c
26439 views
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.
5
*
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/signal.h>
11
#include <linux/signal.h>
12
#include <linux/export.h>
13
#include <asm/branch.h>
14
#include <asm/cpu.h>
15
#include <asm/cpu-features.h>
16
#include <asm/fpu.h>
17
#include <asm/fpu_emulator.h>
18
#include <asm/inst.h>
19
#include <asm/mips-r2-to-r6-emul.h>
20
#include <asm/ptrace.h>
21
#include <linux/uaccess.h>
22
23
#include "probes-common.h"
24
25
/*
26
* Calculate and return exception PC in case of branch delay slot
27
* for microMIPS and MIPS16e. It does not clear the ISA mode bit.
28
*/
29
int __isa_exception_epc(struct pt_regs *regs)
30
{
31
unsigned short inst;
32
long epc = regs->cp0_epc;
33
34
/* Calculate exception PC in branch delay slot. */
35
if (__get_user(inst, (u16 __user *) msk_isa16_mode(epc))) {
36
/* This should never happen because delay slot was checked. */
37
force_sig(SIGSEGV);
38
return epc;
39
}
40
if (cpu_has_mips16) {
41
union mips16e_instruction inst_mips16e;
42
43
inst_mips16e.full = inst;
44
if (inst_mips16e.ri.opcode == MIPS16e_jal_op)
45
epc += 4;
46
else
47
epc += 2;
48
} else if (mm_insn_16bit(inst))
49
epc += 2;
50
else
51
epc += 4;
52
53
return epc;
54
}
55
56
/* (microMIPS) Convert 16-bit register encoding to 32-bit register encoding. */
57
static const unsigned int reg16to32map[8] = {16, 17, 2, 3, 4, 5, 6, 7};
58
59
int __mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
60
unsigned long *contpc)
61
{
62
union mips_instruction insn = (union mips_instruction)dec_insn.insn;
63
int __maybe_unused bc_false = 0;
64
65
if (!cpu_has_mmips)
66
return 0;
67
68
switch (insn.mm_i_format.opcode) {
69
case mm_pool32a_op:
70
if ((insn.mm_i_format.simmediate & MM_POOL32A_MINOR_MASK) ==
71
mm_pool32axf_op) {
72
switch (insn.mm_i_format.simmediate >>
73
MM_POOL32A_MINOR_SHIFT) {
74
case mm_jalr_op:
75
case mm_jalrhb_op:
76
case mm_jalrs_op:
77
case mm_jalrshb_op:
78
if (insn.mm_i_format.rt != 0) /* Not mm_jr */
79
regs->regs[insn.mm_i_format.rt] =
80
regs->cp0_epc +
81
dec_insn.pc_inc +
82
dec_insn.next_pc_inc;
83
*contpc = regs->regs[insn.mm_i_format.rs];
84
return 1;
85
}
86
}
87
break;
88
case mm_pool32i_op:
89
switch (insn.mm_i_format.rt) {
90
case mm_bltzals_op:
91
case mm_bltzal_op:
92
regs->regs[31] = regs->cp0_epc +
93
dec_insn.pc_inc +
94
dec_insn.next_pc_inc;
95
fallthrough;
96
case mm_bltz_op:
97
if ((long)regs->regs[insn.mm_i_format.rs] < 0)
98
*contpc = regs->cp0_epc +
99
dec_insn.pc_inc +
100
(insn.mm_i_format.simmediate << 1);
101
else
102
*contpc = regs->cp0_epc +
103
dec_insn.pc_inc +
104
dec_insn.next_pc_inc;
105
return 1;
106
case mm_bgezals_op:
107
case mm_bgezal_op:
108
regs->regs[31] = regs->cp0_epc +
109
dec_insn.pc_inc +
110
dec_insn.next_pc_inc;
111
fallthrough;
112
case mm_bgez_op:
113
if ((long)regs->regs[insn.mm_i_format.rs] >= 0)
114
*contpc = regs->cp0_epc +
115
dec_insn.pc_inc +
116
(insn.mm_i_format.simmediate << 1);
117
else
118
*contpc = regs->cp0_epc +
119
dec_insn.pc_inc +
120
dec_insn.next_pc_inc;
121
return 1;
122
case mm_blez_op:
123
if ((long)regs->regs[insn.mm_i_format.rs] <= 0)
124
*contpc = regs->cp0_epc +
125
dec_insn.pc_inc +
126
(insn.mm_i_format.simmediate << 1);
127
else
128
*contpc = regs->cp0_epc +
129
dec_insn.pc_inc +
130
dec_insn.next_pc_inc;
131
return 1;
132
case mm_bgtz_op:
133
if ((long)regs->regs[insn.mm_i_format.rs] <= 0)
134
*contpc = regs->cp0_epc +
135
dec_insn.pc_inc +
136
(insn.mm_i_format.simmediate << 1);
137
else
138
*contpc = regs->cp0_epc +
139
dec_insn.pc_inc +
140
dec_insn.next_pc_inc;
141
return 1;
142
#ifdef CONFIG_MIPS_FP_SUPPORT
143
case mm_bc2f_op:
144
case mm_bc1f_op: {
145
unsigned int fcr31;
146
unsigned int bit;
147
148
bc_false = 1;
149
fallthrough;
150
case mm_bc2t_op:
151
case mm_bc1t_op:
152
preempt_disable();
153
if (is_fpu_owner())
154
fcr31 = read_32bit_cp1_register(CP1_STATUS);
155
else
156
fcr31 = current->thread.fpu.fcr31;
157
preempt_enable();
158
159
if (bc_false)
160
fcr31 = ~fcr31;
161
162
bit = (insn.mm_i_format.rs >> 2);
163
bit += (bit != 0);
164
bit += 23;
165
if (fcr31 & (1 << bit))
166
*contpc = regs->cp0_epc +
167
dec_insn.pc_inc +
168
(insn.mm_i_format.simmediate << 1);
169
else
170
*contpc = regs->cp0_epc +
171
dec_insn.pc_inc + dec_insn.next_pc_inc;
172
return 1;
173
}
174
#endif /* CONFIG_MIPS_FP_SUPPORT */
175
}
176
break;
177
case mm_pool16c_op:
178
switch (insn.mm_i_format.rt) {
179
case mm_jalr16_op:
180
case mm_jalrs16_op:
181
regs->regs[31] = regs->cp0_epc +
182
dec_insn.pc_inc + dec_insn.next_pc_inc;
183
fallthrough;
184
case mm_jr16_op:
185
*contpc = regs->regs[insn.mm_i_format.rs];
186
return 1;
187
}
188
break;
189
case mm_beqz16_op:
190
if ((long)regs->regs[reg16to32map[insn.mm_b1_format.rs]] == 0)
191
*contpc = regs->cp0_epc +
192
dec_insn.pc_inc +
193
(insn.mm_b1_format.simmediate << 1);
194
else
195
*contpc = regs->cp0_epc +
196
dec_insn.pc_inc + dec_insn.next_pc_inc;
197
return 1;
198
case mm_bnez16_op:
199
if ((long)regs->regs[reg16to32map[insn.mm_b1_format.rs]] != 0)
200
*contpc = regs->cp0_epc +
201
dec_insn.pc_inc +
202
(insn.mm_b1_format.simmediate << 1);
203
else
204
*contpc = regs->cp0_epc +
205
dec_insn.pc_inc + dec_insn.next_pc_inc;
206
return 1;
207
case mm_b16_op:
208
*contpc = regs->cp0_epc + dec_insn.pc_inc +
209
(insn.mm_b0_format.simmediate << 1);
210
return 1;
211
case mm_beq32_op:
212
if (regs->regs[insn.mm_i_format.rs] ==
213
regs->regs[insn.mm_i_format.rt])
214
*contpc = regs->cp0_epc +
215
dec_insn.pc_inc +
216
(insn.mm_i_format.simmediate << 1);
217
else
218
*contpc = regs->cp0_epc +
219
dec_insn.pc_inc +
220
dec_insn.next_pc_inc;
221
return 1;
222
case mm_bne32_op:
223
if (regs->regs[insn.mm_i_format.rs] !=
224
regs->regs[insn.mm_i_format.rt])
225
*contpc = regs->cp0_epc +
226
dec_insn.pc_inc +
227
(insn.mm_i_format.simmediate << 1);
228
else
229
*contpc = regs->cp0_epc +
230
dec_insn.pc_inc + dec_insn.next_pc_inc;
231
return 1;
232
case mm_jalx32_op:
233
regs->regs[31] = regs->cp0_epc +
234
dec_insn.pc_inc + dec_insn.next_pc_inc;
235
*contpc = regs->cp0_epc + dec_insn.pc_inc;
236
*contpc >>= 28;
237
*contpc <<= 28;
238
*contpc |= (insn.j_format.target << 2);
239
return 1;
240
case mm_jals32_op:
241
case mm_jal32_op:
242
regs->regs[31] = regs->cp0_epc +
243
dec_insn.pc_inc + dec_insn.next_pc_inc;
244
fallthrough;
245
case mm_j32_op:
246
*contpc = regs->cp0_epc + dec_insn.pc_inc;
247
*contpc >>= 27;
248
*contpc <<= 27;
249
*contpc |= (insn.j_format.target << 1);
250
set_isa16_mode(*contpc);
251
return 1;
252
}
253
return 0;
254
}
255
256
/*
257
* Compute return address and emulate branch in microMIPS mode after an
258
* exception only. It does not handle compact branches/jumps and cannot
259
* be used in interrupt context. (Compact branches/jumps do not cause
260
* exceptions.)
261
*/
262
int __microMIPS_compute_return_epc(struct pt_regs *regs)
263
{
264
u16 __user *pc16;
265
u16 halfword;
266
unsigned int word;
267
unsigned long contpc;
268
struct mm_decoded_insn mminsn = { 0 };
269
270
mminsn.micro_mips_mode = 1;
271
272
/* This load never faults. */
273
pc16 = (unsigned short __user *)msk_isa16_mode(regs->cp0_epc);
274
__get_user(halfword, pc16);
275
pc16++;
276
contpc = regs->cp0_epc + 2;
277
word = ((unsigned int)halfword << 16);
278
mminsn.pc_inc = 2;
279
280
if (!mm_insn_16bit(halfword)) {
281
__get_user(halfword, pc16);
282
pc16++;
283
contpc = regs->cp0_epc + 4;
284
mminsn.pc_inc = 4;
285
word |= halfword;
286
}
287
mminsn.insn = word;
288
289
if (get_user(halfword, pc16))
290
goto sigsegv;
291
mminsn.next_pc_inc = 2;
292
word = ((unsigned int)halfword << 16);
293
294
if (!mm_insn_16bit(halfword)) {
295
pc16++;
296
if (get_user(halfword, pc16))
297
goto sigsegv;
298
mminsn.next_pc_inc = 4;
299
word |= halfword;
300
}
301
mminsn.next_insn = word;
302
303
mm_isBranchInstr(regs, mminsn, &contpc);
304
305
regs->cp0_epc = contpc;
306
307
return 0;
308
309
sigsegv:
310
force_sig(SIGSEGV);
311
return -EFAULT;
312
}
313
314
/*
315
* Compute return address and emulate branch in MIPS16e mode after an
316
* exception only. It does not handle compact branches/jumps and cannot
317
* be used in interrupt context. (Compact branches/jumps do not cause
318
* exceptions.)
319
*/
320
int __MIPS16e_compute_return_epc(struct pt_regs *regs)
321
{
322
u16 __user *addr;
323
union mips16e_instruction inst;
324
u16 inst2;
325
u32 fullinst;
326
long epc;
327
328
epc = regs->cp0_epc;
329
330
/* Read the instruction. */
331
addr = (u16 __user *)msk_isa16_mode(epc);
332
if (__get_user(inst.full, addr)) {
333
force_sig(SIGSEGV);
334
return -EFAULT;
335
}
336
337
switch (inst.ri.opcode) {
338
case MIPS16e_extend_op:
339
regs->cp0_epc += 4;
340
return 0;
341
342
/*
343
* JAL and JALX in MIPS16e mode
344
*/
345
case MIPS16e_jal_op:
346
addr += 1;
347
if (__get_user(inst2, addr)) {
348
force_sig(SIGSEGV);
349
return -EFAULT;
350
}
351
fullinst = ((unsigned)inst.full << 16) | inst2;
352
regs->regs[31] = epc + 6;
353
epc += 4;
354
epc >>= 28;
355
epc <<= 28;
356
/*
357
* JAL:5 X:1 TARGET[20-16]:5 TARGET[25:21]:5 TARGET[15:0]:16
358
*
359
* ......TARGET[15:0].................TARGET[20:16]...........
360
* ......TARGET[25:21]
361
*/
362
epc |=
363
((fullinst & 0xffff) << 2) | ((fullinst & 0x3e00000) >> 3) |
364
((fullinst & 0x1f0000) << 7);
365
if (!inst.jal.x)
366
set_isa16_mode(epc); /* Set ISA mode bit. */
367
regs->cp0_epc = epc;
368
return 0;
369
370
/*
371
* J(AL)R(C)
372
*/
373
case MIPS16e_rr_op:
374
if (inst.rr.func == MIPS16e_jr_func) {
375
376
if (inst.rr.ra)
377
regs->cp0_epc = regs->regs[31];
378
else
379
regs->cp0_epc =
380
regs->regs[reg16to32[inst.rr.rx]];
381
382
if (inst.rr.l) {
383
if (inst.rr.nd)
384
regs->regs[31] = epc + 2;
385
else
386
regs->regs[31] = epc + 4;
387
}
388
return 0;
389
}
390
break;
391
}
392
393
/*
394
* All other cases have no branch delay slot and are 16-bits.
395
* Branches do not cause an exception.
396
*/
397
regs->cp0_epc += 2;
398
399
return 0;
400
}
401
402
/**
403
* __compute_return_epc_for_insn - Computes the return address and do emulate
404
* branch simulation, if required.
405
*
406
* @regs: Pointer to pt_regs
407
* @insn: branch instruction to decode
408
* Return: -EFAULT on error and forces SIGILL, and on success
409
* returns 0 or BRANCH_LIKELY_TAKEN as appropriate after
410
* evaluating the branch.
411
*
412
* MIPS R6 Compact branches and forbidden slots:
413
* Compact branches do not throw exceptions because they do
414
* not have delay slots. The forbidden slot instruction ($PC+4)
415
* is only executed if the branch was not taken. Otherwise the
416
* forbidden slot is skipped entirely. This means that the
417
* only possible reason to be here because of a MIPS R6 compact
418
* branch instruction is that the forbidden slot has thrown one.
419
* In that case the branch was not taken, so the EPC can be safely
420
* set to EPC + 8.
421
*/
422
int __compute_return_epc_for_insn(struct pt_regs *regs,
423
union mips_instruction insn)
424
{
425
long epc = regs->cp0_epc;
426
unsigned int dspcontrol;
427
int ret = 0;
428
429
switch (insn.i_format.opcode) {
430
/*
431
* jr and jalr are in r_format format.
432
*/
433
case spec_op:
434
switch (insn.r_format.func) {
435
case jalr_op:
436
regs->regs[insn.r_format.rd] = epc + 8;
437
fallthrough;
438
case jr_op:
439
if (NO_R6EMU && insn.r_format.func == jr_op)
440
goto sigill_r2r6;
441
regs->cp0_epc = regs->regs[insn.r_format.rs];
442
break;
443
}
444
break;
445
446
/*
447
* This group contains:
448
* bltz_op, bgez_op, bltzl_op, bgezl_op,
449
* bltzal_op, bgezal_op, bltzall_op, bgezall_op.
450
*/
451
case bcond_op:
452
switch (insn.i_format.rt) {
453
case bltzl_op:
454
if (NO_R6EMU)
455
goto sigill_r2r6;
456
fallthrough;
457
case bltz_op:
458
if ((long)regs->regs[insn.i_format.rs] < 0) {
459
epc = epc + 4 + (insn.i_format.simmediate << 2);
460
if (insn.i_format.rt == bltzl_op)
461
ret = BRANCH_LIKELY_TAKEN;
462
} else
463
epc += 8;
464
regs->cp0_epc = epc;
465
break;
466
467
case bgezl_op:
468
if (NO_R6EMU)
469
goto sigill_r2r6;
470
fallthrough;
471
case bgez_op:
472
if ((long)regs->regs[insn.i_format.rs] >= 0) {
473
epc = epc + 4 + (insn.i_format.simmediate << 2);
474
if (insn.i_format.rt == bgezl_op)
475
ret = BRANCH_LIKELY_TAKEN;
476
} else
477
epc += 8;
478
regs->cp0_epc = epc;
479
break;
480
481
case bltzal_op:
482
case bltzall_op:
483
if (NO_R6EMU && (insn.i_format.rs ||
484
insn.i_format.rt == bltzall_op))
485
goto sigill_r2r6;
486
regs->regs[31] = epc + 8;
487
/*
488
* OK we are here either because we hit a NAL
489
* instruction or because we are emulating an
490
* old bltzal{,l} one. Let's figure out what the
491
* case really is.
492
*/
493
if (!insn.i_format.rs) {
494
/*
495
* NAL or BLTZAL with rs == 0
496
* Doesn't matter if we are R6 or not. The
497
* result is the same
498
*/
499
regs->cp0_epc += 4 +
500
(insn.i_format.simmediate << 2);
501
break;
502
}
503
/* Now do the real thing for non-R6 BLTZAL{,L} */
504
if ((long)regs->regs[insn.i_format.rs] < 0) {
505
epc = epc + 4 + (insn.i_format.simmediate << 2);
506
if (insn.i_format.rt == bltzall_op)
507
ret = BRANCH_LIKELY_TAKEN;
508
} else
509
epc += 8;
510
regs->cp0_epc = epc;
511
break;
512
513
case bgezal_op:
514
case bgezall_op:
515
if (NO_R6EMU && (insn.i_format.rs ||
516
insn.i_format.rt == bgezall_op))
517
goto sigill_r2r6;
518
regs->regs[31] = epc + 8;
519
/*
520
* OK we are here either because we hit a BAL
521
* instruction or because we are emulating an
522
* old bgezal{,l} one. Let's figure out what the
523
* case really is.
524
*/
525
if (!insn.i_format.rs) {
526
/*
527
* BAL or BGEZAL with rs == 0
528
* Doesn't matter if we are R6 or not. The
529
* result is the same
530
*/
531
regs->cp0_epc += 4 +
532
(insn.i_format.simmediate << 2);
533
break;
534
}
535
/* Now do the real thing for non-R6 BGEZAL{,L} */
536
if ((long)regs->regs[insn.i_format.rs] >= 0) {
537
epc = epc + 4 + (insn.i_format.simmediate << 2);
538
if (insn.i_format.rt == bgezall_op)
539
ret = BRANCH_LIKELY_TAKEN;
540
} else
541
epc += 8;
542
regs->cp0_epc = epc;
543
break;
544
545
case bposge32_op:
546
if (!cpu_has_dsp)
547
goto sigill_dsp;
548
549
dspcontrol = rddsp(0x01);
550
551
if (dspcontrol >= 32) {
552
epc = epc + 4 + (insn.i_format.simmediate << 2);
553
} else
554
epc += 8;
555
regs->cp0_epc = epc;
556
break;
557
}
558
break;
559
560
/*
561
* These are unconditional and in j_format.
562
*/
563
case jalx_op:
564
case jal_op:
565
regs->regs[31] = regs->cp0_epc + 8;
566
fallthrough;
567
case j_op:
568
epc += 4;
569
epc >>= 28;
570
epc <<= 28;
571
epc |= (insn.j_format.target << 2);
572
regs->cp0_epc = epc;
573
if (insn.i_format.opcode == jalx_op)
574
set_isa16_mode(regs->cp0_epc);
575
break;
576
577
/*
578
* These are conditional and in i_format.
579
*/
580
case beql_op:
581
if (NO_R6EMU)
582
goto sigill_r2r6;
583
fallthrough;
584
case beq_op:
585
if (regs->regs[insn.i_format.rs] ==
586
regs->regs[insn.i_format.rt]) {
587
epc = epc + 4 + (insn.i_format.simmediate << 2);
588
if (insn.i_format.opcode == beql_op)
589
ret = BRANCH_LIKELY_TAKEN;
590
} else
591
epc += 8;
592
regs->cp0_epc = epc;
593
break;
594
595
case bnel_op:
596
if (NO_R6EMU)
597
goto sigill_r2r6;
598
fallthrough;
599
case bne_op:
600
if (regs->regs[insn.i_format.rs] !=
601
regs->regs[insn.i_format.rt]) {
602
epc = epc + 4 + (insn.i_format.simmediate << 2);
603
if (insn.i_format.opcode == bnel_op)
604
ret = BRANCH_LIKELY_TAKEN;
605
} else
606
epc += 8;
607
regs->cp0_epc = epc;
608
break;
609
610
case blezl_op: /* not really i_format */
611
if (!insn.i_format.rt && NO_R6EMU)
612
goto sigill_r2r6;
613
fallthrough;
614
case blez_op:
615
/*
616
* Compact branches for R6 for the
617
* blez and blezl opcodes.
618
* BLEZ | rs = 0 | rt != 0 == BLEZALC
619
* BLEZ | rs = rt != 0 == BGEZALC
620
* BLEZ | rs != 0 | rt != 0 == BGEUC
621
* BLEZL | rs = 0 | rt != 0 == BLEZC
622
* BLEZL | rs = rt != 0 == BGEZC
623
* BLEZL | rs != 0 | rt != 0 == BGEC
624
*
625
* For real BLEZ{,L}, rt is always 0.
626
*/
627
628
if (cpu_has_mips_r6 && insn.i_format.rt) {
629
if ((insn.i_format.opcode == blez_op) &&
630
((!insn.i_format.rs && insn.i_format.rt) ||
631
(insn.i_format.rs == insn.i_format.rt)))
632
regs->regs[31] = epc + 4;
633
regs->cp0_epc += 8;
634
break;
635
}
636
/* rt field assumed to be zero */
637
if ((long)regs->regs[insn.i_format.rs] <= 0) {
638
epc = epc + 4 + (insn.i_format.simmediate << 2);
639
if (insn.i_format.opcode == blezl_op)
640
ret = BRANCH_LIKELY_TAKEN;
641
} else
642
epc += 8;
643
regs->cp0_epc = epc;
644
break;
645
646
case bgtzl_op:
647
if (!insn.i_format.rt && NO_R6EMU)
648
goto sigill_r2r6;
649
fallthrough;
650
case bgtz_op:
651
/*
652
* Compact branches for R6 for the
653
* bgtz and bgtzl opcodes.
654
* BGTZ | rs = 0 | rt != 0 == BGTZALC
655
* BGTZ | rs = rt != 0 == BLTZALC
656
* BGTZ | rs != 0 | rt != 0 == BLTUC
657
* BGTZL | rs = 0 | rt != 0 == BGTZC
658
* BGTZL | rs = rt != 0 == BLTZC
659
* BGTZL | rs != 0 | rt != 0 == BLTC
660
*
661
* *ZALC varint for BGTZ &&& rt != 0
662
* For real GTZ{,L}, rt is always 0.
663
*/
664
if (cpu_has_mips_r6 && insn.i_format.rt) {
665
if ((insn.i_format.opcode == blez_op) &&
666
((!insn.i_format.rs && insn.i_format.rt) ||
667
(insn.i_format.rs == insn.i_format.rt)))
668
regs->regs[31] = epc + 4;
669
regs->cp0_epc += 8;
670
break;
671
}
672
673
/* rt field assumed to be zero */
674
if ((long)regs->regs[insn.i_format.rs] > 0) {
675
epc = epc + 4 + (insn.i_format.simmediate << 2);
676
if (insn.i_format.opcode == bgtzl_op)
677
ret = BRANCH_LIKELY_TAKEN;
678
} else
679
epc += 8;
680
regs->cp0_epc = epc;
681
break;
682
683
#ifdef CONFIG_MIPS_FP_SUPPORT
684
/*
685
* And now the FPA/cp1 branch instructions.
686
*/
687
case cop1_op: {
688
unsigned int bit, fcr31, reg;
689
690
if (cpu_has_mips_r6 &&
691
((insn.i_format.rs == bc1eqz_op) ||
692
(insn.i_format.rs == bc1nez_op))) {
693
if (!init_fp_ctx(current))
694
lose_fpu(1);
695
reg = insn.i_format.rt;
696
bit = get_fpr32(&current->thread.fpu.fpr[reg], 0) & 0x1;
697
if (insn.i_format.rs == bc1eqz_op)
698
bit = !bit;
699
own_fpu(1);
700
if (bit)
701
epc = epc + 4 +
702
(insn.i_format.simmediate << 2);
703
else
704
epc += 8;
705
regs->cp0_epc = epc;
706
707
break;
708
} else {
709
710
preempt_disable();
711
if (is_fpu_owner())
712
fcr31 = read_32bit_cp1_register(CP1_STATUS);
713
else
714
fcr31 = current->thread.fpu.fcr31;
715
preempt_enable();
716
717
bit = (insn.i_format.rt >> 2);
718
bit += (bit != 0);
719
bit += 23;
720
switch (insn.i_format.rt & 3) {
721
case 0: /* bc1f */
722
case 2: /* bc1fl */
723
if (~fcr31 & (1 << bit)) {
724
epc = epc + 4 +
725
(insn.i_format.simmediate << 2);
726
if (insn.i_format.rt == 2)
727
ret = BRANCH_LIKELY_TAKEN;
728
} else
729
epc += 8;
730
regs->cp0_epc = epc;
731
break;
732
733
case 1: /* bc1t */
734
case 3: /* bc1tl */
735
if (fcr31 & (1 << bit)) {
736
epc = epc + 4 +
737
(insn.i_format.simmediate << 2);
738
if (insn.i_format.rt == 3)
739
ret = BRANCH_LIKELY_TAKEN;
740
} else
741
epc += 8;
742
regs->cp0_epc = epc;
743
break;
744
}
745
break;
746
}
747
}
748
#endif /* CONFIG_MIPS_FP_SUPPORT */
749
750
#ifdef CONFIG_CPU_CAVIUM_OCTEON
751
case lwc2_op: /* This is bbit0 on Octeon */
752
if ((regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt))
753
== 0)
754
epc = epc + 4 + (insn.i_format.simmediate << 2);
755
else
756
epc += 8;
757
regs->cp0_epc = epc;
758
break;
759
case ldc2_op: /* This is bbit032 on Octeon */
760
if ((regs->regs[insn.i_format.rs] &
761
(1ull<<(insn.i_format.rt+32))) == 0)
762
epc = epc + 4 + (insn.i_format.simmediate << 2);
763
else
764
epc += 8;
765
regs->cp0_epc = epc;
766
break;
767
case swc2_op: /* This is bbit1 on Octeon */
768
if (regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt))
769
epc = epc + 4 + (insn.i_format.simmediate << 2);
770
else
771
epc += 8;
772
regs->cp0_epc = epc;
773
break;
774
case sdc2_op: /* This is bbit132 on Octeon */
775
if (regs->regs[insn.i_format.rs] &
776
(1ull<<(insn.i_format.rt+32)))
777
epc = epc + 4 + (insn.i_format.simmediate << 2);
778
else
779
epc += 8;
780
regs->cp0_epc = epc;
781
break;
782
#else
783
case bc6_op:
784
/* Only valid for MIPS R6 */
785
if (!cpu_has_mips_r6)
786
goto sigill_r6;
787
regs->cp0_epc += 8;
788
break;
789
case balc6_op:
790
if (!cpu_has_mips_r6)
791
goto sigill_r6;
792
/* Compact branch: BALC */
793
regs->regs[31] = epc + 4;
794
epc += 4 + (insn.i_format.simmediate << 2);
795
regs->cp0_epc = epc;
796
break;
797
case pop66_op:
798
if (!cpu_has_mips_r6)
799
goto sigill_r6;
800
/* Compact branch: BEQZC || JIC */
801
regs->cp0_epc += 8;
802
break;
803
case pop76_op:
804
if (!cpu_has_mips_r6)
805
goto sigill_r6;
806
/* Compact branch: BNEZC || JIALC */
807
if (!insn.i_format.rs) {
808
/* JIALC: set $31/ra */
809
regs->regs[31] = epc + 4;
810
}
811
regs->cp0_epc += 8;
812
break;
813
#endif
814
case pop10_op:
815
case pop30_op:
816
/* Only valid for MIPS R6 */
817
if (!cpu_has_mips_r6)
818
goto sigill_r6;
819
/*
820
* Compact branches:
821
* bovc, beqc, beqzalc, bnvc, bnec, bnezlac
822
*/
823
if (insn.i_format.rt && !insn.i_format.rs)
824
regs->regs[31] = epc + 4;
825
regs->cp0_epc += 8;
826
break;
827
}
828
829
return ret;
830
831
sigill_dsp:
832
pr_debug("%s: DSP branch but not DSP ASE - sending SIGILL.\n",
833
current->comm);
834
force_sig(SIGILL);
835
return -EFAULT;
836
sigill_r2r6:
837
pr_debug("%s: R2 branch but r2-to-r6 emulator is not present - sending SIGILL.\n",
838
current->comm);
839
force_sig(SIGILL);
840
return -EFAULT;
841
sigill_r6:
842
pr_debug("%s: R6 branch but no MIPSr6 ISA support - sending SIGILL.\n",
843
current->comm);
844
force_sig(SIGILL);
845
return -EFAULT;
846
}
847
EXPORT_SYMBOL_GPL(__compute_return_epc_for_insn);
848
849
int __compute_return_epc(struct pt_regs *regs)
850
{
851
unsigned int __user *addr;
852
long epc;
853
union mips_instruction insn;
854
855
epc = regs->cp0_epc;
856
if (epc & 3)
857
goto unaligned;
858
859
/*
860
* Read the instruction
861
*/
862
addr = (unsigned int __user *) epc;
863
if (__get_user(insn.word, addr)) {
864
force_sig(SIGSEGV);
865
return -EFAULT;
866
}
867
868
return __compute_return_epc_for_insn(regs, insn);
869
870
unaligned:
871
printk("%s: unaligned epc - sending SIGBUS.\n", current->comm);
872
force_sig(SIGBUS);
873
return -EFAULT;
874
}
875
876
#if (defined CONFIG_KPROBES) || (defined CONFIG_UPROBES)
877
878
int __insn_is_compact_branch(union mips_instruction insn)
879
{
880
if (!cpu_has_mips_r6)
881
return 0;
882
883
switch (insn.i_format.opcode) {
884
case blezl_op:
885
case bgtzl_op:
886
case blez_op:
887
case bgtz_op:
888
/*
889
* blez[l] and bgtz[l] opcodes with non-zero rt
890
* are MIPS R6 compact branches
891
*/
892
if (insn.i_format.rt)
893
return 1;
894
break;
895
case bc6_op:
896
case balc6_op:
897
case pop10_op:
898
case pop30_op:
899
case pop66_op:
900
case pop76_op:
901
return 1;
902
}
903
904
return 0;
905
}
906
EXPORT_SYMBOL_GPL(__insn_is_compact_branch);
907
908
#endif /* CONFIG_KPROBES || CONFIG_UPROBES */
909
910