OpenOCD
arm.h
Go to the documentation of this file.
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 
50 };
51 
53 enum arm_arch {
59 };
60 
66 };
67 
81 enum arm_mode {
92 
96 
104 
105  ARM_MODE_ANY = -1
106 };
107 
108 /* VFPv3 internal register numbers mapping to d0:31 */
109 enum {
143 };
144 
145 const char *arm_mode_name(unsigned psr_mode);
146 bool is_arm_mode(unsigned psr_mode);
147 
149 enum arm_state {
155 };
156 
163 };
164 
165 #define ARM_COMMON_MAGIC 0x0A450A45U
166 
174 struct arm {
175  unsigned int common_magic;
176 
178 
180  struct reg *pc;
181 
183  struct reg *cpsr;
184 
186  struct reg *spsr;
187 
189  const int *map;
190 
193 
195  enum arm_mode core_mode;
196 
198  enum arm_state core_state;
199 
201  enum arm_arch arch;
202 
205 
206  int (*setup_semihosting)(struct target *target, int enable);
207 
209  struct target *target;
210 
212  struct arm_dpm *dpm;
213 
215  struct etm_context *etm;
216 
217  /* FIXME all these methods should take "struct arm *" not target */
218 
220  int (*full_context)(struct target *target);
221 
223  int (*read_core_reg)(struct target *target, struct reg *reg,
224  int num, enum arm_mode mode);
225  int (*write_core_reg)(struct target *target, struct reg *reg,
226  int num, enum arm_mode mode, uint8_t *value);
227 
229  int (*mrc)(struct target *target, int cpnum,
230  uint32_t op1, uint32_t op2,
231  uint32_t crn, uint32_t crm,
232  uint32_t *value);
233 
235  int (*mrrc)(struct target *target, int cpnum,
236  uint32_t op, uint32_t crm,
237  uint64_t *value);
238 
240  int (*mcr)(struct target *target, int cpnum,
241  uint32_t op1, uint32_t op2,
242  uint32_t crn, uint32_t crm,
243  uint32_t value);
244 
246  int (*mcrr)(struct target *target, int cpnum,
247  uint32_t op, uint32_t crm,
248  uint64_t value);
249 
250  void *arch_info;
251 
256  struct adiv5_dap *dap;
257 };
258 
260 static inline struct arm *target_to_arm(const struct target *target)
261 {
262  assert(target);
263  return target->arch_info;
264 }
265 
266 static inline bool is_arm(struct arm *arm)
267 {
268  assert(arm);
269  return arm->common_magic == ARM_COMMON_MAGIC;
270 }
271 
273  unsigned int common_magic;
274 
275  enum arm_mode core_mode;
276  enum arm_state core_state;
277 };
278 
279 struct arm_reg {
280  int num;
281  enum arm_mode mode;
282  struct target *target;
283  struct arm *arm;
284  uint8_t value[16];
285 };
286 
287 struct reg_cache *arm_build_reg_cache(struct target *target, struct arm *arm);
288 void arm_free_reg_cache(struct arm *arm);
289 
291 
292 extern const struct command_registration arm_command_handlers[];
294 
295 int arm_arch_state(struct target *target);
296 const char *arm_get_gdb_arch(const struct target *target);
298  struct reg **reg_list[], int *reg_list_size,
299  enum target_register_class reg_class);
300 const char *armv8_get_gdb_arch(const struct target *target);
302  struct reg **reg_list[], int *reg_list_size,
303  enum target_register_class reg_class);
304 
305 int arm_init_arch_info(struct target *target, struct arm *arm);
306 
307 /* REVISIT rename this once it's usable by ARMv7-M */
309  int num_mem_params, struct mem_param *mem_params,
310  int num_reg_params, struct reg_param *reg_params,
311  target_addr_t entry_point, target_addr_t exit_point,
312  unsigned int timeout_ms, void *arch_info);
314  int num_mem_params, struct mem_param *mem_params,
315  int num_reg_params, struct reg_param *reg_params,
316  uint32_t entry_point, uint32_t exit_point,
317  unsigned int timeout_ms, void *arch_info,
318  int (*run_it)(struct target *target, uint32_t exit_point,
319  unsigned int timeout_ms, void *arch_info));
320 
321 int arm_checksum_memory(struct target *target,
322  target_addr_t address, uint32_t count, uint32_t *checksum);
324  struct target_memory_check_block *blocks, int num_blocks, uint8_t erased_value);
325 
326 void arm_set_cpsr(struct arm *arm, uint32_t cpsr);
327 struct reg *arm_reg_current(struct arm *arm, unsigned regnum);
328 struct reg *armv8_reg_current(struct arm *arm, unsigned regnum);
329 
330 #endif /* OPENOCD_TARGET_ARM_H */
int arm_blank_check_memory(struct target *target, struct target_memory_check_block *blocks, int num_blocks, uint8_t erased_value)
Runs ARM code in the target to check whether a memory block holds all ones.
Definition: armv4_5.c:1673
const char * armv8_get_gdb_arch(const struct target *target)
Definition: armv8.c:1868
const struct command_registration arm_all_profiles_command_handlers[]
Definition: armv4_5.c:1226
int armv4_5_run_algorithm_inner(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, uint32_t entry_point, uint32_t exit_point, unsigned int timeout_ms, void *arch_info, int(*run_it)(struct target *target, uint32_t exit_point, unsigned int timeout_ms, void *arch_info))
Definition: armv4_5.c:1389
int arm_arch_state(struct target *target)
Definition: armv4_5.c:782
arm_vfp_version
ARM vector floating point enabled, if yes which version.
Definition: arm.h:158
@ ARM_VFP_V2
Definition: arm.h:161
@ ARM_VFP_V3
Definition: arm.h:162
@ ARM_VFP_V1
Definition: arm.h:160
@ ARM_VFP_DISABLED
Definition: arm.h:159
#define ARM_COMMON_MAGIC
Definition: arm.h:165
int arm_checksum_memory(struct target *target, target_addr_t address, uint32_t count, uint32_t *checksum)
Runs ARM code in the target to calculate a CRC32 checksum.
Definition: armv4_5.c:1600
arm_arch
ARM Architecture specifying the version and the profile.
Definition: arm.h:53
@ ARM_ARCH_V6M
Definition: arm.h:56
@ ARM_ARCH_V8M
Definition: arm.h:58
@ ARM_ARCH_V4
Definition: arm.h:55
@ ARM_ARCH_UNKNOWN
Definition: arm.h:54
@ ARM_ARCH_V7M
Definition: arm.h:57
@ ARM_VFP_V3_D14
Definition: arm.h:124
@ ARM_VFP_V3_D24
Definition: arm.h:134
@ ARM_VFP_V3_D9
Definition: arm.h:119
@ ARM_VFP_V3_D1
Definition: arm.h:111
@ ARM_VFP_V3_D17
Definition: arm.h:127
@ ARM_VFP_V3_D19
Definition: arm.h:129
@ ARM_VFP_V3_D4
Definition: arm.h:114
@ ARM_VFP_V3_D15
Definition: arm.h:125
@ ARM_VFP_V3_D10
Definition: arm.h:120
@ ARM_VFP_V3_D3
Definition: arm.h:113
@ ARM_VFP_V3_D31
Definition: arm.h:141
@ ARM_VFP_V3_D16
Definition: arm.h:126
@ ARM_VFP_V3_D22
Definition: arm.h:132
@ ARM_VFP_V3_D5
Definition: arm.h:115
@ ARM_VFP_V3_D18
Definition: arm.h:128
@ ARM_VFP_V3_D26
Definition: arm.h:136
@ ARM_VFP_V3_D7
Definition: arm.h:117
@ ARM_VFP_V3_D23
Definition: arm.h:133
@ ARM_VFP_V3_D21
Definition: arm.h:131
@ ARM_VFP_V3_D28
Definition: arm.h:138
@ ARM_VFP_V3_D2
Definition: arm.h:112
@ ARM_VFP_V3_D27
Definition: arm.h:137
@ ARM_VFP_V3_D29
Definition: arm.h:139
@ ARM_VFP_V3_D11
Definition: arm.h:121
@ ARM_VFP_V3_FPSCR
Definition: arm.h:142
@ ARM_VFP_V3_D20
Definition: arm.h:130
@ ARM_VFP_V3_D13
Definition: arm.h:123
@ ARM_VFP_V3_D12
Definition: arm.h:122
@ ARM_VFP_V3_D6
Definition: arm.h:116
@ ARM_VFP_V3_D8
Definition: arm.h:118
@ ARM_VFP_V3_D0
Definition: arm.h:110
@ ARM_VFP_V3_D30
Definition: arm.h:140
@ ARM_VFP_V3_D25
Definition: arm.h:135
struct reg_cache * arm_build_reg_cache(struct target *target, struct arm *arm)
Definition: armv4_5.c:646
struct reg * armv8_reg_current(struct arm *arm, unsigned regnum)
Definition: armv8.c:1800
int armv8_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int *reg_list_size, enum target_register_class reg_class)
Definition: armv8.c:1874
const char * arm_get_gdb_arch(const struct target *target)
Definition: armv4_5.c:1267
int arm_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int *reg_list_size, enum target_register_class reg_class)
Definition: armv4_5.c:1272
static bool is_arm(struct arm *arm)
Definition: arm.h:266
arm_mode
Represent state of an ARM core.
Definition: arm.h:81
@ ARM_MODE_IRQ
Definition: arm.h:84
@ ARM_MODE_HANDLER
Definition: arm.h:95
@ ARM_MODE_SYS
Definition: arm.h:91
@ ARM_MODE_HYP
Definition: arm.h:88
@ ARMV8_64_EL0T
Definition: arm.h:97
@ ARMV8_64_EL3H
Definition: arm.h:103
@ ARM_MODE_MON
Definition: arm.h:86
@ ARMV8_64_EL3T
Definition: arm.h:102
@ ARM_MODE_FIQ
Definition: arm.h:83
@ ARM_MODE_UND
Definition: arm.h:89
@ ARM_MODE_1176_MON
Definition: arm.h:90
@ ARM_MODE_ANY
Definition: arm.h:105
@ ARMV8_64_EL1H
Definition: arm.h:99
@ ARM_MODE_USR
Definition: arm.h:82
@ ARM_MODE_SVC
Definition: arm.h:85
@ ARM_MODE_USER_THREAD
Definition: arm.h:94
@ ARMV8_64_EL2H
Definition: arm.h:101
@ ARMV8_64_EL2T
Definition: arm.h:100
@ ARMV8_64_EL1T
Definition: arm.h:98
@ ARM_MODE_ABT
Definition: arm.h:87
@ ARM_MODE_THREAD
Definition: arm.h:93
void arm_free_reg_cache(struct arm *arm)
Definition: armv4_5.c:761
static struct arm * target_to_arm(const struct target *target)
Convert target handle to generic ARM target state handle.
Definition: arm.h:260
arm_state
The PSR "T" and "J" bits define the mode of "classic ARM" cores.
Definition: arm.h:149
@ ARM_STATE_JAZELLE
Definition: arm.h:152
@ ARM_STATE_THUMB
Definition: arm.h:151
@ ARM_STATE_ARM
Definition: arm.h:150
@ ARM_STATE_AARCH64
Definition: arm.h:154
@ ARM_STATE_THUMB_EE
Definition: arm.h:153
arm_implementor
Known ARM implementor IDs.
Definition: arm.h:62
@ ARM_IMPLEMENTOR_INFINEON
Definition: arm.h:64
@ ARM_IMPLEMENTOR_REALTEK
Definition: arm.h:65
@ ARM_IMPLEMENTOR_ARM
Definition: arm.h:63
bool is_arm_mode(unsigned psr_mode)
Return true iff the parameter denotes a valid ARM processor mode.
Definition: armv4_5.c:182
const struct command_registration arm_command_handlers[]
Definition: armv4_5.c:1247
struct reg_cache * armv8_build_reg_cache(struct target *target)
Builds cache of architecturally defined registers.
Definition: armv8.c:1703
const char * arm_mode_name(unsigned psr_mode)
Map PSR mode bits to the name of an ARM processor operating mode.
Definition: armv4_5.c:171
int arm_init_arch_info(struct target *target, struct arm *arm)
Definition: armv4_5.c:1799
void arm_set_cpsr(struct arm *arm, uint32_t cpsr)
Configures host-side ARM records to reflect the specified CPSR.
Definition: armv4_5.c:438
int armv4_5_run_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, target_addr_t entry_point, target_addr_t exit_point, unsigned int timeout_ms, void *arch_info)
Definition: armv4_5.c:1574
struct reg * arm_reg_current(struct arm *arm, unsigned regnum)
Returns handle to the register currently mapped to a given number.
Definition: armv4_5.c:502
arm_core_type
Indicates what registers are in the ARM state core register set.
Definition: arm.h:45
@ ARM_CORE_TYPE_SEC_EXT
Definition: arm.h:47
@ ARM_CORE_TYPE_VIRT_EXT
Definition: arm.h:48
@ ARM_CORE_TYPE_M_PROFILE
Definition: arm.h:49
@ ARM_CORE_TYPE_STD
Definition: arm.h:46
enum arm_mode mode
Definition: armv4_5.c:277
uint64_t op
Definition: lakemont.c:68
This represents an ARM Debug Interface (v5) Debug Access Port (DAP).
Definition: arm_adi_v5.h:348
unsigned int common_magic
Definition: arm.h:273
enum arm_mode core_mode
Definition: arm.h:275
enum arm_state core_state
Definition: arm.h:276
This wraps an implementation of DPM primitives.
Definition: arm_dpm.h:47
Definition: arm.h:279
int num
Definition: arm.h:280
struct arm * arm
Definition: arm.h:283
uint8_t value[16]
Definition: arm.h:284
enum arm_mode mode
Definition: arm.h:281
struct target * target
Definition: arm.h:282
Represents a generic ARM core, with standard application registers.
Definition: arm.h:174
int(* full_context)(struct target *target)
Retrieve all core registers, for display.
Definition: arm.h:220
enum arm_arch arch
ARM architecture version.
Definition: arm.h:201
int(* mrrc)(struct target *target, int cpnum, uint32_t op, uint32_t crm, uint64_t *value)
Read coprocessor to two registers.
Definition: arm.h:235
void * arch_info
Definition: arm.h:250
struct etm_context * etm
Handle for the Embedded Trace Module, if one is present.
Definition: arm.h:215
enum arm_core_type core_type
Indicates what registers are in the ARM state core register set.
Definition: arm.h:192
int(* mrc)(struct target *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t crn, uint32_t crm, uint32_t *value)
Read coprocessor register.
Definition: arm.h:229
enum arm_mode core_mode
Record the current core mode: SVC, USR, or some other mode.
Definition: arm.h:195
struct reg * cpsr
Handle to the CPSR/xPSR; valid in all core modes.
Definition: arm.h:183
struct adiv5_dap * dap
For targets conforming to ARM Debug Interface v5, this handle references the Debug Access Port (DAP) ...
Definition: arm.h:256
struct reg * pc
Handle to the PC; valid in all core modes.
Definition: arm.h:180
int(* write_core_reg)(struct target *target, struct reg *reg, int num, enum arm_mode mode, uint8_t *value)
Definition: arm.h:225
int(* setup_semihosting)(struct target *target, int enable)
Definition: arm.h:206
const int * map
Support for arm_reg_current()
Definition: arm.h:189
int(* mcrr)(struct target *target, int cpnum, uint32_t op, uint32_t crm, uint64_t value)
Write coprocessor from two registers.
Definition: arm.h:246
int(* read_core_reg)(struct target *target, struct reg *reg, int num, enum arm_mode mode)
Retrieve a single core register.
Definition: arm.h:223
struct reg_cache * core_cache
Definition: arm.h:177
struct arm_dpm * dpm
Handle for the debug module, if one is present.
Definition: arm.h:212
int(* mcr)(struct target *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t crn, uint32_t crm, uint32_t value)
Write coprocessor register.
Definition: arm.h:240
struct reg * spsr
Handle to the SPSR; valid only in core modes with an SPSR.
Definition: arm.h:186
unsigned int common_magic
Definition: arm.h:175
int arm_vfp_version
Floating point or VFP version, 0 if disabled.
Definition: arm.h:204
struct target * target
Backpointer to the target.
Definition: arm.h:209
enum arm_state core_state
Record the current core state: ARM, Thumb, or otherwise.
Definition: arm.h:198
Definition: register.h:111
uint8_t * value
Definition: register.h:122
Definition: target.h:116
void * arch_info
Definition: target.h:164
target_register_class
Definition: target.h:110
uint64_t target_addr_t
Definition: types.h:335
uint8_t count[4]
Definition: vdebug.c:22