xref: /linux/arch/arm/include/asm/opcodes.h (revision 4413e16d9d21673bb5048a2e542f1aaa00015c2e)
1 /*
2  *  arch/arm/include/asm/opcodes.h
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  */
8 
9 #ifndef __ASM_ARM_OPCODES_H
10 #define __ASM_ARM_OPCODES_H
11 
12 #ifndef __ASSEMBLY__
13 extern asmlinkage unsigned int arm_check_condition(u32 opcode, u32 psr);
14 #endif
15 
16 #define ARM_OPCODE_CONDTEST_FAIL   0
17 #define ARM_OPCODE_CONDTEST_PASS   1
18 #define ARM_OPCODE_CONDTEST_UNCOND 2
19 
20 
21 /*
22  * Opcode byteswap helpers
23  *
24  * These macros help with converting instructions between a canonical integer
25  * format and in-memory representation, in an endianness-agnostic manner.
26  *
27  * __mem_to_opcode_*() convert from in-memory representation to canonical form.
28  * __opcode_to_mem_*() convert from canonical form to in-memory representation.
29  *
30  *
31  * Canonical instruction representation:
32  *
33  *	ARM:		0xKKLLMMNN
34  *	Thumb 16-bit:	0x0000KKLL, where KK < 0xE8
35  *	Thumb 32-bit:	0xKKLLMMNN, where KK >= 0xE8
36  *
37  * There is no way to distinguish an ARM instruction in canonical representation
38  * from a Thumb instruction (just as these cannot be distinguished in memory).
39  * Where this distinction is important, it needs to be tracked separately.
40  *
41  * Note that values in the range 0x0000E800..0xE7FFFFFF intentionally do not
42  * represent any valid Thumb-2 instruction.  For this range,
43  * __opcode_is_thumb32() and __opcode_is_thumb16() will both be false.
44  */
45 
46 #ifndef __ASSEMBLY__
47 
48 #include <linux/types.h>
49 #include <linux/swab.h>
50 
51 #ifdef CONFIG_CPU_ENDIAN_BE8
52 #define __opcode_to_mem_arm(x) swab32(x)
53 #define __opcode_to_mem_thumb16(x) swab16(x)
54 #define __opcode_to_mem_thumb32(x) swahb32(x)
55 #else
56 #define __opcode_to_mem_arm(x) ((u32)(x))
57 #define __opcode_to_mem_thumb16(x) ((u16)(x))
58 #define __opcode_to_mem_thumb32(x) swahw32(x)
59 #endif
60 
61 #define __mem_to_opcode_arm(x) __opcode_to_mem_arm(x)
62 #define __mem_to_opcode_thumb16(x) __opcode_to_mem_thumb16(x)
63 #define __mem_to_opcode_thumb32(x) __opcode_to_mem_thumb32(x)
64 
65 /* Operations specific to Thumb opcodes */
66 
67 /* Instruction size checks: */
68 #define __opcode_is_thumb32(x) ((u32)(x) >= 0xE8000000UL)
69 #define __opcode_is_thumb16(x) ((u32)(x) < 0xE800UL)
70 
71 /* Operations to construct or split 32-bit Thumb instructions: */
72 #define __opcode_thumb32_first(x) ((u16)((x) >> 16))
73 #define __opcode_thumb32_second(x) ((u16)(x))
74 #define __opcode_thumb32_compose(first, second) \
75 	(((u32)(u16)(first) << 16) | (u32)(u16)(second))
76 
77 #endif /* __ASSEMBLY__ */
78 
79 #endif /* __ASM_ARM_OPCODES_H */
80