Introduce ARCv2 architecture related code
[openocd.git] / src / target / arc.h
1 /***************************************************************************
2 * Copyright (C) 2013-2015,2019-2020 Synopsys, Inc. *
3 * Frank Dols <frank.dols@synopsys.com> *
4 * Mischa Jonker <mischa.jonker@synopsys.com> *
5 * Anton Kolesov <anton.kolesov@synopsys.com> *
6 * Evgeniy Didin <didin@synopsys.com> *
7 * *
8 * SPDX-License-Identifier: GPL-2.0-or-later *
9 ***************************************************************************/
10
11 #ifndef OPENOCD_TARGET_ARC_H
12 #define OPENOCD_TARGET_ARC_H
13
14 #include <helper/time_support.h>
15 #include <jtag/jtag.h>
16
17 #include "algorithm.h"
18 #include "breakpoints.h"
19 #include "jtag/interface.h"
20 #include "register.h"
21 #include "target.h"
22 #include "target_request.h"
23 #include "target_type.h"
24 #include "helper/bits.h"
25
26 #include "arc_jtag.h"
27 #include "arc_cmd.h"
28 #include "arc_mem.h"
29
30 #define ARC_COMMON_MAGIC 0xB32EB324 /* just a unique number */
31
32 #define AUX_DEBUG_REG 0x5
33 #define AUX_PC_REG 0x6
34 #define AUX_STATUS32_REG 0xA
35
36 #define SET_CORE_FORCE_HALT BIT(1)
37 #define SET_CORE_HALT_BIT BIT(0) /* STATUS32[0] = H field */
38 #define SET_CORE_ENABLE_INTERRUPTS BIT(31)
39
40 #define AUX_STATUS32_REG_HALT_BIT BIT(0)
41 #define AUX_STATUS32_REG_IE_BIT BIT(31) /* STATUS32[31] = IE field */
42
43 /* Reserved core registers */
44 #define CORE_R61_NUM (61)
45 #define CORE_R62_NUM (62)
46
47 #define CORE_REG_MAX_NUMBER (63)
48
49 /* Limit reg_type/reg_type_field name to 20 symbols */
50 #define REG_TYPE_MAX_NAME_LENGTH 20
51
52 struct arc_reg_bitfield {
53 struct reg_data_type_bitfield bitfield;
54 char name[REG_TYPE_MAX_NAME_LENGTH];
55 };
56 /* Register data type */
57 struct arc_reg_data_type {
58 struct list_head list;
59 struct reg_data_type data_type;
60 struct reg_data_type_flags data_type_flags;
61 struct reg_data_type_struct data_type_struct;
62 char data_type_id[REG_TYPE_MAX_NAME_LENGTH];
63 struct arc_reg_bitfield *bitfields;
64 };
65
66
67
68 /* Standard GDB register types */
69 static const struct reg_data_type standard_gdb_types[] = {
70 { .type = REG_TYPE_INT, .id = "int" },
71 { .type = REG_TYPE_INT8, .id = "int8" },
72 { .type = REG_TYPE_INT16, .id = "int16" },
73 { .type = REG_TYPE_INT32, .id = "int32" },
74 { .type = REG_TYPE_INT64, .id = "int64" },
75 { .type = REG_TYPE_INT128, .id = "int128" },
76 { .type = REG_TYPE_UINT8, .id = "uint8" },
77 { .type = REG_TYPE_UINT16, .id = "uint16" },
78 { .type = REG_TYPE_UINT32, .id = "uint32" },
79 { .type = REG_TYPE_UINT64, .id = "uint64" },
80 { .type = REG_TYPE_UINT128, .id = "uint128" },
81 { .type = REG_TYPE_CODE_PTR, .id = "code_ptr" },
82 { .type = REG_TYPE_DATA_PTR, .id = "data_ptr" },
83 { .type = REG_TYPE_FLOAT, .id = "float" },
84 { .type = REG_TYPE_IEEE_SINGLE, .id = "ieee_single" },
85 { .type = REG_TYPE_IEEE_DOUBLE, .id = "ieee_double" },
86 };
87
88
89 struct arc_common {
90 uint32_t common_magic;
91
92 struct arc_jtag jtag_info;
93
94 struct reg_cache *core_and_aux_cache;
95 struct reg_cache *bcr_cache;
96
97 /* Indicate if cach was built (for deinit function) */
98 bool core_aux_cache_built;
99 bool bcr_cache_built;
100 /* Closely Coupled memory(CCM) regions for performance-critical
101 * code (optional). */
102 uint32_t iccm0_start;
103 uint32_t iccm0_end;
104 uint32_t iccm1_start;
105 uint32_t iccm1_end;
106 uint32_t dccm_start;
107 uint32_t dccm_end;
108
109 int irq_state;
110
111 /* Register descriptions */
112 struct list_head reg_data_types;
113 struct list_head core_reg_descriptions;
114 struct list_head aux_reg_descriptions;
115 struct list_head bcr_reg_descriptions;
116 unsigned long num_regs;
117 unsigned long num_core_regs;
118 unsigned long num_aux_regs;
119 unsigned long num_bcr_regs;
120 unsigned long last_general_reg;
121
122 /* PC register location in register cache. */
123 unsigned long pc_index_in_cache;
124 /* DEBUG register location in register cache. */
125 unsigned long debug_index_in_cache;
126 };
127
128 /* Borrowed from nds32.h */
129 #define CHECK_RETVAL(action) \
130 do { \
131 int __retval = (action); \
132 if (__retval != ERROR_OK) { \
133 LOG_DEBUG("error while calling \"%s\"", \
134 # action); \
135 return __retval; \
136 } \
137 } while (0)
138
139 #define JIM_CHECK_RETVAL(action) \
140 do { \
141 int __retval = (action); \
142 if (__retval != JIM_OK) { \
143 LOG_DEBUG("error while calling \"%s\"", \
144 # action); \
145 return __retval; \
146 } \
147 } while (0)
148
149 static inline struct arc_common *target_to_arc(struct target *target)
150 {
151 return target->arch_info;
152 }
153
154
155 /* ARC Register description */
156 struct arc_reg_desc {
157
158 struct target *target;
159
160 /* Register name */
161 char *name;
162
163 /* Actual place of storing reg_value */
164 uint8_t reg_value[4];
165
166 /* Actual place of storing register feature */
167 struct reg_feature feature;
168
169 /* GDB XML feature */
170 char *gdb_xml_feature;
171
172 /* Is this a register in g/G-packet? */
173 bool is_general;
174
175 /* Architectural number: core reg num or AUX reg num */
176 uint32_t arch_num;
177
178 /* Core or AUX register? */
179 bool is_core;
180
181 /* Build configuration register? */
182 bool is_bcr;
183
184 /* Data type */
185 struct reg_data_type *data_type;
186
187 struct list_head list;
188 };
189
190 /* Error codes */
191 #define ERROR_ARC_REGISTER_NOT_FOUND (-700)
192 #define ERROR_ARC_REGISTER_FIELD_NOT_FOUND (-701)
193 #define ERROR_ARC_REGISTER_IS_NOT_STRUCT (-702)
194 #define ERROR_ARC_FIELD_IS_NOT_BITFIELD (-703)
195 #define ERROR_ARC_REGTYPE_NOT_FOUND (-704)
196
197 void free_reg_desc(struct arc_reg_desc *r);
198
199
200 void arc_reg_data_type_add(struct target *target,
201 struct arc_reg_data_type *data_type);
202
203 int arc_reg_add(struct target *target, struct arc_reg_desc *arc_reg,
204 const char * const type_name, const size_t type_name_len);
205
206 struct reg *arc_reg_get_by_name(struct reg_cache *first,
207 const char *name, bool search_all);
208
209 int arc_reg_get_field(struct target *target, const char *reg_name,
210 const char *field_name, uint32_t *value_ptr);
211
212 #endif /* OPENOCD_TARGET_ARC_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)