Remove BUILD_TARGET64
[openocd.git] / src / target / riscv / riscv-013.c
1 /*
2 * Support for RISC-V, debug version 0.13, which is currently (2/4/17) the
3 * latest draft.
4 */
5
6 #include <assert.h>
7 #include <stdlib.h>
8 #include <time.h>
9
10 #ifdef HAVE_CONFIG_H
11 #include "config.h"
12 #endif
13
14 #include "target/target.h"
15 #include "target/algorithm.h"
16 #include "target/target_type.h"
17 #include "log.h"
18 #include "jtag/jtag.h"
19 #include "target/register.h"
20 #include "target/breakpoints.h"
21 #include "helper/time_support.h"
22 #include "helper/list.h"
23 #include "riscv.h"
24 #include "debug_defines.h"
25 #include "rtos/rtos.h"
26 #include "program.h"
27 #include "asm.h"
28 #include "batch.h"
29
30 #define DMI_DATA1 (DMI_DATA0 + 1)
31 #define DMI_PROGBUF1 (DMI_PROGBUF0 + 1)
32
33 static int riscv013_on_step_or_resume(struct target *target, bool step);
34 static int riscv013_step_or_resume_current_hart(struct target *target, bool step);
35 static void riscv013_clear_abstract_error(struct target *target);
36
37 /* Implementations of the functions in riscv_info_t. */
38 static int riscv013_get_register(struct target *target,
39 riscv_reg_t *value, int hid, int rid);
40 static int riscv013_set_register(struct target *target, int hartid, int regid, uint64_t value);
41 static int riscv013_select_current_hart(struct target *target);
42 static int riscv013_halt_current_hart(struct target *target);
43 static int riscv013_resume_current_hart(struct target *target);
44 static int riscv013_step_current_hart(struct target *target);
45 static int riscv013_on_halt(struct target *target);
46 static int riscv013_on_step(struct target *target);
47 static int riscv013_on_resume(struct target *target);
48 static bool riscv013_is_halted(struct target *target);
49 static enum riscv_halt_reason riscv013_halt_reason(struct target *target);
50 static int riscv013_write_debug_buffer(struct target *target, unsigned index,
51 riscv_insn_t d);
52 static riscv_insn_t riscv013_read_debug_buffer(struct target *target, unsigned
53 index);
54 static int riscv013_execute_debug_buffer(struct target *target);
55 static void riscv013_fill_dmi_write_u64(struct target *target, char *buf, int a, uint64_t d);
56 static void riscv013_fill_dmi_read_u64(struct target *target, char *buf, int a);
57 static int riscv013_dmi_write_u64_bits(struct target *target);
58 static void riscv013_fill_dmi_nop_u64(struct target *target, char *buf);
59 static int register_read(struct target *target, uint64_t *value, uint32_t number);
60 static int register_read_direct(struct target *target, uint64_t *value, uint32_t number);
61 static int register_write_direct(struct target *target, unsigned number,
62 uint64_t value);
63 static int read_memory(struct target *target, target_addr_t address,
64 uint32_t size, uint32_t count, uint8_t *buffer);
65 static int write_memory(struct target *target, target_addr_t address,
66 uint32_t size, uint32_t count, const uint8_t *buffer);
67 static int riscv013_test_sba_config_reg(struct target *target, target_addr_t legal_address,
68 uint32_t num_words, target_addr_t illegal_address, bool run_sbbusyerror_test);
69 void write_memory_sba_simple(struct target *target, target_addr_t addr, uint32_t *write_data,
70 uint32_t write_size, uint32_t sbcs);
71 void read_memory_sba_simple(struct target *target, target_addr_t addr,
72 uint32_t *rd_buf, uint32_t read_size, uint32_t sbcs);
73 static int riscv013_test_compliance(struct target *target);
74
75 /**
76 * Since almost everything can be accomplish by scanning the dbus register, all
77 * functions here assume dbus is already selected. The exception are functions
78 * called directly by OpenOCD, which can't assume anything about what's
79 * currently in IR. They should set IR to dbus explicitly.
80 */
81
82 #define get_field(reg, mask) (((reg) & (mask)) / ((mask) & ~((mask) << 1)))
83 #define set_field(reg, mask, val) (((reg) & ~(mask)) | (((val) * ((mask) & ~((mask) << 1))) & (mask)))
84
85 #define DIM(x) (sizeof(x)/sizeof(*x))
86
87 #define CSR_DCSR_CAUSE_SWBP 1
88 #define CSR_DCSR_CAUSE_TRIGGER 2
89 #define CSR_DCSR_CAUSE_DEBUGINT 3
90 #define CSR_DCSR_CAUSE_STEP 4
91 #define CSR_DCSR_CAUSE_HALT 5
92
93 #define RISCV013_INFO(r) riscv013_info_t *r = get_info(target)
94
95 /*** JTAG registers. ***/
96
97 typedef enum {
98 DMI_OP_NOP = 0,
99 DMI_OP_READ = 1,
100 DMI_OP_WRITE = 2
101 } dmi_op_t;
102 typedef enum {
103 DMI_STATUS_SUCCESS = 0,
104 DMI_STATUS_FAILED = 2,
105 DMI_STATUS_BUSY = 3
106 } dmi_status_t;
107
108 typedef enum {
109 RE_OK,
110 RE_FAIL,
111 RE_AGAIN
112 } riscv_error_t;
113
114 typedef enum slot {
115 SLOT0,
116 SLOT1,
117 SLOT_LAST,
118 } slot_t;
119
120 /*** Debug Bus registers. ***/
121
122 #define CMDERR_NONE 0
123 #define CMDERR_BUSY 1
124 #define CMDERR_NOT_SUPPORTED 2
125 #define CMDERR_EXCEPTION 3
126 #define CMDERR_HALT_RESUME 4
127 #define CMDERR_OTHER 7
128
129 /*** Info about the core being debugged. ***/
130
131 struct trigger {
132 uint64_t address;
133 uint32_t length;
134 uint64_t mask;
135 uint64_t value;
136 bool read, write, execute;
137 int unique_id;
138 };
139
140 typedef enum {
141 YNM_MAYBE,
142 YNM_YES,
143 YNM_NO
144 } yes_no_maybe_t;
145
146 typedef struct {
147 struct list_head list;
148 int abs_chain_position;
149 /* Indicates we already reset this DM, so don't need to do it again. */
150 bool was_reset;
151 /* Targets that are connected to this DM. */
152 struct list_head target_list;
153 /* The currently selected hartid on this DM. */
154 int current_hartid;
155 } dm013_info_t;
156
157 typedef struct {
158 struct list_head list;
159 struct target *target;
160 } target_list_t;
161
162 typedef struct {
163 /* Number of address bits in the dbus register. */
164 unsigned abits;
165 /* Number of abstract command data registers. */
166 unsigned datacount;
167 /* Number of words in the Program Buffer. */
168 unsigned progbufsize;
169
170 /* We cache the read-only bits of sbcs here. */
171 uint32_t sbcs;
172
173 yes_no_maybe_t progbuf_writable;
174 /* We only need the address so that we know the alignment of the buffer. */
175 riscv_addr_t progbuf_address;
176
177 /* Number of run-test/idle cycles the target requests we do after each dbus
178 * access. */
179 unsigned int dtmcs_idle;
180
181 /* This value is incremented every time a dbus access comes back as "busy".
182 * It's used to determine how many run-test/idle cycles to feed the target
183 * in between accesses. */
184 unsigned int dmi_busy_delay;
185
186 /* Number of run-test/idle cycles to add between consecutive bus master
187 * reads/writes respectively. */
188 unsigned int bus_master_write_delay, bus_master_read_delay;
189
190 /* This value is increased every time we tried to execute two commands
191 * consecutively, and the second one failed because the previous hadn't
192 * completed yet. It's used to add extra run-test/idle cycles after
193 * starting a command, so we don't have to waste time checking for busy to
194 * go low. */
195 unsigned int ac_busy_delay;
196
197 bool abstract_read_csr_supported;
198 bool abstract_write_csr_supported;
199 bool abstract_read_fpr_supported;
200 bool abstract_write_fpr_supported;
201
202 /* When a function returns some error due to a failure indicated by the
203 * target in cmderr, the caller can look here to see what that error was.
204 * (Compare with errno.) */
205 uint8_t cmderr;
206
207 /* Some fields from hartinfo. */
208 uint8_t datasize;
209 uint8_t dataaccess;
210 int16_t dataaddr;
211
212 /* The width of the hartsel field. */
213 unsigned hartsellen;
214
215 /* DM that provides access to this target. */
216 dm013_info_t *dm;
217 } riscv013_info_t;
218
219 LIST_HEAD(dm_list);
220
221 static riscv013_info_t *get_info(const struct target *target)
222 {
223 riscv_info_t *info = (riscv_info_t *) target->arch_info;
224 return (riscv013_info_t *) info->version_specific;
225 }
226
227 /**
228 * Return the DM structure for this target. If there isn't one, find it in the
229 * global list of DMs. If it's not in there, then create one and initialize it
230 * to 0.
231 */
232 static dm013_info_t *get_dm(struct target *target)
233 {
234 RISCV013_INFO(info);
235 if (info->dm)
236 return info->dm;
237
238 int abs_chain_position = target->tap->abs_chain_position;
239
240 dm013_info_t *entry;
241 dm013_info_t *dm = NULL;
242 list_for_each_entry(entry, &dm_list, list) {
243 if (entry->abs_chain_position == abs_chain_position) {
244 dm = entry;
245 break;
246 }
247 }
248
249 if (!dm) {
250 dm = calloc(1, sizeof(dm013_info_t));
251 dm->abs_chain_position = abs_chain_position;
252 dm->current_hartid = -1;
253 INIT_LIST_HEAD(&dm->target_list);
254 list_add(&dm->list, &dm_list);
255 }
256
257 info->dm = dm;
258 target_list_t *target_entry;
259 list_for_each_entry(target_entry, &dm->target_list, list) {
260 if (target_entry->target == target)
261 return dm;
262 }
263 target_entry = calloc(1, sizeof(*target_entry));
264 target_entry->target = target;
265 list_add(&target_entry->list, &dm->target_list);
266
267 return dm;
268 }
269
270 static uint32_t set_hartsel(uint32_t initial, uint32_t index)
271 {
272 initial &= ~DMI_DMCONTROL_HARTSELLO;
273 initial &= ~DMI_DMCONTROL_HARTSELHI;
274
275 uint32_t index_lo = index & ((1 << DMI_DMCONTROL_HARTSELLO_LENGTH) - 1);
276 initial |= index_lo << DMI_DMCONTROL_HARTSELLO_OFFSET;
277 uint32_t index_hi = index >> DMI_DMCONTROL_HARTSELLO_LENGTH;
278 assert(index_hi < 1 << DMI_DMCONTROL_HARTSELHI_LENGTH);
279 initial |= index_hi << DMI_DMCONTROL_HARTSELHI_OFFSET;
280
281 return initial;
282 }
283
284 static void decode_dmi(char *text, unsigned address, unsigned data)
285 {
286 static const struct {
287 unsigned address;
288 uint64_t mask;
289 const char *name;
290 } description[] = {
291 { DMI_DMCONTROL, DMI_DMCONTROL_HALTREQ, "haltreq" },
292 { DMI_DMCONTROL, DMI_DMCONTROL_RESUMEREQ, "resumereq" },
293 { DMI_DMCONTROL, DMI_DMCONTROL_HARTRESET, "hartreset" },
294 { DMI_DMCONTROL, DMI_DMCONTROL_HASEL, "hasel" },
295 { DMI_DMCONTROL, DMI_DMCONTROL_HARTSELHI, "hartselhi" },
296 { DMI_DMCONTROL, DMI_DMCONTROL_HARTSELLO, "hartsello" },
297 { DMI_DMCONTROL, DMI_DMCONTROL_NDMRESET, "ndmreset" },
298 { DMI_DMCONTROL, DMI_DMCONTROL_DMACTIVE, "dmactive" },
299 { DMI_DMCONTROL, DMI_DMCONTROL_ACKHAVERESET, "ackhavereset" },
300
301 { DMI_DMSTATUS, DMI_DMSTATUS_IMPEBREAK, "impebreak" },
302 { DMI_DMSTATUS, DMI_DMSTATUS_ALLHAVERESET, "allhavereset" },
303 { DMI_DMSTATUS, DMI_DMSTATUS_ANYHAVERESET, "anyhavereset" },
304 { DMI_DMSTATUS, DMI_DMSTATUS_ALLRESUMEACK, "allresumeack" },
305 { DMI_DMSTATUS, DMI_DMSTATUS_ANYRESUMEACK, "anyresumeack" },
306 { DMI_DMSTATUS, DMI_DMSTATUS_ALLNONEXISTENT, "allnonexistent" },
307 { DMI_DMSTATUS, DMI_DMSTATUS_ANYNONEXISTENT, "anynonexistent" },
308 { DMI_DMSTATUS, DMI_DMSTATUS_ALLUNAVAIL, "allunavail" },
309 { DMI_DMSTATUS, DMI_DMSTATUS_ANYUNAVAIL, "anyunavail" },
310 { DMI_DMSTATUS, DMI_DMSTATUS_ALLRUNNING, "allrunning" },
311 { DMI_DMSTATUS, DMI_DMSTATUS_ANYRUNNING, "anyrunning" },
312 { DMI_DMSTATUS, DMI_DMSTATUS_ALLHALTED, "allhalted" },
313 { DMI_DMSTATUS, DMI_DMSTATUS_ANYHALTED, "anyhalted" },
314 { DMI_DMSTATUS, DMI_DMSTATUS_AUTHENTICATED, "authenticated" },
315 { DMI_DMSTATUS, DMI_DMSTATUS_AUTHBUSY, "authbusy" },
316 { DMI_DMSTATUS, DMI_DMSTATUS_DEVTREEVALID, "devtreevalid" },
317 { DMI_DMSTATUS, DMI_DMSTATUS_VERSION, "version" },
318
319 { DMI_ABSTRACTCS, DMI_ABSTRACTCS_PROGBUFSIZE, "progbufsize" },
320 { DMI_ABSTRACTCS, DMI_ABSTRACTCS_BUSY, "busy" },
321 { DMI_ABSTRACTCS, DMI_ABSTRACTCS_CMDERR, "cmderr" },
322 { DMI_ABSTRACTCS, DMI_ABSTRACTCS_DATACOUNT, "datacount" },
323
324 { DMI_COMMAND, DMI_COMMAND_CMDTYPE, "cmdtype" },
325
326 { DMI_SBCS, DMI_SBCS_SBREADONADDR, "sbreadonaddr" },
327 { DMI_SBCS, DMI_SBCS_SBACCESS, "sbaccess" },
328 { DMI_SBCS, DMI_SBCS_SBAUTOINCREMENT, "sbautoincrement" },
329 { DMI_SBCS, DMI_SBCS_SBREADONDATA, "sbreadondata" },
330 { DMI_SBCS, DMI_SBCS_SBERROR, "sberror" },
331 { DMI_SBCS, DMI_SBCS_SBASIZE, "sbasize" },
332 { DMI_SBCS, DMI_SBCS_SBACCESS128, "sbaccess128" },
333 { DMI_SBCS, DMI_SBCS_SBACCESS64, "sbaccess64" },
334 { DMI_SBCS, DMI_SBCS_SBACCESS32, "sbaccess32" },
335 { DMI_SBCS, DMI_SBCS_SBACCESS16, "sbaccess16" },
336 { DMI_SBCS, DMI_SBCS_SBACCESS8, "sbaccess8" },
337 };
338
339 text[0] = 0;
340 for (unsigned i = 0; i < DIM(description); i++) {
341 if (description[i].address == address) {
342 uint64_t mask = description[i].mask;
343 unsigned value = get_field(data, mask);
344 if (value) {
345 if (i > 0)
346 *(text++) = ' ';
347 if (mask & (mask >> 1)) {
348 /* If the field is more than 1 bit wide. */
349 sprintf(text, "%s=%d", description[i].name, value);
350 } else {
351 strcpy(text, description[i].name);
352 }
353 text += strlen(text);
354 }
355 }
356 }
357 }
358
359 static void dump_field(int idle, const struct scan_field *field)
360 {
361 static const char * const op_string[] = {"-", "r", "w", "?"};
362 static const char * const status_string[] = {"+", "?", "F", "b"};
363
364 if (debug_level < LOG_LVL_DEBUG)
365 return;
366
367 uint64_t out = buf_get_u64(field->out_value, 0, field->num_bits);
368 unsigned int out_op = get_field(out, DTM_DMI_OP);
369 unsigned int out_data = get_field(out, DTM_DMI_DATA);
370 unsigned int out_address = out >> DTM_DMI_ADDRESS_OFFSET;
371
372 uint64_t in = buf_get_u64(field->in_value, 0, field->num_bits);
373 unsigned int in_op = get_field(in, DTM_DMI_OP);
374 unsigned int in_data = get_field(in, DTM_DMI_DATA);
375 unsigned int in_address = in >> DTM_DMI_ADDRESS_OFFSET;
376
377 log_printf_lf(LOG_LVL_DEBUG,
378 __FILE__, __LINE__, "scan",
379 "%db %di %s %08x @%02x -> %s %08x @%02x",
380 field->num_bits, idle,
381 op_string[out_op], out_data, out_address,
382 status_string[in_op], in_data, in_address);
383
384 char out_text[500];
385 char in_text[500];
386 decode_dmi(out_text, out_address, out_data);
387 decode_dmi(in_text, in_address, in_data);
388 if (in_text[0] || out_text[0]) {
389 log_printf_lf(LOG_LVL_DEBUG, __FILE__, __LINE__, "scan", "%s -> %s",
390 out_text, in_text);
391 }
392 }
393
394 /*** Utility functions. ***/
395
396 static void select_dmi(struct target *target)
397 {
398 jtag_add_ir_scan(target->tap, &select_dbus, TAP_IDLE);
399 }
400
401 static uint32_t dtmcontrol_scan(struct target *target, uint32_t out)
402 {
403 struct scan_field field;
404 uint8_t in_value[4];
405 uint8_t out_value[4] = { 0 };
406
407 buf_set_u32(out_value, 0, 32, out);
408
409 jtag_add_ir_scan(target->tap, &select_dtmcontrol, TAP_IDLE);
410
411 field.num_bits = 32;
412 field.out_value = out_value;
413 field.in_value = in_value;
414 jtag_add_dr_scan(target->tap, 1, &field, TAP_IDLE);
415
416 /* Always return to dmi. */
417 select_dmi(target);
418
419 int retval = jtag_execute_queue();
420 if (retval != ERROR_OK) {
421 LOG_ERROR("failed jtag scan: %d", retval);
422 return retval;
423 }
424
425 uint32_t in = buf_get_u32(field.in_value, 0, 32);
426 LOG_DEBUG("DTMCS: 0x%x -> 0x%x", out, in);
427
428 return in;
429 }
430
431 static void increase_dmi_busy_delay(struct target *target)
432 {
433 riscv013_info_t *info = get_info(target);
434 info->dmi_busy_delay += info->dmi_busy_delay / 10 + 1;
435 LOG_DEBUG("dtmcs_idle=%d, dmi_busy_delay=%d, ac_busy_delay=%d",
436 info->dtmcs_idle, info->dmi_busy_delay,
437 info->ac_busy_delay);
438
439 dtmcontrol_scan(target, DTM_DTMCS_DMIRESET);
440 }
441
442 /**
443 * exec: If this is set, assume the scan results in an execution, so more
444 * run-test/idle cycles may be required.
445 */
446 static dmi_status_t dmi_scan(struct target *target, uint32_t *address_in,
447 uint32_t *data_in, dmi_op_t op, uint32_t address_out, uint32_t data_out,
448 bool exec)
449 {
450 riscv013_info_t *info = get_info(target);
451 RISCV_INFO(r);
452 unsigned num_bits = info->abits + DTM_DMI_OP_LENGTH + DTM_DMI_DATA_LENGTH;
453 size_t num_bytes = (num_bits + 7) / 8;
454 uint8_t in[num_bytes];
455 uint8_t out[num_bytes];
456 struct scan_field field = {
457 .num_bits = num_bits,
458 .out_value = out,
459 .in_value = in
460 };
461
462 if (r->reset_delays_wait >= 0) {
463 r->reset_delays_wait--;
464 if (r->reset_delays_wait < 0) {
465 info->dmi_busy_delay = 0;
466 info->ac_busy_delay = 0;
467 }
468 }
469
470 memset(in, 0, num_bytes);
471 memset(out, 0, num_bytes);
472
473 assert(info->abits != 0);
474
475 buf_set_u32(out, DTM_DMI_OP_OFFSET, DTM_DMI_OP_LENGTH, op);
476 buf_set_u32(out, DTM_DMI_DATA_OFFSET, DTM_DMI_DATA_LENGTH, data_out);
477 buf_set_u32(out, DTM_DMI_ADDRESS_OFFSET, info->abits, address_out);
478
479 /* Assume dbus is already selected. */
480 jtag_add_dr_scan(target->tap, 1, &field, TAP_IDLE);
481
482 int idle_count = info->dmi_busy_delay;
483 if (exec)
484 idle_count += info->ac_busy_delay;
485
486 if (idle_count)
487 jtag_add_runtest(idle_count, TAP_IDLE);
488
489 int retval = jtag_execute_queue();
490 if (retval != ERROR_OK) {
491 LOG_ERROR("dmi_scan failed jtag scan");
492 return DMI_STATUS_FAILED;
493 }
494
495 if (data_in)
496 *data_in = buf_get_u32(in, DTM_DMI_DATA_OFFSET, DTM_DMI_DATA_LENGTH);
497
498 if (address_in)
499 *address_in = buf_get_u32(in, DTM_DMI_ADDRESS_OFFSET, info->abits);
500
501 dump_field(idle_count, &field);
502
503 return buf_get_u32(in, DTM_DMI_OP_OFFSET, DTM_DMI_OP_LENGTH);
504 }
505
506 /* If dmi_busy_encountered is non-NULL, this function will use it to tell the
507 * caller whether DMI was ever busy during this call. */
508 static int dmi_op_timeout(struct target *target, uint32_t *data_in,
509 bool *dmi_busy_encountered, int dmi_op, uint32_t address,
510 uint32_t data_out, int timeout_sec, bool exec)
511 {
512 select_dmi(target);
513
514 dmi_status_t status;
515 uint32_t address_in;
516
517 if (dmi_busy_encountered)
518 *dmi_busy_encountered = false;
519
520 const char *op_name;
521 switch (dmi_op) {
522 case DMI_OP_NOP:
523 op_name = "nop";
524 break;
525 case DMI_OP_READ:
526 op_name = "read";
527 break;
528 case DMI_OP_WRITE:
529 op_name = "write";
530 break;
531 default:
532 LOG_ERROR("Invalid DMI operation: %d", dmi_op);
533 return ERROR_FAIL;
534 }
535
536 time_t start = time(NULL);
537 /* This first loop performs the request. Note that if for some reason this
538 * stays busy, it is actually due to the previous access. */
539 while (1) {
540 status = dmi_scan(target, NULL, NULL, dmi_op, address, data_out,
541 exec);
542 if (status == DMI_STATUS_BUSY) {
543 increase_dmi_busy_delay(target);
544 if (dmi_busy_encountered)
545 *dmi_busy_encountered = true;
546 } else if (status == DMI_STATUS_SUCCESS) {
547 break;
548 } else {
549 LOG_ERROR("failed %s at 0x%x, status=%d", op_name, address, status);
550 return ERROR_FAIL;
551 }
552 if (time(NULL) - start > timeout_sec)
553 return ERROR_TIMEOUT_REACHED;
554 }
555
556 if (status != DMI_STATUS_SUCCESS) {
557 LOG_ERROR("Failed %s at 0x%x; status=%d", op_name, address, status);
558 return ERROR_FAIL;
559 }
560
561 /* This second loop ensures the request succeeded, and gets back data.
562 * Note that NOP can result in a 'busy' result as well, but that would be
563 * noticed on the next DMI access we do. */
564 while (1) {
565 status = dmi_scan(target, &address_in, data_in, DMI_OP_NOP, address, 0,
566 false);
567 if (status == DMI_STATUS_BUSY) {
568 increase_dmi_busy_delay(target);
569 } else if (status == DMI_STATUS_SUCCESS) {
570 break;
571 } else {
572 LOG_ERROR("failed %s (NOP) at 0x%x, status=%d", op_name, address,
573 status);
574 return ERROR_FAIL;
575 }
576 if (time(NULL) - start > timeout_sec)
577 return ERROR_TIMEOUT_REACHED;
578 }
579
580 if (status != DMI_STATUS_SUCCESS) {
581 if (status == DMI_STATUS_FAILED || !data_in) {
582 LOG_ERROR("Failed %s (NOP) at 0x%x; status=%d", op_name, address,
583 status);
584 } else {
585 LOG_ERROR("Failed %s (NOP) at 0x%x; value=0x%x, status=%d",
586 op_name, address, *data_in, status);
587 }
588 return ERROR_FAIL;
589 }
590
591 return ERROR_OK;
592 }
593
594 static int dmi_op(struct target *target, uint32_t *data_in,
595 bool *dmi_busy_encountered, int dmi_op, uint32_t address,
596 uint32_t data_out, bool exec)
597 {
598 int result = dmi_op_timeout(target, data_in, dmi_busy_encountered, dmi_op,
599 address, data_out, riscv_command_timeout_sec, exec);
600 if (result == ERROR_TIMEOUT_REACHED) {
601 LOG_ERROR("DMI operation didn't complete in %d seconds. The target is "
602 "either really slow or broken. You could increase the "
603 "timeout with riscv set_command_timeout_sec.",
604 riscv_command_timeout_sec);
605 return ERROR_FAIL;
606 }
607 return result;
608 }
609
610 static int dmi_read(struct target *target, uint32_t *value, uint32_t address)
611 {
612 return dmi_op(target, value, NULL, DMI_OP_READ, address, 0, false);
613 }
614
615 static int dmi_read_exec(struct target *target, uint32_t *value, uint32_t address)
616 {
617 return dmi_op(target, value, NULL, DMI_OP_READ, address, 0, true);
618 }
619
620 static int dmi_write(struct target *target, uint32_t address, uint32_t value)
621 {
622 return dmi_op(target, NULL, NULL, DMI_OP_WRITE, address, value, false);
623 }
624
625 static int dmi_write_exec(struct target *target, uint32_t address, uint32_t value)
626 {
627 return dmi_op(target, NULL, NULL, DMI_OP_WRITE, address, value, true);
628 }
629
630 int dmstatus_read_timeout(struct target *target, uint32_t *dmstatus,
631 bool authenticated, unsigned timeout_sec)
632 {
633 int result = dmi_op_timeout(target, dmstatus, NULL, DMI_OP_READ,
634 DMI_DMSTATUS, 0, timeout_sec, false);
635 if (result != ERROR_OK)
636 return result;
637 if (authenticated && !get_field(*dmstatus, DMI_DMSTATUS_AUTHENTICATED)) {
638 LOG_ERROR("Debugger is not authenticated to target Debug Module. "
639 "(dmstatus=0x%x). Use `riscv authdata_read` and "
640 "`riscv authdata_write` commands to authenticate.", *dmstatus);
641 return ERROR_FAIL;
642 }
643 return ERROR_OK;
644 }
645
646 int dmstatus_read(struct target *target, uint32_t *dmstatus,
647 bool authenticated)
648 {
649 return dmstatus_read_timeout(target, dmstatus, authenticated,
650 riscv_command_timeout_sec);
651 }
652
653 static void increase_ac_busy_delay(struct target *target)
654 {
655 riscv013_info_t *info = get_info(target);
656 info->ac_busy_delay += info->ac_busy_delay / 10 + 1;
657 LOG_DEBUG("dtmcs_idle=%d, dmi_busy_delay=%d, ac_busy_delay=%d",
658 info->dtmcs_idle, info->dmi_busy_delay,
659 info->ac_busy_delay);
660 }
661
662 uint32_t abstract_register_size(unsigned width)
663 {
664 switch (width) {
665 case 32:
666 return set_field(0, AC_ACCESS_REGISTER_SIZE, 2);
667 case 64:
668 return set_field(0, AC_ACCESS_REGISTER_SIZE, 3);
669 break;
670 case 128:
671 return set_field(0, AC_ACCESS_REGISTER_SIZE, 4);
672 break;
673 default:
674 LOG_ERROR("Unsupported register width: %d", width);
675 return 0;
676 }
677 }
678
679 static int wait_for_idle(struct target *target, uint32_t *abstractcs)
680 {
681 RISCV013_INFO(info);
682 time_t start = time(NULL);
683 while (1) {
684 if (dmi_read(target, abstractcs, DMI_ABSTRACTCS) != ERROR_OK)
685 return ERROR_FAIL;
686
687 if (get_field(*abstractcs, DMI_ABSTRACTCS_BUSY) == 0)
688 return ERROR_OK;
689
690 if (time(NULL) - start > riscv_command_timeout_sec) {
691 info->cmderr = get_field(*abstractcs, DMI_ABSTRACTCS_CMDERR);
692 if (info->cmderr != CMDERR_NONE) {
693 const char *errors[8] = {
694 "none",
695 "busy",
696 "not supported",
697 "exception",
698 "halt/resume",
699 "reserved",
700 "reserved",
701 "other" };
702
703 LOG_ERROR("Abstract command ended in error '%s' (abstractcs=0x%x)",
704 errors[info->cmderr], *abstractcs);
705 }
706
707 LOG_ERROR("Timed out after %ds waiting for busy to go low (abstractcs=0x%x). "
708 "Increase the timeout with riscv set_command_timeout_sec.",
709 riscv_command_timeout_sec,
710 *abstractcs);
711 return ERROR_FAIL;
712 }
713 }
714 }
715
716 static int execute_abstract_command(struct target *target, uint32_t command)
717 {
718 RISCV013_INFO(info);
719 if (debug_level >= LOG_LVL_DEBUG) {
720 switch (get_field(command, DMI_COMMAND_CMDTYPE)) {
721 case 0:
722 LOG_DEBUG("command=0x%x; access register, size=%d, postexec=%d, "
723 "transfer=%d, write=%d, regno=0x%x",
724 command,
725 8 << get_field(command, AC_ACCESS_REGISTER_SIZE),
726 get_field(command, AC_ACCESS_REGISTER_POSTEXEC),
727 get_field(command, AC_ACCESS_REGISTER_TRANSFER),
728 get_field(command, AC_ACCESS_REGISTER_WRITE),
729 get_field(command, AC_ACCESS_REGISTER_REGNO));
730 break;
731 default:
732 LOG_DEBUG("command=0x%x", command);
733 break;
734 }
735 }
736
737 dmi_write_exec(target, DMI_COMMAND, command);
738
739 uint32_t abstractcs = 0;
740 wait_for_idle(target, &abstractcs);
741
742 info->cmderr = get_field(abstractcs, DMI_ABSTRACTCS_CMDERR);
743 if (info->cmderr != 0) {
744 LOG_DEBUG("command 0x%x failed; abstractcs=0x%x", command, abstractcs);
745 /* Clear the error. */
746 dmi_write(target, DMI_ABSTRACTCS, set_field(0, DMI_ABSTRACTCS_CMDERR,
747 info->cmderr));
748 return ERROR_FAIL;
749 }
750
751 return ERROR_OK;
752 }
753
754 static riscv_reg_t read_abstract_arg(struct target *target, unsigned index,
755 unsigned size_bits)
756 {
757 riscv_reg_t value = 0;
758 uint32_t v;
759 unsigned offset = index * size_bits / 32;
760 switch (size_bits) {
761 default:
762 LOG_ERROR("Unsupported size: %d", size_bits);
763 return ~0;
764 case 64:
765 dmi_read(target, &v, DMI_DATA0 + offset + 1);
766 value |= ((uint64_t) v) << 32;
767 /* falls through */
768 case 32:
769 dmi_read(target, &v, DMI_DATA0 + offset);
770 value |= v;
771 }
772 return value;
773 }
774
775 static int write_abstract_arg(struct target *target, unsigned index,
776 riscv_reg_t value, unsigned size_bits)
777 {
778 unsigned offset = index * size_bits / 32;
779 switch (size_bits) {
780 default:
781 LOG_ERROR("Unsupported size: %d", size_bits);
782 return ERROR_FAIL;
783 case 64:
784 dmi_write(target, DMI_DATA0 + offset + 1, value >> 32);
785 /* falls through */
786 case 32:
787 dmi_write(target, DMI_DATA0 + offset, value);
788 }
789 return ERROR_OK;
790 }
791
792 /**
793 * @par size in bits
794 */
795 static uint32_t access_register_command(struct target *target, uint32_t number,
796 unsigned size, uint32_t flags)
797 {
798 uint32_t command = set_field(0, DMI_COMMAND_CMDTYPE, 0);
799 switch (size) {
800 case 32:
801 command = set_field(command, AC_ACCESS_REGISTER_SIZE, 2);
802 break;
803 case 64:
804 command = set_field(command, AC_ACCESS_REGISTER_SIZE, 3);
805 break;
806 default:
807 assert(0);
808 }
809
810 if (number <= GDB_REGNO_XPR31) {
811 command = set_field(command, AC_ACCESS_REGISTER_REGNO,
812 0x1000 + number - GDB_REGNO_ZERO);
813 } else if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31) {
814 command = set_field(command, AC_ACCESS_REGISTER_REGNO,
815 0x1020 + number - GDB_REGNO_FPR0);
816 } else if (number >= GDB_REGNO_CSR0 && number <= GDB_REGNO_CSR4095) {
817 command = set_field(command, AC_ACCESS_REGISTER_REGNO,
818 number - GDB_REGNO_CSR0);
819 } else if (number >= GDB_REGNO_COUNT) {
820 /* Custom register. */
821 assert(target->reg_cache->reg_list[number].arch_info);
822 riscv_reg_info_t *reg_info = target->reg_cache->reg_list[number].arch_info;
823 assert(reg_info);
824 command = set_field(command, AC_ACCESS_REGISTER_REGNO,
825 0xc000 + reg_info->custom_number);
826 }
827
828 command |= flags;
829
830 return command;
831 }
832
833 static int register_read_abstract(struct target *target, uint64_t *value,
834 uint32_t number, unsigned size)
835 {
836 RISCV013_INFO(info);
837
838 if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31 &&
839 !info->abstract_read_fpr_supported)
840 return ERROR_FAIL;
841 if (number >= GDB_REGNO_CSR0 && number <= GDB_REGNO_CSR4095 &&
842 !info->abstract_read_csr_supported)
843 return ERROR_FAIL;
844
845 uint32_t command = access_register_command(target, number, size,
846 AC_ACCESS_REGISTER_TRANSFER);
847
848 int result = execute_abstract_command(target, command);
849 if (result != ERROR_OK) {
850 if (info->cmderr == CMDERR_NOT_SUPPORTED) {
851 if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31) {
852 info->abstract_read_fpr_supported = false;
853 LOG_INFO("Disabling abstract command reads from FPRs.");
854 } else if (number >= GDB_REGNO_CSR0 && number <= GDB_REGNO_CSR4095) {
855 info->abstract_read_csr_supported = false;
856 LOG_INFO("Disabling abstract command reads from CSRs.");
857 }
858 }
859 return result;
860 }
861
862 if (value)
863 *value = read_abstract_arg(target, 0, size);
864
865 return ERROR_OK;
866 }
867
868 static int register_write_abstract(struct target *target, uint32_t number,
869 uint64_t value, unsigned size)
870 {
871 RISCV013_INFO(info);
872
873 if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31 &&
874 !info->abstract_write_fpr_supported)
875 return ERROR_FAIL;
876 if (number >= GDB_REGNO_CSR0 && number <= GDB_REGNO_CSR4095 &&
877 !info->abstract_write_csr_supported)
878 return ERROR_FAIL;
879
880 uint32_t command = access_register_command(target, number, size,
881 AC_ACCESS_REGISTER_TRANSFER |
882 AC_ACCESS_REGISTER_WRITE);
883
884 if (write_abstract_arg(target, 0, value, size) != ERROR_OK)
885 return ERROR_FAIL;
886
887 int result = execute_abstract_command(target, command);
888 if (result != ERROR_OK) {
889 if (info->cmderr == CMDERR_NOT_SUPPORTED) {
890 if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31) {
891 info->abstract_write_fpr_supported = false;
892 LOG_INFO("Disabling abstract command writes to FPRs.");
893 } else if (number >= GDB_REGNO_CSR0 && number <= GDB_REGNO_CSR4095) {
894 info->abstract_write_csr_supported = false;
895 LOG_INFO("Disabling abstract command writes to CSRs.");
896 }
897 }
898 return result;
899 }
900
901 return ERROR_OK;
902 }
903
904 static int examine_progbuf(struct target *target)
905 {
906 riscv013_info_t *info = get_info(target);
907
908 if (info->progbuf_writable != YNM_MAYBE)
909 return ERROR_OK;
910
911 /* Figure out if progbuf is writable. */
912
913 if (info->progbufsize < 1) {
914 info->progbuf_writable = YNM_NO;
915 LOG_INFO("No program buffer present.");
916 return ERROR_OK;
917 }
918
919 uint64_t s0;
920 if (register_read(target, &s0, GDB_REGNO_S0) != ERROR_OK)
921 return ERROR_FAIL;
922
923 struct riscv_program program;
924 riscv_program_init(&program, target);
925 riscv_program_insert(&program, auipc(S0));
926 if (riscv_program_exec(&program, target) != ERROR_OK)
927 return ERROR_FAIL;
928
929 if (register_read_direct(target, &info->progbuf_address, GDB_REGNO_S0) != ERROR_OK)
930 return ERROR_FAIL;
931
932 riscv_program_init(&program, target);
933 riscv_program_insert(&program, sw(S0, S0, 0));
934 int result = riscv_program_exec(&program, target);
935
936 if (register_write_direct(target, GDB_REGNO_S0, s0) != ERROR_OK)
937 return ERROR_FAIL;
938
939 if (result != ERROR_OK) {
940 /* This program might have failed if the program buffer is not
941 * writable. */
942 info->progbuf_writable = YNM_NO;
943 return ERROR_OK;
944 }
945
946 uint32_t written;
947 if (dmi_read(target, &written, DMI_PROGBUF0) != ERROR_OK)
948 return ERROR_FAIL;
949 if (written == (uint32_t) info->progbuf_address) {
950 LOG_INFO("progbuf is writable at 0x%" PRIx64,
951 info->progbuf_address);
952 info->progbuf_writable = YNM_YES;
953
954 } else {
955 LOG_INFO("progbuf is not writeable at 0x%" PRIx64,
956 info->progbuf_address);
957 info->progbuf_writable = YNM_NO;
958 }
959
960 return ERROR_OK;
961 }
962
963 typedef enum {
964 SPACE_DMI_DATA,
965 SPACE_DMI_PROGBUF,
966 SPACE_DMI_RAM
967 } memory_space_t;
968
969 typedef struct {
970 /* How can the debugger access this memory? */
971 memory_space_t memory_space;
972 /* Memory address to access the scratch memory from the hart. */
973 riscv_addr_t hart_address;
974 /* Memory address to access the scratch memory from the debugger. */
975 riscv_addr_t debug_address;
976 struct working_area *area;
977 } scratch_mem_t;
978
979 /**
980 * Find some scratch memory to be used with the given program.
981 */
982 static int scratch_reserve(struct target *target,
983 scratch_mem_t *scratch,
984 struct riscv_program *program,
985 unsigned size_bytes)
986 {
987 riscv_addr_t alignment = 1;
988 while (alignment < size_bytes)
989 alignment *= 2;
990
991 scratch->area = NULL;
992
993 riscv013_info_t *info = get_info(target);
994
995 if (info->dataaccess == 1) {
996 /* Sign extend dataaddr. */
997 scratch->hart_address = info->dataaddr;
998 if (info->dataaddr & (1<<11))
999 scratch->hart_address |= 0xfffffffffffff000ULL;
1000 /* Align. */
1001 scratch->hart_address = (scratch->hart_address + alignment - 1) & ~(alignment - 1);
1002
1003 if ((size_bytes + scratch->hart_address - info->dataaddr + 3) / 4 >=
1004 info->datasize) {
1005 scratch->memory_space = SPACE_DMI_DATA;
1006 scratch->debug_address = (scratch->hart_address - info->dataaddr) / 4;
1007 return ERROR_OK;
1008 }
1009 }
1010
1011 if (examine_progbuf(target) != ERROR_OK)
1012 return ERROR_FAIL;
1013
1014 /* Allow for ebreak at the end of the program. */
1015 unsigned program_size = (program->instruction_count + 1) * 4;
1016 scratch->hart_address = (info->progbuf_address + program_size + alignment - 1) &
1017 ~(alignment - 1);
1018 if ((size_bytes + scratch->hart_address - info->progbuf_address + 3) / 4 >=
1019 info->progbufsize) {
1020 scratch->memory_space = SPACE_DMI_PROGBUF;
1021 scratch->debug_address = (scratch->hart_address - info->progbuf_address) / 4;
1022 return ERROR_OK;
1023 }
1024
1025 if (target_alloc_working_area(target, size_bytes + alignment - 1,
1026 &scratch->area) == ERROR_OK) {
1027 scratch->hart_address = (scratch->area->address + alignment - 1) &
1028 ~(alignment - 1);
1029 scratch->memory_space = SPACE_DMI_RAM;
1030 scratch->debug_address = scratch->hart_address;
1031 return ERROR_OK;
1032 }
1033
1034 LOG_ERROR("Couldn't find %d bytes of scratch RAM to use. Please configure "
1035 "a work area with 'configure -work-area-phys'.", size_bytes);
1036 return ERROR_FAIL;
1037 }
1038
1039 static int scratch_release(struct target *target,
1040 scratch_mem_t *scratch)
1041 {
1042 if (scratch->area)
1043 return target_free_working_area(target, scratch->area);
1044
1045 return ERROR_OK;
1046 }
1047
1048 static int scratch_read64(struct target *target, scratch_mem_t *scratch,
1049 uint64_t *value)
1050 {
1051 uint32_t v;
1052 switch (scratch->memory_space) {
1053 case SPACE_DMI_DATA:
1054 if (dmi_read(target, &v, DMI_DATA0 + scratch->debug_address) != ERROR_OK)
1055 return ERROR_FAIL;
1056 *value = v;
1057 if (dmi_read(target, &v, DMI_DATA1 + scratch->debug_address) != ERROR_OK)
1058 return ERROR_FAIL;
1059 *value |= ((uint64_t) v) << 32;
1060 break;
1061 case SPACE_DMI_PROGBUF:
1062 if (dmi_read(target, &v, DMI_PROGBUF0 + scratch->debug_address) != ERROR_OK)
1063 return ERROR_FAIL;
1064 *value = v;
1065 if (dmi_read(target, &v, DMI_PROGBUF1 + scratch->debug_address) != ERROR_OK)
1066 return ERROR_FAIL;
1067 *value |= ((uint64_t) v) << 32;
1068 break;
1069 case SPACE_DMI_RAM:
1070 {
1071 uint8_t buffer[8];
1072 if (read_memory(target, scratch->debug_address, 4, 2, buffer) != ERROR_OK)
1073 return ERROR_FAIL;
1074 *value = buffer[0] |
1075 (((uint64_t) buffer[1]) << 8) |
1076 (((uint64_t) buffer[2]) << 16) |
1077 (((uint64_t) buffer[3]) << 24) |
1078 (((uint64_t) buffer[4]) << 32) |
1079 (((uint64_t) buffer[5]) << 40) |
1080 (((uint64_t) buffer[6]) << 48) |
1081 (((uint64_t) buffer[7]) << 56);
1082 }
1083 break;
1084 }
1085 return ERROR_OK;
1086 }
1087
1088 static int scratch_write64(struct target *target, scratch_mem_t *scratch,
1089 uint64_t value)
1090 {
1091 switch (scratch->memory_space) {
1092 case SPACE_DMI_DATA:
1093 dmi_write(target, DMI_DATA0 + scratch->debug_address, value);
1094 dmi_write(target, DMI_DATA1 + scratch->debug_address, value >> 32);
1095 break;
1096 case SPACE_DMI_PROGBUF:
1097 dmi_write(target, DMI_PROGBUF0 + scratch->debug_address, value);
1098 dmi_write(target, DMI_PROGBUF1 + scratch->debug_address, value >> 32);
1099 break;
1100 case SPACE_DMI_RAM:
1101 {
1102 uint8_t buffer[8] = {
1103 value,
1104 value >> 8,
1105 value >> 16,
1106 value >> 24,
1107 value >> 32,
1108 value >> 40,
1109 value >> 48,
1110 value >> 56
1111 };
1112 if (write_memory(target, scratch->debug_address, 4, 2, buffer) != ERROR_OK)
1113 return ERROR_FAIL;
1114 }
1115 break;
1116 }
1117 return ERROR_OK;
1118 }
1119
1120 /** Return register size in bits. */
1121 static unsigned register_size(struct target *target, unsigned number)
1122 {
1123 /* If reg_cache hasn't been initialized yet, make a guess. We need this for
1124 * when this function is called during examine(). */
1125 if (target->reg_cache)
1126 return target->reg_cache->reg_list[number].size;
1127 else
1128 return riscv_xlen(target);
1129 }
1130
1131 /**
1132 * Immediately write the new value to the requested register. This mechanism
1133 * bypasses any caches.
1134 */
1135 static int register_write_direct(struct target *target, unsigned number,
1136 uint64_t value)
1137 {
1138 RISCV013_INFO(info);
1139 RISCV_INFO(r);
1140
1141 LOG_DEBUG("{%d} reg[0x%x] <- 0x%" PRIx64, riscv_current_hartid(target),
1142 number, value);
1143
1144 int result = register_write_abstract(target, number, value,
1145 register_size(target, number));
1146 if (result == ERROR_OK && target->reg_cache) {
1147 struct reg *reg = &target->reg_cache->reg_list[number];
1148 buf_set_u64(reg->value, 0, reg->size, value);
1149 }
1150 if (result == ERROR_OK || info->progbufsize + r->impebreak < 2 ||
1151 !riscv_is_halted(target))
1152 return result;
1153
1154 struct riscv_program program;
1155 riscv_program_init(&program, target);
1156
1157 uint64_t s0;
1158 if (register_read(target, &s0, GDB_REGNO_S0) != ERROR_OK)
1159 return ERROR_FAIL;
1160
1161 scratch_mem_t scratch;
1162 bool use_scratch = false;
1163 if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31 &&
1164 riscv_supports_extension(target, riscv_current_hartid(target), 'D') &&
1165 riscv_xlen(target) < 64) {
1166 /* There are no instructions to move all the bits from a register, so
1167 * we need to use some scratch RAM. */
1168 use_scratch = true;
1169 riscv_program_insert(&program, fld(number - GDB_REGNO_FPR0, S0, 0));
1170
1171 if (scratch_reserve(target, &scratch, &program, 8) != ERROR_OK)
1172 return ERROR_FAIL;
1173
1174 if (register_write_direct(target, GDB_REGNO_S0, scratch.hart_address)
1175 != ERROR_OK) {
1176 scratch_release(target, &scratch);
1177 return ERROR_FAIL;
1178 }
1179
1180 if (scratch_write64(target, &scratch, value) != ERROR_OK) {
1181 scratch_release(target, &scratch);
1182 return ERROR_FAIL;
1183 }
1184
1185 } else {
1186 if (register_write_direct(target, GDB_REGNO_S0, value) != ERROR_OK)
1187 return ERROR_FAIL;
1188
1189 if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31) {
1190 if (riscv_supports_extension(target, riscv_current_hartid(target), 'D'))
1191 riscv_program_insert(&program, fmv_d_x(number - GDB_REGNO_FPR0, S0));
1192 else
1193 riscv_program_insert(&program, fmv_w_x(number - GDB_REGNO_FPR0, S0));
1194 } else if (number >= GDB_REGNO_CSR0 && number <= GDB_REGNO_CSR4095) {
1195 riscv_program_csrw(&program, S0, number);
1196 } else {
1197 LOG_ERROR("Unsupported register (enum gdb_regno)(%d)", number);
1198 return ERROR_FAIL;
1199 }
1200 }
1201
1202 int exec_out = riscv_program_exec(&program, target);
1203 /* Don't message on error. Probably the register doesn't exist. */
1204 if (exec_out == ERROR_OK && target->reg_cache) {
1205 struct reg *reg = &target->reg_cache->reg_list[number];
1206 buf_set_u64(reg->value, 0, reg->size, value);
1207 }
1208
1209 if (use_scratch)
1210 scratch_release(target, &scratch);
1211
1212 /* Restore S0. */
1213 if (register_write_direct(target, GDB_REGNO_S0, s0) != ERROR_OK)
1214 return ERROR_FAIL;
1215
1216 return exec_out;
1217 }
1218
1219 /** Return the cached value, or read from the target if necessary. */
1220 static int register_read(struct target *target, uint64_t *value, uint32_t number)
1221 {
1222 if (number == GDB_REGNO_ZERO) {
1223 *value = 0;
1224 return ERROR_OK;
1225 }
1226 int result = register_read_direct(target, value, number);
1227 if (result != ERROR_OK)
1228 return ERROR_FAIL;
1229 if (target->reg_cache) {
1230 struct reg *reg = &target->reg_cache->reg_list[number];
1231 buf_set_u64(reg->value, 0, reg->size, *value);
1232 }
1233 return ERROR_OK;
1234 }
1235
1236 /** Actually read registers from the target right now. */
1237 static int register_read_direct(struct target *target, uint64_t *value, uint32_t number)
1238 {
1239 RISCV013_INFO(info);
1240 RISCV_INFO(r);
1241
1242 int result = register_read_abstract(target, value, number,
1243 register_size(target, number));
1244
1245 if (result != ERROR_OK &&
1246 info->progbufsize + r->impebreak >= 2 &&
1247 number > GDB_REGNO_XPR31) {
1248 struct riscv_program program;
1249 riscv_program_init(&program, target);
1250
1251 scratch_mem_t scratch;
1252 bool use_scratch = false;
1253
1254 uint64_t s0;
1255 if (register_read(target, &s0, GDB_REGNO_S0) != ERROR_OK)
1256 return ERROR_FAIL;
1257
1258 /* Write program to move data into s0. */
1259
1260 uint64_t mstatus;
1261 if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31) {
1262 if (register_read(target, &mstatus, GDB_REGNO_MSTATUS) != ERROR_OK)
1263 return ERROR_FAIL;
1264 if ((mstatus & MSTATUS_FS) == 0)
1265 if (register_write_direct(target, GDB_REGNO_MSTATUS,
1266 set_field(mstatus, MSTATUS_FS, 1)) != ERROR_OK)
1267 return ERROR_FAIL;
1268
1269 if (riscv_supports_extension(target, riscv_current_hartid(target), 'D')
1270 && riscv_xlen(target) < 64) {
1271 /* There are no instructions to move all the bits from a
1272 * register, so we need to use some scratch RAM. */
1273 riscv_program_insert(&program, fsd(number - GDB_REGNO_FPR0, S0,
1274 0));
1275
1276 if (scratch_reserve(target, &scratch, &program, 8) != ERROR_OK)
1277 return ERROR_FAIL;
1278 use_scratch = true;
1279
1280 if (register_write_direct(target, GDB_REGNO_S0,
1281 scratch.hart_address) != ERROR_OK) {
1282 scratch_release(target, &scratch);
1283 return ERROR_FAIL;
1284 }
1285 } else if (riscv_supports_extension(target,
1286 riscv_current_hartid(target), 'D')) {
1287 riscv_program_insert(&program, fmv_x_d(S0, number - GDB_REGNO_FPR0));
1288 } else {
1289 riscv_program_insert(&program, fmv_x_w(S0, number - GDB_REGNO_FPR0));
1290 }
1291 } else if (number >= GDB_REGNO_CSR0 && number <= GDB_REGNO_CSR4095) {
1292 riscv_program_csrr(&program, S0, number);
1293 } else {
1294 LOG_ERROR("Unsupported register (enum gdb_regno)(%d)", number);
1295 return ERROR_FAIL;
1296 }
1297
1298 /* Execute program. */
1299 result = riscv_program_exec(&program, target);
1300 /* Don't message on error. Probably the register doesn't exist. */
1301
1302 if (use_scratch) {
1303 result = scratch_read64(target, &scratch, value);
1304 scratch_release(target, &scratch);
1305 if (result != ERROR_OK)
1306 return result;
1307 } else {
1308 /* Read S0 */
1309 if (register_read_direct(target, value, GDB_REGNO_S0) != ERROR_OK)
1310 return ERROR_FAIL;
1311 }
1312
1313 if (number >= GDB_REGNO_FPR0 && number <= GDB_REGNO_FPR31 &&
1314 (mstatus & MSTATUS_FS) == 0)
1315 if (register_write_direct(target, GDB_REGNO_MSTATUS, mstatus) != ERROR_OK)
1316 return ERROR_FAIL;
1317
1318 /* Restore S0. */
1319 if (register_write_direct(target, GDB_REGNO_S0, s0) != ERROR_OK)
1320 return ERROR_FAIL;
1321 }
1322
1323 if (result == ERROR_OK) {
1324 LOG_DEBUG("{%d} reg[0x%x] = 0x%" PRIx64, riscv_current_hartid(target),
1325 number, *value);
1326 }
1327
1328 return result;
1329 }
1330
1331 int wait_for_authbusy(struct target *target, uint32_t *dmstatus)
1332 {
1333 time_t start = time(NULL);
1334 while (1) {
1335 uint32_t value;
1336 if (dmstatus_read(target, &value, false) != ERROR_OK)
1337 return ERROR_FAIL;
1338 if (dmstatus)
1339 *dmstatus = value;
1340 if (!get_field(value, DMI_DMSTATUS_AUTHBUSY))
1341 break;
1342 if (time(NULL) - start > riscv_command_timeout_sec) {
1343 LOG_ERROR("Timed out after %ds waiting for authbusy to go low (dmstatus=0x%x). "
1344 "Increase the timeout with riscv set_command_timeout_sec.",
1345 riscv_command_timeout_sec,
1346 value);
1347 return ERROR_FAIL;
1348 }
1349 }
1350
1351 return ERROR_OK;
1352 }
1353
1354 /*** OpenOCD target functions. ***/
1355
1356 static void deinit_target(struct target *target)
1357 {
1358 LOG_DEBUG("riscv_deinit_target()");
1359 riscv_info_t *info = (riscv_info_t *) target->arch_info;
1360 free(info->version_specific);
1361 /* TODO: free register arch_info */
1362 info->version_specific = NULL;
1363 }
1364
1365 static int examine(struct target *target)
1366 {
1367 /* Don't need to select dbus, since the first thing we do is read dtmcontrol. */
1368
1369 uint32_t dtmcontrol = dtmcontrol_scan(target, 0);
1370 LOG_DEBUG("dtmcontrol=0x%x", dtmcontrol);
1371 LOG_DEBUG(" dmireset=%d", get_field(dtmcontrol, DTM_DTMCS_DMIRESET));
1372 LOG_DEBUG(" idle=%d", get_field(dtmcontrol, DTM_DTMCS_IDLE));
1373 LOG_DEBUG(" dmistat=%d", get_field(dtmcontrol, DTM_DTMCS_DMISTAT));
1374 LOG_DEBUG(" abits=%d", get_field(dtmcontrol, DTM_DTMCS_ABITS));
1375 LOG_DEBUG(" version=%d", get_field(dtmcontrol, DTM_DTMCS_VERSION));
1376 if (dtmcontrol == 0) {
1377 LOG_ERROR("dtmcontrol is 0. Check JTAG connectivity/board power.");
1378 return ERROR_FAIL;
1379 }
1380 if (get_field(dtmcontrol, DTM_DTMCS_VERSION) != 1) {
1381 LOG_ERROR("Unsupported DTM version %d. (dtmcontrol=0x%x)",
1382 get_field(dtmcontrol, DTM_DTMCS_VERSION), dtmcontrol);
1383 return ERROR_FAIL;
1384 }
1385
1386 riscv013_info_t *info = get_info(target);
1387 info->abits = get_field(dtmcontrol, DTM_DTMCS_ABITS);
1388 info->dtmcs_idle = get_field(dtmcontrol, DTM_DTMCS_IDLE);
1389
1390 /* Reset the Debug Module. */
1391 dm013_info_t *dm = get_dm(target);
1392 if (!dm->was_reset) {
1393 dmi_write(target, DMI_DMCONTROL, 0);
1394 dmi_write(target, DMI_DMCONTROL, DMI_DMCONTROL_DMACTIVE);
1395 dm->was_reset = true;
1396 }
1397
1398 dmi_write(target, DMI_DMCONTROL, DMI_DMCONTROL_HARTSELLO |
1399 DMI_DMCONTROL_HARTSELHI | DMI_DMCONTROL_DMACTIVE);
1400 uint32_t dmcontrol;
1401 if (dmi_read(target, &dmcontrol, DMI_DMCONTROL) != ERROR_OK)
1402 return ERROR_FAIL;
1403
1404 if (!get_field(dmcontrol, DMI_DMCONTROL_DMACTIVE)) {
1405 LOG_ERROR("Debug Module did not become active. dmcontrol=0x%x",
1406 dmcontrol);
1407 return ERROR_FAIL;
1408 }
1409
1410 uint32_t dmstatus;
1411 if (dmstatus_read(target, &dmstatus, false) != ERROR_OK)
1412 return ERROR_FAIL;
1413 LOG_DEBUG("dmstatus: 0x%08x", dmstatus);
1414 if (get_field(dmstatus, DMI_DMSTATUS_VERSION) != 2) {
1415 LOG_ERROR("OpenOCD only supports Debug Module version 2, not %d "
1416 "(dmstatus=0x%x)", get_field(dmstatus, DMI_DMSTATUS_VERSION), dmstatus);
1417 return ERROR_FAIL;
1418 }
1419
1420 uint32_t hartsel =
1421 (get_field(dmcontrol, DMI_DMCONTROL_HARTSELHI) <<
1422 DMI_DMCONTROL_HARTSELLO_LENGTH) |
1423 get_field(dmcontrol, DMI_DMCONTROL_HARTSELLO);
1424 info->hartsellen = 0;
1425 while (hartsel & 1) {
1426 info->hartsellen++;
1427 hartsel >>= 1;
1428 }
1429 LOG_DEBUG("hartsellen=%d", info->hartsellen);
1430
1431 uint32_t hartinfo;
1432 if (dmi_read(target, &hartinfo, DMI_HARTINFO) != ERROR_OK)
1433 return ERROR_FAIL;
1434
1435 info->datasize = get_field(hartinfo, DMI_HARTINFO_DATASIZE);
1436 info->dataaccess = get_field(hartinfo, DMI_HARTINFO_DATAACCESS);
1437 info->dataaddr = get_field(hartinfo, DMI_HARTINFO_DATAADDR);
1438
1439 if (!get_field(dmstatus, DMI_DMSTATUS_AUTHENTICATED)) {
1440 LOG_ERROR("Debugger is not authenticated to target Debug Module. "
1441 "(dmstatus=0x%x). Use `riscv authdata_read` and "
1442 "`riscv authdata_write` commands to authenticate.", dmstatus);
1443 /* If we return ERROR_FAIL here, then in a multicore setup the next
1444 * core won't be examined, which means we won't set up the
1445 * authentication commands for them, which means the config script
1446 * needs to be a lot more complex. */
1447 return ERROR_OK;
1448 }
1449
1450 if (dmi_read(target, &info->sbcs, DMI_SBCS) != ERROR_OK)
1451 return ERROR_FAIL;
1452
1453 /* Check that abstract data registers are accessible. */
1454 uint32_t abstractcs;
1455 if (dmi_read(target, &abstractcs, DMI_ABSTRACTCS) != ERROR_OK)
1456 return ERROR_FAIL;
1457 info->datacount = get_field(abstractcs, DMI_ABSTRACTCS_DATACOUNT);
1458 info->progbufsize = get_field(abstractcs, DMI_ABSTRACTCS_PROGBUFSIZE);
1459
1460 LOG_INFO("datacount=%d progbufsize=%d", info->datacount, info->progbufsize);
1461
1462 RISCV_INFO(r);
1463 r->impebreak = get_field(dmstatus, DMI_DMSTATUS_IMPEBREAK);
1464
1465 if (info->progbufsize + r->impebreak < 2) {
1466 LOG_WARNING("We won't be able to execute fence instructions on this "
1467 "target. Memory may not always appear consistent. "
1468 "(progbufsize=%d, impebreak=%d)", info->progbufsize,
1469 r->impebreak);
1470 }
1471
1472 /* Before doing anything else we must first enumerate the harts. */
1473
1474 /* Don't call any riscv_* functions until after we've counted the number of
1475 * cores and initialized registers. */
1476 for (int i = 0; i < MIN(RISCV_MAX_HARTS, 1 << info->hartsellen); ++i) {
1477 if (!riscv_rtos_enabled(target) && i != target->coreid)
1478 continue;
1479
1480 r->current_hartid = i;
1481 if (riscv013_select_current_hart(target) != ERROR_OK)
1482 return ERROR_FAIL;
1483
1484 uint32_t s;
1485 if (dmstatus_read(target, &s, true) != ERROR_OK)
1486 return ERROR_FAIL;
1487 if (get_field(s, DMI_DMSTATUS_ANYNONEXISTENT))
1488 break;
1489 r->hart_count = i + 1;
1490
1491 if (get_field(s, DMI_DMSTATUS_ANYHAVERESET))
1492 dmi_write(target, DMI_DMCONTROL,
1493 set_hartsel(DMI_DMCONTROL_DMACTIVE | DMI_DMCONTROL_ACKHAVERESET, i));
1494
1495 bool halted = riscv_is_halted(target);
1496 if (!halted) {
1497 if (riscv013_halt_current_hart(target) != ERROR_OK) {
1498 LOG_ERROR("Fatal: Hart %d failed to halt during examine()", i);
1499 return ERROR_FAIL;
1500 }
1501 }
1502
1503 /* Without knowing anything else we can at least mess with the
1504 * program buffer. */
1505 r->debug_buffer_size[i] = info->progbufsize;
1506
1507 int result = register_read_abstract(target, NULL, GDB_REGNO_S0, 64);
1508 if (result == ERROR_OK)
1509 r->xlen[i] = 64;
1510 else
1511 r->xlen[i] = 32;
1512
1513 if (register_read(target, &r->misa[i], GDB_REGNO_MISA)) {
1514 LOG_ERROR("Fatal: Failed to read MISA from hart %d.", i);
1515 return ERROR_FAIL;
1516 }
1517
1518 /* Now init registers based on what we discovered. */
1519 if (riscv_init_registers(target) != ERROR_OK)
1520 return ERROR_FAIL;
1521
1522 /* Display this as early as possible to help people who are using
1523 * really slow simulators. */
1524 LOG_DEBUG(" hart %d: XLEN=%d, misa=0x%" PRIx64, i, r->xlen[i],
1525 r->misa[i]);
1526
1527 if (!halted)
1528 riscv013_resume_current_hart(target);
1529 }
1530
1531 LOG_DEBUG("Enumerated %d harts", r->hart_count);
1532
1533 if (r->hart_count == 0) {
1534 LOG_ERROR("No harts found!");
1535 return ERROR_FAIL;
1536 }
1537
1538 target_set_examined(target);
1539
1540 /* Some regression suites rely on seeing 'Examined RISC-V core' to know
1541 * when they can connect with gdb/telnet.
1542 * We will need to update those suites if we want to change that text. */
1543 LOG_INFO("Examined RISC-V core; found %d harts",
1544 riscv_count_harts(target));
1545 for (int i = 0; i < riscv_count_harts(target); ++i) {
1546 if (riscv_hart_enabled(target, i)) {
1547 LOG_INFO(" hart %d: XLEN=%d, misa=0x%" PRIx64, i, r->xlen[i],
1548 r->misa[i]);
1549 } else {
1550 LOG_INFO(" hart %d: currently disabled", i);
1551 }
1552 }
1553 return ERROR_OK;
1554 }
1555
1556 int riscv013_authdata_read(struct target *target, uint32_t *value)
1557 {
1558 if (wait_for_authbusy(target, NULL) != ERROR_OK)
1559 return ERROR_FAIL;
1560
1561 return dmi_read(target, value, DMI_AUTHDATA);
1562 }
1563
1564 int riscv013_authdata_write(struct target *target, uint32_t value)
1565 {
1566 uint32_t before, after;
1567 if (wait_for_authbusy(target, &before) != ERROR_OK)
1568 return ERROR_FAIL;
1569
1570 dmi_write(target, DMI_AUTHDATA, value);
1571
1572 if (wait_for_authbusy(target, &after) != ERROR_OK)
1573 return ERROR_FAIL;
1574
1575 if (!get_field(before, DMI_DMSTATUS_AUTHENTICATED) &&
1576 get_field(after, DMI_DMSTATUS_AUTHENTICATED)) {
1577 LOG_INFO("authdata_write resulted in successful authentication");
1578 int result = ERROR_OK;
1579 dm013_info_t *dm = get_dm(target);
1580 target_list_t *entry;
1581 list_for_each_entry(entry, &dm->target_list, list) {
1582 if (examine(entry->target) != ERROR_OK)
1583 result = ERROR_FAIL;
1584 }
1585 return result;
1586 }
1587
1588 return ERROR_OK;
1589 }
1590
1591 static int init_target(struct command_context *cmd_ctx,
1592 struct target *target)
1593 {
1594 LOG_DEBUG("init");
1595 riscv_info_t *generic_info = (riscv_info_t *) target->arch_info;
1596
1597 generic_info->get_register = &riscv013_get_register;
1598 generic_info->set_register = &riscv013_set_register;
1599 generic_info->select_current_hart = &riscv013_select_current_hart;
1600 generic_info->is_halted = &riscv013_is_halted;
1601 generic_info->halt_current_hart = &riscv013_halt_current_hart;
1602 generic_info->resume_current_hart = &riscv013_resume_current_hart;
1603 generic_info->step_current_hart = &riscv013_step_current_hart;
1604 generic_info->on_halt = &riscv013_on_halt;
1605 generic_info->on_resume = &riscv013_on_resume;
1606 generic_info->on_step = &riscv013_on_step;
1607 generic_info->halt_reason = &riscv013_halt_reason;
1608 generic_info->read_debug_buffer = &riscv013_read_debug_buffer;
1609 generic_info->write_debug_buffer = &riscv013_write_debug_buffer;
1610 generic_info->execute_debug_buffer = &riscv013_execute_debug_buffer;
1611 generic_info->fill_dmi_write_u64 = &riscv013_fill_dmi_write_u64;
1612 generic_info->fill_dmi_read_u64 = &riscv013_fill_dmi_read_u64;
1613 generic_info->fill_dmi_nop_u64 = &riscv013_fill_dmi_nop_u64;
1614 generic_info->dmi_write_u64_bits = &riscv013_dmi_write_u64_bits;
1615 generic_info->authdata_read = &riscv013_authdata_read;
1616 generic_info->authdata_write = &riscv013_authdata_write;
1617 generic_info->dmi_read = &dmi_read;
1618 generic_info->dmi_write = &dmi_write;
1619 generic_info->test_sba_config_reg = &riscv013_test_sba_config_reg;
1620 generic_info->test_compliance = &riscv013_test_compliance;
1621 generic_info->version_specific = calloc(1, sizeof(riscv013_info_t));
1622 if (!generic_info->version_specific)
1623 return ERROR_FAIL;
1624 riscv013_info_t *info = get_info(target);
1625
1626 info->progbufsize = -1;
1627
1628 info->dmi_busy_delay = 0;
1629 info->bus_master_read_delay = 0;
1630 info->bus_master_write_delay = 0;
1631 info->ac_busy_delay = 0;
1632
1633 /* Assume all these abstract commands are supported until we learn
1634 * otherwise.
1635 * TODO: The spec allows eg. one CSR to be able to be accessed abstractly
1636 * while another one isn't. We don't track that this closely here, but in
1637 * the future we probably should. */
1638 info->abstract_read_csr_supported = true;
1639 info->abstract_write_csr_supported = true;
1640 info->abstract_read_fpr_supported = true;
1641 info->abstract_write_fpr_supported = true;
1642
1643 return ERROR_OK;
1644 }
1645
1646 static int assert_reset(struct target *target)
1647 {
1648 RISCV_INFO(r);
1649
1650 select_dmi(target);
1651
1652 uint32_t control_base = set_field(0, DMI_DMCONTROL_DMACTIVE, 1);
1653
1654 if (target->rtos) {
1655 /* There's only one target, and OpenOCD thinks each hart is a thread.
1656 * We must reset them all. */
1657
1658 /* TODO: Try to use hasel in dmcontrol */
1659
1660 /* Set haltreq for each hart. */
1661 uint32_t control = control_base;
1662 for (int i = 0; i < riscv_count_harts(target); ++i) {
1663 if (!riscv_hart_enabled(target, i))
1664 continue;
1665
1666 control = set_hartsel(control_base, i);
1667 control = set_field(control, DMI_DMCONTROL_HALTREQ,
1668 target->reset_halt ? 1 : 0);
1669 dmi_write(target, DMI_DMCONTROL, control);
1670 }
1671 /* Assert ndmreset */
1672 control = set_field(control, DMI_DMCONTROL_NDMRESET, 1);
1673 dmi_write(target, DMI_DMCONTROL, control);
1674
1675 } else {
1676 /* Reset just this hart. */
1677 uint32_t control = set_hartsel(control_base, r->current_hartid);
1678 control = set_field(control, DMI_DMCONTROL_HALTREQ,
1679 target->reset_halt ? 1 : 0);
1680 control = set_field(control, DMI_DMCONTROL_NDMRESET, 1);
1681 dmi_write(target, DMI_DMCONTROL, control);
1682 }
1683
1684 target->state = TARGET_RESET;
1685
1686 return ERROR_OK;
1687 }
1688
1689 static int deassert_reset(struct target *target)
1690 {
1691 RISCV_INFO(r);
1692 RISCV013_INFO(info);
1693 select_dmi(target);
1694
1695 /* Clear the reset, but make sure haltreq is still set */
1696 uint32_t control = 0;
1697 control = set_field(control, DMI_DMCONTROL_HALTREQ, target->reset_halt ? 1 : 0);
1698 control = set_field(control, DMI_DMCONTROL_DMACTIVE, 1);
1699 dmi_write(target, DMI_DMCONTROL,
1700 set_hartsel(control, r->current_hartid));
1701
1702 uint32_t dmstatus;
1703 int dmi_busy_delay = info->dmi_busy_delay;
1704 time_t start = time(NULL);
1705
1706 for (int i = 0; i < riscv_count_harts(target); ++i) {
1707 int index = i;
1708 if (target->rtos) {
1709 if (!riscv_hart_enabled(target, index))
1710 continue;
1711 dmi_write(target, DMI_DMCONTROL,
1712 set_hartsel(control, index));
1713 } else {
1714 index = r->current_hartid;
1715 }
1716
1717 char *operation;
1718 uint32_t expected_field;
1719 if (target->reset_halt) {
1720 operation = "halt";
1721 expected_field = DMI_DMSTATUS_ALLHALTED;
1722 } else {
1723 operation = "run";
1724 expected_field = DMI_DMSTATUS_ALLRUNNING;
1725 }
1726 LOG_DEBUG("Waiting for hart %d to %s out of reset.", index, operation);
1727 while (1) {
1728 int result = dmstatus_read_timeout(target, &dmstatus, true,
1729 riscv_reset_timeout_sec);
1730 if (result == ERROR_TIMEOUT_REACHED)
1731 LOG_ERROR("Hart %d didn't complete a DMI read coming out of "
1732 "reset in %ds; Increase the timeout with riscv "
1733 "set_reset_timeout_sec.",
1734 index, riscv_reset_timeout_sec);
1735 if (result != ERROR_OK)
1736 return result;
1737 if (get_field(dmstatus, expected_field))
1738 break;
1739 if (time(NULL) - start > riscv_reset_timeout_sec) {
1740 LOG_ERROR("Hart %d didn't %s coming out of reset in %ds; "
1741 "dmstatus=0x%x; "
1742 "Increase the timeout with riscv set_reset_timeout_sec.",
1743 index, operation, riscv_reset_timeout_sec, dmstatus);
1744 return ERROR_FAIL;
1745 }
1746 }
1747 target->state = TARGET_HALTED;
1748
1749 if (get_field(dmstatus, DMI_DMSTATUS_ALLHAVERESET)) {
1750 /* Ack reset. */
1751 dmi_write(target, DMI_DMCONTROL,
1752 set_hartsel(control, index) |
1753 DMI_DMCONTROL_ACKHAVERESET);
1754 }
1755
1756 if (!target->rtos)
1757 break;
1758 }
1759 info->dmi_busy_delay = dmi_busy_delay;
1760 return ERROR_OK;
1761 }
1762
1763 /**
1764 * @par size in bytes
1765 */
1766 static void write_to_buf(uint8_t *buffer, uint64_t value, unsigned size)
1767 {
1768 switch (size) {
1769 case 8:
1770 buffer[7] = value >> 56;
1771 buffer[6] = value >> 48;
1772 buffer[5] = value >> 40;
1773 buffer[4] = value >> 32;
1774 /* falls through */
1775 case 4:
1776 buffer[3] = value >> 24;
1777 buffer[2] = value >> 16;
1778 /* falls through */
1779 case 2:
1780 buffer[1] = value >> 8;
1781 /* falls through */
1782 case 1:
1783 buffer[0] = value;
1784 break;
1785 default:
1786 assert(false);
1787 }
1788 }
1789
1790 static int execute_fence(struct target *target)
1791 {
1792 int old_hartid = riscv_current_hartid(target);
1793
1794 /* FIXME: For non-coherent systems we need to flush the caches right
1795 * here, but there's no ISA-defined way of doing that. */
1796 {
1797 struct riscv_program program;
1798 riscv_program_init(&program, target);
1799 riscv_program_fence_i(&program);
1800 riscv_program_fence(&program);
1801 int result = riscv_program_exec(&program, target);
1802 if (result != ERROR_OK)
1803 LOG_DEBUG("Unable to execute pre-fence");
1804 }
1805
1806 for (int i = 0; i < riscv_count_harts(target); ++i) {
1807 if (!riscv_hart_enabled(target, i))
1808 continue;
1809
1810 riscv_set_current_hartid(target, i);
1811
1812 struct riscv_program program;
1813 riscv_program_init(&program, target);
1814 riscv_program_fence_i(&program);
1815 riscv_program_fence(&program);
1816 int result = riscv_program_exec(&program, target);
1817 if (result != ERROR_OK)
1818 LOG_DEBUG("Unable to execute fence on hart %d", i);
1819 }
1820
1821 riscv_set_current_hartid(target, old_hartid);
1822
1823 return ERROR_OK;
1824 }
1825
1826 static void log_memory_access(target_addr_t address, uint64_t value,
1827 unsigned size_bytes, bool read)
1828 {
1829 if (debug_level < LOG_LVL_DEBUG)
1830 return;
1831
1832 char fmt[80];
1833 sprintf(fmt, "M[0x%" TARGET_PRIxADDR "] %ss 0x%%0%d" PRIx64,
1834 address, read ? "read" : "write", size_bytes * 2);
1835 value &= (((uint64_t) 0x1) << (size_bytes * 8)) - 1;
1836 LOG_DEBUG(fmt, value);
1837 }
1838
1839 /* Read the relevant sbdata regs depending on size, and put the results into
1840 * buffer. */
1841 static int read_memory_bus_word(struct target *target, target_addr_t address,
1842 uint32_t size, uint8_t *buffer)
1843 {
1844 uint32_t value;
1845 if (size > 12) {
1846 if (dmi_read(target, &value, DMI_SBDATA3) != ERROR_OK)
1847 return ERROR_FAIL;
1848 write_to_buf(buffer + 12, value, 4);
1849 log_memory_access(address + 12, value, 4, true);
1850 }
1851 if (size > 8) {
1852 if (dmi_read(target, &value, DMI_SBDATA2) != ERROR_OK)
1853 return ERROR_FAIL;
1854 write_to_buf(buffer + 8, value, 4);
1855 log_memory_access(address + 8, value, 4, true);
1856 }
1857 if (size > 4) {
1858 if (dmi_read(target, &value, DMI_SBDATA1) != ERROR_OK)
1859 return ERROR_FAIL;
1860 write_to_buf(buffer + 4, value, 4);
1861 log_memory_access(address + 4, value, 4, true);
1862 }
1863 if (dmi_read(target, &value, DMI_SBDATA0) != ERROR_OK)
1864 return ERROR_FAIL;
1865 write_to_buf(buffer, value, MIN(size, 4));
1866 log_memory_access(address, value, MIN(size, 4), true);
1867 return ERROR_OK;
1868 }
1869
1870 static uint32_t sb_sbaccess(unsigned size_bytes)
1871 {
1872 switch (size_bytes) {
1873 case 1:
1874 return set_field(0, DMI_SBCS_SBACCESS, 0);
1875 case 2:
1876 return set_field(0, DMI_SBCS_SBACCESS, 1);
1877 case 4:
1878 return set_field(0, DMI_SBCS_SBACCESS, 2);
1879 case 8:
1880 return set_field(0, DMI_SBCS_SBACCESS, 3);
1881 case 16:
1882 return set_field(0, DMI_SBCS_SBACCESS, 4);
1883 }
1884 assert(0);
1885 return 0; /* Make mingw happy. */
1886 }
1887
1888 static target_addr_t sb_read_address(struct target *target)
1889 {
1890 RISCV013_INFO(info);
1891 unsigned sbasize = get_field(info->sbcs, DMI_SBCS_SBASIZE);
1892 target_addr_t address = 0;
1893 uint32_t v;
1894 if (sbasize > 32) {
1895 dmi_read(target, &v, DMI_SBADDRESS1);
1896 address |= v;
1897 address <<= 32;
1898 }
1899 dmi_read(target, &v, DMI_SBADDRESS0);
1900 address |= v;
1901 return address;
1902 }
1903
1904 static int sb_write_address(struct target *target, target_addr_t address)
1905 {
1906 RISCV013_INFO(info);
1907 unsigned sbasize = get_field(info->sbcs, DMI_SBCS_SBASIZE);
1908 /* There currently is no support for >64-bit addresses in OpenOCD. */
1909 if (sbasize > 96)
1910 dmi_write(target, DMI_SBADDRESS3, 0);
1911 if (sbasize > 64)
1912 dmi_write(target, DMI_SBADDRESS2, 0);
1913 if (sbasize > 32)
1914 dmi_write(target, DMI_SBADDRESS1, address >> 32);
1915 return dmi_write(target, DMI_SBADDRESS0, address);
1916 }
1917
1918 static int read_sbcs_nonbusy(struct target *target, uint32_t *sbcs)
1919 {
1920 time_t start = time(NULL);
1921 while (1) {
1922 if (dmi_read(target, sbcs, DMI_SBCS) != ERROR_OK)
1923 return ERROR_FAIL;
1924 if (!get_field(*sbcs, DMI_SBCS_SBBUSY))
1925 return ERROR_OK;
1926 if (time(NULL) - start > riscv_command_timeout_sec) {
1927 LOG_ERROR("Timed out after %ds waiting for sbbusy to go low (sbcs=0x%x). "
1928 "Increase the timeout with riscv set_command_timeout_sec.",
1929 riscv_command_timeout_sec, *sbcs);
1930 return ERROR_FAIL;
1931 }
1932 }
1933 }
1934
1935 static int read_memory_bus_v0(struct target *target, target_addr_t address,
1936 uint32_t size, uint32_t count, uint8_t *buffer)
1937 {
1938 LOG_DEBUG("System Bus Access: size: %d\tcount:%d\tstart address: 0x%08"
1939 TARGET_PRIxADDR, size, count, address);
1940 uint8_t *t_buffer = buffer;
1941 riscv_addr_t cur_addr = address;
1942 riscv_addr_t fin_addr = address + (count * size);
1943 uint32_t access = 0;
1944
1945 const int DMI_SBCS_SBSINGLEREAD_OFFSET = 20;
1946 const uint32_t DMI_SBCS_SBSINGLEREAD = (0x1U << DMI_SBCS_SBSINGLEREAD_OFFSET);
1947
1948 const int DMI_SBCS_SBAUTOREAD_OFFSET = 15;
1949 const uint32_t DMI_SBCS_SBAUTOREAD = (0x1U << DMI_SBCS_SBAUTOREAD_OFFSET);
1950
1951 /* ww favorise one off reading if there is an issue */
1952 if (count == 1) {
1953 for (uint32_t i = 0; i < count; i++) {
1954 if (dmi_read(target, &access, DMI_SBCS) != ERROR_OK)
1955 return ERROR_FAIL;
1956 dmi_write(target, DMI_SBADDRESS0, cur_addr);
1957 /* size/2 matching the bit access of the spec 0.13 */
1958 access = set_field(access, DMI_SBCS_SBACCESS, size/2);
1959 access = set_field(access, DMI_SBCS_SBSINGLEREAD, 1);
1960 LOG_DEBUG("\r\nread_memory: sab: access: 0x%08x", access);
1961 dmi_write(target, DMI_SBCS, access);
1962 /* 3) read */
1963 uint32_t value;
1964 if (dmi_read(target, &value, DMI_SBDATA0) != ERROR_OK)
1965 return ERROR_FAIL;
1966 LOG_DEBUG("\r\nread_memory: sab: value: 0x%08x", value);
1967 write_to_buf(t_buffer, value, size);
1968 t_buffer += size;
1969 cur_addr += size;
1970 }
1971 return ERROR_OK;
1972 }
1973
1974 /* has to be the same size if we want to read a block */
1975 LOG_DEBUG("reading block until final address 0x%" PRIx64, fin_addr);
1976 if (dmi_read(target, &access, DMI_SBCS) != ERROR_OK)
1977 return ERROR_FAIL;
1978 /* set current address */
1979 dmi_write(target, DMI_SBADDRESS0, cur_addr);
1980 /* 2) write sbaccess=2, sbsingleread,sbautoread,sbautoincrement
1981 * size/2 matching the bit access of the spec 0.13 */
1982 access = set_field(access, DMI_SBCS_SBACCESS, size/2);
1983 access = set_field(access, DMI_SBCS_SBAUTOREAD, 1);
1984 access = set_field(access, DMI_SBCS_SBSINGLEREAD, 1);
1985 access = set_field(access, DMI_SBCS_SBAUTOINCREMENT, 1);
1986 LOG_DEBUG("\r\naccess: 0x%08x", access);
1987 dmi_write(target, DMI_SBCS, access);
1988
1989 while (cur_addr < fin_addr) {
1990 LOG_DEBUG("\r\nsab:autoincrement: \r\n size: %d\tcount:%d\taddress: 0x%08"
1991 PRIx64, size, count, cur_addr);
1992 /* read */
1993 uint32_t value;
1994 if (dmi_read(target, &value, DMI_SBDATA0) != ERROR_OK)
1995 return ERROR_FAIL;
1996 write_to_buf(t_buffer, value, size);
1997 cur_addr += size;
1998 t_buffer += size;
1999
2000 /* if we are reaching last address, we must clear autoread */
2001 if (cur_addr == fin_addr && count != 1) {
2002 dmi_write(target, DMI_SBCS, 0);
2003 if (dmi_read(target, &value, DMI_SBDATA0) != ERROR_OK)
2004 return ERROR_FAIL;
2005 write_to_buf(t_buffer, value, size);
2006 }
2007 }
2008
2009 return ERROR_OK;
2010 }
2011
2012 /**
2013 * Read the requested memory using the system bus interface.
2014 */
2015 static int read_memory_bus_v1(struct target *target, target_addr_t address,
2016 uint32_t size, uint32_t count, uint8_t *buffer)
2017 {
2018 RISCV013_INFO(info);
2019 target_addr_t next_address = address;
2020 target_addr_t end_address = address + count * size;
2021
2022 while (next_address < end_address) {
2023 uint32_t sbcs = set_field(0, DMI_SBCS_SBREADONADDR, 1);
2024 sbcs |= sb_sbaccess(size);
2025 sbcs = set_field(sbcs, DMI_SBCS_SBAUTOINCREMENT, 1);
2026 sbcs = set_field(sbcs, DMI_SBCS_SBREADONDATA, count > 1);
2027 dmi_write(target, DMI_SBCS, sbcs);
2028
2029 /* This address write will trigger the first read. */
2030 sb_write_address(target, next_address);
2031
2032 if (info->bus_master_read_delay) {
2033 jtag_add_runtest(info->bus_master_read_delay, TAP_IDLE);
2034 if (jtag_execute_queue() != ERROR_OK) {
2035 LOG_ERROR("Failed to scan idle sequence");
2036 return ERROR_FAIL;
2037 }
2038 }
2039
2040 for (uint32_t i = (next_address - address) / size; i < count - 1; i++) {
2041 read_memory_bus_word(target, address + i * size, size,
2042 buffer + i * size);
2043 }
2044
2045 sbcs = set_field(sbcs, DMI_SBCS_SBREADONDATA, 0);
2046 dmi_write(target, DMI_SBCS, sbcs);
2047
2048 read_memory_bus_word(target, address + (count - 1) * size, size,
2049 buffer + (count - 1) * size);
2050
2051 if (read_sbcs_nonbusy(target, &sbcs) != ERROR_OK)
2052 return ERROR_FAIL;
2053
2054 if (get_field(sbcs, DMI_SBCS_SBBUSYERROR)) {
2055 /* We read while the target was busy. Slow down and try again. */
2056 dmi_write(target, DMI_SBCS, DMI_SBCS_SBBUSYERROR);
2057 next_address = sb_read_address(target);
2058 info->bus_master_read_delay += info->bus_master_read_delay / 10 + 1;
2059 continue;
2060 }
2061
2062 unsigned error = get_field(sbcs, DMI_SBCS_SBERROR);
2063 if (error == 0) {
2064 next_address = end_address;
2065 } else {
2066 /* Some error indicating the bus access failed, but not because of
2067 * something we did wrong. */
2068 dmi_write(target, DMI_SBCS, DMI_SBCS_SBERROR);
2069 return ERROR_FAIL;
2070 }
2071 }
2072
2073 return ERROR_OK;
2074 }
2075
2076 static int batch_run(const struct target *target, struct riscv_batch *batch)
2077 {
2078 RISCV013_INFO(info);
2079 RISCV_INFO(r);
2080 if (r->reset_delays_wait >= 0) {
2081 r->reset_delays_wait -= batch->used_scans;
2082 if (r->reset_delays_wait <= 0) {
2083 batch->idle_count = 0;
2084 info->dmi_busy_delay = 0;
2085 info->ac_busy_delay = 0;
2086 }
2087 }
2088 return riscv_batch_run(batch);
2089 }
2090
2091 /**
2092 * Read the requested memory, taking care to execute every read exactly once,
2093 * even if cmderr=busy is encountered.
2094 */
2095 static int read_memory_progbuf_inner(struct target *target, target_addr_t address,
2096 uint32_t size, uint32_t count, uint8_t *buffer)
2097 {
2098 RISCV013_INFO(info);
2099
2100 int result = ERROR_OK;
2101
2102 /* Write address to S0, and execute buffer. */
2103 result = register_write_direct(target, GDB_REGNO_S0, address);
2104 if (result != ERROR_OK)
2105 goto error;
2106 uint32_t command = access_register_command(target, GDB_REGNO_S1,
2107 riscv_xlen(target),
2108 AC_ACCESS_REGISTER_TRANSFER | AC_ACCESS_REGISTER_POSTEXEC);
2109 if (execute_abstract_command(target, command) != ERROR_OK)
2110 return ERROR_FAIL;
2111
2112 /* First read has just triggered. Result is in s1. */
2113
2114 if (count == 1) {
2115 uint64_t value;
2116 if (register_read_direct(target, &value, GDB_REGNO_S1) != ERROR_OK)
2117 return ERROR_FAIL;
2118 write_to_buf(buffer, value, size);
2119 log_memory_access(address, value, size, true);
2120 return ERROR_OK;
2121 }
2122
2123 if (dmi_write(target, DMI_ABSTRACTAUTO,
2124 1 << DMI_ABSTRACTAUTO_AUTOEXECDATA_OFFSET) != ERROR_OK)
2125 goto error;
2126 /* Read garbage from dmi_data0, which triggers another execution of the
2127 * program. Now dmi_data0 contains the first good result, and s1 the next
2128 * memory value. */
2129 if (dmi_read_exec(target, NULL, DMI_DATA0) != ERROR_OK)
2130 goto error;
2131
2132 /* read_addr is the next address that the hart will read from, which is the
2133 * value in s0. */
2134 riscv_addr_t read_addr = address + 2 * size;
2135 riscv_addr_t fin_addr = address + (count * size);
2136 while (read_addr < fin_addr) {
2137 LOG_DEBUG("read_addr=0x%" PRIx64 ", fin_addr=0x%" PRIx64, read_addr,
2138 fin_addr);
2139 /* The pipeline looks like this:
2140 * memory -> s1 -> dm_data0 -> debugger
2141 * Right now:
2142 * s0 contains read_addr
2143 * s1 contains mem[read_addr-size]
2144 * dm_data0 contains[read_addr-size*2]
2145 */
2146
2147 LOG_DEBUG("creating burst to read from 0x%" PRIx64
2148 " up to 0x%" PRIx64, read_addr, fin_addr);
2149 assert(read_addr >= address && read_addr < fin_addr);
2150 struct riscv_batch *batch = riscv_batch_alloc(target, 32,
2151 info->dmi_busy_delay + info->ac_busy_delay);
2152
2153 size_t reads = 0;
2154 for (riscv_addr_t addr = read_addr; addr < fin_addr; addr += size) {
2155 riscv_batch_add_dmi_read(batch, DMI_DATA0);
2156
2157 reads++;
2158 if (riscv_batch_full(batch))
2159 break;
2160 }
2161
2162 batch_run(target, batch);
2163
2164 /* Wait for the target to finish performing the last abstract command,
2165 * and update our copy of cmderr. If we see that DMI is busy here,
2166 * dmi_busy_delay will be incremented. */
2167 uint32_t abstractcs;
2168 if (dmi_read(target, &abstractcs, DMI_ABSTRACTCS) != ERROR_OK)
2169 return ERROR_FAIL;
2170 while (get_field(abstractcs, DMI_ABSTRACTCS_BUSY))
2171 if (dmi_read(target, &abstractcs, DMI_ABSTRACTCS) != ERROR_OK)
2172 return ERROR_FAIL;
2173 info->cmderr = get_field(abstractcs, DMI_ABSTRACTCS_CMDERR);
2174
2175 riscv_addr_t next_read_addr;
2176 unsigned ignore_last = 0;
2177 switch (info->cmderr) {
2178 case CMDERR_NONE:
2179 LOG_DEBUG("successful (partial?) memory read");
2180 next_read_addr = read_addr + reads * size;
2181 break;
2182 case CMDERR_BUSY:
2183 LOG_DEBUG("memory read resulted in busy response");
2184
2185 increase_ac_busy_delay(target);
2186 riscv013_clear_abstract_error(target);
2187
2188 dmi_write(target, DMI_ABSTRACTAUTO, 0);
2189
2190 uint32_t dmi_data0;
2191 /* This is definitely a good version of the value that we
2192 * attempted to read when we discovered that the target was
2193 * busy. */
2194 if (dmi_read(target, &dmi_data0, DMI_DATA0) != ERROR_OK) {
2195 riscv_batch_free(batch);
2196 goto error;
2197 }
2198
2199 /* See how far we got, clobbering dmi_data0. */
2200 result = register_read_direct(target, &next_read_addr,
2201 GDB_REGNO_S0);
2202 if (result != ERROR_OK) {
2203 riscv_batch_free(batch);
2204 goto error;
2205 }
2206 write_to_buf(buffer + next_read_addr - 2 * size - address, dmi_data0, size);
2207 log_memory_access(next_read_addr - 2 * size, dmi_data0, size, true);
2208
2209 /* Restore the command, and execute it.
2210 * Now DMI_DATA0 contains the next value just as it would if no
2211 * error had occurred. */
2212 dmi_write_exec(target, DMI_COMMAND, command);
2213 next_read_addr += size;
2214
2215 dmi_write(target, DMI_ABSTRACTAUTO,
2216 1 << DMI_ABSTRACTAUTO_AUTOEXECDATA_OFFSET);
2217
2218 ignore_last = 1;
2219
2220 break;
2221 default:
2222 LOG_DEBUG("error when reading memory, abstractcs=0x%08lx", (long)abstractcs);
2223 riscv013_clear_abstract_error(target);
2224 riscv_batch_free(batch);
2225 result = ERROR_FAIL;
2226 goto error;
2227 }
2228
2229 /* Now read whatever we got out of the batch. */
2230 dmi_status_t status = DMI_STATUS_SUCCESS;
2231 for (size_t i = 0; i < reads; i++) {
2232 riscv_addr_t receive_addr = read_addr + (i-2) * size;
2233 assert(receive_addr < address + size * count);
2234 if (receive_addr < address)
2235 continue;
2236 if (receive_addr > next_read_addr - (3 + ignore_last) * size)
2237 break;
2238
2239 uint64_t dmi_out = riscv_batch_get_dmi_read(batch, i);
2240 status = get_field(dmi_out, DTM_DMI_OP);
2241 if (status != DMI_STATUS_SUCCESS) {
2242 /* If we're here because of busy count, dmi_busy_delay will
2243 * already have been increased and busy state will have been
2244 * cleared in dmi_read(). */
2245 /* In at least some implementations, we issue a read, and then
2246 * can get busy back when we try to scan out the read result,
2247 * and the actual read value is lost forever. Since this is
2248 * rare in any case, we return error here and rely on our
2249 * caller to reread the entire block. */
2250 LOG_WARNING("Batch memory read encountered DMI error %d. "
2251 "Falling back on slower reads.", status);
2252 riscv_batch_free(batch);
2253 result = ERROR_FAIL;
2254 goto error;
2255 }
2256 uint32_t value = get_field(dmi_out, DTM_DMI_DATA);
2257 riscv_addr_t offset = receive_addr - address;
2258 write_to_buf(buffer + offset, value, size);
2259 log_memory_access(receive_addr, value, size, true);
2260
2261 receive_addr += size;
2262 }
2263
2264 read_addr = next_read_addr;
2265
2266 riscv_batch_free(batch);
2267 }
2268
2269 dmi_write(target, DMI_ABSTRACTAUTO, 0);
2270
2271 if (count > 1) {
2272 /* Read the penultimate word. */
2273 uint32_t value;
2274 if (dmi_read(target, &value, DMI_DATA0) != ERROR_OK)
2275 return ERROR_FAIL;
2276 write_to_buf(buffer + size * (count-2), value, size);
2277 log_memory_access(address + size * (count-2), value, size, true);
2278 }
2279
2280 /* Read the last word. */
2281 uint64_t value;
2282 result = register_read_direct(target, &value, GDB_REGNO_S1);
2283 if (result != ERROR_OK)
2284 goto error;
2285 write_to_buf(buffer + size * (count-1), value, size);
2286 log_memory_access(address + size * (count-1), value, size, true);
2287
2288 return ERROR_OK;
2289
2290 error:
2291 dmi_write(target, DMI_ABSTRACTAUTO, 0);
2292
2293 return result;
2294 }
2295
2296 /**
2297 * Read the requested memory, silently handling memory access errors.
2298 */
2299 static int read_memory_progbuf(struct target *target, target_addr_t address,
2300 uint32_t size, uint32_t count, uint8_t *buffer)
2301 {
2302 int result = ERROR_OK;
2303
2304 LOG_DEBUG("reading %d words of %d bytes from 0x%" TARGET_PRIxADDR, count,
2305 size, address);
2306
2307 select_dmi(target);
2308
2309 memset(buffer, 0, count*size);
2310
2311 /* s0 holds the next address to write to
2312 * s1 holds the next data value to write
2313 */
2314 uint64_t s0, s1;
2315 if (register_read(target, &s0, GDB_REGNO_S0) != ERROR_OK)
2316 return ERROR_FAIL;
2317 if (register_read(target, &s1, GDB_REGNO_S1) != ERROR_OK)
2318 return ERROR_FAIL;
2319
2320 if (execute_fence(target) != ERROR_OK)
2321 return ERROR_FAIL;
2322
2323 /* Write the program (load, increment) */
2324 struct riscv_program program;
2325 riscv_program_init(&program, target);
2326 switch (size) {
2327 case 1:
2328 riscv_program_lbr(&program, GDB_REGNO_S1, GDB_REGNO_S0, 0);
2329 break;
2330 case 2:
2331 riscv_program_lhr(&program, GDB_REGNO_S1, GDB_REGNO_S0, 0);
2332 break;
2333 case 4:
2334 riscv_program_lwr(&program, GDB_REGNO_S1, GDB_REGNO_S0, 0);
2335 break;
2336 default:
2337 LOG_ERROR("Unsupported size: %d", size);
2338 return ERROR_FAIL;
2339 }
2340 riscv_program_addi(&program, GDB_REGNO_S0, GDB_REGNO_S0, size);
2341
2342 if (riscv_program_ebreak(&program) != ERROR_OK)
2343 return ERROR_FAIL;
2344 riscv_program_write(&program);
2345
2346 result = read_memory_progbuf_inner(target, address, size, count, buffer);
2347
2348 if (result != ERROR_OK) {
2349 /* The full read did not succeed, so we will try to read each word individually. */
2350 /* This will not be fast, but reading outside actual memory is a special case anyway. */
2351 /* It will make the toolchain happier, especially Eclipse Memory View as it reads ahead. */
2352 target_addr_t address_i = address;
2353 uint32_t size_i = size;
2354 uint32_t count_i = 1;
2355 uint8_t *buffer_i = buffer;
2356
2357 for (uint32_t i = 0; i < count; i++, address_i += size_i, buffer_i += size_i) {
2358 /* TODO: This is much slower than it needs to be because we end up
2359 * writing the address to read for every word we read. */
2360 result = read_memory_progbuf_inner(target, address_i, size_i, count_i, buffer_i);
2361
2362 /* The read of a single word failed, so we will just return 0 for that instead */
2363 if (result != ERROR_OK) {
2364 LOG_DEBUG("error reading single word of %d bytes from 0x%" TARGET_PRIxADDR,
2365 size_i, address_i);
2366
2367 uint64_t value_i = 0;
2368 write_to_buf(buffer_i, value_i, size_i);
2369 }
2370 }
2371 result = ERROR_OK;
2372 }
2373
2374 riscv_set_register(target, GDB_REGNO_S0, s0);
2375 riscv_set_register(target, GDB_REGNO_S1, s1);
2376 return result;
2377 }
2378
2379 static int read_memory(struct target *target, target_addr_t address,
2380 uint32_t size, uint32_t count, uint8_t *buffer)
2381 {
2382 RISCV013_INFO(info);
2383 if (info->progbufsize >= 2 && !riscv_prefer_sba)
2384 return read_memory_progbuf(target, address, size, count, buffer);
2385
2386 if ((get_field(info->sbcs, DMI_SBCS_SBACCESS8) && size == 1) ||
2387 (get_field(info->sbcs, DMI_SBCS_SBACCESS16) && size == 2) ||
2388 (get_field(info->sbcs, DMI_SBCS_SBACCESS32) && size == 4) ||
2389 (get_field(info->sbcs, DMI_SBCS_SBACCESS64) && size == 8) ||
2390 (get_field(info->sbcs, DMI_SBCS_SBACCESS128) && size == 16)) {
2391 if (get_field(info->sbcs, DMI_SBCS_SBVERSION) == 0)
2392 return read_memory_bus_v0(target, address, size, count, buffer);
2393 else if (get_field(info->sbcs, DMI_SBCS_SBVERSION) == 1)
2394 return read_memory_bus_v1(target, address, size, count, buffer);
2395 }
2396
2397 if (info->progbufsize >= 2)
2398 return read_memory_progbuf(target, address, size, count, buffer);
2399
2400 LOG_ERROR("Don't know how to read memory on this target.");
2401 return ERROR_FAIL;
2402 }
2403
2404 static int write_memory_bus_v0(struct target *target, target_addr_t address,
2405 uint32_t size, uint32_t count, const uint8_t *buffer)
2406 {
2407 /*1) write sbaddress: for singlewrite and autoincrement, we need to write the address once*/
2408 LOG_DEBUG("System Bus Access: size: %d\tcount:%d\tstart address: 0x%08"
2409 TARGET_PRIxADDR, size, count, address);
2410 dmi_write(target, DMI_SBADDRESS0, address);
2411 int64_t value = 0;
2412 int64_t access = 0;
2413 riscv_addr_t offset = 0;
2414 riscv_addr_t t_addr = 0;
2415 const uint8_t *t_buffer = buffer + offset;
2416
2417 /* B.8 Writing Memory, single write check if we write in one go */
2418 if (count == 1) { /* count is in bytes here */
2419 /* check the size */
2420 switch (size) {
2421 case 1:
2422 value = t_buffer[0];
2423 break;
2424 case 2:
2425 value = t_buffer[0]
2426 | ((uint32_t) t_buffer[1] << 8);
2427 break;
2428 case 4:
2429 value = t_buffer[0]
2430 | ((uint32_t) t_buffer[1] << 8)
2431 | ((uint32_t) t_buffer[2] << 16)
2432 | ((uint32_t) t_buffer[3] << 24);
2433 break;
2434 default:
2435 LOG_ERROR("unsupported access size: %d", size);
2436 return ERROR_FAIL;
2437 }
2438
2439 access = 0;
2440 access = set_field(access, DMI_SBCS_SBACCESS, size/2);
2441 dmi_write(target, DMI_SBCS, access);
2442 LOG_DEBUG("\r\naccess: 0x%08" PRIx64, access);
2443 LOG_DEBUG("\r\nwrite_memory:SAB: ONE OFF: value 0x%08" PRIx64, value);
2444 dmi_write(target, DMI_SBDATA0, value);
2445 return ERROR_OK;
2446 }
2447
2448 /*B.8 Writing Memory, using autoincrement*/
2449
2450 access = 0;
2451 access = set_field(access, DMI_SBCS_SBACCESS, size/2);
2452 access = set_field(access, DMI_SBCS_SBAUTOINCREMENT, 1);
2453 LOG_DEBUG("\r\naccess: 0x%08" PRIx64, access);
2454 dmi_write(target, DMI_SBCS, access);
2455
2456 /*2)set the value according to the size required and write*/
2457 for (riscv_addr_t i = 0; i < count; ++i) {
2458 offset = size*i;
2459 /* for monitoring only */
2460 t_addr = address + offset;
2461 t_buffer = buffer + offset;
2462
2463 switch (size) {
2464 case 1:
2465 value = t_buffer[0];
2466 break;
2467 case 2:
2468 value = t_buffer[0]
2469 | ((uint32_t) t_buffer[1] << 8);
2470 break;
2471 case 4:
2472 value = t_buffer[0]
2473 | ((uint32_t) t_buffer[1] << 8)
2474 | ((uint32_t) t_buffer[2] << 16)
2475 | ((uint32_t) t_buffer[3] << 24);
2476 break;
2477 default:
2478 LOG_ERROR("unsupported access size: %d", size);
2479 return ERROR_FAIL;
2480 }
2481 LOG_DEBUG("SAB:autoincrement: expected address: 0x%08x value: 0x%08x"
2482 PRIx64, (uint32_t)t_addr, (uint32_t)value);
2483 dmi_write(target, DMI_SBDATA0, value);
2484 }
2485 /*reset the autoincrement when finished (something weird is happening if this is not done at the end*/
2486 access = set_field(access, DMI_SBCS_SBAUTOINCREMENT, 0);
2487 dmi_write(target, DMI_SBCS, access);
2488
2489 return ERROR_OK;
2490 }
2491
2492 static int write_memory_bus_v1(struct target *target, target_addr_t address,
2493 uint32_t size, uint32_t count, const uint8_t *buffer)
2494 {
2495 RISCV013_INFO(info);
2496 uint32_t sbcs = sb_sbaccess(size);
2497 sbcs = set_field(sbcs, DMI_SBCS_SBAUTOINCREMENT, 1);
2498 dmi_write(target, DMI_SBCS, sbcs);
2499
2500 target_addr_t next_address = address;
2501 target_addr_t end_address = address + count * size;
2502
2503 sb_write_address(target, next_address);
2504 while (next_address < end_address) {
2505 for (uint32_t i = (next_address - address) / size; i < count; i++) {
2506 const uint8_t *p = buffer + i * size;
2507 if (size > 12)
2508 dmi_write(target, DMI_SBDATA3,
2509 ((uint32_t) p[12]) |
2510 (((uint32_t) p[13]) << 8) |
2511 (((uint32_t) p[14]) << 16) |
2512 (((uint32_t) p[15]) << 24));
2513 if (size > 8)
2514 dmi_write(target, DMI_SBDATA2,
2515 ((uint32_t) p[8]) |
2516 (((uint32_t) p[9]) << 8) |
2517 (((uint32_t) p[10]) << 16) |
2518 (((uint32_t) p[11]) << 24));
2519 if (size > 4)
2520 dmi_write(target, DMI_SBDATA1,
2521 ((uint32_t) p[4]) |
2522 (((uint32_t) p[5]) << 8) |
2523 (((uint32_t) p[6]) << 16) |
2524 (((uint32_t) p[7]) << 24));
2525 uint32_t value = p[0];
2526 if (size > 2) {
2527 value |= ((uint32_t) p[2]) << 16;
2528 value |= ((uint32_t) p[3]) << 24;
2529 }
2530 if (size > 1)
2531 value |= ((uint32_t) p[1]) << 8;
2532 dmi_write(target, DMI_SBDATA0, value);
2533
2534 log_memory_access(address + i * size, value, size, false);
2535
2536 if (info->bus_master_write_delay) {
2537 jtag_add_runtest(info->bus_master_write_delay, TAP_IDLE);
2538 if (jtag_execute_queue() != ERROR_OK) {
2539 LOG_ERROR("Failed to scan idle sequence");
2540 return ERROR_FAIL;
2541 }
2542 }
2543 }
2544
2545 if (read_sbcs_nonbusy(target, &sbcs) != ERROR_OK)
2546 return ERROR_FAIL;
2547
2548 if (get_field(sbcs, DMI_SBCS_SBBUSYERROR)) {
2549 /* We wrote while the target was busy. Slow down and try again. */
2550 dmi_write(target, DMI_SBCS, DMI_SBCS_SBBUSYERROR);
2551 next_address = sb_read_address(target);
2552 info->bus_master_write_delay += info->bus_master_write_delay / 10 + 1;
2553 continue;
2554 }
2555
2556 unsigned error = get_field(sbcs, DMI_SBCS_SBERROR);
2557 if (error == 0) {
2558 next_address = end_address;
2559 } else {
2560 /* Some error indicating the bus access failed, but not because of
2561 * something we did wrong. */
2562 dmi_write(target, DMI_SBCS, DMI_SBCS_SBERROR);
2563 return ERROR_FAIL;
2564 }
2565 }
2566
2567 return ERROR_OK;
2568 }
2569
2570 static int write_memory_progbuf(struct target *target, target_addr_t address,
2571 uint32_t size, uint32_t count, const uint8_t *buffer)
2572 {
2573 RISCV013_INFO(info);
2574
2575 LOG_DEBUG("writing %d words of %d bytes to 0x%08lx", count, size, (long)address);
2576
2577 select_dmi(target);
2578
2579 /* s0 holds the next address to write to
2580 * s1 holds the next data value to write
2581 */
2582
2583 int result = ERROR_OK;
2584 uint64_t s0, s1;
2585 if (register_read(target, &s0, GDB_REGNO_S0) != ERROR_OK)
2586 return ERROR_FAIL;
2587 if (register_read(target, &s1, GDB_REGNO_S1) != ERROR_OK)
2588 return ERROR_FAIL;
2589
2590 /* Write the program (store, increment) */
2591 struct riscv_program program;
2592 riscv_program_init(&program, target);
2593
2594 switch (size) {
2595 case 1:
2596 riscv_program_sbr(&program, GDB_REGNO_S1, GDB_REGNO_S0, 0);
2597 break;
2598 case 2:
2599 riscv_program_shr(&program, GDB_REGNO_S1, GDB_REGNO_S0, 0);
2600 break;
2601 case 4:
2602 riscv_program_swr(&program, GDB_REGNO_S1, GDB_REGNO_S0, 0);
2603 break;
2604 default:
2605 LOG_ERROR("Unsupported size: %d", size);
2606 result = ERROR_FAIL;
2607 goto error;
2608 }
2609
2610 riscv_program_addi(&program, GDB_REGNO_S0, GDB_REGNO_S0, size);
2611
2612 result = riscv_program_ebreak(&program);
2613 if (result != ERROR_OK)
2614 goto error;
2615 riscv_program_write(&program);
2616
2617 riscv_addr_t cur_addr = address;
2618 riscv_addr_t fin_addr = address + (count * size);
2619 bool setup_needed = true;
2620 LOG_DEBUG("writing until final address 0x%016" PRIx64, fin_addr);
2621 while (cur_addr < fin_addr) {
2622 LOG_DEBUG("transferring burst starting at address 0x%016" PRIx64,
2623 cur_addr);
2624
2625 struct riscv_batch *batch = riscv_batch_alloc(
2626 target,
2627 32,
2628 info->dmi_busy_delay + info->ac_busy_delay);
2629
2630 /* To write another word, we put it in S1 and execute the program. */
2631 unsigned start = (cur_addr - address) / size;
2632 for (unsigned i = start; i < count; ++i) {
2633 unsigned offset = size*i;
2634 const uint8_t *t_buffer = buffer + offset;
2635
2636 uint32_t value;
2637 switch (size) {
2638 case 1:
2639 value = t_buffer[0];
2640 break;
2641 case 2:
2642 value = t_buffer[0]
2643 | ((uint32_t) t_buffer[1] << 8);
2644 break;
2645 case 4:
2646 value = t_buffer[0]
2647 | ((uint32_t) t_buffer[1] << 8)
2648 | ((uint32_t) t_buffer[2] << 16)
2649 | ((uint32_t) t_buffer[3] << 24);
2650 break;
2651 default:
2652 LOG_ERROR("unsupported access size: %d", size);
2653 riscv_batch_free(batch);
2654 result = ERROR_FAIL;
2655 goto error;
2656 }
2657
2658 log_memory_access(address + offset, value, size, false);
2659 cur_addr += size;
2660
2661 if (setup_needed) {
2662 result = register_write_direct(target, GDB_REGNO_S0,
2663 address + offset);
2664 if (result != ERROR_OK) {
2665 riscv_batch_free(batch);
2666 goto error;
2667 }
2668
2669 /* Write value. */
2670 dmi_write(target, DMI_DATA0, value);
2671
2672 /* Write and execute command that moves value into S1 and
2673 * executes program buffer. */
2674 uint32_t command = access_register_command(target,
2675 GDB_REGNO_S1, 32,
2676 AC_ACCESS_REGISTER_POSTEXEC |
2677 AC_ACCESS_REGISTER_TRANSFER |
2678 AC_ACCESS_REGISTER_WRITE);
2679 result = execute_abstract_command(target, command);
2680 if (result != ERROR_OK) {
2681 riscv_batch_free(batch);
2682 goto error;
2683 }
2684
2685 /* Turn on autoexec */
2686 dmi_write(target, DMI_ABSTRACTAUTO,
2687 1 << DMI_ABSTRACTAUTO_AUTOEXECDATA_OFFSET);
2688
2689 setup_needed = false;
2690 } else {
2691 riscv_batch_add_dmi_write(batch, DMI_DATA0, value);
2692 if (riscv_batch_full(batch))
2693 break;
2694 }
2695 }
2696
2697 result = batch_run(target, batch);
2698 riscv_batch_free(batch);
2699 if (result != ERROR_OK)
2700 goto error;
2701
2702 /* Note that if the scan resulted in a Busy DMI response, it
2703 * is this read to abstractcs that will cause the dmi_busy_delay
2704 * to be incremented if necessary. */
2705
2706 uint32_t abstractcs;
2707 bool dmi_busy_encountered;
2708 if (dmi_op(target, &abstractcs, &dmi_busy_encountered, DMI_OP_READ,
2709 DMI_ABSTRACTCS, 0, false) != ERROR_OK)
2710 goto error;
2711 while (get_field(abstractcs, DMI_ABSTRACTCS_BUSY))
2712 if (dmi_read(target, &abstractcs, DMI_ABSTRACTCS) != ERROR_OK)
2713 return ERROR_FAIL;
2714 info->cmderr = get_field(abstractcs, DMI_ABSTRACTCS_CMDERR);
2715 if (info->cmderr == CMDERR_NONE && !dmi_busy_encountered) {
2716 LOG_DEBUG("successful (partial?) memory write");
2717 } else if (info->cmderr == CMDERR_BUSY || dmi_busy_encountered) {
2718 if (info->cmderr == CMDERR_BUSY)
2719 LOG_DEBUG("Memory write resulted in abstract command busy response.");
2720 else if (dmi_busy_encountered)
2721 LOG_DEBUG("Memory write resulted in DMI busy response.");
2722 riscv013_clear_abstract_error(target);
2723 increase_ac_busy_delay(target);
2724
2725 dmi_write(target, DMI_ABSTRACTAUTO, 0);
2726 result = register_read_direct(target, &cur_addr, GDB_REGNO_S0);
2727 if (result != ERROR_OK)
2728 goto error;
2729 setup_needed = true;
2730 } else {
2731 LOG_ERROR("error when writing memory, abstractcs=0x%08lx", (long)abstractcs);
2732 riscv013_clear_abstract_error(target);
2733 result = ERROR_FAIL;
2734 goto error;
2735 }
2736 }
2737
2738 error:
2739 dmi_write(target, DMI_ABSTRACTAUTO, 0);
2740
2741 if (register_write_direct(target, GDB_REGNO_S1, s1) != ERROR_OK)
2742 return ERROR_FAIL;
2743 if (register_write_direct(target, GDB_REGNO_S0, s0) != ERROR_OK)
2744 return ERROR_FAIL;
2745
2746 if (execute_fence(target) != ERROR_OK)
2747 return ERROR_FAIL;
2748
2749 return result;
2750 }
2751
2752 static int write_memory(struct target *target, target_addr_t address,
2753 uint32_t size, uint32_t count, const uint8_t *buffer)
2754 {
2755 RISCV013_INFO(info);
2756 if (info->progbufsize >= 2 && !riscv_prefer_sba)
2757 return write_memory_progbuf(target, address, size, count, buffer);
2758
2759 if ((get_field(info->sbcs, DMI_SBCS_SBACCESS8) && size == 1) ||
2760 (get_field(info->sbcs, DMI_SBCS_SBACCESS16) && size == 2) ||
2761 (get_field(info->sbcs, DMI_SBCS_SBACCESS32) && size == 4) ||
2762 (get_field(info->sbcs, DMI_SBCS_SBACCESS64) && size == 8) ||
2763 (get_field(info->sbcs, DMI_SBCS_SBACCESS128) && size == 16)) {
2764 if (get_field(info->sbcs, DMI_SBCS_SBVERSION) == 0)
2765 return write_memory_bus_v0(target, address, size, count, buffer);
2766 else if (get_field(info->sbcs, DMI_SBCS_SBVERSION) == 1)
2767 return write_memory_bus_v1(target, address, size, count, buffer);
2768 }
2769
2770 if (info->progbufsize >= 2)
2771 return write_memory_progbuf(target, address, size, count, buffer);
2772
2773 LOG_ERROR("Don't know how to write memory on this target.");
2774 return ERROR_FAIL;
2775 }
2776
2777 static int arch_state(struct target *target)
2778 {
2779 return ERROR_OK;
2780 }
2781
2782 struct target_type riscv013_target = {
2783 .name = "riscv",
2784
2785 .init_target = init_target,
2786 .deinit_target = deinit_target,
2787 .examine = examine,
2788
2789 .poll = &riscv_openocd_poll,
2790 .halt = &riscv_openocd_halt,
2791 .resume = &riscv_openocd_resume,
2792 .step = &riscv_openocd_step,
2793
2794 .assert_reset = assert_reset,
2795 .deassert_reset = deassert_reset,
2796
2797 .read_memory = read_memory,
2798 .write_memory = write_memory,
2799
2800 .arch_state = arch_state,
2801 };
2802
2803 /*** 0.13-specific implementations of various RISC-V helper functions. ***/
2804 static int riscv013_get_register(struct target *target,
2805 riscv_reg_t *value, int hid, int rid)
2806 {
2807 LOG_DEBUG("reading register %s on hart %d", gdb_regno_name(rid), hid);
2808
2809 riscv_set_current_hartid(target, hid);
2810
2811 int result = ERROR_OK;
2812 if (rid == GDB_REGNO_PC) {
2813 result = register_read(target, value, GDB_REGNO_DPC);
2814 LOG_DEBUG("read PC from DPC: 0x%" PRIx64, *value);
2815 } else if (rid == GDB_REGNO_PRIV) {
2816 uint64_t dcsr;
2817 result = register_read(target, &dcsr, GDB_REGNO_DCSR);
2818 *value = get_field(dcsr, CSR_DCSR_PRV);
2819 } else {
2820 result = register_read(target, value, rid);
2821 if (result != ERROR_OK)
2822 *value = -1;
2823 }
2824
2825 return result;
2826 }
2827
2828 static int riscv013_set_register(struct target *target, int hid, int rid, uint64_t value)
2829 {
2830 LOG_DEBUG("writing 0x%" PRIx64 " to register %s on hart %d", value,
2831 gdb_regno_name(rid), hid);
2832
2833 riscv_set_current_hartid(target, hid);
2834
2835 if (rid <= GDB_REGNO_XPR31) {
2836 return register_write_direct(target, rid, value);
2837 } else if (rid == GDB_REGNO_PC) {
2838 LOG_DEBUG("writing PC to DPC: 0x%" PRIx64, value);
2839 register_write_direct(target, GDB_REGNO_DPC, value);
2840 uint64_t actual_value;
2841 register_read_direct(target, &actual_value, GDB_REGNO_DPC);
2842 LOG_DEBUG(" actual DPC written: 0x%016" PRIx64, actual_value);
2843 if (value != actual_value) {
2844 LOG_ERROR("Written PC (0x%" PRIx64 ") does not match read back "
2845 "value (0x%" PRIx64 ")", value, actual_value);
2846 return ERROR_FAIL;
2847 }
2848 } else if (rid == GDB_REGNO_PRIV) {
2849 uint64_t dcsr;
2850 register_read(target, &dcsr, GDB_REGNO_DCSR);
2851 dcsr = set_field(dcsr, CSR_DCSR_PRV, value);
2852 return register_write_direct(target, GDB_REGNO_DCSR, dcsr);
2853 } else {
2854 return register_write_direct(target, rid, value);
2855 }
2856
2857 return ERROR_OK;
2858 }
2859
2860 static int riscv013_select_current_hart(struct target *target)
2861 {
2862 RISCV_INFO(r);
2863
2864 dm013_info_t *dm = get_dm(target);
2865 if (r->current_hartid == dm->current_hartid)
2866 return ERROR_OK;
2867
2868 uint32_t dmcontrol;
2869 /* TODO: can't we just "dmcontrol = DMI_DMACTIVE"? */
2870 if (dmi_read(target, &dmcontrol, DMI_DMCONTROL) != ERROR_OK)
2871 return ERROR_FAIL;
2872 dmcontrol = set_hartsel(dmcontrol, r->current_hartid);
2873 int result = dmi_write(target, DMI_DMCONTROL, dmcontrol);
2874 dm->current_hartid = r->current_hartid;
2875 return result;
2876 }
2877
2878 static int riscv013_halt_current_hart(struct target *target)
2879 {
2880 RISCV_INFO(r);
2881 LOG_DEBUG("halting hart %d", r->current_hartid);
2882 if (riscv_is_halted(target))
2883 LOG_ERROR("Hart %d is already halted!", r->current_hartid);
2884
2885 /* Issue the halt command, and then wait for the current hart to halt. */
2886 uint32_t dmcontrol;
2887 if (dmi_read(target, &dmcontrol, DMI_DMCONTROL) != ERROR_OK)
2888 return ERROR_FAIL;
2889 dmcontrol = set_field(dmcontrol, DMI_DMCONTROL_HALTREQ, 1);
2890 dmi_write(target, DMI_DMCONTROL, dmcontrol);
2891 for (size_t i = 0; i < 256; ++i)
2892 if (riscv_is_halted(target))
2893 break;
2894
2895 if (!riscv_is_halted(target)) {
2896 uint32_t dmstatus;
2897 if (dmstatus_read(target, &dmstatus, true) != ERROR_OK)
2898 return ERROR_FAIL;
2899 if (dmi_read(target, &dmcontrol, DMI_DMCONTROL) != ERROR_OK)
2900 return ERROR_FAIL;
2901
2902 LOG_ERROR("unable to halt hart %d", r->current_hartid);
2903 LOG_ERROR(" dmcontrol=0x%08x", dmcontrol);
2904 LOG_ERROR(" dmstatus =0x%08x", dmstatus);
2905 return ERROR_FAIL;
2906 }
2907
2908 dmcontrol = set_field(dmcontrol, DMI_DMCONTROL_HALTREQ, 0);
2909 dmi_write(target, DMI_DMCONTROL, dmcontrol);
2910
2911 return ERROR_OK;
2912 }
2913
2914 static int riscv013_resume_current_hart(struct target *target)
2915 {
2916 return riscv013_step_or_resume_current_hart(target, false);
2917 }
2918
2919 static int riscv013_step_current_hart(struct target *target)
2920 {
2921 return riscv013_step_or_resume_current_hart(target, true);
2922 }
2923
2924 static int riscv013_on_resume(struct target *target)
2925 {
2926 return riscv013_on_step_or_resume(target, false);
2927 }
2928
2929 static int riscv013_on_step(struct target *target)
2930 {
2931 return riscv013_on_step_or_resume(target, true);
2932 }
2933
2934 static int riscv013_on_halt(struct target *target)
2935 {
2936 return ERROR_OK;
2937 }
2938
2939 static bool riscv013_is_halted(struct target *target)
2940 {
2941 uint32_t dmstatus;
2942 if (dmstatus_read(target, &dmstatus, true) != ERROR_OK)
2943 return false;
2944 if (get_field(dmstatus, DMI_DMSTATUS_ANYUNAVAIL))
2945 LOG_ERROR("Hart %d is unavailable.", riscv_current_hartid(target));
2946 if (get_field(dmstatus, DMI_DMSTATUS_ANYNONEXISTENT))
2947 LOG_ERROR("Hart %d doesn't exist.", riscv_current_hartid(target));
2948 if (get_field(dmstatus, DMI_DMSTATUS_ANYHAVERESET)) {
2949 int hartid = riscv_current_hartid(target);
2950 LOG_INFO("Hart %d unexpectedly reset!", hartid);
2951 /* TODO: Can we make this more obvious to eg. a gdb user? */
2952 uint32_t dmcontrol = DMI_DMCONTROL_DMACTIVE |
2953 DMI_DMCONTROL_ACKHAVERESET;
2954 dmcontrol = set_hartsel(dmcontrol, hartid);
2955 /* If we had been halted when we reset, request another halt. If we
2956 * ended up running out of reset, then the user will (hopefully) get a
2957 * message that a reset happened, that the target is running, and then
2958 * that it is halted again once the request goes through.
2959 */
2960 if (target->state == TARGET_HALTED)
2961 dmcontrol |= DMI_DMCONTROL_HALTREQ;
2962 dmi_write(target, DMI_DMCONTROL, dmcontrol);
2963 }
2964 return get_field(dmstatus, DMI_DMSTATUS_ALLHALTED);
2965 }
2966
2967 static enum riscv_halt_reason riscv013_halt_reason(struct target *target)
2968 {
2969 riscv_reg_t dcsr;
2970 int result = register_read(target, &dcsr, GDB_REGNO_DCSR);
2971 if (result != ERROR_OK)
2972 return RISCV_HALT_UNKNOWN;
2973
2974 switch (get_field(dcsr, CSR_DCSR_CAUSE)) {
2975 case CSR_DCSR_CAUSE_SWBP:
2976 return RISCV_HALT_BREAKPOINT;
2977 case CSR_DCSR_CAUSE_TRIGGER:
2978 /* We could get here before triggers are enumerated if a trigger was
2979 * already set when we connected. Force enumeration now, which has the
2980 * side effect of clearing any triggers we did not set. */
2981 riscv_enumerate_triggers(target);
2982 LOG_DEBUG("{%d} halted because of trigger", target->coreid);
2983 return RISCV_HALT_TRIGGER;
2984 case CSR_DCSR_CAUSE_STEP:
2985 return RISCV_HALT_SINGLESTEP;
2986 case CSR_DCSR_CAUSE_DEBUGINT:
2987 case CSR_DCSR_CAUSE_HALT:
2988 return RISCV_HALT_INTERRUPT;
2989 }
2990
2991 LOG_ERROR("Unknown DCSR cause field: %x", (int)get_field(dcsr, CSR_DCSR_CAUSE));
2992 LOG_ERROR(" dcsr=0x%016lx", (long)dcsr);
2993 return RISCV_HALT_UNKNOWN;
2994 }
2995
2996 int riscv013_write_debug_buffer(struct target *target, unsigned index, riscv_insn_t data)
2997 {
2998 return dmi_write(target, DMI_PROGBUF0 + index, data);
2999 }
3000
3001 riscv_insn_t riscv013_read_debug_buffer(struct target *target, unsigned index)
3002 {
3003 uint32_t value;
3004 dmi_read(target, &value, DMI_PROGBUF0 + index);
3005 return value;
3006 }
3007
3008 int riscv013_execute_debug_buffer(struct target *target)
3009 {
3010 uint32_t run_program = 0;
3011 run_program = set_field(run_program, AC_ACCESS_REGISTER_SIZE, 2);
3012 run_program = set_field(run_program, AC_ACCESS_REGISTER_POSTEXEC, 1);
3013 run_program = set_field(run_program, AC_ACCESS_REGISTER_TRANSFER, 0);
3014 run_program = set_field(run_program, AC_ACCESS_REGISTER_REGNO, 0x1000);
3015
3016 return execute_abstract_command(target, run_program);
3017 }
3018
3019 void riscv013_fill_dmi_write_u64(struct target *target, char *buf, int a, uint64_t d)
3020 {
3021 RISCV013_INFO(info);
3022 buf_set_u64((unsigned char *)buf, DTM_DMI_OP_OFFSET, DTM_DMI_OP_LENGTH, DMI_OP_WRITE);
3023 buf_set_u64((unsigned char *)buf, DTM_DMI_DATA_OFFSET, DTM_DMI_DATA_LENGTH, d);
3024 buf_set_u64((unsigned char *)buf, DTM_DMI_ADDRESS_OFFSET, info->abits, a);
3025 }
3026
3027 void riscv013_fill_dmi_read_u64(struct target *target, char *buf, int a)
3028 {
3029 RISCV013_INFO(info);
3030 buf_set_u64((unsigned char *)buf, DTM_DMI_OP_OFFSET, DTM_DMI_OP_LENGTH, DMI_OP_READ);
3031 buf_set_u64((unsigned char *)buf, DTM_DMI_DATA_OFFSET, DTM_DMI_DATA_LENGTH, 0);
3032 buf_set_u64((unsigned char *)buf, DTM_DMI_ADDRESS_OFFSET, info->abits, a);
3033 }
3034
3035 void riscv013_fill_dmi_nop_u64(struct target *target, char *buf)
3036 {
3037 RISCV013_INFO(info);
3038 buf_set_u64((unsigned char *)buf, DTM_DMI_OP_OFFSET, DTM_DMI_OP_LENGTH, DMI_OP_NOP);
3039 buf_set_u64((unsigned char *)buf, DTM_DMI_DATA_OFFSET, DTM_DMI_DATA_LENGTH, 0);
3040 buf_set_u64((unsigned char *)buf, DTM_DMI_ADDRESS_OFFSET, info->abits, 0);
3041 }
3042
3043 /* Helper function for riscv013_test_sba_config_reg */
3044 static int get_max_sbaccess(struct target *target)
3045 {
3046 RISCV013_INFO(info);
3047
3048 uint32_t sbaccess128 = get_field(info->sbcs, DMI_SBCS_SBACCESS128);
3049 uint32_t sbaccess64 = get_field(info->sbcs, DMI_SBCS_SBACCESS64);
3050 uint32_t sbaccess32 = get_field(info->sbcs, DMI_SBCS_SBACCESS32);
3051 uint32_t sbaccess16 = get_field(info->sbcs, DMI_SBCS_SBACCESS16);
3052 uint32_t sbaccess8 = get_field(info->sbcs, DMI_SBCS_SBACCESS8);
3053
3054 if (sbaccess128)
3055 return 4;
3056 else if (sbaccess64)
3057 return 3;
3058 else if (sbaccess32)
3059 return 2;
3060 else if (sbaccess16)
3061 return 1;
3062 else if (sbaccess8)
3063 return 0;
3064 else
3065 return -1;
3066 }
3067
3068 static uint32_t get_num_sbdata_regs(struct target *target)
3069 {
3070 RISCV013_INFO(info);
3071
3072 uint32_t sbaccess128 = get_field(info->sbcs, DMI_SBCS_SBACCESS128);
3073 uint32_t sbaccess64 = get_field(info->sbcs, DMI_SBCS_SBACCESS64);
3074 uint32_t sbaccess32 = get_field(info->sbcs, DMI_SBCS_SBACCESS32);
3075
3076 if (sbaccess128)
3077 return 4;
3078 else if (sbaccess64)
3079 return 2;
3080 else if (sbaccess32)
3081 return 1;
3082 else
3083 return 0;
3084 }
3085
3086 static int riscv013_test_sba_config_reg(struct target *target,
3087 target_addr_t legal_address, uint32_t num_words,
3088 target_addr_t illegal_address, bool run_sbbusyerror_test)
3089 {
3090 LOG_INFO("Testing System Bus Access as defined by RISC-V Debug Spec v0.13");
3091
3092 uint32_t tests_failed = 0;
3093
3094 uint32_t rd_val;
3095 uint32_t sbcs_orig;
3096 dmi_read(target, &sbcs_orig, DMI_SBCS);
3097
3098 uint32_t sbcs = sbcs_orig;
3099 bool test_passed;
3100
3101 int max_sbaccess = get_max_sbaccess(target);
3102
3103 if (max_sbaccess == -1) {
3104 LOG_ERROR("System Bus Access not supported in this config.");
3105 return ERROR_FAIL;
3106 }
3107
3108 if (get_field(sbcs, DMI_SBCS_SBVERSION) != 1) {
3109 LOG_ERROR("System Bus Access unsupported SBVERSION (%d). Only version 1 is supported.",
3110 get_field(sbcs, DMI_SBCS_SBVERSION));
3111 return ERROR_FAIL;
3112 }
3113
3114 uint32_t num_sbdata_regs = get_num_sbdata_regs(target);
3115
3116 uint32_t rd_buf[num_sbdata_regs];
3117
3118 /* Test 1: Simple write/read test */
3119 test_passed = true;
3120 sbcs = set_field(sbcs_orig, DMI_SBCS_SBAUTOINCREMENT, 0);
3121 dmi_write(target, DMI_SBCS, sbcs);
3122
3123 uint32_t test_patterns[4] = {0xdeadbeef, 0xfeedbabe, 0x12345678, 0x08675309};
3124 for (uint32_t sbaccess = 0; sbaccess <= (uint32_t)max_sbaccess; sbaccess++) {
3125 sbcs = set_field(sbcs, DMI_SBCS_SBACCESS, sbaccess);
3126 dmi_write(target, DMI_SBCS, sbcs);
3127
3128 uint32_t compare_mask = (sbaccess == 0) ? 0xff : (sbaccess == 1) ? 0xffff : 0xffffffff;
3129
3130 for (uint32_t i = 0; i < num_words; i++) {
3131 uint32_t addr = legal_address + (i << sbaccess);
3132 uint32_t wr_data[num_sbdata_regs];
3133 for (uint32_t j = 0; j < num_sbdata_regs; j++)
3134 wr_data[j] = test_patterns[j] + i;
3135 write_memory_sba_simple(target, addr, wr_data, num_sbdata_regs, sbcs);
3136 }
3137
3138 for (uint32_t i = 0; i < num_words; i++) {
3139 uint32_t addr = legal_address + (i << sbaccess);
3140 read_memory_sba_simple(target, addr, rd_buf, num_sbdata_regs, sbcs);
3141 for (uint32_t j = 0; j < num_sbdata_regs; j++) {
3142 if (((test_patterns[j]+i)&compare_mask) != (rd_buf[j]&compare_mask)) {
3143 LOG_ERROR("System Bus Access Test 1: Error reading non-autoincremented address %x,"
3144 "expected val = %x, read val = %x", addr, test_patterns[j]+i, rd_buf[j]);
3145 test_passed = false;
3146 tests_failed++;
3147 }
3148 }
3149 }
3150 }
3151 if (test_passed)
3152 LOG_INFO("System Bus Access Test 1: Simple write/read test PASSED.");
3153
3154 /* Test 2: Address autoincrement test */
3155 target_addr_t curr_addr;
3156 target_addr_t prev_addr;
3157 test_passed = true;
3158 sbcs = set_field(sbcs_orig, DMI_SBCS_SBAUTOINCREMENT, 1);
3159 dmi_write(target, DMI_SBCS, sbcs);
3160
3161 for (uint32_t sbaccess = 0; sbaccess <= (uint32_t)max_sbaccess; sbaccess++) {
3162 sbcs = set_field(sbcs, DMI_SBCS_SBACCESS, sbaccess);
3163 dmi_write(target, DMI_SBCS, sbcs);
3164
3165 dmi_write(target, DMI_SBADDRESS0, legal_address);
3166 read_sbcs_nonbusy(target, &sbcs);
3167 curr_addr = legal_address;
3168 for (uint32_t i = 0; i < num_words; i++) {
3169 prev_addr = curr_addr;
3170 read_sbcs_nonbusy(target, &sbcs);
3171 curr_addr = sb_read_address(target);
3172 if ((curr_addr - prev_addr != (uint32_t)(1 << sbaccess)) && (i != 0)) {
3173 LOG_ERROR("System Bus Access Test 2: Error with address auto-increment, sbaccess = %x.", sbaccess);
3174 test_passed = false;
3175 tests_failed++;
3176 }
3177 dmi_write(target, DMI_SBDATA0, i);
3178 }
3179
3180 read_sbcs_nonbusy(target, &sbcs);
3181
3182 dmi_write(target, DMI_SBADDRESS0, legal_address);
3183
3184 uint32_t val;
3185 sbcs = set_field(sbcs, DMI_SBCS_SBREADONDATA, 1);
3186 dmi_write(target, DMI_SBCS, sbcs);
3187 dmi_read(target, &val, DMI_SBDATA0); /* Dummy read to trigger first system bus read */
3188 curr_addr = legal_address;
3189 for (uint32_t i = 0; i < num_words; i++) {
3190 prev_addr = curr_addr;
3191 read_sbcs_nonbusy(target, &sbcs);
3192 curr_addr = sb_read_address(target);
3193 if ((curr_addr - prev_addr != (uint32_t)(1 << sbaccess)) && (i != 0)) {
3194 LOG_ERROR("System Bus Access Test 2: Error with address auto-increment, sbaccess = %x", sbaccess);
3195 test_passed = false;
3196 tests_failed++;
3197 }
3198 dmi_read(target, &val, DMI_SBDATA0);
3199 read_sbcs_nonbusy(target, &sbcs);
3200 if (i != val) {
3201 LOG_ERROR("System Bus Access Test 2: Error reading auto-incremented address,"
3202 "expected val = %x, read val = %x.", i, val);
3203 test_passed = false;
3204 tests_failed++;
3205 }
3206 }
3207 }
3208 if (test_passed)
3209 LOG_INFO("System Bus Access Test 2: Address auto-increment test PASSED.");
3210
3211 /* Test 3: Read from illegal address */
3212 read_memory_sba_simple(target, illegal_address, rd_buf, 1, sbcs_orig);
3213
3214 dmi_read(target, &rd_val, DMI_SBCS);
3215 if (get_field(rd_val, DMI_SBCS_SBERROR) == 2) {
3216 sbcs = set_field(sbcs_orig, DMI_SBCS_SBERROR, 2);
3217 dmi_write(target, DMI_SBCS, sbcs);
3218 dmi_read(target, &rd_val, DMI_SBCS);
3219 if (get_field(rd_val, DMI_SBCS_SBERROR) == 0)
3220 LOG_INFO("System Bus Access Test 3: Illegal address read test PASSED.");
3221 else
3222 LOG_ERROR("System Bus Access Test 3: Illegal address read test FAILED, unable to clear to 0.");
3223 } else {
3224 LOG_ERROR("System Bus Access Test 3: Illegal address read test FAILED, unable to set error code.");
3225 }
3226
3227 /* Test 4: Write to illegal address */
3228 write_memory_sba_simple(target, illegal_address, test_patterns, 1, sbcs_orig);
3229
3230 dmi_read(target, &rd_val, DMI_SBCS);
3231 if (get_field(rd_val, DMI_SBCS_SBERROR) == 2) {
3232 sbcs = set_field(sbcs_orig, DMI_SBCS_SBERROR, 2);
3233 dmi_write(target, DMI_SBCS, sbcs);
3234 dmi_read(target, &rd_val, DMI_SBCS);
3235 if (get_field(rd_val, DMI_SBCS_SBERROR) == 0)
3236 LOG_INFO("System Bus Access Test 4: Illegal address write test PASSED.");
3237 else {
3238 LOG_ERROR("System Bus Access Test 4: Illegal address write test FAILED, unable to clear to 0.");
3239 tests_failed++;
3240 }
3241 } else {
3242 LOG_ERROR("System Bus Access Test 4: Illegal address write test FAILED, unable to set error code.");
3243 tests_failed++;
3244 }
3245
3246 /* Test 5: Write with unsupported sbaccess size */
3247 uint32_t sbaccess128 = get_field(sbcs_orig, DMI_SBCS_SBACCESS128);
3248
3249 if (sbaccess128) {
3250 LOG_INFO("System Bus Access Test 5: SBCS sbaccess error test PASSED, all sbaccess sizes supported.");
3251 } else {
3252 sbcs = set_field(sbcs_orig, DMI_SBCS_SBACCESS, 4);
3253
3254 write_memory_sba_simple(target, legal_address, test_patterns, 1, sbcs);
3255
3256 dmi_read(target, &rd_val, DMI_SBCS);
3257 if (get_field(rd_val, DMI_SBCS_SBERROR) == 4) {
3258 sbcs = set_field(sbcs_orig, DMI_SBCS_SBERROR, 4);
3259 dmi_write(target, DMI_SBCS, sbcs);
3260 dmi_read(target, &rd_val, DMI_SBCS);
3261 if (get_field(rd_val, DMI_SBCS_SBERROR) == 0)
3262 LOG_INFO("System Bus Access Test 5: SBCS sbaccess error test PASSED.");
3263 else {
3264 LOG_ERROR("System Bus Access Test 5: SBCS sbaccess error test FAILED, unable to clear to 0.");
3265 tests_failed++;
3266 }
3267 } else {
3268 LOG_ERROR("System Bus Access Test 5: SBCS sbaccess error test FAILED, unable to set error code.");
3269 tests_failed++;
3270 }
3271 }
3272
3273 /* Test 6: Write to misaligned address */
3274 sbcs = set_field(sbcs_orig, DMI_SBCS_SBACCESS, 1);
3275
3276 write_memory_sba_simple(target, legal_address+1, test_patterns, 1, sbcs);
3277
3278 dmi_read(target, &rd_val, DMI_SBCS);
3279 if (get_field(rd_val, DMI_SBCS_SBERROR) == 3) {
3280 sbcs = set_field(sbcs_orig, DMI_SBCS_SBERROR, 3);
3281 dmi_write(target, DMI_SBCS, sbcs);
3282 dmi_read(target, &rd_val, DMI_SBCS);
3283 if (get_field(rd_val, DMI_SBCS_SBERROR) == 0)
3284 LOG_INFO("System Bus Access Test 6: SBCS address alignment error test PASSED");
3285 else {
3286 LOG_ERROR("System Bus Access Test 6: SBCS address alignment error test FAILED, unable to clear to 0.");
3287 tests_failed++;
3288 }
3289 } else {
3290 LOG_ERROR("System Bus Access Test 6: SBCS address alignment error test FAILED, unable to set error code.");
3291 tests_failed++;
3292 }
3293
3294 /* Test 7: Set sbbusyerror, only run this case in simulation as it is likely
3295 * impossible to hit otherwise */
3296 if (run_sbbusyerror_test) {
3297 sbcs = set_field(sbcs_orig, DMI_SBCS_SBREADONADDR, 1);
3298 dmi_write(target, DMI_SBCS, sbcs);
3299
3300 for (int i = 0; i < 16; i++)
3301 dmi_write(target, DMI_SBDATA0, 0xdeadbeef);
3302
3303 for (int i = 0; i < 16; i++)
3304 dmi_write(target, DMI_SBADDRESS0, legal_address);
3305
3306 dmi_read(target, &rd_val, DMI_SBCS);
3307 if (get_field(rd_val, DMI_SBCS_SBBUSYERROR)) {
3308 sbcs = set_field(sbcs_orig, DMI_SBCS_SBBUSYERROR, 1);
3309 dmi_write(target, DMI_SBCS, sbcs);
3310 dmi_read(target, &rd_val, DMI_SBCS);
3311 if (get_field(rd_val, DMI_SBCS_SBBUSYERROR) == 0)
3312 LOG_INFO("System Bus Access Test 7: SBCS sbbusyerror test PASSED.");
3313 else {
3314 LOG_ERROR("System Bus Access Test 7: SBCS sbbusyerror test FAILED, unable to clear to 0.");
3315 tests_failed++;
3316 }
3317 } else {
3318 LOG_ERROR("System Bus Access Test 7: SBCS sbbusyerror test FAILED, unable to set error code.");
3319 tests_failed++;
3320 }
3321 }
3322
3323 if (tests_failed == 0) {
3324 LOG_INFO("ALL TESTS PASSED");
3325 return ERROR_OK;
3326 } else {
3327 LOG_ERROR("%d TESTS FAILED", tests_failed);
3328 return ERROR_FAIL;
3329 }
3330
3331 }
3332
3333 void write_memory_sba_simple(struct target *target, target_addr_t addr,
3334 uint32_t *write_data, uint32_t write_size, uint32_t sbcs)
3335 {
3336 RISCV013_INFO(info);
3337
3338 uint32_t rd_sbcs;
3339 uint32_t masked_addr;
3340
3341 uint32_t sba_size = get_field(info->sbcs, DMI_SBCS_SBASIZE);
3342
3343 read_sbcs_nonbusy(target, &rd_sbcs);
3344
3345 uint32_t sbcs_no_readonaddr = set_field(sbcs, DMI_SBCS_SBREADONADDR, 0);
3346 dmi_write(target, DMI_SBCS, sbcs_no_readonaddr);
3347
3348 for (uint32_t i = 0; i < sba_size/32; i++) {
3349 masked_addr = (addr >> 32*i) & 0xffffffff;
3350
3351 if (i != 3)
3352 dmi_write(target, DMI_SBADDRESS0+i, masked_addr);
3353 else
3354 dmi_write(target, DMI_SBADDRESS3, masked_addr);
3355 }
3356
3357 /* Write SBDATA registers starting with highest address, since write to
3358 * SBDATA0 triggers write */
3359 for (int i = write_size-1; i >= 0; i--)
3360 dmi_write(target, DMI_SBDATA0+i, write_data[i]);
3361 }
3362
3363 void read_memory_sba_simple(struct target *target, target_addr_t addr,
3364 uint32_t *rd_buf, uint32_t read_size, uint32_t sbcs)
3365 {
3366 RISCV013_INFO(info);
3367
3368 uint32_t rd_sbcs;
3369 uint32_t masked_addr;
3370
3371 uint32_t sba_size = get_field(info->sbcs, DMI_SBCS_SBASIZE);
3372
3373 read_sbcs_nonbusy(target, &rd_sbcs);
3374
3375 uint32_t sbcs_readonaddr = set_field(sbcs, DMI_SBCS_SBREADONADDR, 1);
3376 dmi_write(target, DMI_SBCS, sbcs_readonaddr);
3377
3378 /* Write addresses starting with highest address register */
3379 for (int i = sba_size/32-1; i >= 0; i--) {
3380 masked_addr = (addr >> 32*i) & 0xffffffff;
3381
3382 if (i != 3)
3383 dmi_write(target, DMI_SBADDRESS0+i, masked_addr);
3384 else
3385 dmi_write(target, DMI_SBADDRESS3, masked_addr);
3386 }
3387
3388 read_sbcs_nonbusy(target, &rd_sbcs);
3389
3390 for (uint32_t i = 0; i < read_size; i++)
3391 dmi_read(target, &(rd_buf[i]), DMI_SBDATA0+i);
3392 }
3393
3394 int riscv013_dmi_write_u64_bits(struct target *target)
3395 {
3396 RISCV013_INFO(info);
3397 return info->abits + DTM_DMI_DATA_LENGTH + DTM_DMI_OP_LENGTH;
3398 }
3399
3400 static int maybe_execute_fence_i(struct target *target)
3401 {
3402 RISCV013_INFO(info);
3403 RISCV_INFO(r);
3404 if (info->progbufsize + r->impebreak >= 3)
3405 return execute_fence(target);
3406 return ERROR_OK;
3407 }
3408
3409 /* Helper Functions. */
3410 static int riscv013_on_step_or_resume(struct target *target, bool step)
3411 {
3412 if (maybe_execute_fence_i(target) != ERROR_OK)
3413 return ERROR_FAIL;
3414
3415 /* We want to twiddle some bits in the debug CSR so debugging works. */
3416 riscv_reg_t dcsr;
3417 int result = register_read(target, &dcsr, GDB_REGNO_DCSR);
3418 if (result != ERROR_OK)
3419 return result;
3420 dcsr = set_field(dcsr, CSR_DCSR_STEP, step);
3421 dcsr = set_field(dcsr, CSR_DCSR_EBREAKM, 1);
3422 dcsr = set_field(dcsr, CSR_DCSR_EBREAKS, 1);
3423 dcsr = set_field(dcsr, CSR_DCSR_EBREAKU, 1);
3424 return riscv_set_register(target, GDB_REGNO_DCSR, dcsr);
3425 }
3426
3427 static int riscv013_step_or_resume_current_hart(struct target *target, bool step)
3428 {
3429 RISCV_INFO(r);
3430 LOG_DEBUG("resuming hart %d (for step?=%d)", r->current_hartid, step);
3431 if (!riscv_is_halted(target)) {
3432 LOG_ERROR("Hart %d is not halted!", r->current_hartid);
3433 return ERROR_FAIL;
3434 }
3435
3436 if (maybe_execute_fence_i(target) != ERROR_OK)
3437 return ERROR_FAIL;
3438
3439 /* Issue the resume command, and then wait for the current hart to resume. */
3440 uint32_t dmcontrol = DMI_DMCONTROL_DMACTIVE;
3441 dmcontrol = set_hartsel(dmcontrol, r->current_hartid);
3442 dmi_write(target, DMI_DMCONTROL, dmcontrol | DMI_DMCONTROL_RESUMEREQ);
3443
3444 uint32_t dmstatus;
3445 for (size_t i = 0; i < 256; ++i) {
3446 usleep(10);
3447 if (dmstatus_read(target, &dmstatus, true) != ERROR_OK)
3448 return ERROR_FAIL;
3449 if (get_field(dmstatus, DMI_DMSTATUS_ALLRESUMEACK) == 0)
3450 continue;
3451 if (step && get_field(dmstatus, DMI_DMSTATUS_ALLHALTED) == 0)
3452 continue;
3453
3454 dmi_write(target, DMI_DMCONTROL, dmcontrol);
3455 return ERROR_OK;
3456 }
3457
3458 LOG_ERROR("unable to resume hart %d", r->current_hartid);
3459 if (dmi_read(target, &dmcontrol, DMI_DMCONTROL) != ERROR_OK)
3460 return ERROR_FAIL;
3461 LOG_ERROR(" dmcontrol=0x%08x", dmcontrol);
3462 if (dmstatus_read(target, &dmstatus, true) != ERROR_OK)
3463 return ERROR_FAIL;
3464 LOG_ERROR(" dmstatus =0x%08x", dmstatus);
3465
3466 if (step) {
3467 LOG_ERROR(" was stepping, halting");
3468 riscv013_halt_current_hart(target);
3469 return ERROR_OK;
3470 }
3471
3472 return ERROR_FAIL;
3473 }
3474
3475 void riscv013_clear_abstract_error(struct target *target)
3476 {
3477 /* Wait for busy to go away. */
3478 time_t start = time(NULL);
3479 uint32_t abstractcs;
3480 dmi_read(target, &abstractcs, DMI_ABSTRACTCS);
3481 while (get_field(abstractcs, DMI_ABSTRACTCS_BUSY)) {
3482 dmi_read(target, &abstractcs, DMI_ABSTRACTCS);
3483
3484 if (time(NULL) - start > riscv_command_timeout_sec) {
3485 LOG_ERROR("abstractcs.busy is not going low after %d seconds "
3486 "(abstractcs=0x%x). The target is either really slow or "
3487 "broken. You could increase the timeout with riscv "
3488 "set_command_timeout_sec.",
3489 riscv_command_timeout_sec, abstractcs);
3490 break;
3491 }
3492 }
3493 /* Clear the error status. */
3494 dmi_write(target, DMI_ABSTRACTCS, abstractcs & DMI_ABSTRACTCS_CMDERR);
3495 }
3496
3497 #define COMPLIANCE_TEST(b, message) \
3498 { \
3499 int pass = 0; \
3500 if (b) { \
3501 pass = 1; \
3502 passed_tests++; \
3503 } \
3504 LOG_INFO("%s test %d (%s)\n", (pass) ? "PASSED" : "FAILED", total_tests, message); \
3505 assert(pass); \
3506 total_tests++; \
3507 }
3508
3509 #define COMPLIANCE_MUST_PASS(b) COMPLIANCE_TEST(ERROR_OK == (b), "Regular calls must return ERROR_OK")
3510
3511 #define COMPLIANCE_READ(target, addr, value) COMPLIANCE_MUST_PASS(dmi_read(target, addr, value))
3512 #define COMPLIANCE_WRITE(target, addr, value) COMPLIANCE_MUST_PASS(dmi_write(target, addr, value))
3513
3514 #define COMPLIANCE_CHECK_RO(target, addr) \
3515 { \
3516 uint32_t orig; \
3517 uint32_t inverse; \
3518 COMPLIANCE_READ(target, &orig, addr); \
3519 COMPLIANCE_WRITE(target, addr, ~orig); \
3520 COMPLIANCE_READ(target, &inverse, addr); \
3521 COMPLIANCE_TEST(orig == inverse, "Register must be read-only"); \
3522 }
3523
3524 int riscv013_test_compliance(struct target *target)
3525 {
3526 LOG_INFO("Testing Compliance against RISC-V Debug Spec v0.13");
3527
3528 if (!riscv_rtos_enabled(target)) {
3529 LOG_ERROR("Please run with -rtos riscv to run compliance test.");
3530 return ERROR_FAIL;
3531 }
3532
3533 int total_tests = 0;
3534 int passed_tests = 0;
3535
3536 uint32_t dmcontrol_orig = DMI_DMCONTROL_DMACTIVE;
3537 uint32_t dmcontrol;
3538 uint32_t testvar;
3539 uint32_t testvar_read;
3540 riscv_reg_t value;
3541 RISCV013_INFO(info);
3542
3543 /* All the bits of HARTSEL are covered by the examine sequence. */
3544
3545 /* hartreset */
3546 /* This field is optional. Either we can read and write it to 1/0,
3547 or it is tied to 0. This check doesn't really do anything, but
3548 it does attempt to set the bit to 1 and then back to 0, which needs to
3549 work if its implemented. */
3550 COMPLIANCE_WRITE(target, DMI_DMCONTROL, set_field(dmcontrol_orig, DMI_DMCONTROL_HARTRESET, 1));
3551 COMPLIANCE_WRITE(target, DMI_DMCONTROL, set_field(dmcontrol_orig, DMI_DMCONTROL_HARTRESET, 0));
3552 COMPLIANCE_READ(target, &dmcontrol, DMI_DMCONTROL);
3553 COMPLIANCE_TEST((get_field(dmcontrol, DMI_DMCONTROL_HARTRESET) == 0),
3554 "DMCONTROL.hartreset can be 0 or RW.");
3555
3556 /* hasel */
3557 COMPLIANCE_WRITE(target, DMI_DMCONTROL, set_field(dmcontrol_orig, DMI_DMCONTROL_HASEL, 1));
3558 COMPLIANCE_WRITE(target, DMI_DMCONTROL, set_field(dmcontrol_orig, DMI_DMCONTROL_HASEL, 0));
3559 COMPLIANCE_READ(target, &dmcontrol, DMI_DMCONTROL);
3560 COMPLIANCE_TEST((get_field(dmcontrol, DMI_DMCONTROL_HASEL) == 0),
3561 "DMCONTROL.hasel can be 0 or RW.");
3562 /* TODO: test that hamask registers exist if hasel does. */
3563
3564 /* haltreq */
3565 COMPLIANCE_MUST_PASS(riscv_halt_all_harts(target));
3566 /* This bit is not actually readable according to the spec, so nothing to check.*/
3567
3568 /* DMSTATUS */
3569 COMPLIANCE_CHECK_RO(target, DMI_DMSTATUS);
3570
3571 /* resumereq */
3572 /* This bit is not actually readable according to the spec, so nothing to check.*/
3573 COMPLIANCE_MUST_PASS(riscv_resume_all_harts(target));
3574
3575 /* Halt all harts again so the test can continue.*/
3576 COMPLIANCE_MUST_PASS(riscv_halt_all_harts(target));
3577
3578 /* HARTINFO: Read-Only. This is per-hart, so need to adjust hartsel. */
3579 uint32_t hartinfo;
3580 COMPLIANCE_READ(target, &hartinfo, DMI_HARTINFO);
3581 for (int hartsel = 0; hartsel < riscv_count_harts(target); hartsel++) {
3582 COMPLIANCE_MUST_PASS(riscv_set_current_hartid(target, hartsel));
3583
3584 COMPLIANCE_CHECK_RO(target, DMI_HARTINFO);
3585
3586 /* $dscratch CSRs */
3587 uint32_t nscratch = get_field(hartinfo, DMI_HARTINFO_NSCRATCH);
3588 for (unsigned int d = 0; d < nscratch; d++) {
3589 riscv_reg_t testval, testval_read;
3590 /* Because DSCRATCH is not guaranteed to last across PB executions, need to put
3591 this all into one PB execution. Which may not be possible on all implementations.*/
3592 if (info->progbufsize >= 5) {
3593 for (testval = 0x0011223300112233;
3594 testval != 0xDEAD;
3595 testval = testval == 0x0011223300112233 ? ~testval : 0xDEAD) {
3596 COMPLIANCE_TEST(register_write_direct(target, GDB_REGNO_S0, testval) == ERROR_OK,
3597 "Need to be able to write S0 in order to test DSCRATCH.");
3598 struct riscv_program program32;
3599 riscv_program_init(&program32, target);
3600 riscv_program_csrw(&program32, GDB_REGNO_S0, GDB_REGNO_DSCRATCH + d);
3601 riscv_program_csrr(&program32, GDB_REGNO_S1, GDB_REGNO_DSCRATCH + d);
3602 riscv_program_fence(&program32);
3603 riscv_program_ebreak(&program32);
3604 COMPLIANCE_TEST(riscv_program_exec(&program32, target) == ERROR_OK,
3605 "Accessing DSCRATCH with program buffer should succeed.");
3606 COMPLIANCE_TEST(register_read_direct(target, &testval_read, GDB_REGNO_S1) == ERROR_OK,
3607 "Need to be able to read S1 in order to test DSCRATCH.");
3608 if (riscv_xlen(target) > 32) {
3609 COMPLIANCE_TEST(testval == testval_read,
3610 "All DSCRATCH registers in HARTINFO must be R/W.");
3611 } else {
3612 COMPLIANCE_TEST(testval_read == (testval & 0xFFFFFFFF),
3613 "All DSCRATCH registers in HARTINFO must be R/W.");
3614 }
3615 }
3616 }
3617 }
3618 /* TODO: dataaccess */
3619 if (get_field(hartinfo, DMI_HARTINFO_DATAACCESS)) {
3620 /* TODO: Shadowed in memory map. */
3621 /* TODO: datasize */
3622 /* TODO: dataaddr */
3623 } else {
3624 /* TODO: Shadowed in CSRs. */
3625 /* TODO: datasize */
3626 /* TODO: dataaddr */
3627 }
3628
3629 }
3630
3631 /* HALTSUM -- TODO: More than 32 harts. Would need to loop over this to set hartsel */
3632 /* TODO: HALTSUM2, HALTSUM3 */
3633 /* HALTSUM0 */
3634 uint32_t expected_haltsum0 = 0;
3635 for (int i = 0; i < MIN(riscv_count_harts(target), 32); i++)
3636 expected_haltsum0 |= (1 << i);
3637
3638 COMPLIANCE_READ(target, &testvar_read, DMI_HALTSUM0);
3639 COMPLIANCE_TEST(testvar_read == expected_haltsum0,
3640 "HALTSUM0 should report summary of up to 32 halted harts");
3641
3642 COMPLIANCE_WRITE(target, DMI_HALTSUM0, 0xffffffff);
3643 COMPLIANCE_READ(target, &testvar_read, DMI_HALTSUM0);
3644 COMPLIANCE_TEST(testvar_read == expected_haltsum0, "HALTSUM0 should be R/O");
3645
3646 COMPLIANCE_WRITE(target, DMI_HALTSUM0, 0x0);
3647 COMPLIANCE_READ(target, &testvar_read, DMI_HALTSUM0);
3648 COMPLIANCE_TEST(testvar_read == expected_haltsum0, "HALTSUM0 should be R/O");
3649
3650 /* HALTSUM1 */
3651 uint32_t expected_haltsum1 = 0;
3652 for (int i = 0; i < MIN(riscv_count_harts(target), 1024); i += 32)
3653 expected_haltsum1 |= (1 << (i/32));
3654
3655 COMPLIANCE_READ(target, &testvar_read, DMI_HALTSUM1);
3656 COMPLIANCE_TEST(testvar_read == expected_haltsum1,
3657 "HALTSUM1 should report summary of up to 1024 halted harts");
3658
3659 COMPLIANCE_WRITE(target, DMI_HALTSUM1, 0xffffffff);
3660 COMPLIANCE_READ(target, &testvar_read, DMI_HALTSUM1);
3661 COMPLIANCE_TEST(testvar_read == expected_haltsum1, "HALTSUM1 should be R/O");
3662
3663 COMPLIANCE_WRITE(target, DMI_HALTSUM1, 0x0);
3664 COMPLIANCE_READ(target, &testvar_read, DMI_HALTSUM1);
3665 COMPLIANCE_TEST(testvar_read == expected_haltsum1, "HALTSUM1 should be R/O");
3666
3667 /* TODO: HAWINDOWSEL */
3668
3669 /* TODO: HAWINDOW */
3670
3671 /* ABSTRACTCS */
3672
3673 uint32_t abstractcs;
3674 COMPLIANCE_READ(target, &abstractcs, DMI_ABSTRACTCS);
3675
3676 /* Check that all reported Data Words are really R/W */
3677 for (int invert = 0; invert < 2; invert++) {
3678 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_DATACOUNT); i++) {
3679 testvar = (i + 1) * 0x11111111;
3680 if (invert)
3681 testvar = ~testvar;
3682 COMPLIANCE_WRITE(target, DMI_DATA0 + i, testvar);
3683 }
3684 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_DATACOUNT); i++) {
3685 testvar = (i + 1) * 0x11111111;
3686 if (invert)
3687 testvar = ~testvar;
3688 COMPLIANCE_READ(target, &testvar_read, DMI_DATA0 + i);
3689 COMPLIANCE_TEST(testvar_read == testvar, "All reported DATA words must be R/W");
3690 }
3691 }
3692
3693 /* Check that all reported ProgBuf words are really R/W */
3694 for (int invert = 0; invert < 2; invert++) {
3695 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_PROGBUFSIZE); i++) {
3696 testvar = (i + 1) * 0x11111111;
3697 if (invert)
3698 testvar = ~testvar;
3699 COMPLIANCE_WRITE(target, DMI_PROGBUF0 + i, testvar);
3700 }
3701 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_PROGBUFSIZE); i++) {
3702 testvar = (i + 1) * 0x11111111;
3703 if (invert)
3704 testvar = ~testvar;
3705 COMPLIANCE_READ(target, &testvar_read, DMI_PROGBUF0 + i);
3706 COMPLIANCE_TEST(testvar_read == testvar, "All reported PROGBUF words must be R/W");
3707 }
3708 }
3709
3710 /* TODO: Cause and clear all error types */
3711
3712 /* COMMAND
3713 According to the spec, this register is only W, so can't really check the read result.
3714 But at any rate, this is not legal and should cause an error. */
3715 COMPLIANCE_WRITE(target, DMI_COMMAND, 0xAAAAAAAA);
3716 COMPLIANCE_READ(target, &testvar_read, DMI_ABSTRACTCS);
3717 COMPLIANCE_TEST(get_field(testvar_read, DMI_ABSTRACTCS_CMDERR) == CMDERR_NOT_SUPPORTED, \
3718 "Illegal COMMAND should result in UNSUPPORTED");
3719 COMPLIANCE_WRITE(target, DMI_ABSTRACTCS, DMI_ABSTRACTCS_CMDERR);
3720
3721 COMPLIANCE_WRITE(target, DMI_COMMAND, 0x55555555);
3722 COMPLIANCE_READ(target, &testvar_read, DMI_ABSTRACTCS);
3723 COMPLIANCE_TEST(get_field(testvar_read, DMI_ABSTRACTCS_CMDERR) == CMDERR_NOT_SUPPORTED, \
3724 "Illegal COMMAND should result in UNSUPPORTED");
3725 COMPLIANCE_WRITE(target, DMI_ABSTRACTCS, DMI_ABSTRACTCS_CMDERR);
3726
3727 /* Basic Abstract Commands */
3728 for (unsigned int i = 1; i < 32; i = i << 1) {
3729 riscv_reg_t testval = i | ((i + 1ULL) << 32);
3730 riscv_reg_t testval_read;
3731 COMPLIANCE_TEST(ERROR_OK == register_write_direct(target, GDB_REGNO_ZERO + i, testval),
3732 "GPR Writes should be supported.");
3733 COMPLIANCE_MUST_PASS(write_abstract_arg(target, 0, 0xDEADBEEFDEADBEEF, 64));
3734 COMPLIANCE_TEST(ERROR_OK == register_read_direct(target, &testval_read, GDB_REGNO_ZERO + i),
3735 "GPR Reads should be supported.");
3736 if (riscv_xlen(target) > 32) {
3737 /* Dummy comment to satisfy linter, since removing the brances here doesn't actually compile. */
3738 COMPLIANCE_TEST(testval == testval_read, "GPR Reads and writes should be supported.");
3739 } else {
3740 /* Dummy comment to satisfy linter, since removing the brances here doesn't actually compile. */
3741 COMPLIANCE_TEST((testval & 0xFFFFFFFF) == testval_read, "GPR Reads and writes should be supported.");
3742 }
3743 }
3744
3745 /* ABSTRACTAUTO
3746 See which bits are actually writable */
3747 COMPLIANCE_WRITE(target, DMI_ABSTRACTAUTO, 0xFFFFFFFF);
3748 uint32_t abstractauto;
3749 uint32_t busy;
3750 COMPLIANCE_READ(target, &abstractauto, DMI_ABSTRACTAUTO);
3751 COMPLIANCE_WRITE(target, DMI_ABSTRACTAUTO, 0x0);
3752 if (abstractauto > 0) {
3753 /* This mechanism only works when you have a reasonable sized progbuf, which is not
3754 a true compliance requirement. */
3755 if (info->progbufsize >= 3) {
3756
3757 testvar = 0;
3758 COMPLIANCE_TEST(ERROR_OK == register_write_direct(target, GDB_REGNO_S0, 0),
3759 "Need to be able to write S0 to test ABSTRACTAUTO");
3760 struct riscv_program program;
3761 COMPLIANCE_MUST_PASS(riscv_program_init(&program, target));
3762 /* This is also testing that WFI() is a NOP during debug mode. */
3763 COMPLIANCE_MUST_PASS(riscv_program_insert(&program, wfi()));
3764 COMPLIANCE_MUST_PASS(riscv_program_addi(&program, GDB_REGNO_S0, GDB_REGNO_S0, 1));
3765 COMPLIANCE_MUST_PASS(riscv_program_ebreak(&program));
3766 COMPLIANCE_WRITE(target, DMI_ABSTRACTAUTO, 0x0);
3767 COMPLIANCE_MUST_PASS(riscv_program_exec(&program, target));
3768 testvar++;
3769 COMPLIANCE_WRITE(target, DMI_ABSTRACTAUTO, 0xFFFFFFFF);
3770 COMPLIANCE_READ(target, &abstractauto, DMI_ABSTRACTAUTO);
3771 uint32_t autoexec_data = get_field(abstractauto, DMI_ABSTRACTAUTO_AUTOEXECDATA);
3772 uint32_t autoexec_progbuf = get_field(abstractauto, DMI_ABSTRACTAUTO_AUTOEXECPROGBUF);
3773 for (unsigned int i = 0; i < 12; i++) {
3774 COMPLIANCE_READ(target, &testvar_read, DMI_DATA0 + i);
3775 do {
3776 COMPLIANCE_READ(target, &testvar_read, DMI_ABSTRACTCS);
3777 busy = get_field(testvar_read, DMI_ABSTRACTCS_BUSY);
3778 } while (busy);
3779 if (autoexec_data & (1 << i)) {
3780 COMPLIANCE_TEST(i < get_field(abstractcs, DMI_ABSTRACTCS_DATACOUNT),
3781 "AUTOEXEC may be writable up to DATACOUNT bits.");
3782 testvar++;
3783 }
3784 }
3785 for (unsigned int i = 0; i < 16; i++) {
3786 COMPLIANCE_READ(target, &testvar_read, DMI_PROGBUF0 + i);
3787 do {
3788 COMPLIANCE_READ(target, &testvar_read, DMI_ABSTRACTCS);
3789 busy = get_field(testvar_read, DMI_ABSTRACTCS_BUSY);
3790 } while (busy);
3791 if (autoexec_progbuf & (1 << i)) {
3792 COMPLIANCE_TEST(i < get_field(abstractcs, DMI_ABSTRACTCS_PROGBUFSIZE),
3793 "AUTOEXEC may be writable up to PROGBUFSIZE bits.");
3794 testvar++;
3795 }
3796 }
3797
3798 COMPLIANCE_WRITE(target, DMI_ABSTRACTAUTO, 0);
3799 COMPLIANCE_TEST(ERROR_OK == register_read_direct(target, &value, GDB_REGNO_S0),
3800 "Need to be able to read S0 to test ABSTRACTAUTO");
3801
3802 COMPLIANCE_TEST(testvar == value,
3803 "ABSTRACTAUTO should cause COMMAND to run the expected number of times.");
3804 }
3805 }
3806
3807 /* Single-Step each hart. */
3808 for (int hartsel = 0; hartsel < riscv_count_harts(target); hartsel++) {
3809 COMPLIANCE_MUST_PASS(riscv_set_current_hartid(target, hartsel));
3810 COMPLIANCE_MUST_PASS(riscv013_on_step(target));
3811 COMPLIANCE_MUST_PASS(riscv013_step_current_hart(target));
3812 COMPLIANCE_TEST(riscv_halt_reason(target, hartsel) == RISCV_HALT_SINGLESTEP,
3813 "Single Step should result in SINGLESTEP");
3814 }
3815
3816 /* Core Register Tests */
3817 uint64_t bogus_dpc = 0xdeadbeef;
3818 for (int hartsel = 0; hartsel < riscv_count_harts(target); hartsel++) {
3819 COMPLIANCE_MUST_PASS(riscv_set_current_hartid(target, hartsel));
3820
3821 /* DCSR Tests */
3822 COMPLIANCE_MUST_PASS(register_write_direct(target, GDB_REGNO_DCSR, 0x0));
3823 COMPLIANCE_MUST_PASS(register_read_direct(target, &value, GDB_REGNO_DCSR));
3824 COMPLIANCE_TEST(value != 0, "Not all bits in DCSR are writable by Debugger");
3825 COMPLIANCE_MUST_PASS(register_write_direct(target, GDB_REGNO_DCSR, 0xFFFFFFFF));
3826 COMPLIANCE_MUST_PASS(register_read_direct(target, &value, GDB_REGNO_DCSR));
3827 COMPLIANCE_TEST(value != 0, "At least some bits in DCSR must be 1");
3828
3829 /* DPC. Note that DPC is sign-extended. */
3830 riscv_reg_t dpcmask = 0xFFFFFFFCUL;
3831 riscv_reg_t dpc;
3832
3833 if (riscv_xlen(target) > 32)
3834 dpcmask |= (0xFFFFFFFFULL << 32);
3835
3836 if (riscv_supports_extension(target, riscv_current_hartid(target), 'C'))
3837 dpcmask |= 0x2;
3838
3839 COMPLIANCE_MUST_PASS(register_write_direct(target, GDB_REGNO_DPC, dpcmask));
3840 COMPLIANCE_MUST_PASS(register_read_direct(target, &dpc, GDB_REGNO_DPC));
3841 COMPLIANCE_TEST(dpcmask == dpc,
3842 "DPC must be sign-extended to XLEN and writable to all-1s (except the least significant bits)");
3843 COMPLIANCE_MUST_PASS(register_write_direct(target, GDB_REGNO_DPC, 0));
3844 COMPLIANCE_MUST_PASS(register_read_direct(target, &dpc, GDB_REGNO_DPC));
3845 COMPLIANCE_TEST(dpc == 0, "DPC must be writable to 0.");
3846 if (hartsel == 0)
3847 bogus_dpc = dpc; /* For a later test step */
3848 }
3849
3850 /* NDMRESET
3851 Asserting non-debug module reset should not reset Debug Module state.
3852 But it should reset Hart State, e.g. DPC should get a different value.
3853 Also make sure that DCSR reports cause of 'HALT' even though previously we single-stepped.
3854 */
3855
3856 /* Write some registers. They should not be impacted by ndmreset. */
3857 COMPLIANCE_WRITE(target, DMI_COMMAND, 0xFFFFFFFF);
3858
3859 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_PROGBUFSIZE); i++) {
3860 testvar = (i + 1) * 0x11111111;
3861 COMPLIANCE_WRITE(target, DMI_PROGBUF0 + i, testvar);
3862 }
3863
3864 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_DATACOUNT); i++) {
3865 testvar = (i + 1) * 0x11111111;
3866 COMPLIANCE_WRITE(target, DMI_DATA0 + i, testvar);
3867 }
3868
3869 COMPLIANCE_WRITE(target, DMI_ABSTRACTAUTO, 0xFFFFFFFF);
3870 COMPLIANCE_READ(target, &abstractauto, DMI_ABSTRACTAUTO);
3871
3872 /* Pulse reset. */
3873 target->reset_halt = true;
3874 COMPLIANCE_MUST_PASS(riscv_set_current_hartid(target, 0));
3875 COMPLIANCE_TEST(ERROR_OK == assert_reset(target), "Must be able to assert NDMRESET");
3876 COMPLIANCE_TEST(ERROR_OK == deassert_reset(target), "Must be able to deassert NDMRESET");
3877
3878 /* Verify that most stuff is not affected by ndmreset. */
3879 COMPLIANCE_READ(target, &testvar_read, DMI_ABSTRACTCS);
3880 COMPLIANCE_TEST(get_field(testvar_read, DMI_ABSTRACTCS_CMDERR) == CMDERR_NOT_SUPPORTED,
3881 "NDMRESET should not affect DMI_ABSTRACTCS");
3882 COMPLIANCE_READ(target, &testvar_read, DMI_ABSTRACTAUTO);
3883 COMPLIANCE_TEST(testvar_read == abstractauto, "NDMRESET should not affect DMI_ABSTRACTAUTO");
3884
3885 /* Clean up to avoid future test failures */
3886 COMPLIANCE_WRITE(target, DMI_ABSTRACTCS, DMI_ABSTRACTCS_CMDERR);
3887 COMPLIANCE_WRITE(target, DMI_ABSTRACTAUTO, 0);
3888
3889 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_PROGBUFSIZE); i++) {
3890 testvar = (i + 1) * 0x11111111;
3891 COMPLIANCE_READ(target, &testvar_read, DMI_PROGBUF0 + i);
3892 COMPLIANCE_TEST(testvar_read == testvar, "PROGBUF words must not be affected by NDMRESET");
3893 }
3894
3895 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_DATACOUNT); i++) {
3896 testvar = (i + 1) * 0x11111111;
3897 COMPLIANCE_READ(target, &testvar_read, DMI_DATA0 + i);
3898 COMPLIANCE_TEST(testvar_read == testvar, "DATA words must not be affected by NDMRESET");
3899 }
3900
3901 /* Verify that DPC *is* affected by ndmreset. Since we don't know what it *should* be,
3902 just verify that at least it's not the bogus value anymore. */
3903
3904 COMPLIANCE_TEST(bogus_dpc != 0xdeadbeef, "BOGUS DPC should have been set somehow (bug in compliance test)");
3905 COMPLIANCE_MUST_PASS(register_read_direct(target, &value, GDB_REGNO_DPC));
3906 COMPLIANCE_TEST(bogus_dpc != value, "NDMRESET should move DPC to reset value.");
3907
3908 COMPLIANCE_TEST(riscv_halt_reason(target, 0) == RISCV_HALT_INTERRUPT,
3909 "After NDMRESET halt, DCSR should report cause of halt");
3910
3911 /* DMACTIVE -- deasserting DMACTIVE should reset all the above values. */
3912
3913 /* Toggle dmactive */
3914 COMPLIANCE_WRITE(target, DMI_DMCONTROL, 0);
3915 COMPLIANCE_WRITE(target, DMI_DMCONTROL, DMI_DMCONTROL_DMACTIVE);
3916 COMPLIANCE_READ(target, &testvar_read, DMI_ABSTRACTCS);
3917 COMPLIANCE_TEST(get_field(testvar_read, DMI_ABSTRACTCS_CMDERR) == 0, "ABSTRACTCS.cmderr should reset to 0");
3918 COMPLIANCE_READ(target, &testvar_read, DMI_ABSTRACTAUTO);
3919 COMPLIANCE_TEST(testvar_read == 0, "ABSTRACTAUTO should reset to 0");
3920
3921 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_PROGBUFSIZE); i++) {
3922 COMPLIANCE_READ(target, &testvar_read, DMI_PROGBUF0 + i);
3923 COMPLIANCE_TEST(testvar_read == 0, "PROGBUF words should reset to 0");
3924 }
3925
3926 for (unsigned int i = 0; i < get_field(abstractcs, DMI_ABSTRACTCS_DATACOUNT); i++) {
3927 COMPLIANCE_READ(target, &testvar_read, DMI_DATA0 + i);
3928 COMPLIANCE_TEST(testvar_read == 0, "DATA words should reset to 0");
3929 }
3930
3931 /*
3932 * TODO:
3933 * DCSR.cause priorities
3934 * DCSR.stoptime/stopcycle
3935 * DCSR.stepie
3936 * DCSR.ebreak
3937 * DCSR.prv
3938 */
3939
3940 /* Halt every hart for any follow-up tests*/
3941 COMPLIANCE_MUST_PASS(riscv_halt_all_harts(target));
3942
3943 uint32_t failed_tests = total_tests - passed_tests;
3944 if (total_tests == passed_tests) {
3945 LOG_INFO("ALL TESTS PASSED\n");
3946 return ERROR_OK;
3947 } else {
3948 LOG_INFO("%d TESTS FAILED\n", failed_tests);
3949 return ERROR_FAIL;
3950 }
3951 }

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)