10 /* The register cache is statically allocated. */
11 #define RISCV_MAX_HARTS 32
12 #define RISCV_MAX_REGISTERS 5000
13 #define RISCV_MAX_TRIGGERS 32
14 #define RISCV_MAX_HWBPS 16
16 #define DEFAULT_COMMAND_TIMEOUT_SEC 2
17 #define DEFAULT_RESET_TIMEOUT_SEC 30
19 extern struct target_type riscv011_target
;
20 extern struct target_type riscv013_target
;
23 * Definitions shared by code supporting all RISC-V versions.
25 typedef uint64_t riscv_reg_t
;
26 typedef uint32_t riscv_insn_t
;
27 typedef uint64_t riscv_addr_t
;
29 enum riscv_halt_reason
{
31 RISCV_HALT_BREAKPOINT
,
32 RISCV_HALT_SINGLESTEP
,
41 struct command_context
*cmd_ctx
;
42 void *version_specific
;
44 /* The number of harts on this system. */
47 /* The hart that the RTOS thinks is currently being debugged. */
50 /* The hart that is currently being debugged. Note that this is
51 * different than the hartid that the RTOS is expected to use. This
52 * one will change all the time, it's more of a global argument to
53 * every function than an actual */
56 /* Enough space to store all the registers we might need to save. */
57 /* FIXME: This should probably be a bunch of register caches. */
58 uint64_t saved_registers
[RISCV_MAX_HARTS
][RISCV_MAX_REGISTERS
];
59 bool valid_saved_registers
[RISCV_MAX_HARTS
][RISCV_MAX_REGISTERS
];
61 /* OpenOCD's register cache points into here. This is not per-hart because
62 * we just invalidate the entire cache when we change which hart is
64 uint64_t reg_cache_values
[RISCV_MAX_REGISTERS
];
66 /* Single buffer that contains all register names, instead of calling
67 * malloc for each register. Needs to be freed when reg_list is freed. */
70 /* It's possible that each core has a different supported ISA set. */
71 int xlen
[RISCV_MAX_HARTS
];
72 riscv_reg_t misa
[RISCV_MAX_HARTS
];
74 /* The number of triggers per hart. */
75 unsigned trigger_count
[RISCV_MAX_HARTS
];
77 /* For each physical trigger, contains -1 if the hwbp is available, or the
78 * unique_id of the breakpoint/watchpoint that is using it.
79 * Note that in RTOS mode the triggers are the same across all harts the
80 * target controls, while otherwise only a single hart is controlled. */
81 int trigger_unique_id
[RISCV_MAX_HWBPS
];
83 /* The number of entries in the debug buffer. */
84 int debug_buffer_size
[RISCV_MAX_HARTS
];
86 /* This avoids invalidating the register cache too often. */
87 bool registers_initialized
;
89 /* This hart contains an implicit ebreak at the end of the program buffer. */
92 bool triggers_enumerated
;
94 /* Helper functions that target the various RISC-V debug spec
96 int (*get_register
)(struct target
*target
,
97 riscv_reg_t
*value
, int hid
, int rid
);
98 int (*set_register
)(struct target
*, int hartid
, int regid
,
100 int (*select_current_hart
)(struct target
*);
101 bool (*is_halted
)(struct target
*target
);
102 int (*halt_current_hart
)(struct target
*);
103 int (*resume_current_hart
)(struct target
*target
);
104 int (*step_current_hart
)(struct target
*target
);
105 int (*on_halt
)(struct target
*target
);
106 int (*on_resume
)(struct target
*target
);
107 int (*on_step
)(struct target
*target
);
108 enum riscv_halt_reason (*halt_reason
)(struct target
*target
);
109 int (*write_debug_buffer
)(struct target
*target
, unsigned index
,
111 riscv_insn_t (*read_debug_buffer
)(struct target
*target
, unsigned index
);
112 int (*execute_debug_buffer
)(struct target
*target
);
113 int (*dmi_write_u64_bits
)(struct target
*target
);
114 void (*fill_dmi_write_u64
)(struct target
*target
, char *buf
, int a
, uint64_t d
);
115 void (*fill_dmi_read_u64
)(struct target
*target
, char *buf
, int a
);
116 void (*fill_dmi_nop_u64
)(struct target
*target
, char *buf
);
118 int (*authdata_read
)(struct target
*target
, uint32_t *value
);
119 int (*authdata_write
)(struct target
*target
, uint32_t value
);
121 int (*dmi_read
)(struct target
*target
, uint32_t *value
, uint32_t address
);
122 int (*dmi_write
)(struct target
*target
, uint32_t address
, uint32_t value
);
125 /* Wall-clock timeout for a command/access. Settable via RISC-V Target commands.*/
126 extern int riscv_command_timeout_sec
;
128 /* Wall-clock timeout after reset. Settable via RISC-V Target commands.*/
129 extern int riscv_reset_timeout_sec
;
131 extern bool riscv_prefer_sba
;
133 /* Everything needs the RISC-V specific info structure, so here's a nice macro
134 * that provides that. */
135 static inline riscv_info_t
*riscv_info(const struct target
*target
) __attribute__((unused
));
136 static inline riscv_info_t
*riscv_info(const struct target
*target
)
137 { return target
->arch_info
; }
138 #define RISCV_INFO(R) riscv_info_t *R = riscv_info(target);
140 extern uint8_t ir_dtmcontrol
[1];
141 extern struct scan_field select_dtmcontrol
;
142 extern uint8_t ir_dbus
[1];
143 extern struct scan_field select_dbus
;
144 extern uint8_t ir_idcode
[1];
145 extern struct scan_field select_idcode
;
147 /*** OpenOCD Interface */
148 int riscv_openocd_poll(struct target
*target
);
150 int riscv_openocd_halt(struct target
*target
);
152 int riscv_openocd_resume(
153 struct target
*target
,
155 target_addr_t address
,
156 int handle_breakpoints
,
160 int riscv_openocd_step(
161 struct target
*target
,
163 target_addr_t address
,
164 int handle_breakpoints
167 int riscv_openocd_assert_reset(struct target
*target
);
168 int riscv_openocd_deassert_reset(struct target
*target
);
170 /*** RISC-V Interface ***/
172 /* Initializes the shared RISC-V structure. */
173 void riscv_info_init(struct target
*target
, riscv_info_t
*r
);
175 /* Run control, possibly for multiple harts. The _all_harts versions resume
176 * all the enabled harts, which when running in RTOS mode is all the harts on
178 int riscv_halt_all_harts(struct target
*target
);
179 int riscv_halt_one_hart(struct target
*target
, int hartid
);
180 int riscv_resume_all_harts(struct target
*target
);
181 int riscv_resume_one_hart(struct target
*target
, int hartid
);
183 /* Steps the hart that's currently selected in the RTOS, or if there is no RTOS
184 * then the only hart. */
185 int riscv_step_rtos_hart(struct target
*target
);
187 bool riscv_supports_extension(struct target
*target
, int hartid
, char letter
);
189 /* Returns XLEN for the given (or current) hart. */
190 int riscv_xlen(const struct target
*target
);
191 int riscv_xlen_of_hart(const struct target
*target
, int hartid
);
193 bool riscv_rtos_enabled(const struct target
*target
);
195 /* Sets the current hart, which is the hart that will actually be used when
196 * issuing debug commands. */
197 int riscv_set_current_hartid(struct target
*target
, int hartid
);
198 int riscv_current_hartid(const struct target
*target
);
200 /*** Support functions for the RISC-V 'RTOS', which provides multihart support
201 * without requiring multiple targets. */
203 /* When using the RTOS to debug, this selects the hart that is currently being
204 * debugged. This doesn't propogate to the hardware. */
205 void riscv_set_all_rtos_harts(struct target
*target
);
206 void riscv_set_rtos_hartid(struct target
*target
, int hartid
);
208 /* Lists the number of harts in the system, which are assumed to be
209 * concecutive and start with mhartid=0. */
210 int riscv_count_harts(struct target
*target
);
212 /* Returns TRUE if the target has the given register on the given hart. */
213 bool riscv_has_register(struct target
*target
, int hartid
, int regid
);
215 /* Returns the value of the given register on the given hart. 32-bit registers
216 * are zero extended to 64 bits. */
217 int riscv_set_register(struct target
*target
, enum gdb_regno i
, riscv_reg_t v
);
218 int riscv_set_register_on_hart(struct target
*target
, int hid
, enum gdb_regno rid
, uint64_t v
);
219 int riscv_get_register(struct target
*target
, riscv_reg_t
*value
,
221 int riscv_get_register_on_hart(struct target
*target
, riscv_reg_t
*value
,
222 int hartid
, enum gdb_regno regid
);
224 /* Checks the state of the current hart -- "is_halted" checks the actual
225 * on-device register. */
226 bool riscv_is_halted(struct target
*target
);
227 enum riscv_halt_reason
riscv_halt_reason(struct target
*target
, int hartid
);
229 /* These helper functions let the generic program interface get target-specific
231 size_t riscv_debug_buffer_size(struct target
*target
);
233 riscv_insn_t
riscv_read_debug_buffer(struct target
*target
, int index
);
234 int riscv_write_debug_buffer(struct target
*target
, int index
, riscv_insn_t insn
);
235 int riscv_execute_debug_buffer(struct target
*target
);
237 void riscv_fill_dmi_nop_u64(struct target
*target
, char *buf
);
238 void riscv_fill_dmi_write_u64(struct target
*target
, char *buf
, int a
, uint64_t d
);
239 void riscv_fill_dmi_read_u64(struct target
*target
, char *buf
, int a
);
240 int riscv_dmi_write_u64_bits(struct target
*target
);
242 /* Invalidates the register cache. */
243 void riscv_invalidate_register_cache(struct target
*target
);
245 /* Returns TRUE when a hart is enabled in this target. */
246 bool riscv_hart_enabled(struct target
*target
, int hartid
);
248 int riscv_enumerate_triggers(struct target
*target
);
250 int riscv_add_breakpoint(struct target
*target
, struct breakpoint
*breakpoint
);
251 int riscv_remove_breakpoint(struct target
*target
,
252 struct breakpoint
*breakpoint
);
253 int riscv_add_watchpoint(struct target
*target
, struct watchpoint
*watchpoint
);
254 int riscv_remove_watchpoint(struct target
*target
,
255 struct watchpoint
*watchpoint
);
257 int riscv_init_registers(struct target
*target
);
259 void riscv_semihosting_init(struct target
*target
);
260 int riscv_semihosting(struct target
*target
, int *retval
);
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)