jtag: linuxgpiod: drop extra parenthesis
[openocd.git] / src / target / arm_opcodes.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /*
4 * Copyright (C) 2005 by Dominic Rath
5 * Dominic.Rath@gmx.de
6 *
7 * Copyright (C) 2006 by Magnus Lundin
8 * lundin@mlu.mine.nu
9 *
10 * Copyright (C) 2008 by Spencer Oliver
11 * spen@spen-soft.co.uk
12 *
13 * Copyright (C) 2009 by Øyvind Harboe
14 * oyvind.harboe@zylin.com
15 */
16
17 #ifndef OPENOCD_TARGET_ARM_OPCODES_H
18 #define OPENOCD_TARGET_ARM_OPCODES_H
19
20 /**
21 * @file
22 * Macros used to generate various ARM or Thumb opcodes.
23 */
24
25 /* ARM mode instructions */
26
27 /* Store multiple increment after
28 * rn: base register
29 * list: for each bit in list: store register
30 * s: in privileged mode: store user-mode registers
31 * w = 1: update the base register. w = 0: leave the base register untouched
32 */
33 #define ARMV4_5_STMIA(rn, list, s, w) \
34 (0xe8800000 | ((s) << 22) | ((w) << 21) | ((rn) << 16) | (list))
35
36 /* Load multiple increment after
37 * rn: base register
38 * list: for each bit in list: store register
39 * s: in privileged mode: store user-mode registers
40 * w = 1: update the base register. w = 0: leave the base register untouched
41 */
42 #define ARMV4_5_LDMIA(rn, list, s, w) \
43 (0xe8900000 | ((s) << 22) | ((w) << 21) | ((rn) << 16) | (list))
44
45 /* MOV r8, r8 */
46 #define ARMV4_5_NOP (0xe1a08008)
47
48 /* Move PSR to general purpose register
49 * r = 1: SPSR r = 0: CPSR
50 * rn: target register
51 */
52 #define ARMV4_5_MRS(rn, r) (0xe10f0000 | ((r) << 22) | ((rn) << 12))
53
54 /* Store register
55 * rd: register to store
56 * rn: base register
57 */
58 #define ARMV4_5_STR(rd, rn) (0xe5800000 | ((rd) << 12) | ((rn) << 16))
59
60 /* Load register
61 * rd: register to load
62 * rn: base register
63 */
64 #define ARMV4_5_LDR(rd, rn) (0xe5900000 | ((rd) << 12) | ((rn) << 16))
65
66 /* Move general purpose register to PSR
67 * r = 1: SPSR r = 0: CPSR
68 * field: Field mask
69 * 1: control field 2: extension field 4: status field 8: flags field
70 * rm: source register
71 */
72 #define ARMV4_5_MSR_GP(rm, field, r) \
73 (0xe120f000 | (rm) | ((field) << 16) | ((r) << 22))
74 #define ARMV4_5_MSR_IM(im, rotate, field, r) \
75 (0xe320f000 | (im) | ((rotate) << 8) | ((field) << 16) | ((r) << 22))
76
77 /* Load Register Word Immediate Post-Index
78 * rd: register to load
79 * rn: base register
80 */
81 #define ARMV4_5_LDRW_IP(rd, rn) (0xe4900004 | ((rd) << 12) | ((rn) << 16))
82
83 /* Load Register Halfword Immediate Post-Index
84 * rd: register to load
85 * rn: base register
86 */
87 #define ARMV4_5_LDRH_IP(rd, rn) (0xe0d000b2 | ((rd) << 12) | ((rn) << 16))
88
89 /* Load Register Byte Immediate Post-Index
90 * rd: register to load
91 * rn: base register
92 */
93 #define ARMV4_5_LDRB_IP(rd, rn) (0xe4d00001 | ((rd) << 12) | ((rn) << 16))
94
95 /* Store register Word Immediate Post-Index
96 * rd: register to store
97 * rn: base register
98 */
99 #define ARMV4_5_STRW_IP(rd, rn) (0xe4800004 | ((rd) << 12) | ((rn) << 16))
100
101 /* Store register Halfword Immediate Post-Index
102 * rd: register to store
103 * rn: base register
104 */
105 #define ARMV4_5_STRH_IP(rd, rn) (0xe0c000b2 | ((rd) << 12) | ((rn) << 16))
106
107 /* Store register Byte Immediate Post-Index
108 * rd: register to store
109 * rn: base register
110 */
111 #define ARMV4_5_STRB_IP(rd, rn) (0xe4c00001 | ((rd) << 12) | ((rn) << 16))
112
113 /* Branch (and Link)
114 * im: Branch target (left-shifted by 2 bits, added to PC)
115 * l: 1: branch and link 0: branch only
116 */
117 #define ARMV4_5_B(im, l) (0xea000000 | (im) | ((l) << 24))
118
119 /* Branch and exchange (ARM state)
120 * rm: register holding branch target address
121 */
122 #define ARMV4_5_BX(rm) (0xe12fff10 | (rm))
123
124 /* Copies two words from two ARM core registers
125 * into a doubleword extension register, or
126 * from a doubleword extension register to two ARM core registers.
127 * See Armv7-A arch reference manual section A8.8.345
128 * rt: Arm core register 1
129 * rt2: Arm core register 2
130 * vm: The doubleword extension register
131 * m: m = UInt(m:vm);
132 * op: to_arm_registers = (op == ‘1’);
133 */
134 #define ARMV4_5_VMOV(op, rt2, rt, m, vm) \
135 (0xec400b10 | ((op) << 20) | ((rt2) << 16) | \
136 ((rt) << 12) | ((m) << 5) | (vm))
137
138 /* Moves the value of the FPSCR to an ARM core register
139 * rt: Arm core register
140 */
141 #define ARMV4_5_VMRS(rt) (0xeef10a10 | ((rt) << 12))
142
143 /* Moves the value of an ARM core register to the FPSCR.
144 * rt: Arm core register
145 */
146 #define ARMV4_5_VMSR(rt) (0xeee10a10 | ((rt) << 12))
147
148 /* Store data from coprocessor to consecutive memory
149 * See Armv7-A arch doc section A8.6.187
150 * p: 1=index mode (offset from rn)
151 * u: 1=add, 0=subtract rn address with imm
152 * d: Opcode D encoding
153 * w: write back the offset start address to the rn register
154 * cp: Coprocessor number (4 bits)
155 * crd: Coprocessor source register (4 bits)
156 * rn: Base register for memory address (4 bits)
157 * imm: Immediate value (0 - 1020, must be divisible by 4)
158 */
159 #define ARMV4_5_STC(p, u, d, w, cp, crd, rn, imm) \
160 (0xec000000 | ((p) << 24) | ((u) << 23) | ((d) << 22) | \
161 ((w) << 21) | ((rn) << 16) | ((crd) << 12) | ((cp) << 8) | ((imm)>>2))
162
163 /* Loads data from consecutive memory to coprocessor
164 * See Armv7-A arch doc section A8.6.51
165 * p: 1=index mode (offset from rn)
166 * u: 1=add, 0=subtract rn address with imm
167 * d: Opcode D encoding
168 * w: write back the offset start address to the rn register
169 * cp: Coprocessor number (4 bits)
170 * crd: Coprocessor dest register (4 bits)
171 * rn: Base register for memory address (4 bits)
172 * imm: Immediate value (0 - 1020, must be divisible by 4)
173 */
174 #define ARMV4_5_LDC(p, u, d, w, cp, crd, rn, imm) \
175 (0xec100000 | ((p) << 24) | ((u) << 23) | ((d) << 22) | \
176 ((w) << 21) | ((rn) << 16) | ((crd) << 12) | ((cp) << 8) | ((imm) >> 2))
177
178 /* Move to ARM register from coprocessor
179 * cp: Coprocessor number
180 * op1: Coprocessor opcode
181 * rd: destination register
182 * crn: first coprocessor operand
183 * crm: second coprocessor operand
184 * op2: Second coprocessor opcode
185 */
186 #define ARMV4_5_MRC(cp, op1, rd, crn, crm, op2) \
187 (0xee100010 | (crm) | ((op2) << 5) | ((cp) << 8) \
188 | ((rd) << 12) | ((crn) << 16) | ((op1) << 21))
189
190 /* Move to coprocessor from ARM register
191 * cp: Coprocessor number
192 * op1: Coprocessor opcode
193 * rd: destination register
194 * crn: first coprocessor operand
195 * crm: second coprocessor operand
196 * op2: Second coprocessor opcode
197 */
198 #define ARMV4_5_MCR(cp, op1, rd, crn, crm, op2) \
199 (0xee000010 | (crm) | ((op2) << 5) | ((cp) << 8) \
200 | ((rd) << 12) | ((crn) << 16) | ((op1) << 21))
201
202 /* Breakpoint instruction (ARMv5)
203 * im: 16-bit immediate
204 */
205 #define ARMV5_BKPT(im) (0xe1200070 | ((im & 0xfff0) << 4) | (im & 0xf))
206
207
208 /* Thumb mode instructions
209 *
210 * NOTE: these 16-bit opcodes fill both halves of a word with the same
211 * value. The reason for this is that when we need to execute Thumb
212 * opcodes on ARM7/ARM9 cores (to switch to ARM state on debug entry),
213 * we must shift 32 bits to the bus using scan chain 1 ... if we write
214 * both halves, we don't need to track which half matters. On ARMv6 and
215 * ARMv7 we don't execute Thumb instructions in debug mode; the ITR
216 * register does not accept Thumb (or Thumb2) opcodes.
217 */
218
219 /* Store register (Thumb mode)
220 * rd: source register
221 * rn: base register
222 */
223 #define ARMV4_5_T_STR(rd, rn) \
224 ((0x6000 | (rd) | ((rn) << 3)) | \
225 ((0x6000 | (rd) | ((rn) << 3)) << 16))
226
227 /* Load register (Thumb state)
228 * rd: destination register
229 * rn: base register
230 */
231 #define ARMV4_5_T_LDR(rd, rn) \
232 ((0x6800 | ((rn) << 3) | (rd)) \
233 | ((0x6800 | ((rn) << 3) | (rd)) << 16))
234
235 /* Load multiple (Thumb state)
236 * rn: base register
237 * list: for each bit in list: store register
238 */
239 #define ARMV4_5_T_LDMIA(rn, list) \
240 ((0xc800 | ((rn) << 8) | (list)) \
241 | ((0xc800 | ((rn) << 8) | (list)) << 16))
242
243 /* Load register with PC relative addressing
244 * rd: register to load
245 */
246 #define ARMV4_5_T_LDR_PCREL(rd) \
247 ((0x4800 | ((rd) << 8)) \
248 | ((0x4800 | ((rd) << 8)) << 16))
249
250 /* Move hi register (Thumb mode)
251 * rd: destination register
252 * rm: source register
253 */
254 #define ARMV4_5_T_MOV(rd, rm) \
255 ((0x4600 | ((rd) & 0x7) | (((rd) & 0x8) << 4) | \
256 (((rm) & 0x7) << 3) | (((rm) & 0x8) << 3)) \
257 | ((0x4600 | ((rd) & 0x7) | (((rd) & 0x8) << 4) | \
258 (((rm) & 0x7) << 3) | (((rm) & 0x8) << 3)) << 16))
259
260 /* No operation (Thumb mode)
261 * NOTE: this is "MOV r8, r8" ... Thumb2 adds two
262 * architected NOPs, 16-bit and 32-bit.
263 */
264 #define ARMV4_5_T_NOP (0x46c0 | (0x46c0 << 16))
265
266 /* Move immediate to register (Thumb state)
267 * rd: destination register
268 * im: 8-bit immediate value
269 */
270 #define ARMV4_5_T_MOV_IM(rd, im) \
271 ((0x2000 | ((rd) << 8) | (im)) \
272 | ((0x2000 | ((rd) << 8) | (im)) << 16))
273
274 /* Branch and Exchange
275 * rm: register containing branch target
276 */
277 #define ARMV4_5_T_BX(rm) \
278 ((0x4700 | ((rm) << 3)) \
279 | ((0x4700 | ((rm) << 3)) << 16))
280
281 /* Branch (Thumb state)
282 * imm: Branch target
283 */
284 #define ARMV4_5_T_B(imm) \
285 ((0xe000 | (imm)) \
286 | ((0xe000 | (imm)) << 16))
287
288 /* Breakpoint instruction (ARMv5) (Thumb state)
289 * Im: 8-bit immediate
290 */
291 #define ARMV5_T_BKPT(im) \
292 ((0xbe00 | (im)) \
293 | ((0xbe00 | (im)) << 16))
294
295 /* Move to Register from Special Register
296 * 32 bit Thumb2 instruction
297 * rd: destination register
298 * sysm: source special register
299 */
300 #define ARM_T2_MRS(rd, sysm) \
301 ((0xF3EF) | ((0x8000 | (rd << 8) | sysm) << 16))
302
303 /* Move from Register from Special Register
304 * 32 bit Thumb2 instruction
305 * rd: source register
306 * sysm: destination special register
307 */
308 #define ARM_T2_MSR(sysm, rn) \
309 ((0xF380 | (rn << 8)) | ((0x8800 | sysm) << 16))
310
311 /* Change Processor State.
312 * 16 bit Thumb2 instruction
313 * rd: source register
314 * IF: A_FLAG and/or I_FLAG and/or F_FLAG
315 */
316 #define A_FLAG 4
317 #define I_FLAG 2
318 #define F_FLAG 1
319 #define ARM_T2_CPSID(_if) \
320 ((0xB660 | (1 << 8) | ((_if)&0x3)) \
321 | ((0xB660 | (1 << 8) | ((_if)&0x3)) << 16))
322 #define ARM_T2_CPSIE(_if) \
323 ((0xB660 | (0 << 8) | ((_if)&0x3)) \
324 | ((0xB660 | (0 << 8) | ((_if)&0x3)) << 16))
325
326 #endif /* OPENOCD_TARGET_ARM_OPCODES_H */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)