xref: /openbmc/linux/arch/mips/kernel/probes-common.h (revision 4f6cce39)
1 /*
2  * Copyright (C) 2016 Imagination Technologies
3  * Author: Marcin Nowakowski <marcin.nowakowski@imgtec.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 */
84