drivers/ulink: Group adapter commands
[openocd.git] / src / target / esirisc.c
blobe49f5f6596fc3ea0a36d9b95d599cc2b5d8fdd78
1 /***************************************************************************
2 * Copyright (C) 2018 by Square, Inc. *
3 * Steven Stallion <stallion@squareup.com> *
4 * James Zhao <hjz@squareup.com> *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
18 ***************************************************************************/
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
24 #include <helper/binarybuffer.h>
25 #include <helper/command.h>
26 #include <helper/log.h>
27 #include <helper/time_support.h>
28 #include <helper/types.h>
29 #include <jtag/interface.h>
30 #include <target/breakpoints.h>
31 #include <target/register.h>
32 #include <target/target.h>
33 #include <target/target_type.h>
35 #include "esirisc.h"
37 #define RESET_TIMEOUT 5000 /* 5s */
38 #define STEP_TIMEOUT 1000 /* 1s */
41 * eSi-RISC targets support a configurable number of interrupts;
42 * up to 32 interrupts are supported.
44 static const char * const esirisc_exception_strings[] = {
45 [EID_RESET] = "Reset",
46 [EID_HARDWARE_FAILURE] = "HardwareFailure",
47 [EID_NMI] = "NMI",
48 [EID_INST_BREAKPOINT] = "InstBreakpoint",
49 [EID_DATA_BREAKPOINT] = "DataBreakpoint",
50 [EID_UNSUPPORTED] = "Unsupported",
51 [EID_PRIVILEGE_VIOLATION] = "PrivilegeViolation",
52 [EID_INST_BUS_ERROR] = "InstBusError",
53 [EID_DATA_BUS_ERROR] = "DataBusError",
54 [EID_ALIGNMENT_ERROR] = "AlignmentError",
55 [EID_ARITHMETIC_ERROR] = "ArithmeticError",
56 [EID_SYSTEM_CALL] = "SystemCall",
57 [EID_MEMORY_MANAGEMENT] = "MemoryManagement",
58 [EID_UNRECOVERABLE] = "Unrecoverable",
59 [EID_INTERRUPT_N+0] = "Interrupt0",
60 [EID_INTERRUPT_N+1] = "Interrupt1",
61 [EID_INTERRUPT_N+2] = "Interrupt2",
62 [EID_INTERRUPT_N+3] = "Interrupt3",
63 [EID_INTERRUPT_N+4] = "Interrupt4",
64 [EID_INTERRUPT_N+5] = "Interrupt5",
65 [EID_INTERRUPT_N+6] = "Interrupt6",
66 [EID_INTERRUPT_N+7] = "Interrupt7",
67 [EID_INTERRUPT_N+8] = "Interrupt8",
68 [EID_INTERRUPT_N+9] = "Interrupt9",
69 [EID_INTERRUPT_N+10] = "Interrupt10",
70 [EID_INTERRUPT_N+11] = "Interrupt11",
71 [EID_INTERRUPT_N+12] = "Interrupt12",
72 [EID_INTERRUPT_N+13] = "Interrupt13",
73 [EID_INTERRUPT_N+14] = "Interrupt14",
74 [EID_INTERRUPT_N+15] = "Interrupt15",
75 [EID_INTERRUPT_N+16] = "Interrupt16",
76 [EID_INTERRUPT_N+17] = "Interrupt17",
77 [EID_INTERRUPT_N+18] = "Interrupt18",
78 [EID_INTERRUPT_N+19] = "Interrupt19",
79 [EID_INTERRUPT_N+20] = "Interrupt20",
80 [EID_INTERRUPT_N+21] = "Interrupt21",
81 [EID_INTERRUPT_N+22] = "Interrupt22",
82 [EID_INTERRUPT_N+23] = "Interrupt23",
83 [EID_INTERRUPT_N+24] = "Interrupt24",
84 [EID_INTERRUPT_N+25] = "Interrupt25",
85 [EID_INTERRUPT_N+26] = "Interrupt26",
86 [EID_INTERRUPT_N+27] = "Interrupt27",
87 [EID_INTERRUPT_N+28] = "Interrupt28",
88 [EID_INTERRUPT_N+29] = "Interrupt29",
89 [EID_INTERRUPT_N+30] = "Interrupt30",
90 [EID_INTERRUPT_N+31] = "Interrupt31",
94 * eSi-RISC targets support a configurable number of general purpose
95 * registers; 8, 16, and 32 registers are supported.
97 static const struct {
98 enum esirisc_reg_num number;
99 const char *name;
100 enum reg_type type;
101 const char *group;
102 } esirisc_regs[] = {
103 { ESIRISC_SP, "sp", REG_TYPE_DATA_PTR, "general" },
104 { ESIRISC_RA, "ra", REG_TYPE_INT, "general" },
105 { ESIRISC_R2, "r2", REG_TYPE_INT, "general" },
106 { ESIRISC_R3, "r3", REG_TYPE_INT, "general" },
107 { ESIRISC_R4, "r4", REG_TYPE_INT, "general" },
108 { ESIRISC_R5, "r5", REG_TYPE_INT, "general" },
109 { ESIRISC_R6, "r6", REG_TYPE_INT, "general" },
110 { ESIRISC_R7, "r7", REG_TYPE_INT, "general" },
111 { ESIRISC_R8, "r8", REG_TYPE_INT, "general" },
112 { ESIRISC_R9, "r9", REG_TYPE_INT, "general" },
113 { ESIRISC_R10, "r10", REG_TYPE_INT, "general" },
114 { ESIRISC_R11, "r11", REG_TYPE_INT, "general" },
115 { ESIRISC_R12, "r12", REG_TYPE_INT, "general" },
116 { ESIRISC_R13, "r13", REG_TYPE_INT, "general" },
117 { ESIRISC_R14, "r14", REG_TYPE_INT, "general" },
118 { ESIRISC_R15, "r15", REG_TYPE_INT, "general" },
119 { ESIRISC_R16, "r16", REG_TYPE_INT, "general" },
120 { ESIRISC_R17, "r17", REG_TYPE_INT, "general" },
121 { ESIRISC_R18, "r18", REG_TYPE_INT, "general" },
122 { ESIRISC_R19, "r19", REG_TYPE_INT, "general" },
123 { ESIRISC_R20, "r20", REG_TYPE_INT, "general" },
124 { ESIRISC_R21, "r21", REG_TYPE_INT, "general" },
125 { ESIRISC_R22, "r22", REG_TYPE_INT, "general" },
126 { ESIRISC_R23, "r23", REG_TYPE_INT, "general" },
127 { ESIRISC_R24, "r24", REG_TYPE_INT, "general" },
128 { ESIRISC_R25, "r25", REG_TYPE_INT, "general" },
129 { ESIRISC_R26, "r26", REG_TYPE_INT, "general" },
130 { ESIRISC_R27, "r27", REG_TYPE_INT, "general" },
131 { ESIRISC_R28, "r28", REG_TYPE_INT, "general" },
132 { ESIRISC_R29, "r29", REG_TYPE_INT, "general" },
133 { ESIRISC_R30, "r30", REG_TYPE_INT, "general" },
134 { ESIRISC_R31, "r31", REG_TYPE_INT, "general" },
138 * Control and Status Registers (CSRs) are largely defined as belonging
139 * to the system register group. The exception to this rule are the PC
140 * and CAS registers, which belong to the general group. While debug is
141 * active, EPC, ECAS, and ETC must be used to read and write the PC,
142 * CAS, and TC CSRs, respectively.
144 static const struct {
145 enum esirisc_reg_num number;
146 uint8_t bank;
147 uint8_t csr;
148 const char *name;
149 enum reg_type type;
150 const char *group;
151 } esirisc_csrs[] = {
152 { ESIRISC_PC, CSR_THREAD, CSR_THREAD_EPC, "PC", REG_TYPE_CODE_PTR, "general" }, /* PC -> EPC */
153 { ESIRISC_CAS, CSR_THREAD, CSR_THREAD_ECAS, "CAS", REG_TYPE_INT, "general" }, /* CAS -> ECAS */
154 { ESIRISC_TC, CSR_THREAD, CSR_THREAD_ETC, "TC", REG_TYPE_INT, "system" }, /* TC -> ETC */
155 { ESIRISC_ETA, CSR_THREAD, CSR_THREAD_ETA, "ETA", REG_TYPE_INT, "system" },
156 { ESIRISC_ETC, CSR_THREAD, CSR_THREAD_ETC, "ETC", REG_TYPE_INT, "system" },
157 { ESIRISC_EPC, CSR_THREAD, CSR_THREAD_EPC, "EPC", REG_TYPE_CODE_PTR, "system" },
158 { ESIRISC_ECAS, CSR_THREAD, CSR_THREAD_ECAS, "ECAS", REG_TYPE_INT, "system" },
159 { ESIRISC_EID, CSR_THREAD, CSR_THREAD_EID, "EID", REG_TYPE_INT, "system" },
160 { ESIRISC_ED, CSR_THREAD, CSR_THREAD_ED, "ED", REG_TYPE_INT, "system" },
161 { ESIRISC_IP, CSR_INTERRUPT, CSR_INTERRUPT_IP, "IP", REG_TYPE_INT, "system"},
162 { ESIRISC_IM, CSR_INTERRUPT, CSR_INTERRUPT_IM, "IM", REG_TYPE_INT, "system"},
163 { ESIRISC_IS, CSR_INTERRUPT, CSR_INTERRUPT_IS, "IS", REG_TYPE_INT, "system"},
164 { ESIRISC_IT, CSR_INTERRUPT, CSR_INTERRUPT_IT, "IT", REG_TYPE_INT, "system"},
167 static int esirisc_disable_interrupts(struct target *target)
169 struct esirisc_common *esirisc = target_to_esirisc(target);
170 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
171 uint32_t etc;
172 int retval;
174 LOG_DEBUG("-");
176 retval = esirisc_jtag_read_csr(jtag_info, CSR_THREAD, CSR_THREAD_ETC, &etc);
177 if (retval != ERROR_OK) {
178 LOG_ERROR("%s: failed to read Thread CSR: ETC", target_name(target));
179 return retval;
182 etc &= ~(1<<0); /* TC.I */
184 retval = esirisc_jtag_write_csr(jtag_info, CSR_THREAD, CSR_THREAD_ETC, etc);
185 if (retval != ERROR_OK) {
186 LOG_ERROR("%s: failed to write Thread CSR: ETC", target_name(target));
187 return retval;
190 return ERROR_OK;
193 #if 0
194 static int esirisc_enable_interrupts(struct target *target)
196 struct esirisc_common *esirisc = target_to_esirisc(target);
197 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
198 uint32_t etc;
199 int retval;
201 LOG_DEBUG("-");
203 retval = esirisc_jtag_read_csr(jtag_info, CSR_THREAD, CSR_THREAD_ETC, &etc);
204 if (retval != ERROR_OK) {
205 LOG_ERROR("%s: failed to read Thread CSR: ETC", target_name(target));
206 return retval;
209 etc |= (1<<0); /* TC.I */
211 retval = esirisc_jtag_write_csr(jtag_info, CSR_THREAD, CSR_THREAD_ETC, etc);
212 if (retval != ERROR_OK) {
213 LOG_ERROR("%s: failed to write Thread CSR: ETC", target_name(target));
214 return retval;
217 return ERROR_OK;
219 #endif
221 static int esirisc_save_interrupts(struct target *target)
223 struct esirisc_common *esirisc = target_to_esirisc(target);
224 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
226 LOG_DEBUG("-");
228 int retval = esirisc_jtag_read_csr(jtag_info, CSR_THREAD, CSR_THREAD_ETC,
229 &esirisc->etc_save);
230 if (retval != ERROR_OK) {
231 LOG_ERROR("%s: failed to read Thread CSR: ETC", target_name(target));
232 return retval;
235 return ERROR_OK;
238 static int esirisc_restore_interrupts(struct target *target)
240 struct esirisc_common *esirisc = target_to_esirisc(target);
241 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
243 LOG_DEBUG("-");
245 int retval = esirisc_jtag_write_csr(jtag_info, CSR_THREAD, CSR_THREAD_ETC,
246 esirisc->etc_save);
247 if (retval != ERROR_OK) {
248 LOG_ERROR("%s: failed to write Thread CSR: ETC", target_name(target));
249 return retval;
252 return ERROR_OK;
255 #if 0
256 static int esirisc_save_hwdc(struct target *target)
258 struct esirisc_common *esirisc = target_to_esirisc(target);
259 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
261 LOG_DEBUG("-");
263 int retval = esirisc_jtag_read_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_HWDC,
264 &esirisc->hwdc_save);
265 if (retval != ERROR_OK) {
266 LOG_ERROR("%s: failed to read Thread CSR: HWDC", target_name(target));
267 return retval;
270 return ERROR_OK;
272 #endif
274 static int esirisc_restore_hwdc(struct target *target)
276 struct esirisc_common *esirisc = target_to_esirisc(target);
277 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
279 LOG_DEBUG("-");
281 int retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_HWDC,
282 esirisc->hwdc_save);
283 if (retval != ERROR_OK) {
284 LOG_ERROR("%s: failed to write Debug CSR: HWDC", target_name(target));
285 return retval;
288 return ERROR_OK;
291 static int esirisc_save_context(struct target *target)
293 struct esirisc_common *esirisc = target_to_esirisc(target);
295 LOG_DEBUG("-");
297 for (unsigned i = 0; i < esirisc->reg_cache->num_regs; ++i) {
298 struct reg *reg = esirisc->reg_cache->reg_list + i;
299 struct esirisc_reg *reg_info = reg->arch_info;
301 if (reg->exist && !reg->valid)
302 reg_info->read(reg);
305 return ERROR_OK;
308 static int esirisc_restore_context(struct target *target)
310 struct esirisc_common *esirisc = target_to_esirisc(target);
312 LOG_DEBUG("-");
314 for (unsigned i = 0; i < esirisc->reg_cache->num_regs; ++i) {
315 struct reg *reg = esirisc->reg_cache->reg_list + i;
316 struct esirisc_reg *reg_info = reg->arch_info;
318 if (reg->exist && reg->dirty)
319 reg_info->write(reg);
322 return ERROR_OK;
325 static int esirisc_flush_caches(struct target *target)
327 struct esirisc_common *esirisc = target_to_esirisc(target);
328 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
330 LOG_DEBUG("-");
332 if (target->state != TARGET_HALTED)
333 return ERROR_TARGET_NOT_HALTED;
335 int retval = esirisc_jtag_flush_caches(jtag_info);
336 if (retval != ERROR_OK) {
337 LOG_ERROR("%s: failed to flush caches", target_name(target));
338 return retval;
341 return ERROR_OK;
344 static int esirisc_wait_debug_active(struct esirisc_common *esirisc, int ms)
346 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
347 int64_t t;
349 LOG_DEBUG("-");
351 t = timeval_ms();
352 for (;;) {
353 int retval = esirisc_jtag_enable_debug(jtag_info);
354 if (retval == ERROR_OK && esirisc_jtag_is_debug_active(jtag_info))
355 return retval;
357 if ((timeval_ms() - t) > ms)
358 return ERROR_TARGET_TIMEOUT;
360 alive_sleep(100);
364 static int esirisc_read_memory(struct target *target, target_addr_t address,
365 uint32_t size, uint32_t count, uint8_t *buffer)
367 struct esirisc_common *esirisc = target_to_esirisc(target);
368 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
369 int retval;
371 LOG_DEBUG("-");
373 int num_bits = 8 * size;
374 for (uint32_t i = 0; i < count; ++i) {
375 union esirisc_memory value;
376 void *value_p;
378 switch (size) {
379 case sizeof(value.word):
380 value_p = &value.word;
381 retval = esirisc_jtag_read_word(jtag_info, address, value_p);
382 break;
384 case sizeof(value.hword):
385 value_p = &value.hword;
386 retval = esirisc_jtag_read_hword(jtag_info, address, value_p);
387 break;
389 case sizeof(value.byte):
390 value_p = &value.byte;
391 retval = esirisc_jtag_read_byte(jtag_info, address, value_p);
392 break;
394 default:
395 LOG_ERROR("%s: unsupported size: %" PRIu32, target_name(target), size);
396 return ERROR_FAIL;
399 if (retval != ERROR_OK) {
400 LOG_ERROR("%s: failed to read address: 0x%" TARGET_PRIxADDR, target_name(target),
401 address);
402 return retval;
405 buf_cpy(value_p, buffer, num_bits);
406 address += size;
407 buffer += size;
410 return ERROR_OK;
413 static int esirisc_write_memory(struct target *target, target_addr_t address,
414 uint32_t size, uint32_t count, const uint8_t *buffer)
416 struct esirisc_common *esirisc = target_to_esirisc(target);
417 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
418 int retval;
420 LOG_DEBUG("-");
422 int num_bits = 8 * size;
423 for (uint32_t i = 0; i < count; ++i) {
424 union esirisc_memory value;
426 switch (size) {
427 case sizeof(value.word):
428 value.word = buf_get_u32(buffer, 0, num_bits);
429 retval = esirisc_jtag_write_word(jtag_info, address, value.word);
430 break;
432 case sizeof(value.hword):
433 value.hword = buf_get_u32(buffer, 0, num_bits);
434 retval = esirisc_jtag_write_hword(jtag_info, address, value.hword);
435 break;
437 case sizeof(value.byte):
438 value.byte = buf_get_u32(buffer, 0, num_bits);
439 retval = esirisc_jtag_write_byte(jtag_info, address, value.byte);
440 break;
442 default:
443 LOG_ERROR("%s: unsupported size: %" PRIu32, target_name(target), size);
444 return ERROR_FAIL;
447 if (retval != ERROR_OK) {
448 LOG_ERROR("%s: failed to write address: 0x%" TARGET_PRIxADDR, target_name(target),
449 address);
450 return retval;
453 address += size;
454 buffer += size;
457 return ERROR_OK;
460 static int esirisc_checksum_memory(struct target *target, target_addr_t address,
461 uint32_t count, uint32_t *checksum)
463 return ERROR_FAIL; /* not supported */
466 static int esirisc_next_breakpoint(struct target *target)
468 struct esirisc_common *esirisc = target_to_esirisc(target);
469 struct breakpoint **breakpoints_p = esirisc->breakpoints_p;
470 struct breakpoint **breakpoints_e = breakpoints_p + esirisc->num_breakpoints;
472 LOG_DEBUG("-");
474 for (int bp_index = 0; breakpoints_p < breakpoints_e; ++breakpoints_p, ++bp_index)
475 if (!*breakpoints_p)
476 return bp_index;
478 return -1;
481 static int esirisc_add_breakpoint(struct target *target, struct breakpoint *breakpoint)
483 struct esirisc_common *esirisc = target_to_esirisc(target);
484 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
485 int bp_index;
486 uint32_t ibc;
487 int retval;
489 LOG_DEBUG("-");
492 * The default linker scripts provided by the eSi-RISC toolchain do
493 * not specify attributes on memory regions, which results in
494 * incorrect application of software breakpoints by GDB. Targets
495 * must be configured with `gdb_breakpoint_override hard` as
496 * software breakpoints are not supported.
498 if (breakpoint->type != BKPT_HARD)
499 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
501 bp_index = esirisc_next_breakpoint(target);
502 if (bp_index < 0) {
503 LOG_ERROR("%s: out of hardware breakpoints", target_name(target));
504 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
507 breakpoint->set = bp_index + 1;
508 esirisc->breakpoints_p[bp_index] = breakpoint;
510 /* specify instruction breakpoint address */
511 retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_IBA_N + bp_index,
512 breakpoint->address);
513 if (retval != ERROR_OK) {
514 LOG_ERROR("%s: failed to write Debug CSR: IBA", target_name(target));
515 return retval;
518 /* enable instruction breakpoint */
519 retval = esirisc_jtag_read_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_IBC, &ibc);
520 if (retval != ERROR_OK) {
521 LOG_ERROR("%s: failed to read Debug CSR: IBC", target_name(target));
522 return retval;
525 ibc |= (1 << bp_index); /* IBC.In */
527 retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_IBC, ibc);
528 if (retval != ERROR_OK) {
529 LOG_ERROR("%s: failed to write Debug CSR: IBC", target_name(target));
530 return retval;
533 return ERROR_OK;
536 static int esirisc_add_breakpoints(struct target *target)
538 struct breakpoint *breakpoint = target->breakpoints;
540 LOG_DEBUG("-");
542 while (breakpoint) {
543 if (breakpoint->set == 0)
544 esirisc_add_breakpoint(target, breakpoint);
546 breakpoint = breakpoint->next;
549 return ERROR_OK;
552 static int esirisc_remove_breakpoint(struct target *target, struct breakpoint *breakpoint)
554 struct esirisc_common *esirisc = target_to_esirisc(target);
555 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
556 int bp_index = breakpoint->set - 1;
557 uint32_t ibc;
558 int retval;
560 LOG_DEBUG("-");
562 /* disable instruction breakpoint */
563 retval = esirisc_jtag_read_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_IBC, &ibc);
564 if (retval != ERROR_OK) {
565 LOG_ERROR("%s: failed to read Debug CSR: IBC", target_name(target));
566 return retval;
569 ibc &= ~(1 << bp_index); /* IBC.In */
571 retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_IBC, ibc);
572 if (retval != ERROR_OK) {
573 LOG_ERROR("%s: failed to write Debug CSR: IBC", target_name(target));
574 return retval;
577 esirisc->breakpoints_p[bp_index] = NULL;
578 breakpoint->set = 0;
580 return ERROR_OK;
583 static int esirisc_remove_breakpoints(struct target *target)
585 struct esirisc_common *esirisc = target_to_esirisc(target);
586 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
588 LOG_DEBUG("-");
590 /* clear instruction breakpoints */
591 int retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_IBC, 0);
592 if (retval != ERROR_OK) {
593 LOG_ERROR("%s: failed to write Debug CSR: IBC", target_name(target));
594 return retval;
597 memset(esirisc->breakpoints_p, 0, sizeof(esirisc->breakpoints_p));
599 return ERROR_OK;
602 static int esirisc_next_watchpoint(struct target *target)
604 struct esirisc_common *esirisc = target_to_esirisc(target);
605 struct watchpoint **watchpoints_p = esirisc->watchpoints_p;
606 struct watchpoint **watchpoints_e = watchpoints_p + esirisc->num_watchpoints;
608 LOG_DEBUG("-");
610 for (int wp_index = 0; watchpoints_p < watchpoints_e; ++watchpoints_p, ++wp_index)
611 if (!*watchpoints_p)
612 return wp_index;
614 return -1;
617 static int esirisc_add_watchpoint(struct target *target, struct watchpoint *watchpoint)
619 struct esirisc_common *esirisc = target_to_esirisc(target);
620 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
621 int wp_index;
622 uint32_t dbs, dbc;
623 int retval;
625 LOG_DEBUG("-");
627 wp_index = esirisc_next_watchpoint(target);
628 if (wp_index < 0) {
629 LOG_ERROR("%s: out of hardware watchpoints", target_name(target));
630 return ERROR_FAIL;
633 watchpoint->set = wp_index + 1;
634 esirisc->watchpoints_p[wp_index] = watchpoint;
636 /* specify data breakpoint address */
637 retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DBA_N + wp_index,
638 watchpoint->address);
639 if (retval != ERROR_OK) {
640 LOG_ERROR("%s: failed to write Debug CSR: DBA", target_name(target));
641 return retval;
644 /* specify data breakpoint size */
645 retval = esirisc_jtag_read_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DBS, &dbs);
646 if (retval != ERROR_OK) {
647 LOG_ERROR("%s: failed to read Debug CSR: DBS", target_name(target));
648 return retval;
651 uint32_t sn;
652 switch (watchpoint->length) {
653 case sizeof(uint64_t):
654 sn = 0x3;
655 break;
656 case sizeof(uint32_t):
657 sn = 0x2;
658 break;
660 case sizeof(uint16_t):
661 sn = 0x1;
662 break;
664 case sizeof(uint8_t):
665 sn = 0x0;
666 break;
668 default:
669 LOG_ERROR("%s: unsupported length: %" PRIu32, target_name(target),
670 watchpoint->length);
671 return ERROR_FAIL;
674 dbs |= (sn << (2 * wp_index)); /* DBS.Sn */
676 retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DBS, dbs);
677 if (retval != ERROR_OK) {
678 LOG_ERROR("%s: failed to write Debug CSR: DBS", target_name(target));
679 return retval;
682 /* enable data breakpoint */
683 retval = esirisc_jtag_read_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DBC, &dbc);
684 if (retval != ERROR_OK) {
685 LOG_ERROR("%s: failed to read Debug CSR: DBC", target_name(target));
686 return retval;
689 uint32_t dn;
690 switch (watchpoint->rw) {
691 case WPT_READ:
692 dn = 0x1;
693 break;
695 case WPT_WRITE:
696 dn = 0x2;
697 break;
699 case WPT_ACCESS:
700 dn = 0x3;
701 break;
703 default:
704 LOG_ERROR("%s: unsupported rw: %" PRId32, target_name(target),
705 watchpoint->rw);
706 return ERROR_FAIL;
709 dbc |= (dn << (2 * wp_index)); /* DBC.Dn */
711 retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DBC, dbc);
712 if (retval != ERROR_OK) {
713 LOG_ERROR("%s: failed to write Debug CSR: DBC", target_name(target));
714 return retval;
717 return ERROR_OK;
720 static int esirisc_add_watchpoints(struct target *target)
722 struct watchpoint *watchpoint = target->watchpoints;
724 LOG_DEBUG("-");
726 while (watchpoint) {
727 if (watchpoint->set == 0)
728 esirisc_add_watchpoint(target, watchpoint);
730 watchpoint = watchpoint->next;
733 return ERROR_OK;
736 static int esirisc_remove_watchpoint(struct target *target, struct watchpoint *watchpoint)
738 struct esirisc_common *esirisc = target_to_esirisc(target);
739 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
740 int wp_index = watchpoint->set - 1;
741 uint32_t dbc;
742 int retval;
744 LOG_DEBUG("-");
746 /* disable data breakpoint */
747 retval = esirisc_jtag_read_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DBC, &dbc);
748 if (retval != ERROR_OK) {
749 LOG_ERROR("%s: failed to read Debug CSR: DBC", target_name(target));
750 return retval;
753 dbc &= ~(0x3 << (2 * wp_index)); /* DBC.Dn */
755 retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DBC, dbc);
756 if (retval != ERROR_OK) {
757 LOG_ERROR("%s: failed to write Debug CSR: DBC", target_name(target));
758 return retval;
761 esirisc->watchpoints_p[wp_index] = NULL;
762 watchpoint->set = 0;
764 return ERROR_OK;
767 static int esirisc_remove_watchpoints(struct target *target)
769 struct esirisc_common *esirisc = target_to_esirisc(target);
770 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
772 LOG_DEBUG("-");
774 /* clear data breakpoints */
775 int retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DBC, 0);
776 if (retval != ERROR_OK) {
777 LOG_ERROR("%s: failed to write Debug CSR: DBC", target_name(target));
778 return retval;
781 memset(esirisc->watchpoints_p, 0, sizeof(esirisc->watchpoints_p));
783 return ERROR_OK;
786 static int esirisc_halt(struct target *target)
788 struct esirisc_common *esirisc = target_to_esirisc(target);
789 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
791 LOG_DEBUG("-");
793 if (target->state == TARGET_HALTED)
794 return ERROR_OK;
796 int retval = esirisc_jtag_break(jtag_info);
797 if (retval != ERROR_OK) {
798 LOG_ERROR("%s: failed to halt target", target_name(target));
799 return retval;
802 target->debug_reason = DBG_REASON_DBGRQ;
804 return ERROR_OK;
807 static int esirisc_disable_step(struct target *target)
809 struct esirisc_common *esirisc = target_to_esirisc(target);
810 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
811 uint32_t dc;
812 int retval;
814 LOG_DEBUG("-");
816 retval = esirisc_jtag_read_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DC, &dc);
817 if (retval != ERROR_OK) {
818 LOG_ERROR("%s: failed to read Debug CSR: DC", target_name(target));
819 return retval;
822 dc &= ~(1<<0); /* DC.S */
824 retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DC, dc);
825 if (retval != ERROR_OK) {
826 LOG_ERROR("%s: failed to write Debug CSR: DC", target_name(target));
827 return retval;
830 return ERROR_OK;
833 static int esirisc_enable_step(struct target *target)
835 struct esirisc_common *esirisc = target_to_esirisc(target);
836 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
837 uint32_t dc;
838 int retval;
840 LOG_DEBUG("-");
842 retval = esirisc_jtag_read_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DC, &dc);
843 if (retval != ERROR_OK) {
844 LOG_ERROR("%s: failed to read Debug CSR: DC", target_name(target));
845 return retval;
848 dc |= (1<<0); /* DC.S */
850 retval = esirisc_jtag_write_csr(jtag_info, CSR_DEBUG, CSR_DEBUG_DC, dc);
851 if (retval != ERROR_OK) {
852 LOG_ERROR("%s: failed to write Debug CSR: DC", target_name(target));
853 return retval;
856 return ERROR_OK;
859 static int esirisc_resume_or_step(struct target *target, int current, target_addr_t address,
860 int handle_breakpoints, int debug_execution, bool step)
862 struct esirisc_common *esirisc = target_to_esirisc(target);
863 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
864 struct breakpoint *breakpoint = NULL;
865 int retval;
867 LOG_DEBUG("-");
869 if (target->state != TARGET_HALTED)
870 return ERROR_TARGET_NOT_HALTED;
872 if (!debug_execution) {
873 target_free_all_working_areas(target);
874 esirisc_add_breakpoints(target);
875 esirisc_add_watchpoints(target);
878 if (current)
879 address = buf_get_u32(esirisc->epc->value, 0, esirisc->epc->size);
880 else {
881 buf_set_u32(esirisc->epc->value, 0, esirisc->epc->size, address);
882 esirisc->epc->dirty = true;
883 esirisc->epc->valid = true;
886 esirisc_restore_context(target);
888 if (esirisc_has_cache(esirisc))
889 esirisc_flush_caches(target);
891 if (handle_breakpoints) {
892 breakpoint = breakpoint_find(target, address);
893 if (breakpoint)
894 esirisc_remove_breakpoint(target, breakpoint);
897 if (step) {
898 esirisc_disable_interrupts(target);
899 esirisc_enable_step(target);
900 target->debug_reason = DBG_REASON_SINGLESTEP;
901 } else {
902 esirisc_disable_step(target);
903 esirisc_restore_interrupts(target);
904 target->debug_reason = DBG_REASON_NOTHALTED;
907 esirisc_restore_hwdc(target);
909 retval = esirisc_jtag_continue(jtag_info);
910 if (retval != ERROR_OK) {
911 LOG_ERROR("%s: failed to resume target", target_name(target));
912 return retval;
915 register_cache_invalidate(esirisc->reg_cache);
917 if (!debug_execution) {
918 target->state = TARGET_RUNNING;
919 target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
920 } else {
921 target->state = TARGET_DEBUG_RUNNING;
922 target_call_event_callbacks(target, TARGET_EVENT_DEBUG_RESUMED);
925 return ERROR_OK;
928 static int esirisc_resume(struct target *target, int current, target_addr_t address,
929 int handle_breakpoints, int debug_execution)
931 LOG_DEBUG("-");
933 return esirisc_resume_or_step(target, current, address,
934 handle_breakpoints, debug_execution, false);
937 static int esirisc_step(struct target *target, int current, target_addr_t address,
938 int handle_breakpoints)
940 LOG_DEBUG("-");
942 return esirisc_resume_or_step(target, current, address,
943 handle_breakpoints, 0, true);
946 static int esirisc_debug_step(struct target *target)
948 struct esirisc_common *esirisc = target_to_esirisc(target);
949 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
950 int retval;
952 LOG_DEBUG("-");
954 esirisc_disable_interrupts(target);
955 esirisc_enable_step(target);
957 retval = esirisc_jtag_continue(jtag_info);
958 if (retval != ERROR_OK) {
959 LOG_ERROR("%s: failed to resume target", target_name(target));
960 return retval;
963 retval = esirisc_wait_debug_active(esirisc, STEP_TIMEOUT);
964 if (retval != ERROR_OK) {
965 LOG_ERROR("%s: step timed out", target_name(target));
966 return retval;
969 esirisc_disable_step(target);
970 esirisc_restore_interrupts(target);
972 return ERROR_OK;
975 static int esirisc_debug_reset(struct target *target)
977 struct esirisc_common *esirisc = target_to_esirisc(target);
978 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
979 int retval;
981 LOG_DEBUG("-");
983 retval = esirisc_jtag_assert_reset(jtag_info);
984 if (retval != ERROR_OK) {
985 LOG_ERROR("%s: failed to assert reset", target_name(target));
986 return retval;
989 retval = esirisc_jtag_deassert_reset(jtag_info);
990 if (retval != ERROR_OK) {
991 LOG_ERROR("%s: failed to deassert reset", target_name(target));
992 return retval;
995 retval = esirisc_wait_debug_active(esirisc, RESET_TIMEOUT);
996 if (retval != ERROR_OK) {
997 LOG_ERROR("%s: reset timed out", target_name(target));
998 return retval;
1001 return ERROR_OK;
1004 static int esirisc_debug_enable(struct target *target)
1006 struct esirisc_common *esirisc = target_to_esirisc(target);
1007 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1008 int retval;
1010 LOG_DEBUG("-");
1012 retval = esirisc_jtag_enable_debug(jtag_info);
1013 if (retval != ERROR_OK) {
1014 LOG_ERROR("%s: failed to enable debug mode", target_name(target));
1015 return retval;
1019 * The debug clock is inactive until the first command is sent.
1020 * If the target is stopped, we must first issue a reset before
1021 * attempting further communication. This also handles unpowered
1022 * targets, which will respond with all ones and appear active.
1024 if (esirisc_jtag_is_stopped(jtag_info)) {
1025 LOG_INFO("%s: debug clock inactive; attempting debug reset", target_name(target));
1026 retval = esirisc_debug_reset(target);
1027 if (retval != ERROR_OK)
1028 return retval;
1030 if (esirisc_jtag_is_stopped(jtag_info)) {
1031 LOG_ERROR("%s: target unresponsive; giving up", target_name(target));
1032 return ERROR_FAIL;
1036 return ERROR_OK;
1039 static int esirisc_debug_entry(struct target *target)
1041 struct esirisc_common *esirisc = target_to_esirisc(target);
1042 struct breakpoint *breakpoint;
1044 LOG_DEBUG("-");
1046 esirisc_save_context(target);
1048 if (esirisc_has_cache(esirisc))
1049 esirisc_flush_caches(target);
1051 if (target->debug_reason != DBG_REASON_SINGLESTEP) {
1052 esirisc_save_interrupts(target);
1054 uint32_t eid = buf_get_u32(esirisc->eid->value, 0, esirisc->eid->size);
1055 switch (eid) {
1057 * InstBreakpoint exceptions are also raised when a core is
1058 * halted for debugging. The following is required to
1059 * determine if a breakpoint was encountered.
1061 case EID_INST_BREAKPOINT:
1062 breakpoint = breakpoint_find(target,
1063 buf_get_u32(esirisc->epc->value, 0, esirisc->epc->size));
1064 target->debug_reason = (breakpoint) ?
1065 DBG_REASON_BREAKPOINT : DBG_REASON_DBGRQ;
1066 break;
1069 * eSi-RISC treats watchpoints similarly to breakpoints,
1070 * however GDB will not request to step over the current
1071 * instruction when a watchpoint fires. The following is
1072 * required to resume the target.
1074 case EID_DATA_BREAKPOINT:
1075 esirisc_remove_watchpoints(target);
1076 esirisc_debug_step(target);
1077 esirisc_add_watchpoints(target);
1078 target->debug_reason = DBG_REASON_WATCHPOINT;
1079 break;
1081 default:
1082 target->debug_reason = DBG_REASON_DBGRQ;
1086 return ERROR_OK;
1089 static int esirisc_poll(struct target *target)
1091 struct esirisc_common *esirisc = target_to_esirisc(target);
1092 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1093 int retval;
1095 retval = esirisc_jtag_enable_debug(jtag_info);
1096 if (retval != ERROR_OK) {
1097 LOG_ERROR("%s: failed to poll target", target_name(target));
1098 return retval;
1101 if (esirisc_jtag_is_stopped(jtag_info)) {
1102 LOG_ERROR("%s: target has stopped; reset required", target_name(target));
1103 target->state = TARGET_UNKNOWN;
1104 return ERROR_TARGET_FAILURE;
1107 if (esirisc_jtag_is_debug_active(jtag_info)) {
1108 if (target->state == TARGET_RUNNING || target->state == TARGET_RESET) {
1109 target->state = TARGET_HALTED;
1111 retval = esirisc_debug_entry(target);
1112 if (retval != ERROR_OK)
1113 return retval;
1115 target_call_event_callbacks(target, TARGET_EVENT_HALTED);
1118 } else if (target->state == TARGET_HALTED || target->state == TARGET_RESET) {
1119 target->state = TARGET_RUNNING;
1120 target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
1123 return ERROR_OK;
1126 static int esirisc_assert_reset(struct target *target)
1128 struct esirisc_common *esirisc = target_to_esirisc(target);
1129 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1130 int retval;
1132 LOG_DEBUG("-");
1134 if (jtag_get_reset_config() & RESET_HAS_SRST) {
1135 jtag_add_reset(1, 1);
1136 if ((jtag_get_reset_config() & RESET_SRST_PULLS_TRST) == 0)
1137 jtag_add_reset(0, 1);
1138 } else {
1139 esirisc_remove_breakpoints(target);
1140 esirisc_remove_watchpoints(target);
1142 retval = esirisc_jtag_assert_reset(jtag_info);
1143 if (retval != ERROR_OK) {
1144 LOG_ERROR("%s: failed to assert reset", target_name(target));
1145 return retval;
1149 target->state = TARGET_RESET;
1151 register_cache_invalidate(esirisc->reg_cache);
1153 return ERROR_OK;
1156 static int esirisc_reset_entry(struct target *target)
1158 struct esirisc_common *esirisc = target_to_esirisc(target);
1159 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1160 uint32_t eta, epc;
1161 int retval;
1163 LOG_DEBUG("-");
1165 /* read exception table address */
1166 retval = esirisc_jtag_read_csr(jtag_info, CSR_THREAD, CSR_THREAD_ETA, &eta);
1167 if (retval != ERROR_OK) {
1168 LOG_ERROR("%s: failed to read Thread CSR: ETA", target_name(target));
1169 return retval;
1172 /* read reset entry point */
1173 retval = esirisc_jtag_read_word(jtag_info, eta + ENTRY_RESET, &epc);
1174 if (retval != ERROR_OK) {
1175 LOG_ERROR("%s: failed to read address: 0x%" TARGET_PRIxADDR, target_name(target),
1176 (target_addr_t)epc);
1177 return retval;
1180 /* write reset entry point */
1181 retval = esirisc_jtag_write_csr(jtag_info, CSR_THREAD, CSR_THREAD_EPC, epc);
1182 if (retval != ERROR_OK) {
1183 LOG_ERROR("%s: failed to write Thread CSR: EPC", target_name(target));
1184 return retval;
1187 return ERROR_OK;
1190 static int esirisc_deassert_reset(struct target *target)
1192 struct esirisc_common *esirisc = target_to_esirisc(target);
1193 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1194 int retval;
1196 LOG_DEBUG("-");
1198 if (jtag_get_reset_config() & RESET_HAS_SRST) {
1199 jtag_add_reset(0, 0);
1201 retval = esirisc_debug_enable(target);
1202 if (retval != ERROR_OK)
1203 return retval;
1205 retval = esirisc_debug_reset(target);
1206 if (retval != ERROR_OK)
1207 return retval;
1209 } else {
1210 retval = esirisc_jtag_deassert_reset(jtag_info);
1211 if (retval != ERROR_OK) {
1212 LOG_ERROR("%s: failed to deassert reset", target_name(target));
1213 return retval;
1217 retval = esirisc_wait_debug_active(esirisc, RESET_TIMEOUT);
1218 if (retval != ERROR_OK) {
1219 LOG_ERROR("%s: reset timed out", target_name(target));
1220 return retval;
1223 retval = esirisc_reset_entry(target);
1224 if (retval != ERROR_OK)
1225 return retval;
1227 esirisc_add_breakpoints(target);
1228 esirisc_add_watchpoints(target);
1230 esirisc_restore_hwdc(target);
1232 if (!target->reset_halt) {
1233 retval = esirisc_jtag_continue(jtag_info);
1234 if (retval != ERROR_OK) {
1235 LOG_ERROR("%s: failed to resume target", target_name(target));
1236 return retval;
1240 return ERROR_OK;
1243 static int esirisc_arch_state(struct target *target)
1245 struct esirisc_common *esirisc = target_to_esirisc(target);
1246 uint32_t epc = buf_get_u32(esirisc->epc->value, 0, esirisc->epc->size);
1247 uint32_t ecas = buf_get_u32(esirisc->ecas->value, 0, esirisc->ecas->size);
1248 uint32_t eid = buf_get_u32(esirisc->eid->value, 0, esirisc->eid->size);
1249 uint32_t ed = buf_get_u32(esirisc->ed->value, 0, esirisc->ed->size);
1251 LOG_USER("target halted due to %s, exception: %s\n"
1252 "EPC: 0x%" PRIx32 ", ECAS: 0x%" PRIx32 ", EID: 0x%" PRIx32 ", ED: 0x%" PRIx32,
1253 debug_reason_name(target), esirisc_exception_strings[eid], epc, ecas, eid, ed);
1255 return ERROR_OK;
1258 static const char *esirisc_get_gdb_arch(struct target *target)
1260 struct esirisc_common *esirisc = target_to_esirisc(target);
1262 LOG_DEBUG("-");
1265 * Targets with the UNIFIED_ADDRESS_SPACE option disabled employ a
1266 * Harvard architecture. This option is not exposed in a CSR, which
1267 * requires additional configuration to properly interact with these
1268 * targets in GDB (also see: `esirisc cache_arch`).
1270 if (!esirisc->gdb_arch && target_was_examined(target))
1271 esirisc->gdb_arch = alloc_printf("esirisc:%d_bit_%d_reg_%s",
1272 esirisc->num_bits, esirisc->num_regs, esirisc_cache_arch_name(esirisc));
1274 return esirisc->gdb_arch;
1277 static int esirisc_get_gdb_reg_list(struct target *target, struct reg **reg_list[],
1278 int *reg_list_size, enum target_register_class reg_class)
1280 struct esirisc_common *esirisc = target_to_esirisc(target);
1282 LOG_DEBUG("-");
1284 *reg_list_size = ESIRISC_NUM_REGS;
1286 *reg_list = calloc(*reg_list_size, sizeof(struct reg *));
1287 if (!*reg_list)
1288 return ERROR_FAIL;
1290 if (reg_class == REG_CLASS_ALL)
1291 for (int i = 0; i < *reg_list_size; ++i)
1292 (*reg_list)[i] = esirisc->reg_cache->reg_list + i;
1293 else {
1294 for (int i = 0; i < esirisc->num_regs; ++i)
1295 (*reg_list)[i] = esirisc->reg_cache->reg_list + i;
1297 (*reg_list)[ESIRISC_PC] = esirisc->reg_cache->reg_list + ESIRISC_PC;
1298 (*reg_list)[ESIRISC_CAS] = esirisc->reg_cache->reg_list + ESIRISC_CAS;
1301 return ERROR_OK;
1304 static int esirisc_read_reg(struct reg *reg)
1306 struct esirisc_reg *reg_info = reg->arch_info;
1307 struct esirisc_common *esirisc = reg_info->esirisc;
1308 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1309 struct target *target = esirisc->target;
1310 uint32_t data;
1312 LOG_DEBUG("-");
1314 int retval = esirisc_jtag_read_reg(jtag_info, reg->number, &data);
1315 if (retval != ERROR_OK) {
1316 LOG_ERROR("%s: failed to read register: %s", target_name(target), reg->name);
1317 return retval;
1320 buf_set_u32(reg->value, 0, reg->size, data);
1321 reg->dirty = false;
1322 reg->valid = true;
1324 return ERROR_OK;
1327 static int esirisc_write_reg(struct reg *reg)
1329 struct esirisc_reg *reg_info = reg->arch_info;
1330 struct esirisc_common *esirisc = reg_info->esirisc;
1331 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1332 struct target *target = esirisc->target;
1333 uint32_t data = buf_get_u32(reg->value, 0, reg->size);
1335 LOG_DEBUG("-");
1337 int retval = esirisc_jtag_write_reg(jtag_info, reg->number, data);
1338 if (retval != ERROR_OK) {
1339 LOG_ERROR("%s: failed to write register: %s", target_name(target), reg->name);
1340 return retval;
1343 reg->dirty = false;
1344 reg->valid = true;
1346 return ERROR_OK;
1349 static int esirisc_read_csr(struct reg *reg)
1351 struct esirisc_reg *reg_info = reg->arch_info;
1352 struct esirisc_common *esirisc = reg_info->esirisc;
1353 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1354 struct target *target = esirisc->target;
1355 uint32_t data;
1357 LOG_DEBUG("-");
1359 int retval = esirisc_jtag_read_csr(jtag_info, reg_info->bank, reg_info->csr, &data);
1360 if (retval != ERROR_OK) {
1361 LOG_ERROR("%s: failed to read CSR: %s", target_name(target), reg->name);
1362 return retval;
1365 buf_set_u32(reg->value, 0, reg->size, data);
1366 reg->dirty = false;
1367 reg->valid = true;
1369 return ERROR_OK;
1372 static int esirisc_write_csr(struct reg *reg)
1374 struct esirisc_reg *reg_info = reg->arch_info;
1375 struct esirisc_common *esirisc = reg_info->esirisc;
1376 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1377 struct target *target = esirisc->target;
1378 uint32_t data = buf_get_u32(reg->value, 0, reg->size);
1380 LOG_DEBUG("-");
1382 int retval = esirisc_jtag_write_csr(jtag_info, reg_info->bank, reg_info->csr, data);
1383 if (retval != ERROR_OK) {
1384 LOG_ERROR("%s: failed to write CSR: %s", target_name(target), reg->name);
1385 return retval;
1388 reg->dirty = false;
1389 reg->valid = true;
1391 return ERROR_OK;
1394 static int esirisc_get_reg(struct reg *reg)
1396 struct esirisc_reg *reg_info = reg->arch_info;
1397 struct esirisc_common *esirisc = reg_info->esirisc;
1398 struct target *target = esirisc->target;
1400 LOG_DEBUG("-");
1402 if (target->state != TARGET_HALTED)
1403 return ERROR_TARGET_NOT_HALTED;
1405 return reg_info->read(reg);
1408 static int esirisc_set_reg(struct reg *reg, uint8_t *buf)
1410 struct esirisc_reg *reg_info = reg->arch_info;
1411 struct esirisc_common *esirisc = reg_info->esirisc;
1412 struct target *target = esirisc->target;
1413 uint32_t value = buf_get_u32(buf, 0, reg->size);
1415 LOG_DEBUG("-");
1417 if (target->state != TARGET_HALTED)
1418 return ERROR_TARGET_NOT_HALTED;
1420 buf_set_u32(reg->value, 0, reg->size, value);
1421 reg->dirty = true;
1422 reg->valid = true;
1424 return ERROR_OK;
1427 static const struct reg_arch_type esirisc_reg_type = {
1428 .get = esirisc_get_reg,
1429 .set = esirisc_set_reg,
1432 static struct reg_cache *esirisc_build_reg_cache(struct target *target)
1434 struct esirisc_common *esirisc = target_to_esirisc(target);
1435 struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
1436 struct reg_cache *cache = malloc(sizeof(struct reg_cache));
1437 struct reg *reg_list = calloc(ESIRISC_NUM_REGS, sizeof(struct reg));
1439 LOG_DEBUG("-");
1441 cache->name = "eSi-RISC registers";
1442 cache->next = NULL;
1443 cache->reg_list = reg_list;
1444 cache->num_regs = ESIRISC_NUM_REGS;
1445 (*cache_p) = cache;
1447 esirisc->reg_cache = cache;
1448 esirisc->epc = reg_list + ESIRISC_EPC;
1449 esirisc->ecas = reg_list + ESIRISC_ECAS;
1450 esirisc->eid = reg_list + ESIRISC_EID;
1451 esirisc->ed = reg_list + ESIRISC_ED;
1453 for (int i = 0; i < esirisc->num_regs; ++i) {
1454 struct reg *reg = reg_list + esirisc_regs[i].number;
1455 struct esirisc_reg *reg_info = calloc(1, sizeof(struct esirisc_reg));
1457 reg->name = esirisc_regs[i].name;
1458 reg->number = esirisc_regs[i].number;
1459 reg->value = calloc(1, DIV_ROUND_UP(esirisc->num_bits, 8));
1460 reg->size = esirisc->num_bits;
1461 reg->reg_data_type = calloc(1, sizeof(struct reg_data_type));
1462 reg->reg_data_type->type = esirisc_regs[i].type;
1463 reg->group = esirisc_regs[i].group;
1464 reg_info->esirisc = esirisc;
1465 reg_info->read = esirisc_read_reg;
1466 reg_info->write = esirisc_write_reg;
1467 reg->arch_info = reg_info;
1468 reg->type = &esirisc_reg_type;
1469 reg->exist = true;
1472 for (size_t i = 0; i < ARRAY_SIZE(esirisc_csrs); ++i) {
1473 struct reg *reg = reg_list + esirisc_csrs[i].number;
1474 struct esirisc_reg *reg_info = calloc(1, sizeof(struct esirisc_reg));
1476 reg->name = esirisc_csrs[i].name;
1477 reg->number = esirisc_csrs[i].number;
1478 reg->value = calloc(1, DIV_ROUND_UP(esirisc->num_bits, 8));
1479 reg->size = esirisc->num_bits;
1480 reg->reg_data_type = calloc(1, sizeof(struct reg_data_type));
1481 reg->reg_data_type->type = esirisc_csrs[i].type;
1482 reg->group = esirisc_csrs[i].group;
1483 reg_info->esirisc = esirisc;
1484 reg_info->bank = esirisc_csrs[i].bank;
1485 reg_info->csr = esirisc_csrs[i].csr;
1486 reg_info->read = esirisc_read_csr;
1487 reg_info->write = esirisc_write_csr;
1488 reg->arch_info = reg_info;
1489 reg->type = &esirisc_reg_type;
1490 reg->exist = true;
1493 return cache;
1496 static int esirisc_identify(struct target *target)
1498 struct esirisc_common *esirisc = target_to_esirisc(target);
1499 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1500 uint32_t csr;
1501 int retval;
1503 LOG_DEBUG("-");
1505 retval = esirisc_jtag_read_csr(jtag_info, CSR_CONFIG, CSR_CONFIG_ARCH0, &csr);
1506 if (retval != ERROR_OK) {
1507 LOG_ERROR("%s: failed to read Configuration CSR: ARCH0", target_name(target));
1508 return retval;
1511 esirisc->num_bits = (csr >> 0) & 0x3f; /* ARCH0.B */
1512 esirisc->num_regs = (csr >> 10) & 0x3f; /* ARCH0.R */
1514 retval = esirisc_jtag_read_csr(jtag_info, CSR_CONFIG, CSR_CONFIG_MEM, &csr);
1515 if (retval != ERROR_OK) {
1516 LOG_ERROR("%s: failed to read Configuration CSR: MEM", target_name(target));
1517 return retval;
1520 target->endianness = (csr & 1<<0) ? /* MEM.E */
1521 TARGET_BIG_ENDIAN : TARGET_LITTLE_ENDIAN;
1523 retval = esirisc_jtag_read_csr(jtag_info, CSR_CONFIG, CSR_CONFIG_IC, &csr);
1524 if (retval != ERROR_OK) {
1525 LOG_ERROR("%s: failed to read Configuration CSR: IC", target_name(target));
1526 return retval;
1529 esirisc->has_icache = !!(csr & 1<<0); /* IC.E */
1531 retval = esirisc_jtag_read_csr(jtag_info, CSR_CONFIG, CSR_CONFIG_DC, &csr);
1532 if (retval != ERROR_OK) {
1533 LOG_ERROR("%s: failed to read Configuration CSR: DC", target_name(target));
1534 return retval;
1537 esirisc->has_dcache = !!(csr & 1<<0); /* DC.E */
1539 retval = esirisc_jtag_read_csr(jtag_info, CSR_CONFIG, CSR_CONFIG_DBG, &csr);
1540 if (retval != ERROR_OK) {
1541 LOG_ERROR("%s: failed to read Configuration CSR: DBG", target_name(target));
1542 return retval;
1545 esirisc->num_breakpoints = (csr >> 7) & 0xf; /* DBG.BP */
1546 esirisc->num_watchpoints = (csr >> 12) & 0xf; /* DBG.WP */
1548 retval = esirisc_jtag_read_csr(jtag_info, CSR_CONFIG, CSR_CONFIG_TRACE, &csr);
1549 if (retval != ERROR_OK) {
1550 LOG_ERROR("%s: failed to read Configuration CSR: TRACE", target_name(target));
1551 return retval;
1554 esirisc->has_trace = !!(csr & 1<<0); /* TRACE.T */
1556 return ERROR_OK;
1559 static int esirisc_target_create(struct target *target, Jim_Interp *interp)
1561 struct jtag_tap *tap = target->tap;
1562 struct esirisc_common *esirisc;
1564 if (!tap)
1565 return ERROR_FAIL;
1567 if (tap->ir_length != INSTR_LENGTH) {
1568 LOG_ERROR("%s: invalid IR length; expected %d", target_name(target),
1569 INSTR_LENGTH);
1570 return ERROR_FAIL;
1573 esirisc = calloc(1, sizeof(struct esirisc_common));
1574 if (!esirisc)
1575 return ERROR_FAIL;
1577 esirisc->target = target;
1578 esirisc->jtag_info.tap = tap;
1579 target->arch_info = esirisc;
1581 return ERROR_OK;
1584 static int esirisc_init_target(struct command_context *cmd_ctx, struct target *target)
1586 struct esirisc_common *esirisc = target_to_esirisc(target);
1588 /* trap reset, error, and debug exceptions */
1589 esirisc->hwdc_save = HWDC_R | HWDC_E | HWDC_D;
1591 return ERROR_OK;
1594 static int esirisc_examine(struct target *target)
1596 struct esirisc_common *esirisc = target_to_esirisc(target);
1597 struct esirisc_jtag *jtag_info = &esirisc->jtag_info;
1598 int retval;
1600 LOG_DEBUG("-");
1602 if (!target_was_examined(target)) {
1603 retval = esirisc_debug_enable(target);
1604 if (retval != ERROR_OK)
1605 return retval;
1608 * In order to identify the target we must first halt the core.
1609 * We quietly resume once identification has completed for those
1610 * targets that were running when target_examine was called.
1612 if (esirisc_jtag_is_debug_active(jtag_info)) {
1613 if (target->state == TARGET_UNKNOWN)
1614 target->debug_reason = DBG_REASON_DBGRQ;
1616 target->state = TARGET_HALTED;
1617 } else {
1618 retval = esirisc_jtag_break(jtag_info);
1619 if (retval != ERROR_OK) {
1620 LOG_ERROR("%s: failed to halt target", target_name(target));
1621 return retval;
1624 target->state = TARGET_RUNNING;
1627 retval = esirisc_identify(target);
1628 if (retval != ERROR_OK) {
1629 LOG_ERROR("%s: failed to identify target", target_name(target));
1630 return retval;
1633 esirisc_build_reg_cache(target);
1635 esirisc_remove_breakpoints(target);
1636 esirisc_remove_watchpoints(target);
1638 esirisc_disable_step(target);
1639 esirisc_restore_hwdc(target);
1641 if (target->state == TARGET_HALTED)
1642 esirisc_save_interrupts(target);
1643 else {
1644 retval = esirisc_jtag_continue(jtag_info);
1645 if (retval != ERROR_OK) {
1646 LOG_ERROR("%s: failed to resume target", target_name(target));
1647 return retval;
1651 target_set_examined(target);
1653 LOG_INFO("%s: %d bit, %d registers, %s%s%s", target_name(target),
1654 esirisc->num_bits, esirisc->num_regs,
1655 target_endianness(target),
1656 esirisc->has_icache ? ", icache" : "",
1657 esirisc->has_dcache ? ", dcache" : "");
1659 LOG_INFO("%s: hardware has %d breakpoints, %d watchpoints%s", target_name(target),
1660 esirisc->num_breakpoints, esirisc->num_watchpoints,
1661 esirisc->has_trace ? ", trace" : "");
1664 return ERROR_OK;
1667 COMMAND_HANDLER(handle_esirisc_cache_arch_command)
1669 struct target *target = get_current_target(CMD_CTX);
1670 struct esirisc_common *esirisc = target_to_esirisc(target);
1672 if (CMD_ARGC > 0) {
1673 if (strcmp(*CMD_ARGV, "harvard") == 0)
1674 esirisc->cache_arch = ESIRISC_CACHE_HARVARD;
1675 else if (strcmp(*CMD_ARGV, "von_neumann") == 0)
1676 esirisc->cache_arch = ESIRISC_CACHE_VON_NEUMANN;
1677 else {
1678 LOG_ERROR("invalid cache_arch: %s", *CMD_ARGV);
1679 return ERROR_COMMAND_SYNTAX_ERROR;
1683 command_print(CMD, "esirisc cache_arch %s", esirisc_cache_arch_name(esirisc));
1685 return ERROR_OK;
1688 COMMAND_HANDLER(handle_esirisc_flush_caches_command)
1690 struct target *target = get_current_target(CMD_CTX);
1691 struct esirisc_common *esirisc = target_to_esirisc(target);
1692 int retval;
1694 if (!esirisc_has_cache(esirisc)) {
1695 LOG_ERROR("target does not support caching");
1696 return ERROR_FAIL;
1699 retval = esirisc_flush_caches(target);
1701 command_print(CMD, "cache flush %s",
1702 (retval == ERROR_OK) ? "successful" : "failed");
1704 return retval;
1707 static const struct {
1708 const char *name;
1709 int mask;
1710 } esirisc_hwdc_masks[] = {
1711 { "reset", HWDC_R },
1712 { "interrupt", HWDC_I },
1713 { "syscall", HWDC_S },
1714 { "error", HWDC_E },
1715 { "debug", HWDC_D },
1718 static int esirisc_find_hwdc_mask(const char *name)
1720 for (size_t i = 0; i < ARRAY_SIZE(esirisc_hwdc_masks); ++i)
1721 if (strcmp(esirisc_hwdc_masks[i].name, name) == 0)
1722 return esirisc_hwdc_masks[i].mask;
1724 return -1;
1727 COMMAND_HANDLER(handle_esirisc_hwdc_command)
1729 struct target *target = get_current_target(CMD_CTX);
1730 struct esirisc_common *esirisc = target_to_esirisc(target);
1732 if (CMD_ARGC > 0) {
1733 if (strcmp(CMD_ARGV[0], "all") == 0)
1734 esirisc->hwdc_save = HWDC_R | HWDC_I | HWDC_S | HWDC_E | HWDC_D;
1735 else {
1736 esirisc->hwdc_save = 0;
1737 if (strcmp(CMD_ARGV[0], "none") != 0) {
1738 while (CMD_ARGC-- > 0) {
1739 int mask = esirisc_find_hwdc_mask(CMD_ARGV[CMD_ARGC]);
1740 if (mask < 0) {
1741 LOG_ERROR("invalid mask: %s", CMD_ARGV[CMD_ARGC]);
1742 return ERROR_COMMAND_SYNTAX_ERROR;
1744 esirisc->hwdc_save |= mask;
1750 for (size_t i = 0; i < ARRAY_SIZE(esirisc_hwdc_masks); ++i)
1751 command_print(CMD, "%9s: %s", esirisc_hwdc_masks[i].name,
1752 (esirisc->hwdc_save & esirisc_hwdc_masks[i].mask) ? "enabled" : "disabled");
1754 return ERROR_OK;
1757 static const struct command_registration esirisc_exec_command_handlers[] = {
1759 .name = "flush_caches",
1760 .handler = handle_esirisc_flush_caches_command,
1761 .mode = COMMAND_EXEC,
1762 .help = "flush instruction and data caches",
1763 .usage = "",
1765 COMMAND_REGISTRATION_DONE
1768 static const struct command_registration esirisc_any_command_handlers[] = {
1770 .name = "cache_arch",
1771 .handler = handle_esirisc_cache_arch_command,
1772 .mode = COMMAND_ANY,
1773 .help = "configure cache architecture",
1774 .usage = "['harvard'|'von_neumann']",
1777 .name = "hwdc",
1778 .handler = handle_esirisc_hwdc_command,
1779 .mode = COMMAND_ANY,
1780 .help = "configure hardware debug control",
1781 .usage = "['all'|'none'|mask ...]",
1784 .chain = esirisc_exec_command_handlers
1787 .chain = esirisc_trace_command_handlers
1789 COMMAND_REGISTRATION_DONE
1792 static const struct command_registration esirisc_command_handlers[] = {
1794 .name = "esirisc",
1795 .mode = COMMAND_ANY,
1796 .help = "eSi-RISC command group",
1797 .usage = "",
1798 .chain = esirisc_any_command_handlers,
1800 COMMAND_REGISTRATION_DONE
1803 struct target_type esirisc_target = {
1804 .name = "esirisc",
1806 .poll = esirisc_poll,
1807 .arch_state = esirisc_arch_state,
1809 .halt = esirisc_halt,
1810 .resume = esirisc_resume,
1811 .step = esirisc_step,
1813 .assert_reset = esirisc_assert_reset,
1814 .deassert_reset = esirisc_deassert_reset,
1816 .get_gdb_arch = esirisc_get_gdb_arch,
1817 .get_gdb_reg_list = esirisc_get_gdb_reg_list,
1819 .read_memory = esirisc_read_memory,
1820 .write_memory = esirisc_write_memory,
1821 .checksum_memory = esirisc_checksum_memory,
1823 .add_breakpoint = esirisc_add_breakpoint,
1824 .remove_breakpoint = esirisc_remove_breakpoint,
1825 .add_watchpoint = esirisc_add_watchpoint,
1826 .remove_watchpoint = esirisc_remove_watchpoint,
1828 .commands = esirisc_command_handlers,
1830 .target_create = esirisc_target_create,
1831 .init_target = esirisc_init_target,
1832 .examine = esirisc_examine,