target: use boolean values for 'valid' and 'dirty' flags
[openocd.git] / src / target / arc.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2
3 /***************************************************************************
4 * Copyright (C) 2013-2015,2019-2020 Synopsys, Inc. *
5 * Frank Dols <frank.dols@synopsys.com> *
6 * Mischa Jonker <mischa.jonker@synopsys.com> *
7 * Anton Kolesov <anton.kolesov@synopsys.com> *
8 * Evgeniy Didin <didin@synopsys.com> *
9 ***************************************************************************/
10
11
12 #ifdef HAVE_CONFIG_H
13 #include "config.h"
14 #endif
15
16 #include "arc.h"
17
18
19
20 /*
21 * ARC architecture specific details.
22 *
23 * ARC has two types of registers:
24 * 1) core registers(e.g. r0,r1..) [is_core = true]
25 * 2) Auxiliary registers [is_core = false]..
26 *
27 * Auxiliary registers at the same time can be divided into
28 * read-only BCR(build configuration regs, e.g. isa_config, mpu_build) and
29 * R/RW non-BCR ("control" register, e.g. pc, status32_t, debug).
30 *
31 * The way of accessing to Core and AUX registers differs on Jtag level.
32 * BCR/non-BCR describes if the register is immutable and that reading
33 * unexisting register is safe RAZ, rather then an error.
34 * Note, core registers cannot be BCR.
35 *
36 * In arc/cpu/ tcl files all registers are defined as core, non-BCR aux
37 * and BCR aux, in "add-reg" command they are passed to three lists
38 * respectively: core_reg_descriptions, aux_reg_descriptions,
39 * bcr_reg_descriptions.
40 *
41 * Due to the specifics of accessing to BCR/non-BCR registers there are two
42 * register caches:
43 * 1) core_and_aux_cache - includes registers described in
44 * core_reg_descriptions and aux_reg_descriptions lists.
45 * Used during save/restore context step.
46 * 2) bcr_cache - includes registers described bcr_reg_descriptions.
47 * Currently used internally during configure step.
48 */
49
50
51 static int arc_remove_watchpoint(struct target *target,
52 struct watchpoint *watchpoint);
53
54 void arc_reg_data_type_add(struct target *target,
55 struct arc_reg_data_type *data_type)
56 {
57 LOG_DEBUG("Adding %s reg_data_type", data_type->data_type.id);
58 struct arc_common *arc = target_to_arc(target);
59 assert(arc);
60
61 list_add_tail(&data_type->list, &arc->reg_data_types);
62 }
63
64 /**
65 * Private implementation of register_get_by_name() for ARC that
66 * doesn't skip not [yet] existing registers. Used in many places
67 * for iteration through registers and even for marking required registers as
68 * existing.
69 */
70 struct reg *arc_reg_get_by_name(struct reg_cache *first,
71 const char *name, bool search_all)
72 {
73 unsigned int i;
74 struct reg_cache *cache = first;
75
76 while (cache) {
77 for (i = 0; i < cache->num_regs; i++) {
78 if (!strcmp(cache->reg_list[i].name, name))
79 return &(cache->reg_list[i]);
80 }
81
82 if (search_all)
83 cache = cache->next;
84 else
85 break;
86 }
87
88 return NULL;
89 }
90
91 /**
92 * Reset internal states of caches. Must be called when entering debugging.
93 *
94 * @param target Target for which to reset caches states.
95 */
96 static int arc_reset_caches_states(struct target *target)
97 {
98 struct arc_common *arc = target_to_arc(target);
99
100 LOG_DEBUG("Resetting internal variables of caches states");
101
102 /* Reset caches states. */
103 arc->dcache_flushed = false;
104 arc->l2cache_flushed = false;
105 arc->icache_invalidated = false;
106 arc->dcache_invalidated = false;
107 arc->l2cache_invalidated = false;
108
109 return ERROR_OK;
110 }
111
112 /* Initialize arc_common structure, which passes to openocd target instance */
113 static int arc_init_arch_info(struct target *target, struct arc_common *arc,
114 struct jtag_tap *tap)
115 {
116 arc->common_magic = ARC_COMMON_MAGIC;
117 target->arch_info = arc;
118
119 arc->jtag_info.tap = tap;
120
121 /* The only allowed ir_length is 4 for ARC jtag. */
122 if (tap->ir_length != 4) {
123 LOG_ERROR("ARC jtag instruction length should be equal to 4");
124 return ERROR_FAIL;
125 }
126
127 /* On most ARC targets there is a dcache, so we enable its flushing
128 * by default. If there no dcache, there will be no error, just a slight
129 * performance penalty from unnecessary JTAG operations. */
130 arc->has_dcache = true;
131 arc->has_icache = true;
132 /* L2$ is not available in a target by default. */
133 arc->has_l2cache = false;
134 arc_reset_caches_states(target);
135
136 /* Add standard GDB data types */
137 INIT_LIST_HEAD(&arc->reg_data_types);
138 struct arc_reg_data_type *std_types = calloc(ARRAY_SIZE(standard_gdb_types),
139 sizeof(*std_types));
140
141 if (!std_types) {
142 LOG_ERROR("Unable to allocate memory");
143 return ERROR_FAIL;
144 }
145
146 for (unsigned int i = 0; i < ARRAY_SIZE(standard_gdb_types); i++) {
147 std_types[i].data_type.type = standard_gdb_types[i].type;
148 std_types[i].data_type.id = standard_gdb_types[i].id;
149 arc_reg_data_type_add(target, &(std_types[i]));
150 }
151
152 /* Fields related to target descriptions */
153 INIT_LIST_HEAD(&arc->core_reg_descriptions);
154 INIT_LIST_HEAD(&arc->aux_reg_descriptions);
155 INIT_LIST_HEAD(&arc->bcr_reg_descriptions);
156 arc->num_regs = 0;
157 arc->num_core_regs = 0;
158 arc->num_aux_regs = 0;
159 arc->num_bcr_regs = 0;
160 arc->last_general_reg = ULONG_MAX;
161 arc->pc_index_in_cache = ULONG_MAX;
162 arc->debug_index_in_cache = ULONG_MAX;
163
164 return ERROR_OK;
165 }
166
167 int arc_reg_add(struct target *target, struct arc_reg_desc *arc_reg,
168 const char * const type_name, const size_t type_name_len)
169 {
170 assert(target);
171 assert(arc_reg);
172
173 struct arc_common *arc = target_to_arc(target);
174 assert(arc);
175
176 /* Find register type */
177 {
178 struct arc_reg_data_type *type;
179 list_for_each_entry(type, &arc->reg_data_types, list)
180 if (!strncmp(type->data_type.id, type_name, type_name_len)) {
181 arc_reg->data_type = &(type->data_type);
182 break;
183 }
184
185 if (!arc_reg->data_type)
186 return ERROR_ARC_REGTYPE_NOT_FOUND;
187 }
188
189 if (arc_reg->is_core) {
190 list_add_tail(&arc_reg->list, &arc->core_reg_descriptions);
191 arc->num_core_regs += 1;
192 } else if (arc_reg->is_bcr) {
193 list_add_tail(&arc_reg->list, &arc->bcr_reg_descriptions);
194 arc->num_bcr_regs += 1;
195 } else {
196 list_add_tail(&arc_reg->list, &arc->aux_reg_descriptions);
197 arc->num_aux_regs += 1;
198 }
199 arc->num_regs += 1;
200
201 LOG_DEBUG(
202 "added register {name=%s, num=0x%" PRIx32 ", type=%s%s%s%s}",
203 arc_reg->name, arc_reg->arch_num, arc_reg->data_type->id,
204 arc_reg->is_core ? ", core" : "", arc_reg->is_bcr ? ", bcr" : "",
205 arc_reg->is_general ? ", general" : ""
206 );
207
208 return ERROR_OK;
209 }
210
211 /* Reading core or aux register */
212 static int arc_get_register(struct reg *reg)
213 {
214 assert(reg);
215
216 struct arc_reg_desc *desc = reg->arch_info;
217 struct target *target = desc->target;
218 struct arc_common *arc = target_to_arc(target);
219
220 uint32_t value;
221
222 if (reg->valid) {
223 LOG_DEBUG("Get register (cached) gdb_num=%" PRIu32 ", name=%s, value=0x%" PRIx32,
224 reg->number, desc->name, target_buffer_get_u32(target, reg->value));
225 return ERROR_OK;
226 }
227
228 if (desc->is_core) {
229 /* Accessing to R61/R62 registers causes Jtag hang */
230 if (desc->arch_num == ARC_R61 || desc->arch_num == ARC_R62) {
231 LOG_ERROR("It is forbidden to read core registers 61 and 62.");
232 return ERROR_FAIL;
233 }
234 CHECK_RETVAL(arc_jtag_read_core_reg_one(&arc->jtag_info, desc->arch_num,
235 &value));
236 } else {
237 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, desc->arch_num,
238 &value));
239 }
240
241 target_buffer_set_u32(target, reg->value, value);
242
243 /* If target is unhalted all register reads should be uncached. */
244 if (target->state == TARGET_HALTED)
245 reg->valid = true;
246 else
247 reg->valid = false;
248
249 reg->dirty = false;
250
251 LOG_DEBUG("Get register gdb_num=%" PRIu32 ", name=%s, value=0x%" PRIx32,
252 reg->number, desc->name, value);
253
254
255 return ERROR_OK;
256 }
257
258 /* Writing core or aux register */
259 static int arc_set_register(struct reg *reg, uint8_t *buf)
260 {
261 struct arc_reg_desc *desc = reg->arch_info;
262 struct target *target = desc->target;
263 uint32_t value = target_buffer_get_u32(target, buf);
264 /* Unlike "get" function "set" is supported only if target
265 * is in halt mode. Async writes are not supported yet. */
266 if (target->state != TARGET_HALTED)
267 return ERROR_TARGET_NOT_HALTED;
268
269 /* Accessing to R61/R62 registers causes Jtag hang */
270 if (desc->is_core && (desc->arch_num == ARC_R61 ||
271 desc->arch_num == ARC_R62)) {
272 LOG_ERROR("It is forbidden to write core registers 61 and 62.");
273 return ERROR_FAIL;
274 }
275 target_buffer_set_u32(target, reg->value, value);
276
277 LOG_DEBUG("Set register gdb_num=%" PRIu32 ", name=%s, value=0x%08" PRIx32,
278 reg->number, desc->name, value);
279
280 reg->valid = true;
281 reg->dirty = true;
282
283 return ERROR_OK;
284 }
285
286 static const struct reg_arch_type arc_reg_type = {
287 .get = arc_get_register,
288 .set = arc_set_register,
289 };
290
291 /* GDB register groups. For now we support only general and "empty" */
292 static const char * const reg_group_general = "general";
293 static const char * const reg_group_other = "";
294
295 /* Common code to initialize `struct reg` for different registers: core, aux, bcr. */
296 static int arc_init_reg(struct target *target, struct reg *reg,
297 struct arc_reg_desc *reg_desc, unsigned long number)
298 {
299 assert(target);
300 assert(reg);
301 assert(reg_desc);
302
303 struct arc_common *arc = target_to_arc(target);
304
305 /* Initialize struct reg */
306 reg->name = reg_desc->name;
307 reg->size = 32; /* All register in ARC are 32-bit */
308 reg->value = reg_desc->reg_value;
309 reg->type = &arc_reg_type;
310 reg->arch_info = reg_desc;
311 reg->caller_save = true; /* @todo should be configurable. */
312 reg->reg_data_type = reg_desc->data_type;
313 reg->feature = &reg_desc->feature;
314
315 reg->feature->name = reg_desc->gdb_xml_feature;
316
317 /* reg->number is used by OpenOCD as value for @regnum. Thus when setting
318 * value of a register GDB will use it as a number of register in
319 * P-packet. OpenOCD gdbserver will then use number of register in
320 * P-packet as an array index in the reg_list returned by
321 * arc_regs_get_gdb_reg_list. So to ensure that registers are assigned
322 * correctly it would be required to either sort registers in
323 * arc_regs_get_gdb_reg_list or to assign numbers sequentially here and
324 * according to how registers will be sorted in
325 * arc_regs_get_gdb_reg_list. Second options is much more simpler. */
326 reg->number = number;
327
328 if (reg_desc->is_general) {
329 arc->last_general_reg = reg->number;
330 reg->group = reg_group_general;
331 } else {
332 reg->group = reg_group_other;
333 }
334
335 return ERROR_OK;
336 }
337
338 /* Building aux/core reg_cache */
339 static int arc_build_reg_cache(struct target *target)
340 {
341 unsigned long i = 0;
342 struct arc_reg_desc *reg_desc;
343 /* get pointers to arch-specific information */
344 struct arc_common *arc = target_to_arc(target);
345 const unsigned long num_regs = arc->num_core_regs + arc->num_aux_regs;
346 struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
347 struct reg_cache *cache = calloc(1, sizeof(*cache));
348 struct reg *reg_list = calloc(num_regs, sizeof(*reg_list));
349
350 if (!cache || !reg_list) {
351 LOG_ERROR("Not enough memory");
352 goto fail;
353 }
354
355 /* Build the process context cache */
356 cache->name = "arc registers";
357 cache->next = NULL;
358 cache->reg_list = reg_list;
359 cache->num_regs = num_regs;
360 arc->core_and_aux_cache = cache;
361 (*cache_p) = cache;
362
363 if (list_empty(&arc->core_reg_descriptions)) {
364 LOG_ERROR("No core registers were defined");
365 goto fail;
366 }
367
368 list_for_each_entry(reg_desc, &arc->core_reg_descriptions, list) {
369 CHECK_RETVAL(arc_init_reg(target, &reg_list[i], reg_desc, i));
370
371 LOG_DEBUG("reg n=%3li name=%3s group=%s feature=%s", i,
372 reg_list[i].name, reg_list[i].group,
373 reg_list[i].feature->name);
374
375 i += 1;
376 }
377
378 if (list_empty(&arc->aux_reg_descriptions)) {
379 LOG_ERROR("No aux registers were defined");
380 goto fail;
381 }
382
383 list_for_each_entry(reg_desc, &arc->aux_reg_descriptions, list) {
384 CHECK_RETVAL(arc_init_reg(target, &reg_list[i], reg_desc, i));
385
386 LOG_DEBUG("reg n=%3li name=%3s group=%s feature=%s", i,
387 reg_list[i].name, reg_list[i].group,
388 reg_list[i].feature->name);
389
390 /* PC and DEBUG are essential so we search for them. */
391 if (!strcmp("pc", reg_desc->name)) {
392 if (arc->pc_index_in_cache != ULONG_MAX) {
393 LOG_ERROR("Double definition of PC in configuration");
394 goto fail;
395 }
396 arc->pc_index_in_cache = i;
397 } else if (!strcmp("debug", reg_desc->name)) {
398 if (arc->debug_index_in_cache != ULONG_MAX) {
399 LOG_ERROR("Double definition of DEBUG in configuration");
400 goto fail;
401 }
402 arc->debug_index_in_cache = i;
403 }
404 i += 1;
405 }
406
407 if (arc->pc_index_in_cache == ULONG_MAX
408 || arc->debug_index_in_cache == ULONG_MAX) {
409 LOG_ERROR("`pc' and `debug' registers must be present in target description.");
410 goto fail;
411 }
412
413 assert(i == (arc->num_core_regs + arc->num_aux_regs));
414
415 arc->core_aux_cache_built = true;
416
417 return ERROR_OK;
418
419 fail:
420 free(cache);
421 free(reg_list);
422
423 return ERROR_FAIL;
424 }
425
426 /* Build bcr reg_cache.
427 * This function must be called only after arc_build_reg_cache */
428 static int arc_build_bcr_reg_cache(struct target *target)
429 {
430 /* get pointers to arch-specific information */
431 struct arc_common *arc = target_to_arc(target);
432 const unsigned long num_regs = arc->num_bcr_regs;
433 struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
434 struct reg_cache *cache = malloc(sizeof(*cache));
435 struct reg *reg_list = calloc(num_regs, sizeof(*reg_list));
436
437 struct arc_reg_desc *reg_desc;
438 unsigned long i = 0;
439 unsigned long gdb_regnum = arc->core_and_aux_cache->num_regs;
440
441 if (!cache || !reg_list) {
442 LOG_ERROR("Unable to allocate memory");
443 goto fail;
444 }
445
446 /* Build the process context cache */
447 cache->name = "arc.bcr";
448 cache->next = NULL;
449 cache->reg_list = reg_list;
450 cache->num_regs = num_regs;
451 arc->bcr_cache = cache;
452 (*cache_p) = cache;
453
454 if (list_empty(&arc->bcr_reg_descriptions)) {
455 LOG_ERROR("No BCR registers are defined");
456 goto fail;
457 }
458
459 list_for_each_entry(reg_desc, &arc->bcr_reg_descriptions, list) {
460 CHECK_RETVAL(arc_init_reg(target, &reg_list[i], reg_desc, gdb_regnum));
461 /* BCRs always semantically, they are just read-as-zero, if there is
462 * not real register. */
463 reg_list[i].exist = true;
464
465 LOG_DEBUG("reg n=%3li name=%3s group=%s feature=%s", i,
466 reg_list[i].name, reg_list[i].group,
467 reg_list[i].feature->name);
468 i += 1;
469 gdb_regnum += 1;
470 }
471
472 assert(i == arc->num_bcr_regs);
473
474 arc->bcr_cache_built = true;
475
476
477 return ERROR_OK;
478 fail:
479 free(cache);
480 free(reg_list);
481
482 return ERROR_FAIL;
483 }
484
485
486 static int arc_get_gdb_reg_list(struct target *target, struct reg **reg_list[],
487 int *reg_list_size, enum target_register_class reg_class)
488 {
489 assert(target->reg_cache);
490 struct arc_common *arc = target_to_arc(target);
491
492 /* get pointers to arch-specific information storage */
493 *reg_list_size = arc->num_regs;
494 *reg_list = calloc(*reg_list_size, sizeof(struct reg *));
495
496 if (!*reg_list) {
497 LOG_ERROR("Unable to allocate memory");
498 return ERROR_FAIL;
499 }
500
501 /* OpenOCD gdb_server API seems to be inconsistent here: when it generates
502 * XML tdesc it filters out !exist registers, however when creating a
503 * g-packet it doesn't do so. REG_CLASS_ALL is used in first case, and
504 * REG_CLASS_GENERAL used in the latter one. Due to this we had to filter
505 * out !exist register for "general", but not for "all". Attempts to filter out
506 * !exist for "all" as well will cause a failed check in OpenOCD GDB
507 * server. */
508 if (reg_class == REG_CLASS_ALL) {
509 unsigned long i = 0;
510 struct reg_cache *reg_cache = target->reg_cache;
511 while (reg_cache) {
512 for (unsigned j = 0; j < reg_cache->num_regs; j++, i++)
513 (*reg_list)[i] = &reg_cache->reg_list[j];
514 reg_cache = reg_cache->next;
515 }
516 assert(i == arc->num_regs);
517 LOG_DEBUG("REG_CLASS_ALL: number of regs=%i", *reg_list_size);
518 } else {
519 unsigned long i = 0;
520 unsigned long gdb_reg_number = 0;
521 struct reg_cache *reg_cache = target->reg_cache;
522 while (reg_cache) {
523 for (unsigned j = 0;
524 j < reg_cache->num_regs && gdb_reg_number <= arc->last_general_reg;
525 j++) {
526 if (reg_cache->reg_list[j].exist) {
527 (*reg_list)[i] = &reg_cache->reg_list[j];
528 i++;
529 }
530 gdb_reg_number += 1;
531 }
532 reg_cache = reg_cache->next;
533 }
534 *reg_list_size = i;
535 LOG_DEBUG("REG_CLASS_GENERAL: number of regs=%i", *reg_list_size);
536 }
537
538 return ERROR_OK;
539 }
540
541 /* Reading field of struct_type register */
542 int arc_reg_get_field(struct target *target, const char *reg_name,
543 const char *field_name, uint32_t *value_ptr)
544 {
545 struct reg_data_type_struct_field *field;
546
547 LOG_DEBUG("getting register field (reg_name=%s, field_name=%s)", reg_name, field_name);
548
549 /* Get register */
550 struct reg *reg = arc_reg_get_by_name(target->reg_cache, reg_name, true);
551
552 if (!reg) {
553 LOG_ERROR("Requested register `%s' doesn't exist.", reg_name);
554 return ERROR_ARC_REGISTER_NOT_FOUND;
555 }
556
557 if (reg->reg_data_type->type != REG_TYPE_ARCH_DEFINED
558 || reg->reg_data_type->type_class != REG_TYPE_CLASS_STRUCT)
559 return ERROR_ARC_REGISTER_IS_NOT_STRUCT;
560
561 /* Get field in a register */
562 struct reg_data_type_struct *reg_struct =
563 reg->reg_data_type->reg_type_struct;
564 for (field = reg_struct->fields;
565 field;
566 field = field->next) {
567 if (!strcmp(field->name, field_name))
568 break;
569 }
570
571 if (!field)
572 return ERROR_ARC_REGISTER_FIELD_NOT_FOUND;
573
574 if (!field->use_bitfields)
575 return ERROR_ARC_FIELD_IS_NOT_BITFIELD;
576
577 if (!reg->valid)
578 CHECK_RETVAL(reg->type->get(reg));
579
580 /* First do endianness-safe read of register value
581 * then convert it to binary buffer for further
582 * field extraction */
583
584 *value_ptr = buf_get_u32(reg->value, field->bitfield->start,
585 field->bitfield->end - field->bitfield->start + 1);
586
587 return ERROR_OK;
588 }
589
590 static int arc_get_register_value(struct target *target, const char *reg_name,
591 uint32_t *value_ptr)
592 {
593 LOG_DEBUG("reg_name=%s", reg_name);
594
595 struct reg *reg = arc_reg_get_by_name(target->reg_cache, reg_name, true);
596
597 if (!reg)
598 return ERROR_ARC_REGISTER_NOT_FOUND;
599
600 if (!reg->valid)
601 CHECK_RETVAL(reg->type->get(reg));
602
603 *value_ptr = target_buffer_get_u32(target, reg->value);
604
605 return ERROR_OK;
606 }
607
608 static int arc_set_register_value(struct target *target, const char *reg_name,
609 uint32_t value)
610 {
611 LOG_DEBUG("reg_name=%s value=0x%08" PRIx32, reg_name, value);
612
613 if (!(target && reg_name)) {
614 LOG_ERROR("Arguments cannot be NULL.");
615 return ERROR_FAIL;
616 }
617
618 struct reg *reg = arc_reg_get_by_name(target->reg_cache, reg_name, true);
619
620 if (!reg)
621 return ERROR_ARC_REGISTER_NOT_FOUND;
622
623 uint8_t value_buf[4];
624 buf_set_u32(value_buf, 0, 32, value);
625 CHECK_RETVAL(reg->type->set(reg, value_buf));
626
627 return ERROR_OK;
628 }
629
630 /* Configure DCCM's */
631 static int arc_configure_dccm(struct target *target)
632 {
633 struct arc_common *arc = target_to_arc(target);
634
635 uint32_t dccm_build_version, dccm_build_size0, dccm_build_size1;
636 CHECK_RETVAL(arc_reg_get_field(target, "dccm_build", "version",
637 &dccm_build_version));
638 CHECK_RETVAL(arc_reg_get_field(target, "dccm_build", "size0",
639 &dccm_build_size0));
640 CHECK_RETVAL(arc_reg_get_field(target, "dccm_build", "size1",
641 &dccm_build_size1));
642 /* There is no yet support of configurable number of cycles,
643 * So there is no difference between v3 and v4 */
644 if ((dccm_build_version == 3 || dccm_build_version == 4) && dccm_build_size0 > 0) {
645 CHECK_RETVAL(arc_get_register_value(target, "aux_dccm", &(arc->dccm_start)));
646 uint32_t dccm_size = 0x100;
647 dccm_size <<= dccm_build_size0;
648 if (dccm_build_size0 == 0xF)
649 dccm_size <<= dccm_build_size1;
650 arc->dccm_end = arc->dccm_start + dccm_size;
651 LOG_DEBUG("DCCM detected start=0x%" PRIx32 " end=0x%" PRIx32,
652 arc->dccm_start, arc->dccm_end);
653
654 }
655 return ERROR_OK;
656 }
657
658
659 /* Configure ICCM's */
660
661 static int arc_configure_iccm(struct target *target)
662 {
663 struct arc_common *arc = target_to_arc(target);
664
665 /* ICCM0 */
666 uint32_t iccm_build_version, iccm_build_size00, iccm_build_size01;
667 uint32_t aux_iccm = 0;
668 CHECK_RETVAL(arc_reg_get_field(target, "iccm_build", "version",
669 &iccm_build_version));
670 CHECK_RETVAL(arc_reg_get_field(target, "iccm_build", "iccm0_size0",
671 &iccm_build_size00));
672 CHECK_RETVAL(arc_reg_get_field(target, "iccm_build", "iccm0_size1",
673 &iccm_build_size01));
674 if (iccm_build_version == 4 && iccm_build_size00 > 0) {
675 CHECK_RETVAL(arc_get_register_value(target, "aux_iccm", &aux_iccm));
676 uint32_t iccm0_size = 0x100;
677 iccm0_size <<= iccm_build_size00;
678 if (iccm_build_size00 == 0xF)
679 iccm0_size <<= iccm_build_size01;
680 /* iccm0 start is located in highest 4 bits of aux_iccm */
681 arc->iccm0_start = aux_iccm & 0xF0000000;
682 arc->iccm0_end = arc->iccm0_start + iccm0_size;
683 LOG_DEBUG("ICCM0 detected start=0x%" PRIx32 " end=0x%" PRIx32,
684 arc->iccm0_start, arc->iccm0_end);
685 }
686
687 /* ICCM1 */
688 uint32_t iccm_build_size10, iccm_build_size11;
689 CHECK_RETVAL(arc_reg_get_field(target, "iccm_build", "iccm1_size0",
690 &iccm_build_size10));
691 CHECK_RETVAL(arc_reg_get_field(target, "iccm_build", "iccm1_size1",
692 &iccm_build_size11));
693 if (iccm_build_version == 4 && iccm_build_size10 > 0) {
694 /* Use value read for ICCM0 */
695 if (!aux_iccm)
696 CHECK_RETVAL(arc_get_register_value(target, "aux_iccm", &aux_iccm));
697 uint32_t iccm1_size = 0x100;
698 iccm1_size <<= iccm_build_size10;
699 if (iccm_build_size10 == 0xF)
700 iccm1_size <<= iccm_build_size11;
701 arc->iccm1_start = aux_iccm & 0x0F000000;
702 arc->iccm1_end = arc->iccm1_start + iccm1_size;
703 LOG_DEBUG("ICCM1 detected start=0x%" PRIx32 " end=0x%" PRIx32,
704 arc->iccm1_start, arc->iccm1_end);
705 }
706 return ERROR_OK;
707 }
708
709 /* Configure some core features, depending on BCRs. */
710 static int arc_configure(struct target *target)
711 {
712 LOG_DEBUG("Configuring ARC ICCM and DCCM");
713
714 /* Configuring DCCM if DCCM_BUILD and AUX_DCCM are known registers. */
715 if (arc_reg_get_by_name(target->reg_cache, "dccm_build", true) &&
716 arc_reg_get_by_name(target->reg_cache, "aux_dccm", true))
717 CHECK_RETVAL(arc_configure_dccm(target));
718
719 /* Configuring ICCM if ICCM_BUILD and AUX_ICCM are known registers. */
720 if (arc_reg_get_by_name(target->reg_cache, "iccm_build", true) &&
721 arc_reg_get_by_name(target->reg_cache, "aux_iccm", true))
722 CHECK_RETVAL(arc_configure_iccm(target));
723
724 return ERROR_OK;
725 }
726
727 /* arc_examine is function, which is used for all arc targets*/
728 static int arc_examine(struct target *target)
729 {
730 uint32_t status;
731 struct arc_common *arc = target_to_arc(target);
732
733 CHECK_RETVAL(arc_jtag_startup(&arc->jtag_info));
734
735 if (!target_was_examined(target)) {
736 CHECK_RETVAL(arc_jtag_status(&arc->jtag_info, &status));
737 if (status & ARC_JTAG_STAT_RU)
738 target->state = TARGET_RUNNING;
739 else
740 target->state = TARGET_HALTED;
741
742 /* Read BCRs and configure optional registers. */
743 CHECK_RETVAL(arc_configure(target));
744
745 target_set_examined(target);
746 }
747
748 return ERROR_OK;
749 }
750
751 static int arc_halt(struct target *target)
752 {
753 uint32_t value, irq_state;
754 struct arc_common *arc = target_to_arc(target);
755
756 LOG_DEBUG("target->state: %s", target_state_name(target));
757
758 if (target->state == TARGET_HALTED) {
759 LOG_DEBUG("target was already halted");
760 return ERROR_OK;
761 }
762
763 if (target->state == TARGET_UNKNOWN)
764 LOG_WARNING("target was in unknown state when halt was requested");
765
766 if (target->state == TARGET_RESET) {
767 if ((jtag_get_reset_config() & RESET_SRST_PULLS_TRST) && jtag_get_srst()) {
768 LOG_ERROR("can't request a halt while in reset if nSRST pulls nTRST");
769 return ERROR_TARGET_FAILURE;
770 } else {
771 target->debug_reason = DBG_REASON_DBGRQ;
772 }
773 }
774
775 /* Break (stop) processor.
776 * Do read-modify-write sequence, or DEBUG.UB will be reset unintentionally.
777 * We do not use here arc_get/set_core_reg functions here because they imply
778 * that the processor is already halted. */
779 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, AUX_DEBUG_REG, &value));
780 value |= SET_CORE_FORCE_HALT; /* set the HALT bit */
781 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_DEBUG_REG, value));
782 alive_sleep(1);
783
784 /* Save current IRQ state */
785 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, AUX_STATUS32_REG, &irq_state));
786
787 if (irq_state & AUX_STATUS32_REG_IE_BIT)
788 arc->irq_state = 1;
789 else
790 arc->irq_state = 0;
791
792 /* update state and notify gdb*/
793 target->state = TARGET_HALTED;
794 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_HALTED));
795
796 /* some more debug information */
797 if (debug_level >= LOG_LVL_DEBUG) {
798 LOG_DEBUG("core stopped (halted) DEGUB-REG: 0x%08" PRIx32, value);
799 CHECK_RETVAL(arc_get_register_value(target, "status32", &value));
800 LOG_DEBUG("core STATUS32: 0x%08" PRIx32, value);
801 }
802
803 return ERROR_OK;
804 }
805
806 /**
807 * Read registers that are used in GDB g-packet. We don't read them one-by-one,
808 * but do that in one batch operation to improve speed. Calls to JTAG layer are
809 * expensive so it is better to make one big call that reads all necessary
810 * registers, instead of many calls, one for one register.
811 */
812 static int arc_save_context(struct target *target)
813 {
814 int retval = ERROR_OK;
815 unsigned int i;
816 struct arc_common *arc = target_to_arc(target);
817 struct reg *reg_list = arc->core_and_aux_cache->reg_list;
818
819 LOG_DEBUG("Saving aux and core registers values");
820 assert(reg_list);
821
822 /* It is assumed that there is at least one AUX register in the list, for
823 * example PC. */
824 const uint32_t core_regs_size = arc->num_core_regs * sizeof(uint32_t);
825 /* last_general_reg is inclusive number. To get count of registers it is
826 * required to do +1. */
827 const uint32_t regs_to_scan =
828 MIN(arc->last_general_reg + 1, arc->num_regs);
829 const uint32_t aux_regs_size = arc->num_aux_regs * sizeof(uint32_t);
830 uint32_t *core_values = malloc(core_regs_size);
831 uint32_t *aux_values = malloc(aux_regs_size);
832 uint32_t *core_addrs = malloc(core_regs_size);
833 uint32_t *aux_addrs = malloc(aux_regs_size);
834 unsigned int core_cnt = 0;
835 unsigned int aux_cnt = 0;
836
837 if (!core_values || !core_addrs || !aux_values || !aux_addrs) {
838 LOG_ERROR("Unable to allocate memory");
839 retval = ERROR_FAIL;
840 goto exit;
841 }
842
843 memset(core_values, 0xff, core_regs_size);
844 memset(core_addrs, 0xff, core_regs_size);
845 memset(aux_values, 0xff, aux_regs_size);
846 memset(aux_addrs, 0xff, aux_regs_size);
847
848 for (i = 0; i < MIN(arc->num_core_regs, regs_to_scan); i++) {
849 struct reg *reg = reg_list + i;
850 struct arc_reg_desc *arc_reg = reg->arch_info;
851 if (!reg->valid && reg->exist)
852 core_addrs[core_cnt++] = arc_reg->arch_num;
853 }
854
855 for (i = arc->num_core_regs; i < regs_to_scan; i++) {
856 struct reg *reg = reg_list + i;
857 struct arc_reg_desc *arc_reg = reg->arch_info;
858 if (!reg->valid && reg->exist)
859 aux_addrs[aux_cnt++] = arc_reg->arch_num;
860 }
861
862 /* Read data from target. */
863 if (core_cnt > 0) {
864 retval = arc_jtag_read_core_reg(&arc->jtag_info, core_addrs, core_cnt, core_values);
865 if (retval != ERROR_OK) {
866 LOG_ERROR("Attempt to read core registers failed.");
867 retval = ERROR_FAIL;
868 goto exit;
869 }
870 }
871 if (aux_cnt > 0) {
872 retval = arc_jtag_read_aux_reg(&arc->jtag_info, aux_addrs, aux_cnt, aux_values);
873 if (retval != ERROR_OK) {
874 LOG_ERROR("Attempt to read aux registers failed.");
875 retval = ERROR_FAIL;
876 goto exit;
877 }
878 }
879
880 /* Parse core regs */
881 core_cnt = 0;
882 for (i = 0; i < MIN(arc->num_core_regs, regs_to_scan); i++) {
883 struct reg *reg = reg_list + i;
884 struct arc_reg_desc *arc_reg = reg->arch_info;
885 if (!reg->valid && reg->exist) {
886 target_buffer_set_u32(target, reg->value, core_values[core_cnt]);
887 reg->valid = true;
888 reg->dirty = false;
889 LOG_DEBUG("Get core register regnum=%u, name=%s, value=0x%08" PRIx32,
890 i, arc_reg->name, core_values[core_cnt]);
891 core_cnt++;
892 }
893 }
894
895 /* Parse aux regs */
896 aux_cnt = 0;
897 for (i = arc->num_core_regs; i < regs_to_scan; i++) {
898 struct reg *reg = reg_list + i;
899 struct arc_reg_desc *arc_reg = reg->arch_info;
900 if (!reg->valid && reg->exist) {
901 target_buffer_set_u32(target, reg->value, aux_values[aux_cnt]);
902 reg->valid = true;
903 reg->dirty = false;
904 LOG_DEBUG("Get aux register regnum=%u, name=%s, value=0x%08" PRIx32,
905 i, arc_reg->name, aux_values[aux_cnt]);
906 aux_cnt++;
907 }
908 }
909
910 exit:
911 free(core_values);
912 free(core_addrs);
913 free(aux_values);
914 free(aux_addrs);
915
916 return retval;
917 }
918
919 /**
920 * Finds an actionpoint that triggered last actionpoint event, as specified by
921 * DEBUG.ASR.
922 *
923 * @param target
924 * @param actionpoint Pointer to be set to last active actionpoint. Pointer
925 * will be set to NULL if DEBUG.AH is 0.
926 */
927 static int get_current_actionpoint(struct target *target,
928 struct arc_actionpoint **actionpoint)
929 {
930 assert(target);
931 assert(actionpoint);
932
933 uint32_t debug_ah;
934 /* Check if actionpoint caused halt */
935 CHECK_RETVAL(arc_reg_get_field(target, "debug", "ah",
936 &debug_ah));
937
938 if (debug_ah) {
939 struct arc_common *arc = target_to_arc(target);
940 unsigned int ap;
941 uint32_t debug_asr;
942 CHECK_RETVAL(arc_reg_get_field(target, "debug",
943 "asr", &debug_asr));
944
945 for (ap = 0; debug_asr > 1; debug_asr >>= 1)
946 ap += 1;
947
948 assert(ap < arc->actionpoints_num);
949
950 *actionpoint = &(arc->actionpoints_list[ap]);
951 } else {
952 *actionpoint = NULL;
953 }
954
955 return ERROR_OK;
956 }
957
958 static int arc_examine_debug_reason(struct target *target)
959 {
960 uint32_t debug_bh;
961
962 /* Only check for reason if don't know it already. */
963 /* BTW After singlestep at this point core is not marked as halted, so
964 * reading from memory to get current instruction wouldn't work anyway. */
965 if (target->debug_reason == DBG_REASON_DBGRQ ||
966 target->debug_reason == DBG_REASON_SINGLESTEP) {
967 return ERROR_OK;
968 }
969
970 CHECK_RETVAL(arc_reg_get_field(target, "debug", "bh",
971 &debug_bh));
972
973 if (debug_bh) {
974 /* DEBUG.BH is set if core halted due to BRK instruction. */
975 target->debug_reason = DBG_REASON_BREAKPOINT;
976 } else {
977 struct arc_actionpoint *actionpoint = NULL;
978 CHECK_RETVAL(get_current_actionpoint(target, &actionpoint));
979
980 if (actionpoint) {
981 if (!actionpoint->used)
982 LOG_WARNING("Target halted by an unused actionpoint.");
983
984 if (actionpoint->type == ARC_AP_BREAKPOINT)
985 target->debug_reason = DBG_REASON_BREAKPOINT;
986 else if (actionpoint->type == ARC_AP_WATCHPOINT)
987 target->debug_reason = DBG_REASON_WATCHPOINT;
988 else
989 LOG_WARNING("Unknown type of actionpoint.");
990 }
991 }
992
993 return ERROR_OK;
994 }
995
996 static int arc_debug_entry(struct target *target)
997 {
998 CHECK_RETVAL(arc_save_context(target));
999
1000 /* TODO: reset internal indicators of caches states, otherwise D$/I$
1001 * will not be flushed/invalidated when required. */
1002 CHECK_RETVAL(arc_reset_caches_states(target));
1003 CHECK_RETVAL(arc_examine_debug_reason(target));
1004
1005 return ERROR_OK;
1006 }
1007
1008 static int arc_poll(struct target *target)
1009 {
1010 uint32_t status, value;
1011 struct arc_common *arc = target_to_arc(target);
1012
1013 /* gdb calls continuously through this arc_poll() function */
1014 CHECK_RETVAL(arc_jtag_status(&arc->jtag_info, &status));
1015
1016 /* check for processor halted */
1017 if (status & ARC_JTAG_STAT_RU) {
1018 if (target->state != TARGET_RUNNING) {
1019 LOG_WARNING("target is still running!");
1020 target->state = TARGET_RUNNING;
1021 }
1022 return ERROR_OK;
1023 }
1024 /* In some cases JTAG status register indicates that
1025 * processor is in halt mode, but processor is still running.
1026 * We check halt bit of AUX STATUS32 register for setting correct state. */
1027 if ((target->state == TARGET_RUNNING) || (target->state == TARGET_RESET)) {
1028 CHECK_RETVAL(arc_get_register_value(target, "status32", &value));
1029 if (value & AUX_STATUS32_REG_HALT_BIT) {
1030 LOG_DEBUG("ARC core in halt or reset state.");
1031 /* Save context if target was not in reset state */
1032 if (target->state == TARGET_RUNNING)
1033 CHECK_RETVAL(arc_debug_entry(target));
1034 target->state = TARGET_HALTED;
1035 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_HALTED));
1036 } else {
1037 LOG_DEBUG("Discrepancy of STATUS32[0] HALT bit and ARC_JTAG_STAT_RU, "
1038 "target is still running");
1039 }
1040
1041 } else if (target->state == TARGET_DEBUG_RUNNING) {
1042
1043 target->state = TARGET_HALTED;
1044 LOG_DEBUG("ARC core is in debug running mode");
1045
1046 CHECK_RETVAL(arc_debug_entry(target));
1047
1048 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_DEBUG_HALTED));
1049 }
1050
1051 return ERROR_OK;
1052 }
1053
1054 static int arc_assert_reset(struct target *target)
1055 {
1056 struct arc_common *arc = target_to_arc(target);
1057 enum reset_types jtag_reset_config = jtag_get_reset_config();
1058 bool srst_asserted = false;
1059
1060 LOG_DEBUG("target->state: %s", target_state_name(target));
1061
1062 if (target_has_event_action(target, TARGET_EVENT_RESET_ASSERT)) {
1063 /* allow scripts to override the reset event */
1064
1065 target_handle_event(target, TARGET_EVENT_RESET_ASSERT);
1066 register_cache_invalidate(arc->core_and_aux_cache);
1067 /* An ARC target might be in halt state after reset, so
1068 * if script requested processor to resume, then it must
1069 * be manually started to ensure that this request
1070 * is satisfied. */
1071 if (target->state == TARGET_HALTED && !target->reset_halt) {
1072 /* Resume the target and continue from the current
1073 * PC register value. */
1074 LOG_DEBUG("Starting CPU execution after reset");
1075 CHECK_RETVAL(target_resume(target, 1, 0, 0, 0));
1076 }
1077 target->state = TARGET_RESET;
1078
1079 return ERROR_OK;
1080 }
1081
1082 /* some cores support connecting while srst is asserted
1083 * use that mode if it has been configured */
1084 if (!(jtag_reset_config & RESET_SRST_PULLS_TRST) &&
1085 (jtag_reset_config & RESET_SRST_NO_GATING)) {
1086 jtag_add_reset(0, 1);
1087 srst_asserted = true;
1088 }
1089
1090 if (jtag_reset_config & RESET_HAS_SRST) {
1091 /* should issue a srst only, but we may have to assert trst as well */
1092 if (jtag_reset_config & RESET_SRST_PULLS_TRST)
1093 jtag_add_reset(1, 1);
1094 else if (!srst_asserted)
1095 jtag_add_reset(0, 1);
1096 }
1097
1098 target->state = TARGET_RESET;
1099 jtag_add_sleep(50000);
1100
1101 register_cache_invalidate(arc->core_and_aux_cache);
1102
1103 if (target->reset_halt)
1104 CHECK_RETVAL(target_halt(target));
1105
1106 return ERROR_OK;
1107 }
1108
1109 static int arc_deassert_reset(struct target *target)
1110 {
1111 LOG_DEBUG("target->state: %s", target_state_name(target));
1112
1113 /* deassert reset lines */
1114 jtag_add_reset(0, 0);
1115
1116 return ERROR_OK;
1117 }
1118
1119 static int arc_arch_state(struct target *target)
1120 {
1121 uint32_t pc_value;
1122
1123 if (debug_level < LOG_LVL_DEBUG)
1124 return ERROR_OK;
1125
1126 CHECK_RETVAL(arc_get_register_value(target, "pc", &pc_value));
1127
1128 LOG_DEBUG("target state: %s; PC at: 0x%08" PRIx32,
1129 target_state_name(target),
1130 pc_value);
1131
1132 return ERROR_OK;
1133 }
1134
1135 /**
1136 * See arc_save_context() for reason why we want to dump all regs at once.
1137 * This however means that if there are dependencies between registers they
1138 * will not be observable until target will be resumed.
1139 */
1140 static int arc_restore_context(struct target *target)
1141 {
1142 int retval = ERROR_OK;
1143 unsigned int i;
1144 struct arc_common *arc = target_to_arc(target);
1145 struct reg *reg_list = arc->core_and_aux_cache->reg_list;
1146
1147 LOG_DEBUG("Restoring registers values");
1148 assert(reg_list);
1149
1150 const uint32_t core_regs_size = arc->num_core_regs * sizeof(uint32_t);
1151 const uint32_t aux_regs_size = arc->num_aux_regs * sizeof(uint32_t);
1152 uint32_t *core_values = malloc(core_regs_size);
1153 uint32_t *aux_values = malloc(aux_regs_size);
1154 uint32_t *core_addrs = malloc(core_regs_size);
1155 uint32_t *aux_addrs = malloc(aux_regs_size);
1156 unsigned int core_cnt = 0;
1157 unsigned int aux_cnt = 0;
1158
1159 if (!core_values || !core_addrs || !aux_values || !aux_addrs) {
1160 LOG_ERROR("Unable to allocate memory");
1161 retval = ERROR_FAIL;
1162 goto exit;
1163 }
1164
1165 memset(core_values, 0xff, core_regs_size);
1166 memset(core_addrs, 0xff, core_regs_size);
1167 memset(aux_values, 0xff, aux_regs_size);
1168 memset(aux_addrs, 0xff, aux_regs_size);
1169
1170 for (i = 0; i < arc->num_core_regs; i++) {
1171 struct reg *reg = &(reg_list[i]);
1172 struct arc_reg_desc *arc_reg = reg->arch_info;
1173 if (reg->valid && reg->exist && reg->dirty) {
1174 LOG_DEBUG("Will write regnum=%u", i);
1175 core_addrs[core_cnt] = arc_reg->arch_num;
1176 core_values[core_cnt] = target_buffer_get_u32(target, reg->value);
1177 core_cnt += 1;
1178 }
1179 }
1180
1181 for (i = 0; i < arc->num_aux_regs; i++) {
1182 struct reg *reg = &(reg_list[arc->num_core_regs + i]);
1183 struct arc_reg_desc *arc_reg = reg->arch_info;
1184 if (reg->valid && reg->exist && reg->dirty) {
1185 LOG_DEBUG("Will write regnum=%lu", arc->num_core_regs + i);
1186 aux_addrs[aux_cnt] = arc_reg->arch_num;
1187 aux_values[aux_cnt] = target_buffer_get_u32(target, reg->value);
1188 aux_cnt += 1;
1189 }
1190 }
1191
1192 /* Write data to target.
1193 * Check before write, if aux and core count is greater than 0. */
1194 if (core_cnt > 0) {
1195 retval = arc_jtag_write_core_reg(&arc->jtag_info, core_addrs, core_cnt, core_values);
1196 if (retval != ERROR_OK) {
1197 LOG_ERROR("Attempt to write to core registers failed.");
1198 retval = ERROR_FAIL;
1199 goto exit;
1200 }
1201 }
1202
1203 if (aux_cnt > 0) {
1204 retval = arc_jtag_write_aux_reg(&arc->jtag_info, aux_addrs, aux_cnt, aux_values);
1205 if (retval != ERROR_OK) {
1206 LOG_ERROR("Attempt to write to aux registers failed.");
1207 retval = ERROR_FAIL;
1208 goto exit;
1209 }
1210 }
1211
1212 exit:
1213 free(core_values);
1214 free(core_addrs);
1215 free(aux_values);
1216 free(aux_addrs);
1217
1218 return retval;
1219 }
1220
1221 static int arc_enable_interrupts(struct target *target, int enable)
1222 {
1223 uint32_t value;
1224
1225 struct arc_common *arc = target_to_arc(target);
1226
1227 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, AUX_STATUS32_REG, &value));
1228
1229 if (enable) {
1230 /* enable interrupts */
1231 value |= SET_CORE_ENABLE_INTERRUPTS;
1232 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_STATUS32_REG, value));
1233 LOG_DEBUG("interrupts enabled");
1234 } else {
1235 /* disable interrupts */
1236 value &= ~SET_CORE_ENABLE_INTERRUPTS;
1237 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_STATUS32_REG, value));
1238 LOG_DEBUG("interrupts disabled");
1239 }
1240
1241 return ERROR_OK;
1242 }
1243
1244 static int arc_resume(struct target *target, int current, target_addr_t address,
1245 int handle_breakpoints, int debug_execution)
1246 {
1247 struct arc_common *arc = target_to_arc(target);
1248 uint32_t resume_pc = 0;
1249 uint32_t value;
1250 struct reg *pc = &arc->core_and_aux_cache->reg_list[arc->pc_index_in_cache];
1251
1252 LOG_DEBUG("current:%i, address:0x%08" TARGET_PRIxADDR ", handle_breakpoints(not supported yet):%i,"
1253 " debug_execution:%i", current, address, handle_breakpoints, debug_execution);
1254
1255 /* We need to reset ARC cache variables so caches
1256 * would be invalidated and actual data
1257 * would be fetched from memory. */
1258 CHECK_RETVAL(arc_reset_caches_states(target));
1259
1260 if (target->state != TARGET_HALTED) {
1261 LOG_TARGET_ERROR(target, "not halted");
1262 return ERROR_TARGET_NOT_HALTED;
1263 }
1264
1265 /* current = 1: continue on current PC, otherwise continue at <address> */
1266 if (!current) {
1267 target_buffer_set_u32(target, pc->value, address);
1268 pc->dirty = true;
1269 pc->valid = true;
1270 LOG_DEBUG("Changing the value of current PC to 0x%08" TARGET_PRIxADDR, address);
1271 }
1272
1273 if (!current)
1274 resume_pc = address;
1275 else
1276 resume_pc = target_buffer_get_u32(target, pc->value);
1277
1278 CHECK_RETVAL(arc_restore_context(target));
1279
1280 LOG_DEBUG("Target resumes from PC=0x%" PRIx32 ", pc.dirty=%i, pc.valid=%i",
1281 resume_pc, pc->dirty, pc->valid);
1282
1283 /* check if GDB tells to set our PC where to continue from */
1284 if (pc->valid && resume_pc == target_buffer_get_u32(target, pc->value)) {
1285 value = target_buffer_get_u32(target, pc->value);
1286 LOG_DEBUG("resume Core (when start-core) with PC @:0x%08" PRIx32, value);
1287 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_PC_REG, value));
1288 }
1289
1290 /* Restore IRQ state if not in debug_execution*/
1291 if (!debug_execution)
1292 CHECK_RETVAL(arc_enable_interrupts(target, arc->irq_state));
1293 else
1294 CHECK_RETVAL(arc_enable_interrupts(target, !debug_execution));
1295
1296 target->debug_reason = DBG_REASON_NOTHALTED;
1297
1298 /* ready to get us going again */
1299 target->state = TARGET_RUNNING;
1300 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, AUX_STATUS32_REG, &value));
1301 value &= ~SET_CORE_HALT_BIT; /* clear the HALT bit */
1302 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_STATUS32_REG, value));
1303 LOG_DEBUG("Core started to run");
1304
1305 /* registers are now invalid */
1306 register_cache_invalidate(arc->core_and_aux_cache);
1307
1308 if (!debug_execution) {
1309 target->state = TARGET_RUNNING;
1310 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_RESUMED));
1311 LOG_DEBUG("target resumed at 0x%08" PRIx32, resume_pc);
1312 } else {
1313 target->state = TARGET_DEBUG_RUNNING;
1314 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_DEBUG_RESUMED));
1315 LOG_DEBUG("target debug resumed at 0x%08" PRIx32, resume_pc);
1316 }
1317
1318 return ERROR_OK;
1319 }
1320
1321 static int arc_init_target(struct command_context *cmd_ctx, struct target *target)
1322 {
1323 CHECK_RETVAL(arc_build_reg_cache(target));
1324 CHECK_RETVAL(arc_build_bcr_reg_cache(target));
1325 target->debug_reason = DBG_REASON_DBGRQ;
1326 return ERROR_OK;
1327 }
1328
1329 static void arc_free_reg_cache(struct reg_cache *cache)
1330 {
1331 free(cache->reg_list);
1332 free(cache);
1333 }
1334
1335 static void arc_deinit_target(struct target *target)
1336 {
1337 struct arc_common *arc = target_to_arc(target);
1338
1339 LOG_DEBUG("deinitialization of target");
1340 if (arc->core_aux_cache_built)
1341 arc_free_reg_cache(arc->core_and_aux_cache);
1342 if (arc->bcr_cache_built)
1343 arc_free_reg_cache(arc->bcr_cache);
1344
1345 struct arc_reg_data_type *type, *n;
1346 struct arc_reg_desc *desc, *k;
1347
1348 /* Free arc-specific reg_data_types allocations*/
1349 list_for_each_entry_safe_reverse(type, n, &arc->reg_data_types, list) {
1350 if (type->data_type.type_class == REG_TYPE_CLASS_STRUCT) {
1351 free(type->reg_type_struct_field);
1352 free(type->bitfields);
1353 free(type);
1354 } else if (type->data_type.type_class == REG_TYPE_CLASS_FLAGS) {
1355 free(type->reg_type_flags_field);
1356 free(type->bitfields);
1357 free(type);
1358 }
1359 }
1360
1361 /* Free standard_gdb_types reg_data_types allocations */
1362 type = list_first_entry(&arc->reg_data_types, struct arc_reg_data_type, list);
1363 free(type);
1364
1365 list_for_each_entry_safe(desc, k, &arc->aux_reg_descriptions, list)
1366 free_reg_desc(desc);
1367
1368 list_for_each_entry_safe(desc, k, &arc->core_reg_descriptions, list)
1369 free_reg_desc(desc);
1370
1371 list_for_each_entry_safe(desc, k, &arc->bcr_reg_descriptions, list)
1372 free_reg_desc(desc);
1373
1374 free(arc->actionpoints_list);
1375 free(arc);
1376 }
1377
1378
1379 static int arc_target_create(struct target *target, Jim_Interp *interp)
1380 {
1381 struct arc_common *arc = calloc(1, sizeof(*arc));
1382
1383 if (!arc) {
1384 LOG_ERROR("Unable to allocate memory");
1385 return ERROR_FAIL;
1386 }
1387
1388 LOG_DEBUG("Entering");
1389 CHECK_RETVAL(arc_init_arch_info(target, arc, target->tap));
1390
1391 return ERROR_OK;
1392 }
1393
1394 /**
1395 * Write 4-byte instruction to memory. This is like target_write_u32, however
1396 * in case of little endian ARC instructions are in middle endian format, not
1397 * little endian, so different type of conversion should be done.
1398 * Middle endian: instruction "aabbccdd", stored as "bbaaddcc"
1399 */
1400 static int arc_write_instruction_u32(struct target *target, uint32_t address,
1401 uint32_t instr)
1402 {
1403 uint8_t value_buf[4];
1404 if (!target_was_examined(target)) {
1405 LOG_ERROR("Target not examined yet");
1406 return ERROR_FAIL;
1407 }
1408
1409 LOG_DEBUG("Address: 0x%08" PRIx32 ", value: 0x%08" PRIx32, address,
1410 instr);
1411
1412 if (target->endianness == TARGET_LITTLE_ENDIAN)
1413 arc_h_u32_to_me(value_buf, instr);
1414 else
1415 h_u32_to_be(value_buf, instr);
1416
1417 CHECK_RETVAL(target_write_buffer(target, address, 4, value_buf));
1418
1419 return ERROR_OK;
1420 }
1421
1422 /**
1423 * Read 32-bit instruction from memory. It is like target_read_u32, however in
1424 * case of little endian ARC instructions are in middle endian format, so
1425 * different type of conversion should be done.
1426 */
1427 static int arc_read_instruction_u32(struct target *target, uint32_t address,
1428 uint32_t *value)
1429 {
1430 uint8_t value_buf[4];
1431
1432 if (!target_was_examined(target)) {
1433 LOG_ERROR("Target not examined yet");
1434 return ERROR_FAIL;
1435 }
1436
1437 *value = 0;
1438 CHECK_RETVAL(target_read_buffer(target, address, 4, value_buf));
1439
1440 if (target->endianness == TARGET_LITTLE_ENDIAN)
1441 *value = arc_me_to_h_u32(value_buf);
1442 else
1443 *value = be_to_h_u32(value_buf);
1444
1445 LOG_DEBUG("Address: 0x%08" PRIx32 ", value: 0x%08" PRIx32, address,
1446 *value);
1447
1448 return ERROR_OK;
1449 }
1450
1451 /* Actionpoint mechanism allows to setup HW breakpoints
1452 * and watchpoints. Each actionpoint is controlled by
1453 * 3 aux registers: Actionpoint(AP) match mask(AP_AMM), AP match value(AP_AMV)
1454 * and AP control(AC).
1455 * This function is for setting/unsetting actionpoints:
1456 * at - actionpoint target: trigger on mem/reg access
1457 * tt - transaction type : trigger on r/w. */
1458 static int arc_configure_actionpoint(struct target *target, uint32_t ap_num,
1459 uint32_t match_value, uint32_t control_tt, uint32_t control_at)
1460 {
1461 struct arc_common *arc = target_to_arc(target);
1462
1463 if (control_tt != AP_AC_TT_DISABLE) {
1464
1465 if (arc->actionpoints_num_avail < 1) {
1466 LOG_ERROR("No free actionpoints, maximum amount is %u",
1467 arc->actionpoints_num);
1468 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1469 }
1470
1471 /* Names of register to set - 24 chars should be enough. Looks a little
1472 * bit out-of-place for C code, but makes it aligned to the bigger
1473 * concept of "ARC registers are defined in TCL" as far as possible.
1474 */
1475 char ap_amv_reg_name[24], ap_amm_reg_name[24], ap_ac_reg_name[24];
1476 snprintf(ap_amv_reg_name, 24, "ap_amv%" PRIu32, ap_num);
1477 snprintf(ap_amm_reg_name, 24, "ap_amm%" PRIu32, ap_num);
1478 snprintf(ap_ac_reg_name, 24, "ap_ac%" PRIu32, ap_num);
1479 CHECK_RETVAL(arc_set_register_value(target, ap_amv_reg_name,
1480 match_value));
1481 CHECK_RETVAL(arc_set_register_value(target, ap_amm_reg_name, 0));
1482 CHECK_RETVAL(arc_set_register_value(target, ap_ac_reg_name,
1483 control_tt | control_at));
1484 arc->actionpoints_num_avail--;
1485 } else {
1486 char ap_ac_reg_name[24];
1487 snprintf(ap_ac_reg_name, 24, "ap_ac%" PRIu32, ap_num);
1488 CHECK_RETVAL(arc_set_register_value(target, ap_ac_reg_name,
1489 AP_AC_TT_DISABLE));
1490 arc->actionpoints_num_avail++;
1491 }
1492
1493 return ERROR_OK;
1494 }
1495
1496 static int arc_set_breakpoint(struct target *target,
1497 struct breakpoint *breakpoint)
1498 {
1499 if (breakpoint->is_set) {
1500 LOG_WARNING("breakpoint already set");
1501 return ERROR_OK;
1502 }
1503
1504 if (breakpoint->type == BKPT_SOFT) {
1505 LOG_DEBUG("bpid: %" PRIu32, breakpoint->unique_id);
1506
1507 if (breakpoint->length == 4) {
1508 uint32_t verify = 0xffffffff;
1509
1510 CHECK_RETVAL(target_read_buffer(target, breakpoint->address, breakpoint->length,
1511 breakpoint->orig_instr));
1512
1513 CHECK_RETVAL(arc_write_instruction_u32(target, breakpoint->address,
1514 ARC_SDBBP_32));
1515
1516 CHECK_RETVAL(arc_read_instruction_u32(target, breakpoint->address, &verify));
1517
1518 if (verify != ARC_SDBBP_32) {
1519 LOG_ERROR("Unable to set 32bit breakpoint at address @0x%" TARGET_PRIxADDR
1520 " - check that memory is read/writable", breakpoint->address);
1521 return ERROR_FAIL;
1522 }
1523 } else if (breakpoint->length == 2) {
1524 uint16_t verify = 0xffff;
1525
1526 CHECK_RETVAL(target_read_buffer(target, breakpoint->address, breakpoint->length,
1527 breakpoint->orig_instr));
1528 CHECK_RETVAL(target_write_u16(target, breakpoint->address, ARC_SDBBP_16));
1529
1530 CHECK_RETVAL(target_read_u16(target, breakpoint->address, &verify));
1531 if (verify != ARC_SDBBP_16) {
1532 LOG_ERROR("Unable to set 16bit breakpoint at address @0x%" TARGET_PRIxADDR
1533 " - check that memory is read/writable", breakpoint->address);
1534 return ERROR_FAIL;
1535 }
1536 } else {
1537 LOG_ERROR("Invalid breakpoint length: target supports only 2 or 4");
1538 return ERROR_COMMAND_ARGUMENT_INVALID;
1539 }
1540
1541 breakpoint->is_set = true;
1542 } else if (breakpoint->type == BKPT_HARD) {
1543 struct arc_common *arc = target_to_arc(target);
1544 struct arc_actionpoint *ap_list = arc->actionpoints_list;
1545 unsigned int bp_num;
1546
1547 for (bp_num = 0; bp_num < arc->actionpoints_num; bp_num++) {
1548 if (!ap_list[bp_num].used)
1549 break;
1550 }
1551
1552 if (bp_num >= arc->actionpoints_num) {
1553 LOG_ERROR("No free actionpoints, maximum amount is %u",
1554 arc->actionpoints_num);
1555 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1556 }
1557
1558 int retval = arc_configure_actionpoint(target, bp_num,
1559 breakpoint->address, AP_AC_TT_READWRITE, AP_AC_AT_INST_ADDR);
1560
1561 if (retval == ERROR_OK) {
1562 breakpoint_hw_set(breakpoint, bp_num);
1563 ap_list[bp_num].used = 1;
1564 ap_list[bp_num].bp_value = breakpoint->address;
1565 ap_list[bp_num].type = ARC_AP_BREAKPOINT;
1566
1567 LOG_DEBUG("bpid: %" PRIu32 ", bp_num %u bp_value 0x%" PRIx32,
1568 breakpoint->unique_id, bp_num, ap_list[bp_num].bp_value);
1569 }
1570
1571 } else {
1572 LOG_DEBUG("ERROR: setting unknown breakpoint type");
1573 return ERROR_FAIL;
1574 }
1575
1576 return ERROR_OK;
1577 }
1578
1579 static int arc_unset_breakpoint(struct target *target,
1580 struct breakpoint *breakpoint)
1581 {
1582 int retval = ERROR_OK;
1583
1584 if (!breakpoint->is_set) {
1585 LOG_WARNING("breakpoint not set");
1586 return ERROR_OK;
1587 }
1588
1589 if (breakpoint->type == BKPT_SOFT) {
1590 /* restore original instruction (kept in target endianness) */
1591 LOG_DEBUG("bpid: %" PRIu32, breakpoint->unique_id);
1592 if (breakpoint->length == 4) {
1593 uint32_t current_instr;
1594
1595 /* check that user program has not modified breakpoint instruction */
1596 CHECK_RETVAL(arc_read_instruction_u32(target, breakpoint->address, &current_instr));
1597
1598 if (current_instr == ARC_SDBBP_32) {
1599 retval = target_write_buffer(target, breakpoint->address,
1600 breakpoint->length, breakpoint->orig_instr);
1601 if (retval != ERROR_OK)
1602 return retval;
1603 } else {
1604 LOG_WARNING("Software breakpoint @0x%" TARGET_PRIxADDR
1605 " has been overwritten outside of debugger."
1606 "Expected: @0x%x, got: @0x%" PRIx32,
1607 breakpoint->address, ARC_SDBBP_32, current_instr);
1608 }
1609 } else if (breakpoint->length == 2) {
1610 uint16_t current_instr;
1611
1612 /* check that user program has not modified breakpoint instruction */
1613 CHECK_RETVAL(target_read_u16(target, breakpoint->address, &current_instr));
1614 if (current_instr == ARC_SDBBP_16) {
1615 retval = target_write_buffer(target, breakpoint->address,
1616 breakpoint->length, breakpoint->orig_instr);
1617 if (retval != ERROR_OK)
1618 return retval;
1619 } else {
1620 LOG_WARNING("Software breakpoint @0x%" TARGET_PRIxADDR
1621 " has been overwritten outside of debugger. "
1622 "Expected: 0x%04x, got: 0x%04" PRIx16,
1623 breakpoint->address, ARC_SDBBP_16, current_instr);
1624 }
1625 } else {
1626 LOG_ERROR("Invalid breakpoint length: target supports only 2 or 4");
1627 return ERROR_COMMAND_ARGUMENT_INVALID;
1628 }
1629 breakpoint->is_set = false;
1630
1631 } else if (breakpoint->type == BKPT_HARD) {
1632 struct arc_common *arc = target_to_arc(target);
1633 struct arc_actionpoint *ap_list = arc->actionpoints_list;
1634 unsigned int bp_num = breakpoint->number;
1635
1636 if (bp_num >= arc->actionpoints_num) {
1637 LOG_DEBUG("Invalid actionpoint ID: %u in breakpoint: %" PRIu32,
1638 bp_num, breakpoint->unique_id);
1639 return ERROR_OK;
1640 }
1641
1642 retval = arc_configure_actionpoint(target, bp_num,
1643 breakpoint->address, AP_AC_TT_DISABLE, AP_AC_AT_INST_ADDR);
1644
1645 if (retval == ERROR_OK) {
1646 breakpoint->is_set = false;
1647 ap_list[bp_num].used = 0;
1648 ap_list[bp_num].bp_value = 0;
1649
1650 LOG_DEBUG("bpid: %" PRIu32 " - released actionpoint ID: %u",
1651 breakpoint->unique_id, bp_num);
1652 }
1653 } else {
1654 LOG_DEBUG("ERROR: unsetting unknown breakpoint type");
1655 return ERROR_FAIL;
1656 }
1657
1658 return retval;
1659 }
1660
1661
1662 static int arc_add_breakpoint(struct target *target, struct breakpoint *breakpoint)
1663 {
1664 if (target->state == TARGET_HALTED) {
1665 return arc_set_breakpoint(target, breakpoint);
1666
1667 } else {
1668 LOG_TARGET_ERROR(target, "not halted (add breakpoint)");
1669 return ERROR_TARGET_NOT_HALTED;
1670 }
1671 }
1672
1673 static int arc_remove_breakpoint(struct target *target,
1674 struct breakpoint *breakpoint)
1675 {
1676 if (target->state == TARGET_HALTED) {
1677 if (breakpoint->is_set)
1678 CHECK_RETVAL(arc_unset_breakpoint(target, breakpoint));
1679 } else {
1680 LOG_TARGET_ERROR(target, "not halted (remove breakpoint)");
1681 return ERROR_TARGET_NOT_HALTED;
1682 }
1683
1684 return ERROR_OK;
1685 }
1686
1687 static void arc_reset_actionpoints(struct target *target)
1688 {
1689 struct arc_common *arc = target_to_arc(target);
1690 struct arc_actionpoint *ap_list = arc->actionpoints_list;
1691 struct breakpoint *next_b;
1692 struct watchpoint *next_w;
1693
1694 while (target->breakpoints) {
1695 next_b = target->breakpoints->next;
1696 arc_remove_breakpoint(target, target->breakpoints);
1697 free(target->breakpoints->orig_instr);
1698 free(target->breakpoints);
1699 target->breakpoints = next_b;
1700 }
1701 while (target->watchpoints) {
1702 next_w = target->watchpoints->next;
1703 arc_remove_watchpoint(target, target->watchpoints);
1704 free(target->watchpoints);
1705 target->watchpoints = next_w;
1706 }
1707 for (unsigned int i = 0; i < arc->actionpoints_num; i++) {
1708 if ((ap_list[i].used) && (ap_list[i].reg_address))
1709 arc_remove_auxreg_actionpoint(target, ap_list[i].reg_address);
1710 }
1711 }
1712
1713 int arc_set_actionpoints_num(struct target *target, uint32_t ap_num)
1714 {
1715 LOG_DEBUG("target=%s actionpoints=%" PRIu32, target_name(target), ap_num);
1716 struct arc_common *arc = target_to_arc(target);
1717
1718 /* Make sure that there are no enabled actionpoints in target. */
1719 arc_reset_actionpoints(target);
1720
1721 /* Assume that all points have been removed from target. */
1722 free(arc->actionpoints_list);
1723
1724 arc->actionpoints_num_avail = ap_num;
1725 arc->actionpoints_num = ap_num;
1726 /* calloc can be safely called when ncount == 0. */
1727 arc->actionpoints_list = calloc(ap_num, sizeof(struct arc_actionpoint));
1728
1729 if (!arc->actionpoints_list) {
1730 LOG_ERROR("Unable to allocate memory");
1731 return ERROR_FAIL;
1732 }
1733 return ERROR_OK;
1734 }
1735
1736
1737 int arc_add_auxreg_actionpoint(struct target *target,
1738 uint32_t auxreg_addr, uint32_t transaction)
1739 {
1740 unsigned int ap_num = 0;
1741 int retval = ERROR_OK;
1742
1743 if (target->state != TARGET_HALTED)
1744 return ERROR_TARGET_NOT_HALTED;
1745
1746 struct arc_common *arc = target_to_arc(target);
1747 struct arc_actionpoint *ap_list = arc->actionpoints_list;
1748
1749 while (ap_list[ap_num].used)
1750 ap_num++;
1751
1752 if (ap_num >= arc->actionpoints_num) {
1753 LOG_ERROR("No actionpoint free, maximum amount is %u",
1754 arc->actionpoints_num);
1755 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1756 }
1757
1758 retval = arc_configure_actionpoint(target, ap_num,
1759 auxreg_addr, transaction, AP_AC_AT_AUXREG_ADDR);
1760
1761 if (retval == ERROR_OK) {
1762 ap_list[ap_num].used = 1;
1763 ap_list[ap_num].reg_address = auxreg_addr;
1764 }
1765
1766 return retval;
1767 }
1768
1769 int arc_remove_auxreg_actionpoint(struct target *target, uint32_t auxreg_addr)
1770 {
1771 int retval = ERROR_OK;
1772 bool ap_found = false;
1773 unsigned int ap_num = 0;
1774
1775 if (target->state != TARGET_HALTED)
1776 return ERROR_TARGET_NOT_HALTED;
1777
1778 struct arc_common *arc = target_to_arc(target);
1779 struct arc_actionpoint *ap_list = arc->actionpoints_list;
1780
1781 while ((ap_list[ap_num].used) && (ap_num < arc->actionpoints_num)) {
1782 if (ap_list[ap_num].reg_address == auxreg_addr) {
1783 ap_found = true;
1784 break;
1785 }
1786 ap_num++;
1787 }
1788
1789 if (ap_found) {
1790 retval = arc_configure_actionpoint(target, ap_num,
1791 auxreg_addr, AP_AC_TT_DISABLE, AP_AC_AT_AUXREG_ADDR);
1792
1793 if (retval == ERROR_OK) {
1794 ap_list[ap_num].used = 0;
1795 ap_list[ap_num].bp_value = 0;
1796 }
1797 } else {
1798 LOG_ERROR("Register actionpoint not found");
1799 }
1800 return retval;
1801 }
1802
1803
1804 static int arc_set_watchpoint(struct target *target,
1805 struct watchpoint *watchpoint)
1806 {
1807 unsigned int wp_num;
1808 struct arc_common *arc = target_to_arc(target);
1809 struct arc_actionpoint *ap_list = arc->actionpoints_list;
1810
1811 if (watchpoint->is_set) {
1812 LOG_WARNING("watchpoint already set");
1813 return ERROR_OK;
1814 }
1815
1816 for (wp_num = 0; wp_num < arc->actionpoints_num; wp_num++) {
1817 if (!ap_list[wp_num].used)
1818 break;
1819 }
1820
1821 if (wp_num >= arc->actionpoints_num) {
1822 LOG_ERROR("No free actionpoints, maximum amount is %u",
1823 arc->actionpoints_num);
1824 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1825 }
1826
1827 if (watchpoint->length != 4) {
1828 LOG_ERROR("Only watchpoints of length 4 are supported");
1829 return ERROR_TARGET_UNALIGNED_ACCESS;
1830 }
1831
1832 int enable = AP_AC_TT_DISABLE;
1833 switch (watchpoint->rw) {
1834 case WPT_READ:
1835 enable = AP_AC_TT_READ;
1836 break;
1837 case WPT_WRITE:
1838 enable = AP_AC_TT_WRITE;
1839 break;
1840 case WPT_ACCESS:
1841 enable = AP_AC_TT_READWRITE;
1842 break;
1843 default:
1844 LOG_ERROR("BUG: watchpoint->rw neither read, write nor access");
1845 return ERROR_FAIL;
1846 }
1847
1848 int retval = arc_configure_actionpoint(target, wp_num,
1849 watchpoint->address, enable, AP_AC_AT_MEMORY_ADDR);
1850
1851 if (retval == ERROR_OK) {
1852 watchpoint_set(watchpoint, wp_num);
1853 ap_list[wp_num].used = 1;
1854 ap_list[wp_num].bp_value = watchpoint->address;
1855 ap_list[wp_num].type = ARC_AP_WATCHPOINT;
1856
1857 LOG_DEBUG("wpid: %" PRIu32 ", wp_num %u wp_value 0x%" PRIx32,
1858 watchpoint->unique_id, wp_num, ap_list[wp_num].bp_value);
1859 }
1860
1861 return retval;
1862 }
1863
1864 static int arc_unset_watchpoint(struct target *target,
1865 struct watchpoint *watchpoint)
1866 {
1867 /* get pointers to arch-specific information */
1868 struct arc_common *arc = target_to_arc(target);
1869 struct arc_actionpoint *ap_list = arc->actionpoints_list;
1870
1871 if (!watchpoint->is_set) {
1872 LOG_WARNING("watchpoint not set");
1873 return ERROR_OK;
1874 }
1875
1876 unsigned int wp_num = watchpoint->number;
1877 if (wp_num >= arc->actionpoints_num) {
1878 LOG_DEBUG("Invalid actionpoint ID: %u in watchpoint: %" PRIu32,
1879 wp_num, watchpoint->unique_id);
1880 return ERROR_OK;
1881 }
1882
1883 int retval = arc_configure_actionpoint(target, wp_num,
1884 watchpoint->address, AP_AC_TT_DISABLE, AP_AC_AT_MEMORY_ADDR);
1885
1886 if (retval == ERROR_OK) {
1887 watchpoint->is_set = false;
1888 ap_list[wp_num].used = 0;
1889 ap_list[wp_num].bp_value = 0;
1890
1891 LOG_DEBUG("wpid: %" PRIu32 " - releasing actionpoint ID: %u",
1892 watchpoint->unique_id, wp_num);
1893 }
1894
1895 return retval;
1896 }
1897
1898 static int arc_add_watchpoint(struct target *target,
1899 struct watchpoint *watchpoint)
1900 {
1901 if (target->state != TARGET_HALTED) {
1902 LOG_TARGET_ERROR(target, "not halted");
1903 return ERROR_TARGET_NOT_HALTED;
1904 }
1905
1906 CHECK_RETVAL(arc_set_watchpoint(target, watchpoint));
1907
1908 return ERROR_OK;
1909 }
1910
1911 static int arc_remove_watchpoint(struct target *target,
1912 struct watchpoint *watchpoint)
1913 {
1914 if (target->state != TARGET_HALTED) {
1915 LOG_TARGET_ERROR(target, "not halted");
1916 return ERROR_TARGET_NOT_HALTED;
1917 }
1918
1919 if (watchpoint->is_set)
1920 CHECK_RETVAL(arc_unset_watchpoint(target, watchpoint));
1921
1922 return ERROR_OK;
1923 }
1924
1925 static int arc_hit_watchpoint(struct target *target, struct watchpoint **hit_watchpoint)
1926 {
1927 assert(target);
1928 assert(hit_watchpoint);
1929
1930 struct arc_actionpoint *actionpoint = NULL;
1931 CHECK_RETVAL(get_current_actionpoint(target, &actionpoint));
1932
1933 if (actionpoint) {
1934 if (!actionpoint->used)
1935 LOG_WARNING("Target halted by unused actionpoint.");
1936
1937 /* If this check fails - that is some sort of an error in OpenOCD. */
1938 if (actionpoint->type != ARC_AP_WATCHPOINT)
1939 LOG_WARNING("Target halted by breakpoint, but is treated as a watchpoint.");
1940
1941 for (struct watchpoint *watchpoint = target->watchpoints;
1942 watchpoint;
1943 watchpoint = watchpoint->next) {
1944 if (actionpoint->bp_value == watchpoint->address) {
1945 *hit_watchpoint = watchpoint;
1946 LOG_DEBUG("Hit watchpoint, wpid: %" PRIu32 ", watchpoint num: %u",
1947 watchpoint->unique_id, watchpoint->number);
1948 return ERROR_OK;
1949 }
1950 }
1951 }
1952
1953 return ERROR_FAIL;
1954 }
1955
1956 /* Helper function which switches core to single_step mode by
1957 * doing aux r/w operations. */
1958 static int arc_config_step(struct target *target, int enable_step)
1959 {
1960 uint32_t value;
1961
1962 struct arc_common *arc = target_to_arc(target);
1963
1964 /* enable core debug step mode */
1965 if (enable_step) {
1966 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, AUX_STATUS32_REG,
1967 &value));
1968 value &= ~SET_CORE_AE_BIT; /* clear the AE bit */
1969 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_STATUS32_REG,
1970 value));
1971 LOG_DEBUG(" [status32:0x%08" PRIx32 "]", value);
1972
1973 /* Doing read-modify-write, because DEBUG might contain manually set
1974 * bits like UB or ED, which should be preserved. */
1975 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info,
1976 AUX_DEBUG_REG, &value));
1977 value |= SET_CORE_SINGLE_INSTR_STEP; /* set the IS bit */
1978 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_DEBUG_REG,
1979 value));
1980 LOG_DEBUG("core debug step mode enabled [debug-reg:0x%08" PRIx32 "]", value);
1981
1982 } else { /* disable core debug step mode */
1983 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, AUX_DEBUG_REG,
1984 &value));
1985 value &= ~SET_CORE_SINGLE_INSTR_STEP; /* clear the IS bit */
1986 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_DEBUG_REG,
1987 value));
1988 LOG_DEBUG("core debug step mode disabled");
1989 }
1990
1991 return ERROR_OK;
1992 }
1993
1994 static int arc_step(struct target *target, int current, target_addr_t address,
1995 int handle_breakpoints)
1996 {
1997 /* get pointers to arch-specific information */
1998 struct arc_common *arc = target_to_arc(target);
1999 struct breakpoint *breakpoint = NULL;
2000 struct reg *pc = &(arc->core_and_aux_cache->reg_list[arc->pc_index_in_cache]);
2001
2002 if (target->state != TARGET_HALTED) {
2003 LOG_TARGET_ERROR(target, "not halted");
2004 return ERROR_TARGET_NOT_HALTED;
2005 }
2006
2007 /* current = 1: continue on current pc, otherwise continue at <address> */
2008 if (!current) {
2009 buf_set_u32(pc->value, 0, 32, address);
2010 pc->dirty = true;
2011 pc->valid = true;
2012 }
2013
2014 LOG_DEBUG("Target steps one instruction from PC=0x%" PRIx32,
2015 buf_get_u32(pc->value, 0, 32));
2016
2017 /* the front-end may request us not to handle breakpoints */
2018 if (handle_breakpoints) {
2019 breakpoint = breakpoint_find(target, buf_get_u32(pc->value, 0, 32));
2020 if (breakpoint)
2021 CHECK_RETVAL(arc_unset_breakpoint(target, breakpoint));
2022 }
2023
2024 /* restore context */
2025 CHECK_RETVAL(arc_restore_context(target));
2026
2027 target->debug_reason = DBG_REASON_SINGLESTEP;
2028
2029 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_RESUMED));
2030
2031 /* disable interrupts while stepping */
2032 CHECK_RETVAL(arc_enable_interrupts(target, 0));
2033
2034 /* do a single step */
2035 CHECK_RETVAL(arc_config_step(target, 1));
2036
2037 /* make sure we done our step */
2038 alive_sleep(1);
2039
2040 /* registers are now invalid */
2041 register_cache_invalidate(arc->core_and_aux_cache);
2042
2043 if (breakpoint)
2044 CHECK_RETVAL(arc_set_breakpoint(target, breakpoint));
2045
2046 LOG_DEBUG("target stepped ");
2047
2048 target->state = TARGET_HALTED;
2049
2050 /* Saving context */
2051 CHECK_RETVAL(arc_debug_entry(target));
2052 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_HALTED));
2053
2054 return ERROR_OK;
2055 }
2056
2057
2058 /* This function invalidates icache. */
2059 static int arc_icache_invalidate(struct target *target)
2060 {
2061 uint32_t value;
2062
2063 struct arc_common *arc = target_to_arc(target);
2064
2065 /* Don't waste time if already done. */
2066 if (!arc->has_icache || arc->icache_invalidated)
2067 return ERROR_OK;
2068
2069 LOG_DEBUG("Invalidating I$.");
2070
2071 value = IC_IVIC_INVALIDATE; /* invalidate I$ */
2072 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_IC_IVIC_REG, value));
2073
2074 arc->icache_invalidated = true;
2075
2076 return ERROR_OK;
2077 }
2078
2079 /* This function invalidates dcache */
2080 static int arc_dcache_invalidate(struct target *target)
2081 {
2082 uint32_t value, dc_ctrl_value;
2083
2084 struct arc_common *arc = target_to_arc(target);
2085
2086 if (!arc->has_dcache || arc->dcache_invalidated)
2087 return ERROR_OK;
2088
2089 LOG_DEBUG("Invalidating D$.");
2090
2091 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, AUX_DC_CTRL_REG, &value));
2092 dc_ctrl_value = value;
2093 value &= ~DC_CTRL_IM;
2094
2095 /* set DC_CTRL invalidate mode to invalidate-only (no flushing!!) */
2096 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_DC_CTRL_REG, value));
2097 value = DC_IVDC_INVALIDATE; /* invalidate D$ */
2098 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_DC_IVDC_REG, value));
2099
2100 /* restore DC_CTRL invalidate mode */
2101 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_DC_CTRL_REG, dc_ctrl_value));
2102
2103 arc->dcache_invalidated = true;
2104
2105 return ERROR_OK;
2106 }
2107
2108 /* This function invalidates l2 cache. */
2109 static int arc_l2cache_invalidate(struct target *target)
2110 {
2111 uint32_t value, slc_ctrl_value;
2112
2113 struct arc_common *arc = target_to_arc(target);
2114
2115 if (!arc->has_l2cache || arc->l2cache_invalidated)
2116 return ERROR_OK;
2117
2118 LOG_DEBUG("Invalidating L2$.");
2119
2120 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, SLC_AUX_CACHE_CTRL, &value));
2121 slc_ctrl_value = value;
2122 value &= ~L2_CTRL_IM;
2123
2124 /* set L2_CTRL invalidate mode to invalidate-only (no flushing!!) */
2125 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, SLC_AUX_CACHE_CTRL, value));
2126 /* invalidate L2$ */
2127 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, SLC_AUX_CACHE_INV, L2_INV_IV));
2128
2129 /* Wait until invalidate operation ends */
2130 do {
2131 LOG_DEBUG("Waiting for invalidation end.");
2132 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, SLC_AUX_CACHE_CTRL, &value));
2133 } while (value & L2_CTRL_BS);
2134
2135 /* restore L2_CTRL invalidate mode */
2136 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, SLC_AUX_CACHE_CTRL, slc_ctrl_value));
2137
2138 arc->l2cache_invalidated = true;
2139
2140 return ERROR_OK;
2141 }
2142
2143
2144 int arc_cache_invalidate(struct target *target)
2145 {
2146 CHECK_RETVAL(arc_icache_invalidate(target));
2147 CHECK_RETVAL(arc_dcache_invalidate(target));
2148 CHECK_RETVAL(arc_l2cache_invalidate(target));
2149
2150 return ERROR_OK;
2151 }
2152
2153 /* Flush data cache. This function is cheap to call and return quickly if D$
2154 * already has been flushed since target had been halted. JTAG debugger reads
2155 * values directly from memory, bypassing cache, so if there are unflushed
2156 * lines debugger will read invalid values, which will cause a lot of troubles.
2157 * */
2158 static int arc_dcache_flush(struct target *target)
2159 {
2160 uint32_t value, dc_ctrl_value;
2161 bool has_to_set_dc_ctrl_im;
2162
2163 struct arc_common *arc = target_to_arc(target);
2164
2165 /* Don't waste time if already done. */
2166 if (!arc->has_dcache || arc->dcache_flushed)
2167 return ERROR_OK;
2168
2169 LOG_DEBUG("Flushing D$.");
2170
2171 /* Store current value of DC_CTRL */
2172 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, AUX_DC_CTRL_REG, &dc_ctrl_value));
2173
2174 /* Set DC_CTRL invalidate mode to flush (if not already set) */
2175 has_to_set_dc_ctrl_im = (dc_ctrl_value & DC_CTRL_IM) == 0;
2176 if (has_to_set_dc_ctrl_im) {
2177 value = dc_ctrl_value | DC_CTRL_IM;
2178 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_DC_CTRL_REG, value));
2179 }
2180
2181 /* Flush D$ */
2182 value = DC_IVDC_INVALIDATE;
2183 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_DC_IVDC_REG, value));
2184
2185 /* Restore DC_CTRL invalidate mode (even of flush failed) */
2186 if (has_to_set_dc_ctrl_im)
2187 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, AUX_DC_CTRL_REG, dc_ctrl_value));
2188
2189 arc->dcache_flushed = true;
2190
2191 return ERROR_OK;
2192 }
2193
2194 /* This function flushes l2cache. */
2195 static int arc_l2cache_flush(struct target *target)
2196 {
2197 uint32_t value;
2198
2199 struct arc_common *arc = target_to_arc(target);
2200
2201 /* Don't waste time if already done. */
2202 if (!arc->has_l2cache || arc->l2cache_flushed)
2203 return ERROR_OK;
2204
2205 LOG_DEBUG("Flushing L2$.");
2206
2207 /* Flush L2 cache */
2208 CHECK_RETVAL(arc_jtag_write_aux_reg_one(&arc->jtag_info, SLC_AUX_CACHE_FLUSH, L2_FLUSH_FL));
2209
2210 /* Wait until flush operation ends */
2211 do {
2212 LOG_DEBUG("Waiting for flushing end.");
2213 CHECK_RETVAL(arc_jtag_read_aux_reg_one(&arc->jtag_info, SLC_AUX_CACHE_CTRL, &value));
2214 } while (value & L2_CTRL_BS);
2215
2216 arc->l2cache_flushed = true;
2217
2218 return ERROR_OK;
2219 }
2220
2221 int arc_cache_flush(struct target *target)
2222 {
2223 CHECK_RETVAL(arc_dcache_flush(target));
2224 CHECK_RETVAL(arc_l2cache_flush(target));
2225
2226 return ERROR_OK;
2227 }
2228
2229 /* ARC v2 target */
2230 struct target_type arcv2_target = {
2231 .name = "arcv2",
2232
2233 .poll = arc_poll,
2234
2235 .arch_state = arc_arch_state,
2236
2237 /* TODO That seems like something similar to metaware hostlink, so perhaps
2238 * we can exploit this in the future. */
2239 .target_request_data = NULL,
2240
2241 .halt = arc_halt,
2242 .resume = arc_resume,
2243 .step = arc_step,
2244
2245 .assert_reset = arc_assert_reset,
2246 .deassert_reset = arc_deassert_reset,
2247
2248 /* TODO Implement soft_reset_halt */
2249 .soft_reset_halt = NULL,
2250
2251 .get_gdb_reg_list = arc_get_gdb_reg_list,
2252
2253 .read_memory = arc_mem_read,
2254 .write_memory = arc_mem_write,
2255 .checksum_memory = NULL,
2256 .blank_check_memory = NULL,
2257
2258 .add_breakpoint = arc_add_breakpoint,
2259 .add_context_breakpoint = NULL,
2260 .add_hybrid_breakpoint = NULL,
2261 .remove_breakpoint = arc_remove_breakpoint,
2262 .add_watchpoint = arc_add_watchpoint,
2263 .remove_watchpoint = arc_remove_watchpoint,
2264 .hit_watchpoint = arc_hit_watchpoint,
2265
2266 .run_algorithm = NULL,
2267 .start_algorithm = NULL,
2268 .wait_algorithm = NULL,
2269
2270 .commands = arc_monitor_command_handlers,
2271
2272 .target_create = arc_target_create,
2273 .init_target = arc_init_target,
2274 .deinit_target = arc_deinit_target,
2275 .examine = arc_examine,
2276
2277 .virt2phys = NULL,
2278 .read_phys_memory = NULL,
2279 .write_phys_memory = NULL,
2280 .mmu = NULL,
2281 };

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)