xref: /openbmc/linux/arch/mips/kernel/probes-common.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*2874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2e3031b32SMarcin Nowakowski /*
3e3031b32SMarcin Nowakowski  * Copyright (C) 2016 Imagination Technologies
4ca208b5fSMarcin Nowakowski  * Author: Marcin Nowakowski <marcin.nowakowski@mips.com>
5e3031b32SMarcin Nowakowski  */
6e3031b32SMarcin Nowakowski 
7e3031b32SMarcin Nowakowski #ifndef __PROBES_COMMON_H
8e3031b32SMarcin Nowakowski #define __PROBES_COMMON_H
9e3031b32SMarcin Nowakowski 
10e3031b32SMarcin Nowakowski #include <asm/inst.h>
11e3031b32SMarcin Nowakowski 
12d05c5130SMarcin Nowakowski int __insn_is_compact_branch(union mips_instruction insn);
13d05c5130SMarcin Nowakowski 
__insn_has_delay_slot(const union mips_instruction insn)14e3031b32SMarcin Nowakowski static inline int __insn_has_delay_slot(const union mips_instruction insn)
15e3031b32SMarcin Nowakowski {
16e3031b32SMarcin Nowakowski 	switch (insn.i_format.opcode) {
17e3031b32SMarcin Nowakowski 	/*
18e3031b32SMarcin Nowakowski 	 * jr and jalr are in r_format format.
19e3031b32SMarcin Nowakowski 	 */
20e3031b32SMarcin Nowakowski 	case spec_op:
21e3031b32SMarcin Nowakowski 		switch (insn.r_format.func) {
22e3031b32SMarcin Nowakowski 		case jalr_op:
23e3031b32SMarcin Nowakowski 		case jr_op:
24e3031b32SMarcin Nowakowski 			return 1;
25e3031b32SMarcin Nowakowski 		}
26e3031b32SMarcin Nowakowski 		break;
27e3031b32SMarcin Nowakowski 
28e3031b32SMarcin Nowakowski 	/*
29e3031b32SMarcin Nowakowski 	 * This group contains:
30e3031b32SMarcin Nowakowski 	 * bltz_op, bgez_op, bltzl_op, bgezl_op,
31e3031b32SMarcin Nowakowski 	 * bltzal_op, bgezal_op, bltzall_op, bgezall_op.
32e3031b32SMarcin Nowakowski 	 */
33e3031b32SMarcin Nowakowski 	case bcond_op:
34e3031b32SMarcin Nowakowski 		switch (insn.i_format.rt) {
35e3031b32SMarcin Nowakowski 		case bltz_op:
36e3031b32SMarcin Nowakowski 		case bltzl_op:
37e3031b32SMarcin Nowakowski 		case bgez_op:
38e3031b32SMarcin Nowakowski 		case bgezl_op:
39e3031b32SMarcin Nowakowski 		case bltzal_op:
40e3031b32SMarcin Nowakowski 		case bltzall_op:
41e3031b32SMarcin Nowakowski 		case bgezal_op:
42e3031b32SMarcin Nowakowski 		case bgezall_op:
43e3031b32SMarcin Nowakowski 		case bposge32_op:
44e3031b32SMarcin Nowakowski 			return 1;
45e3031b32SMarcin Nowakowski 		}
46e3031b32SMarcin Nowakowski 		break;
47e3031b32SMarcin Nowakowski 
48e3031b32SMarcin Nowakowski 	/*
49e3031b32SMarcin Nowakowski 	 * These are unconditional and in j_format.
50e3031b32SMarcin Nowakowski 	 */
51e3031b32SMarcin Nowakowski 	case jal_op:
52e3031b32SMarcin Nowakowski 	case j_op:
53e3031b32SMarcin Nowakowski 	case beq_op:
54e3031b32SMarcin Nowakowski 	case beql_op:
55e3031b32SMarcin Nowakowski 	case bne_op:
56e3031b32SMarcin Nowakowski 	case bnel_op:
57e3031b32SMarcin Nowakowski 	case blez_op: /* not really i_format */
58e3031b32SMarcin Nowakowski 	case blezl_op:
59e3031b32SMarcin Nowakowski 	case bgtz_op:
60e3031b32SMarcin Nowakowski 	case bgtzl_op:
61e3031b32SMarcin Nowakowski 		return 1;
62e3031b32SMarcin Nowakowski 
63e3031b32SMarcin Nowakowski 	/*
64e3031b32SMarcin Nowakowski 	 * And now the FPA/cp1 branch instructions.
65e3031b32SMarcin Nowakowski 	 */
66e3031b32SMarcin Nowakowski 	case cop1_op:
67e3031b32SMarcin Nowakowski #ifdef CONFIG_CPU_CAVIUM_OCTEON
68e3031b32SMarcin Nowakowski 	case lwc2_op: /* This is bbit0 on Octeon */
69e3031b32SMarcin Nowakowski 	case ldc2_op: /* This is bbit032 on Octeon */
70e3031b32SMarcin Nowakowski 	case swc2_op: /* This is bbit1 on Octeon */
71e3031b32SMarcin Nowakowski 	case sdc2_op: /* This is bbit132 on Octeon */
72e3031b32SMarcin Nowakowski #endif
73e3031b32SMarcin Nowakowski 		return 1;
74e3031b32SMarcin Nowakowski 	}
75e3031b32SMarcin Nowakowski 
76e3031b32SMarcin Nowakowski 	return 0;
77e3031b32SMarcin Nowakowski }
78e3031b32SMarcin Nowakowski 
79e3031b32SMarcin Nowakowski #endif  /* __PROBES_COMMON_H */
80