GNU Linux-libre 4.19.286-gnu1
[releases.git] / arch / mips / kernel / probes-common.h
1 /*
2  * Copyright (C) 2016 Imagination Technologies
3  * Author: Marcin Nowakowski <marcin.nowakowski@mips.com>
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License as published by the
7  * Free Software Foundation; either version 2 of the License, or (at your
8  * option) any later version.
9  */
10
11 #ifndef __PROBES_COMMON_H
12 #define __PROBES_COMMON_H
13
14 #include <asm/inst.h>
15
16 int __insn_is_compact_branch(union mips_instruction insn);
17
18 static inline int __insn_has_delay_slot(const union mips_instruction insn)
19 {
20         switch (insn.i_format.opcode) {
21         /*
22          * jr and jalr are in r_format format.
23          */
24         case spec_op:
25                 switch (insn.r_format.func) {
26                 case jalr_op:
27                 case jr_op:
28                         return 1;
29                 }
30                 break;
31
32         /*
33          * This group contains:
34          * bltz_op, bgez_op, bltzl_op, bgezl_op,
35          * bltzal_op, bgezal_op, bltzall_op, bgezall_op.
36          */
37         case bcond_op:
38                 switch (insn.i_format.rt) {
39                 case bltz_op:
40                 case bltzl_op:
41                 case bgez_op:
42                 case bgezl_op:
43                 case bltzal_op:
44                 case bltzall_op:
45                 case bgezal_op:
46                 case bgezall_op:
47                 case bposge32_op:
48                         return 1;
49                 }
50                 break;
51
52         /*
53          * These are unconditional and in j_format.
54          */
55         case jal_op:
56         case j_op:
57         case beq_op:
58         case beql_op:
59         case bne_op:
60         case bnel_op:
61         case blez_op: /* not really i_format */
62         case blezl_op:
63         case bgtz_op:
64         case bgtzl_op:
65                 return 1;
66
67         /*
68          * And now the FPA/cp1 branch instructions.
69          */
70         case cop1_op:
71 #ifdef CONFIG_CPU_CAVIUM_OCTEON
72         case lwc2_op: /* This is bbit0 on Octeon */
73         case ldc2_op: /* This is bbit032 on Octeon */
74         case swc2_op: /* This is bbit1 on Octeon */
75         case sdc2_op: /* This is bbit132 on Octeon */
76 #endif
77                 return 1;
78         }
79
80         return 0;
81 }
82
83 #endif  /* __PROBES_COMMON_H */