target/arm: do not expose 'arm reg', 'arm mcr/mrc' commands on Cortex-M
[fw/openocd] / src / target / arm.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) 2008 by Spencer Oliver
8  * spen@spen-soft.co.uk
9  *
10  * Copyright (C) 2009 by Ã˜yvind Harboe
11  * oyvind.harboe@zylin.com
12  *
13  * Copyright (C) 2018 by Liviu Ionescu
14  *   <ilg@livius.net>
15  */
16
17 #ifndef OPENOCD_TARGET_ARM_H
18 #define OPENOCD_TARGET_ARM_H
19
20 #include <helper/command.h>
21 #include "target.h"
22
23 /**
24  * @file
25  * Holds the interface to ARM cores.
26  *
27  * At this writing, only "classic ARM" cores built on the ARMv4 register
28  * and mode model are supported.  The Thumb2-only microcontroller profile
29  * support has not yet been integrated, affecting Cortex-M parts.
30  */
31
32 /**
33  * Indicates what registers are in the ARM state core register set.
34  *
35  * - ARM_CORE_TYPE_STD indicates the standard set of 37 registers, seen
36  *   on for example ARM7TDMI cores.
37  * - ARM_CORE_TYPE_SEC_EXT indicates core has security extensions, thus
38  *   three more registers are shadowed for "Secure Monitor" mode.
39  * - ARM_CORE_TYPE_VIRT_EXT indicates core has virtualization extensions
40  *   and also security extensions. Additional shadowed registers for
41  *   "Secure Monitor" and "Hypervisor" modes.
42  * - ARM_CORE_TYPE_M_PROFILE indicates a microcontroller profile core,
43  *   which only shadows SP.
44  */
45 enum arm_core_type {
46         ARM_CORE_TYPE_STD = -1,
47         ARM_CORE_TYPE_SEC_EXT = 1,
48         ARM_CORE_TYPE_VIRT_EXT,
49         ARM_CORE_TYPE_M_PROFILE,
50 };
51
52 /** ARM Architecture specifying the version and the profile */
53 enum arm_arch {
54         ARM_ARCH_UNKNOWN,
55         ARM_ARCH_V4,
56         ARM_ARCH_V6M,
57         ARM_ARCH_V7M,
58         ARM_ARCH_V8M,
59 };
60
61 /**
62  * Represent state of an ARM core.
63  *
64  * Most numbers match the five low bits of the *PSR registers on
65  * "classic ARM" processors, which build on the ARMv4 processor
66  * modes and register set.
67  *
68  * ARM_MODE_ANY is a magic value, often used as a wildcard.
69  *
70  * Only the microcontroller cores (ARMv6-M, ARMv7-M) support ARM_MODE_THREAD,
71  * ARM_MODE_USER_THREAD, and ARM_MODE_HANDLER.  Those are the only modes
72  * they support.
73  */
74 enum arm_mode {
75         ARM_MODE_USR = 16,
76         ARM_MODE_FIQ = 17,
77         ARM_MODE_IRQ = 18,
78         ARM_MODE_SVC = 19,
79         ARM_MODE_MON = 22,
80         ARM_MODE_ABT = 23,
81         ARM_MODE_HYP = 26,
82         ARM_MODE_UND = 27,
83         ARM_MODE_1176_MON = 28,
84         ARM_MODE_SYS = 31,
85
86         ARM_MODE_THREAD = 0,
87         ARM_MODE_USER_THREAD = 1,
88         ARM_MODE_HANDLER = 2,
89
90         ARMV8_64_EL0T = 0x0,
91         ARMV8_64_EL1T = 0x4,
92         ARMV8_64_EL1H = 0x5,
93         ARMV8_64_EL2T = 0x8,
94         ARMV8_64_EL2H = 0x9,
95         ARMV8_64_EL3T = 0xC,
96         ARMV8_64_EL3H = 0xD,
97
98         ARM_MODE_ANY = -1
99 };
100
101 /* VFPv3 internal register numbers mapping to d0:31 */
102 enum {
103         ARM_VFP_V3_D0 = 51,
104         ARM_VFP_V3_D1,
105         ARM_VFP_V3_D2,
106         ARM_VFP_V3_D3,
107         ARM_VFP_V3_D4,
108         ARM_VFP_V3_D5,
109         ARM_VFP_V3_D6,
110         ARM_VFP_V3_D7,
111         ARM_VFP_V3_D8,
112         ARM_VFP_V3_D9,
113         ARM_VFP_V3_D10,
114         ARM_VFP_V3_D11,
115         ARM_VFP_V3_D12,
116         ARM_VFP_V3_D13,
117         ARM_VFP_V3_D14,
118         ARM_VFP_V3_D15,
119         ARM_VFP_V3_D16,
120         ARM_VFP_V3_D17,
121         ARM_VFP_V3_D18,
122         ARM_VFP_V3_D19,
123         ARM_VFP_V3_D20,
124         ARM_VFP_V3_D21,
125         ARM_VFP_V3_D22,
126         ARM_VFP_V3_D23,
127         ARM_VFP_V3_D24,
128         ARM_VFP_V3_D25,
129         ARM_VFP_V3_D26,
130         ARM_VFP_V3_D27,
131         ARM_VFP_V3_D28,
132         ARM_VFP_V3_D29,
133         ARM_VFP_V3_D30,
134         ARM_VFP_V3_D31,
135         ARM_VFP_V3_FPSCR,
136 };
137
138 const char *arm_mode_name(unsigned psr_mode);
139 bool is_arm_mode(unsigned psr_mode);
140
141 /** The PSR "T" and "J" bits define the mode of "classic ARM" cores. */
142 enum arm_state {
143         ARM_STATE_ARM,
144         ARM_STATE_THUMB,
145         ARM_STATE_JAZELLE,
146         ARM_STATE_THUMB_EE,
147         ARM_STATE_AARCH64,
148 };
149
150 /** ARM vector floating point enabled, if yes which version. */
151 enum arm_vfp_version {
152         ARM_VFP_DISABLED,
153         ARM_VFP_V1,
154         ARM_VFP_V2,
155         ARM_VFP_V3,
156 };
157
158 #define ARM_COMMON_MAGIC 0x0A450A45U
159
160 /**
161  * Represents a generic ARM core, with standard application registers.
162  *
163  * There are sixteen application registers (including PC, SP, LR) and a PSR.
164  * Cortex-M series cores do not support as many core states or shadowed
165  * registers as traditional ARM cores, and only support Thumb2 instructions.
166  */
167 struct arm {
168         unsigned int common_magic;
169
170         struct reg_cache *core_cache;
171
172         /** Handle to the PC; valid in all core modes. */
173         struct reg *pc;
174
175         /** Handle to the CPSR/xPSR; valid in all core modes. */
176         struct reg *cpsr;
177
178         /** Handle to the SPSR; valid only in core modes with an SPSR. */
179         struct reg *spsr;
180
181         /** Support for arm_reg_current() */
182         const int *map;
183
184         /** Indicates what registers are in the ARM state core register set. */
185         enum arm_core_type core_type;
186
187         /** Record the current core mode: SVC, USR, or some other mode. */
188         enum arm_mode core_mode;
189
190         /** Record the current core state: ARM, Thumb, or otherwise. */
191         enum arm_state core_state;
192
193         /** ARM architecture version */
194         enum arm_arch arch;
195
196         /** Floating point or VFP version, 0 if disabled. */
197         int arm_vfp_version;
198
199         int (*setup_semihosting)(struct target *target, int enable);
200
201         /** Backpointer to the target. */
202         struct target *target;
203
204         /** Handle for the debug module, if one is present. */
205         struct arm_dpm *dpm;
206
207         /** Handle for the Embedded Trace Module, if one is present. */
208         struct etm_context *etm;
209
210         /* FIXME all these methods should take "struct arm *" not target */
211
212         /** Retrieve all core registers, for display. */
213         int (*full_context)(struct target *target);
214
215         /** Retrieve a single core register. */
216         int (*read_core_reg)(struct target *target, struct reg *reg,
217                         int num, enum arm_mode mode);
218         int (*write_core_reg)(struct target *target, struct reg *reg,
219                         int num, enum arm_mode mode, uint8_t *value);
220
221         /** Read coprocessor register.  */
222         int (*mrc)(struct target *target, int cpnum,
223                         uint32_t op1, uint32_t op2,
224                         uint32_t crn, uint32_t crm,
225                         uint32_t *value);
226
227         /** Write coprocessor register.  */
228         int (*mcr)(struct target *target, int cpnum,
229                         uint32_t op1, uint32_t op2,
230                         uint32_t crn, uint32_t crm,
231                         uint32_t value);
232
233         void *arch_info;
234
235         /** For targets conforming to ARM Debug Interface v5,
236          * this handle references the Debug Access Port (DAP)
237          * used to make requests to the target.
238          */
239         struct adiv5_dap *dap;
240 };
241
242 /** Convert target handle to generic ARM target state handle. */
243 static inline struct arm *target_to_arm(struct target *target)
244 {
245         assert(target);
246         return target->arch_info;
247 }
248
249 static inline bool is_arm(struct arm *arm)
250 {
251         assert(arm);
252         return arm->common_magic == ARM_COMMON_MAGIC;
253 }
254
255 struct arm_algorithm {
256         unsigned int common_magic;
257
258         enum arm_mode core_mode;
259         enum arm_state core_state;
260 };
261
262 struct arm_reg {
263         int num;
264         enum arm_mode mode;
265         struct target *target;
266         struct arm *arm;
267         uint8_t value[16];
268 };
269
270 struct reg_cache *arm_build_reg_cache(struct target *target, struct arm *arm);
271 void arm_free_reg_cache(struct arm *arm);
272
273 struct reg_cache *armv8_build_reg_cache(struct target *target);
274
275 extern const struct command_registration arm_command_handlers[];
276 extern const struct command_registration arm_all_profiles_command_handlers[];
277
278 int arm_arch_state(struct target *target);
279 const char *arm_get_gdb_arch(struct target *target);
280 int arm_get_gdb_reg_list(struct target *target,
281                 struct reg **reg_list[], int *reg_list_size,
282                 enum target_register_class reg_class);
283 const char *armv8_get_gdb_arch(struct target *target);
284 int armv8_get_gdb_reg_list(struct target *target,
285                 struct reg **reg_list[], int *reg_list_size,
286                 enum target_register_class reg_class);
287
288 int arm_init_arch_info(struct target *target, struct arm *arm);
289
290 /* REVISIT rename this once it's usable by ARMv7-M */
291 int armv4_5_run_algorithm(struct target *target,
292                 int num_mem_params, struct mem_param *mem_params,
293                 int num_reg_params, struct reg_param *reg_params,
294                 target_addr_t entry_point, target_addr_t exit_point,
295                 int timeout_ms, void *arch_info);
296 int armv4_5_run_algorithm_inner(struct target *target,
297                 int num_mem_params, struct mem_param *mem_params,
298                 int num_reg_params, struct reg_param *reg_params,
299                 uint32_t entry_point, uint32_t exit_point,
300                 int timeout_ms, void *arch_info,
301                 int (*run_it)(struct target *target, uint32_t exit_point,
302                                 int timeout_ms, void *arch_info));
303
304 int arm_checksum_memory(struct target *target,
305                 target_addr_t address, uint32_t count, uint32_t *checksum);
306 int arm_blank_check_memory(struct target *target,
307                 struct target_memory_check_block *blocks, int num_blocks, uint8_t erased_value);
308
309 void arm_set_cpsr(struct arm *arm, uint32_t cpsr);
310 struct reg *arm_reg_current(struct arm *arm, unsigned regnum);
311 struct reg *armv8_reg_current(struct arm *arm, unsigned regnum);
312
313 extern struct reg arm_gdb_dummy_fp_reg;
314 extern struct reg arm_gdb_dummy_fps_reg;
315
316 #endif /* OPENOCD_TARGET_ARM_H */