ARM11: remove needless string format #ifdeffery
[openocd.git] / src / target / arm11.c
1 /***************************************************************************
2 * Copyright (C) 2008 digenius technology GmbH. *
3 * Michael Bruck *
4 * *
5 * Copyright (C) 2008,2009 Oyvind Harboe oyvind.harboe@zylin.com *
6 * *
7 * Copyright (C) 2008 Georg Acher <acher@in.tum.de> *
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 * This program is distributed in the hope that it will be useful, *
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
17 * GNU General Public License for more details. *
18 * *
19 * You should have received a copy of the GNU General Public License *
20 * along with this program; if not, write to the *
21 * Free Software Foundation, Inc., *
22 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
23 ***************************************************************************/
24
25 #ifdef HAVE_CONFIG_H
26 #include "config.h"
27 #endif
28
29 #include "etm.h"
30 #include "breakpoints.h"
31 #include "arm11_dbgtap.h"
32 #include "arm_simulator.h"
33 #include "time_support.h"
34 #include "target_type.h"
35 #include "algorithm.h"
36 #include "register.h"
37
38
39 #if 0
40 #define _DEBUG_INSTRUCTION_EXECUTION_
41 #endif
42
43 #if 0
44 #define FNC_INFO LOG_DEBUG("-")
45 #else
46 #define FNC_INFO
47 #endif
48
49 #if 1
50 #define FNC_INFO_NOTIMPLEMENTED do { LOG_DEBUG("NOT IMPLEMENTED"); /*exit(-1);*/ } while (0)
51 #else
52 #define FNC_INFO_NOTIMPLEMENTED
53 #endif
54
55 static bool arm11_config_memwrite_burst = true;
56 static bool arm11_config_memwrite_error_fatal = true;
57 static uint32_t arm11_vcr = 0;
58 static bool arm11_config_step_irq_enable = false;
59 static bool arm11_config_hardware_step = false;
60
61 enum arm11_regtype
62 {
63 ARM11_REGISTER_CORE,
64 ARM11_REGISTER_CPSR,
65
66 ARM11_REGISTER_FX,
67 ARM11_REGISTER_FPS,
68
69 ARM11_REGISTER_FIQ,
70 ARM11_REGISTER_SVC,
71 ARM11_REGISTER_ABT,
72 ARM11_REGISTER_IRQ,
73 ARM11_REGISTER_UND,
74 ARM11_REGISTER_MON,
75
76 ARM11_REGISTER_SPSR_FIQ,
77 ARM11_REGISTER_SPSR_SVC,
78 ARM11_REGISTER_SPSR_ABT,
79 ARM11_REGISTER_SPSR_IRQ,
80 ARM11_REGISTER_SPSR_UND,
81 ARM11_REGISTER_SPSR_MON,
82
83 /* debug regs */
84 ARM11_REGISTER_DSCR,
85 ARM11_REGISTER_WDTR,
86 ARM11_REGISTER_RDTR,
87 };
88
89
90 struct arm11_reg_defs
91 {
92 char * name;
93 uint32_t num;
94 int gdb_num;
95 enum arm11_regtype type;
96 };
97
98 /* update arm11_regcache_ids when changing this */
99 static const struct arm11_reg_defs arm11_reg_defs[] =
100 {
101 {"r0", 0, 0, ARM11_REGISTER_CORE},
102 {"r1", 1, 1, ARM11_REGISTER_CORE},
103 {"r2", 2, 2, ARM11_REGISTER_CORE},
104 {"r3", 3, 3, ARM11_REGISTER_CORE},
105 {"r4", 4, 4, ARM11_REGISTER_CORE},
106 {"r5", 5, 5, ARM11_REGISTER_CORE},
107 {"r6", 6, 6, ARM11_REGISTER_CORE},
108 {"r7", 7, 7, ARM11_REGISTER_CORE},
109 {"r8", 8, 8, ARM11_REGISTER_CORE},
110 {"r9", 9, 9, ARM11_REGISTER_CORE},
111 {"r10", 10, 10, ARM11_REGISTER_CORE},
112 {"r11", 11, 11, ARM11_REGISTER_CORE},
113 {"r12", 12, 12, ARM11_REGISTER_CORE},
114 {"sp", 13, 13, ARM11_REGISTER_CORE},
115 {"lr", 14, 14, ARM11_REGISTER_CORE},
116 {"pc", 15, 15, ARM11_REGISTER_CORE},
117
118 {"cpsr", 0, 25, ARM11_REGISTER_CPSR},
119
120 /* Debug Registers */
121 {"dscr", 0, -1, ARM11_REGISTER_DSCR},
122 {"wdtr", 0, -1, ARM11_REGISTER_WDTR},
123 {"rdtr", 0, -1, ARM11_REGISTER_RDTR},
124 };
125
126 enum arm11_regcache_ids
127 {
128 ARM11_RC_R0,
129 ARM11_RC_RX = ARM11_RC_R0,
130
131 ARM11_RC_R1,
132 ARM11_RC_R2,
133 ARM11_RC_R3,
134 ARM11_RC_R4,
135 ARM11_RC_R5,
136 ARM11_RC_R6,
137 ARM11_RC_R7,
138 ARM11_RC_R8,
139 ARM11_RC_R9,
140 ARM11_RC_R10,
141 ARM11_RC_R11,
142 ARM11_RC_R12,
143 ARM11_RC_R13,
144 ARM11_RC_SP = ARM11_RC_R13,
145 ARM11_RC_R14,
146 ARM11_RC_LR = ARM11_RC_R14,
147 ARM11_RC_R15,
148 ARM11_RC_PC = ARM11_RC_R15,
149
150 ARM11_RC_CPSR,
151
152 ARM11_RC_DSCR,
153 ARM11_RC_WDTR,
154 ARM11_RC_RDTR,
155
156 ARM11_RC_MAX,
157 };
158
159 /* GDB expects ARMs to give R0..R15, CPSR, and 7 FPA dummies */
160 #define ARM11_GDB_REGISTER_COUNT 26
161
162 static int arm11_on_enter_debug_state(struct arm11_common *arm11);
163 static int arm11_step(struct target *target, int current,
164 uint32_t address, int handle_breakpoints);
165 /* helpers */
166 static int arm11_build_reg_cache(struct target *target);
167 static int arm11_set_reg(struct reg *reg, uint8_t *buf);
168 static int arm11_get_reg(struct reg *reg);
169
170 static void arm11_record_register_history(struct arm11_common * arm11);
171 static void arm11_dump_reg_changes(struct arm11_common * arm11);
172
173
174 /** Check and if necessary take control of the system
175 *
176 * \param arm11 Target state variable.
177 * \param dscr If the current DSCR content is
178 * available a pointer to a word holding the
179 * DSCR can be passed. Otherwise use NULL.
180 */
181 static int arm11_check_init(struct arm11_common *arm11, uint32_t *dscr)
182 {
183 FNC_INFO;
184
185 uint32_t dscr_local_tmp_copy;
186
187 if (!dscr)
188 {
189 dscr = &dscr_local_tmp_copy;
190
191 CHECK_RETVAL(arm11_read_DSCR(arm11, dscr));
192 }
193
194 if (!(*dscr & ARM11_DSCR_MODE_SELECT))
195 {
196 LOG_DEBUG("Bringing target into debug mode");
197
198 *dscr |= ARM11_DSCR_MODE_SELECT; /* Halt debug-mode */
199 arm11_write_DSCR(arm11, *dscr);
200
201 /* add further reset initialization here */
202
203 arm11->simulate_reset_on_next_halt = true;
204
205 if (*dscr & ARM11_DSCR_CORE_HALTED)
206 {
207 /** \todo TODO: this needs further scrutiny because
208 * arm11_on_enter_debug_state() never gets properly called.
209 * As a result we don't read the actual register states from
210 * the target.
211 */
212
213 arm11->target->state = TARGET_HALTED;
214 arm11->target->debug_reason = arm11_get_DSCR_debug_reason(*dscr);
215 }
216 else
217 {
218 arm11->target->state = TARGET_RUNNING;
219 arm11->target->debug_reason = DBG_REASON_NOTHALTED;
220 }
221
222 arm11_sc7_clear_vbw(arm11);
223 }
224
225 return ERROR_OK;
226 }
227
228
229
230 #define R(x) \
231 (arm11->reg_values[ARM11_RC_##x])
232
233 /** Save processor state.
234 *
235 * This is called when the HALT instruction has succeeded
236 * or on other occasions that stop the processor.
237 *
238 */
239 static int arm11_on_enter_debug_state(struct arm11_common *arm11)
240 {
241 int retval;
242 FNC_INFO;
243
244 for (size_t i = 0; i < ARRAY_SIZE(arm11->reg_values); i++)
245 {
246 arm11->reg_list[i].valid = 1;
247 arm11->reg_list[i].dirty = 0;
248 }
249
250 /* Save DSCR */
251 CHECK_RETVAL(arm11_read_DSCR(arm11, &R(DSCR)));
252
253 /* Save wDTR */
254
255 if (R(DSCR) & ARM11_DSCR_WDTR_FULL)
256 {
257 arm11_add_debug_SCAN_N(arm11, 0x05, ARM11_TAP_DEFAULT);
258
259 arm11_add_IR(arm11, ARM11_INTEST, ARM11_TAP_DEFAULT);
260
261 struct scan_field chain5_fields[3];
262
263 arm11_setup_field(arm11, 32, NULL, &R(WDTR), chain5_fields + 0);
264 arm11_setup_field(arm11, 1, NULL, NULL, chain5_fields + 1);
265 arm11_setup_field(arm11, 1, NULL, NULL, chain5_fields + 2);
266
267 arm11_add_dr_scan_vc(ARRAY_SIZE(chain5_fields), chain5_fields, TAP_DRPAUSE);
268 }
269 else
270 {
271 arm11->reg_list[ARM11_RC_WDTR].valid = 0;
272 }
273
274
275 /* DSCR: set ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE */
276 /* ARM1176 spec says this is needed only for wDTR/rDTR's "ITR mode", but not to issue ITRs
277 ARM1136 seems to require this to issue ITR's as well */
278
279 uint32_t new_dscr = R(DSCR) | ARM11_DSCR_EXECUTE_ARM_INSTRUCTION_ENABLE;
280
281 /* this executes JTAG queue: */
282
283 arm11_write_DSCR(arm11, new_dscr);
284
285
286 /* From the spec:
287 Before executing any instruction in debug state you have to drain the write buffer.
288 This ensures that no imprecise Data Aborts can return at a later point:*/
289
290 /** \todo TODO: Test drain write buffer. */
291
292 #if 0
293 while (1)
294 {
295 /* MRC p14,0,R0,c5,c10,0 */
296 // arm11_run_instr_no_data1(arm11, /*0xee150e1a*/0xe320f000);
297
298 /* mcr 15, 0, r0, cr7, cr10, {4} */
299 arm11_run_instr_no_data1(arm11, 0xee070f9a);
300
301 uint32_t dscr = arm11_read_DSCR(arm11);
302
303 LOG_DEBUG("DRAIN, DSCR %08x", dscr);
304
305 if (dscr & ARM11_DSCR_STICKY_IMPRECISE_DATA_ABORT)
306 {
307 arm11_run_instr_no_data1(arm11, 0xe320f000);
308
309 dscr = arm11_read_DSCR(arm11);
310
311 LOG_DEBUG("DRAIN, DSCR %08x (DONE)", dscr);
312
313 break;
314 }
315 }
316 #endif
317
318 retval = arm11_run_instr_data_prepare(arm11);
319 if (retval != ERROR_OK)
320 return retval;
321
322 /* save r0 - r14 */
323
324 /** \todo TODO: handle other mode registers */
325
326 for (size_t i = 0; i < 15; i++)
327 {
328 /* MCR p14,0,R?,c0,c5,0 */
329 retval = arm11_run_instr_data_from_core(arm11, 0xEE000E15 | (i << 12), &R(RX + i), 1);
330 if (retval != ERROR_OK)
331 return retval;
332 }
333
334 /* save rDTR */
335
336 /* check rDTRfull in DSCR */
337
338 if (R(DSCR) & ARM11_DSCR_RDTR_FULL)
339 {
340 /* MRC p14,0,R0,c0,c5,0 (move rDTR -> r0 (-> wDTR -> local var)) */
341 retval = arm11_run_instr_data_from_core_via_r0(arm11, 0xEE100E15, &R(RDTR));
342 if (retval != ERROR_OK)
343 return retval;
344 }
345 else
346 {
347 arm11->reg_list[ARM11_RC_RDTR].valid = 0;
348 }
349
350 /* save CPSR */
351
352 /* MRS r0,CPSR (move CPSR -> r0 (-> wDTR -> local var)) */
353 retval = arm11_run_instr_data_from_core_via_r0(arm11, 0xE10F0000, &R(CPSR));
354 if (retval != ERROR_OK)
355 return retval;
356
357 /* save PC */
358
359 /* MOV R0,PC (move PC -> r0 (-> wDTR -> local var)) */
360 retval = arm11_run_instr_data_from_core_via_r0(arm11, 0xE1A0000F, &R(PC));
361 if (retval != ERROR_OK)
362 return retval;
363
364 /* adjust PC depending on ARM state */
365
366 if (R(CPSR) & ARM11_CPSR_J) /* Java state */
367 {
368 arm11->reg_values[ARM11_RC_PC] -= 0;
369 }
370 else if (R(CPSR) & ARM11_CPSR_T) /* Thumb state */
371 {
372 arm11->reg_values[ARM11_RC_PC] -= 4;
373 }
374 else /* ARM state */
375 {
376 arm11->reg_values[ARM11_RC_PC] -= 8;
377 }
378
379 if (arm11->simulate_reset_on_next_halt)
380 {
381 arm11->simulate_reset_on_next_halt = false;
382
383 LOG_DEBUG("Reset c1 Control Register");
384
385 /* Write 0 (reset value) to Control register 0 to disable MMU/Cache etc. */
386
387 /* MCR p15,0,R0,c1,c0,0 */
388 retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee010f10, 0);
389 if (retval != ERROR_OK)
390 return retval;
391
392 }
393
394 retval = arm11_run_instr_data_finish(arm11);
395 if (retval != ERROR_OK)
396 return retval;
397
398 arm11_dump_reg_changes(arm11);
399
400 return ERROR_OK;
401 }
402
403 void arm11_dump_reg_changes(struct arm11_common * arm11)
404 {
405
406 if (!(debug_level >= LOG_LVL_DEBUG))
407 {
408 return;
409 }
410
411 for (size_t i = 0; i < ARM11_REGCACHE_COUNT; i++)
412 {
413 if (!arm11->reg_list[i].valid)
414 {
415 if (arm11->reg_history[i].valid)
416 LOG_DEBUG("%8s INVALID (%08" PRIx32 ")", arm11_reg_defs[i].name, arm11->reg_history[i].value);
417 }
418 else
419 {
420 if (arm11->reg_history[i].valid)
421 {
422 if (arm11->reg_history[i].value != arm11->reg_values[i])
423 LOG_DEBUG("%8s %08" PRIx32 " (%08" PRIx32 ")", arm11_reg_defs[i].name, arm11->reg_values[i], arm11->reg_history[i].value);
424 }
425 else
426 {
427 LOG_DEBUG("%8s %08" PRIx32 " (INVALID)", arm11_reg_defs[i].name, arm11->reg_values[i]);
428 }
429 }
430 }
431 }
432
433 /** Restore processor state
434 *
435 * This is called in preparation for the RESTART function.
436 *
437 */
438 static int arm11_leave_debug_state(struct arm11_common *arm11)
439 {
440 FNC_INFO;
441 int retval;
442
443 retval = arm11_run_instr_data_prepare(arm11);
444 if (retval != ERROR_OK)
445 return retval;
446
447 /** \todo TODO: handle other mode registers */
448
449 /* restore R1 - R14 */
450
451 for (unsigned i = 1; i < 15; i++)
452 {
453 if (!arm11->reg_list[ARM11_RC_RX + i].dirty)
454 continue;
455
456 /* MRC p14,0,r?,c0,c5,0 */
457 arm11_run_instr_data_to_core1(arm11,
458 0xee100e15 | (i << 12), R(RX + i));
459
460 // LOG_DEBUG("RESTORE R%u %08x", i, R(RX + i));
461 }
462
463 retval = arm11_run_instr_data_finish(arm11);
464 if (retval != ERROR_OK)
465 return retval;
466
467 /* spec says clear wDTR and rDTR; we assume they are clear as
468 otherwise our programming would be sloppy */
469 {
470 uint32_t DSCR;
471
472 CHECK_RETVAL(arm11_read_DSCR(arm11, &DSCR));
473
474 if (DSCR & (ARM11_DSCR_RDTR_FULL | ARM11_DSCR_WDTR_FULL))
475 {
476 /*
477 The wDTR/rDTR two registers that are used to send/receive data to/from
478 the core in tandem with corresponding instruction codes that are
479 written into the core. The RDTR FULL/WDTR FULL flag indicates that the
480 registers hold data that was written by one side (CPU or JTAG) and not
481 read out by the other side.
482 */
483 LOG_ERROR("wDTR/rDTR inconsistent (DSCR %08" PRIx32 ")", DSCR);
484 return ERROR_FAIL;
485 }
486 }
487
488 retval = arm11_run_instr_data_prepare(arm11);
489 if (retval != ERROR_OK)
490 return retval;
491
492 /* restore original wDTR */
493
494 if ((R(DSCR) & ARM11_DSCR_WDTR_FULL) || arm11->reg_list[ARM11_RC_WDTR].dirty)
495 {
496 /* MCR p14,0,R0,c0,c5,0 */
497 retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xee000e15, R(WDTR));
498 if (retval != ERROR_OK)
499 return retval;
500 }
501
502 /* restore CPSR */
503
504 /* MSR CPSR,R0*/
505 retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xe129f000, R(CPSR));
506 if (retval != ERROR_OK)
507 return retval;
508
509
510 /* restore PC */
511
512 /* MOV PC,R0 */
513 retval = arm11_run_instr_data_to_core_via_r0(arm11, 0xe1a0f000, R(PC));
514 if (retval != ERROR_OK)
515 return retval;
516
517
518 /* restore R0 */
519
520 /* MRC p14,0,r0,c0,c5,0 */
521 arm11_run_instr_data_to_core1(arm11, 0xee100e15, R(R0));
522
523 retval = arm11_run_instr_data_finish(arm11);
524 if (retval != ERROR_OK)
525 return retval;
526
527 /* restore DSCR */
528
529 arm11_write_DSCR(arm11, R(DSCR));
530
531 /* restore rDTR */
532
533 if (R(DSCR) & ARM11_DSCR_RDTR_FULL || arm11->reg_list[ARM11_RC_RDTR].dirty)
534 {
535 arm11_add_debug_SCAN_N(arm11, 0x05, ARM11_TAP_DEFAULT);
536
537 arm11_add_IR(arm11, ARM11_EXTEST, ARM11_TAP_DEFAULT);
538
539 struct scan_field chain5_fields[3];
540
541 uint8_t Ready = 0; /* ignored */
542 uint8_t Valid = 0; /* ignored */
543
544 arm11_setup_field(arm11, 32, &R(RDTR), NULL, chain5_fields + 0);
545 arm11_setup_field(arm11, 1, &Ready, NULL, chain5_fields + 1);
546 arm11_setup_field(arm11, 1, &Valid, NULL, chain5_fields + 2);
547
548 arm11_add_dr_scan_vc(ARRAY_SIZE(chain5_fields), chain5_fields, TAP_DRPAUSE);
549 }
550
551 arm11_record_register_history(arm11);
552
553 return ERROR_OK;
554 }
555
556 static void arm11_record_register_history(struct arm11_common *arm11)
557 {
558 for (size_t i = 0; i < ARM11_REGCACHE_COUNT; i++)
559 {
560 arm11->reg_history[i].value = arm11->reg_values[i];
561 arm11->reg_history[i].valid = arm11->reg_list[i].valid;
562
563 arm11->reg_list[i].valid = 0;
564 arm11->reg_list[i].dirty = 0;
565 }
566 }
567
568
569 /* poll current target status */
570 static int arm11_poll(struct target *target)
571 {
572 FNC_INFO;
573 int retval;
574 struct arm11_common *arm11 = target_to_arm11(target);
575 uint32_t dscr;
576
577 CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
578
579 LOG_DEBUG("DSCR %08" PRIx32 "", dscr);
580
581 CHECK_RETVAL(arm11_check_init(arm11, &dscr));
582
583 if (dscr & ARM11_DSCR_CORE_HALTED)
584 {
585 if (target->state != TARGET_HALTED)
586 {
587 enum target_state old_state = target->state;
588
589 LOG_DEBUG("enter TARGET_HALTED");
590 target->state = TARGET_HALTED;
591 target->debug_reason = arm11_get_DSCR_debug_reason(dscr);
592 retval = arm11_on_enter_debug_state(arm11);
593 if (retval != ERROR_OK)
594 return retval;
595
596 target_call_event_callbacks(target,
597 old_state == TARGET_DEBUG_RUNNING ? TARGET_EVENT_DEBUG_HALTED : TARGET_EVENT_HALTED);
598 }
599 }
600 else
601 {
602 if (target->state != TARGET_RUNNING && target->state != TARGET_DEBUG_RUNNING)
603 {
604 LOG_DEBUG("enter TARGET_RUNNING");
605 target->state = TARGET_RUNNING;
606 target->debug_reason = DBG_REASON_NOTHALTED;
607 }
608 }
609
610 return ERROR_OK;
611 }
612 /* architecture specific status reply */
613 static int arm11_arch_state(struct target *target)
614 {
615 struct arm11_common *arm11 = target_to_arm11(target);
616
617 LOG_USER("target halted due to %s\ncpsr: 0x%8.8" PRIx32 " pc: 0x%8.8" PRIx32 "",
618 Jim_Nvp_value2name_simple(nvp_target_debug_reason, target->debug_reason)->name,
619 R(CPSR),
620 R(PC));
621
622 return ERROR_OK;
623 }
624
625 /* target request support */
626 static int arm11_target_request_data(struct target *target,
627 uint32_t size, uint8_t *buffer)
628 {
629 FNC_INFO_NOTIMPLEMENTED;
630
631 return ERROR_OK;
632 }
633
634 /* target execution control */
635 static int arm11_halt(struct target *target)
636 {
637 FNC_INFO;
638 struct arm11_common *arm11 = target_to_arm11(target);
639
640 LOG_DEBUG("target->state: %s",
641 target_state_name(target));
642
643 if (target->state == TARGET_UNKNOWN)
644 {
645 arm11->simulate_reset_on_next_halt = true;
646 }
647
648 if (target->state == TARGET_HALTED)
649 {
650 LOG_DEBUG("target was already halted");
651 return ERROR_OK;
652 }
653
654 arm11_add_IR(arm11, ARM11_HALT, TAP_IDLE);
655
656 CHECK_RETVAL(jtag_execute_queue());
657
658 uint32_t dscr;
659
660 int i = 0;
661 while (1)
662 {
663 CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
664
665 if (dscr & ARM11_DSCR_CORE_HALTED)
666 break;
667
668
669 long long then = 0;
670 if (i == 1000)
671 {
672 then = timeval_ms();
673 }
674 if (i >= 1000)
675 {
676 if ((timeval_ms()-then) > 1000)
677 {
678 LOG_WARNING("Timeout (1000ms) waiting for instructions to complete");
679 return ERROR_FAIL;
680 }
681 }
682 i++;
683 }
684
685 arm11_on_enter_debug_state(arm11);
686
687 enum target_state old_state = target->state;
688
689 target->state = TARGET_HALTED;
690 target->debug_reason = arm11_get_DSCR_debug_reason(dscr);
691
692 CHECK_RETVAL(
693 target_call_event_callbacks(target,
694 old_state == TARGET_DEBUG_RUNNING ? TARGET_EVENT_DEBUG_HALTED : TARGET_EVENT_HALTED));
695
696 return ERROR_OK;
697 }
698
699 static int arm11_resume(struct target *target, int current,
700 uint32_t address, int handle_breakpoints, int debug_execution)
701 {
702 FNC_INFO;
703
704 // LOG_DEBUG("current %d address %08x handle_breakpoints %d debug_execution %d",
705 // current, address, handle_breakpoints, debug_execution);
706
707 struct arm11_common *arm11 = target_to_arm11(target);
708
709 LOG_DEBUG("target->state: %s",
710 target_state_name(target));
711
712
713 if (target->state != TARGET_HALTED)
714 {
715 LOG_ERROR("Target not halted");
716 return ERROR_TARGET_NOT_HALTED;
717 }
718
719 if (!current)
720 R(PC) = address;
721
722 LOG_DEBUG("RESUME PC %08" PRIx32 "%s", R(PC), !current ? "!" : "");
723
724 /* clear breakpoints/watchpoints and VCR*/
725 arm11_sc7_clear_vbw(arm11);
726
727 /* Set up breakpoints */
728 if (!debug_execution)
729 {
730 /* check if one matches PC and step over it if necessary */
731
732 struct breakpoint * bp;
733
734 for (bp = target->breakpoints; bp; bp = bp->next)
735 {
736 if (bp->address == R(PC))
737 {
738 LOG_DEBUG("must step over %08" PRIx32 "", bp->address);
739 arm11_step(target, 1, 0, 0);
740 break;
741 }
742 }
743
744 /* set all breakpoints */
745
746 unsigned brp_num = 0;
747
748 for (bp = target->breakpoints; bp; bp = bp->next)
749 {
750 struct arm11_sc7_action brp[2];
751
752 brp[0].write = 1;
753 brp[0].address = ARM11_SC7_BVR0 + brp_num;
754 brp[0].value = bp->address;
755 brp[1].write = 1;
756 brp[1].address = ARM11_SC7_BCR0 + brp_num;
757 brp[1].value = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (0 << 21);
758
759 arm11_sc7_run(arm11, brp, ARRAY_SIZE(brp));
760
761 LOG_DEBUG("Add BP %d at %08" PRIx32, brp_num,
762 bp->address);
763
764 brp_num++;
765 }
766
767 arm11_sc7_set_vcr(arm11, arm11_vcr);
768 }
769
770 arm11_leave_debug_state(arm11);
771
772 arm11_add_IR(arm11, ARM11_RESTART, TAP_IDLE);
773
774 CHECK_RETVAL(jtag_execute_queue());
775
776 int i = 0;
777 while (1)
778 {
779 uint32_t dscr;
780
781 CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
782
783 LOG_DEBUG("DSCR %08" PRIx32 "", dscr);
784
785 if (dscr & ARM11_DSCR_CORE_RESTARTED)
786 break;
787
788
789 long long then = 0;
790 if (i == 1000)
791 {
792 then = timeval_ms();
793 }
794 if (i >= 1000)
795 {
796 if ((timeval_ms()-then) > 1000)
797 {
798 LOG_WARNING("Timeout (1000ms) waiting for instructions to complete");
799 return ERROR_FAIL;
800 }
801 }
802 i++;
803 }
804
805 if (!debug_execution)
806 {
807 target->state = TARGET_RUNNING;
808 target->debug_reason = DBG_REASON_NOTHALTED;
809
810 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_RESUMED));
811 }
812 else
813 {
814 target->state = TARGET_DEBUG_RUNNING;
815 target->debug_reason = DBG_REASON_NOTHALTED;
816
817 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_RESUMED));
818 }
819
820 return ERROR_OK;
821 }
822
823
824 static int armv4_5_to_arm11(int reg)
825 {
826 if (reg < 16)
827 return reg;
828 switch (reg)
829 {
830 case ARMV4_5_CPSR:
831 return ARM11_RC_CPSR;
832 case 16:
833 /* FIX!!! handle thumb better! */
834 return ARM11_RC_CPSR;
835 default:
836 LOG_ERROR("BUG: register translation from armv4_5 to arm11 not supported %d", reg);
837 exit(-1);
838 }
839 }
840
841
842 static uint32_t arm11_sim_get_reg(struct arm_sim_interface *sim, int reg)
843 {
844 struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
845
846 reg=armv4_5_to_arm11(reg);
847
848 return buf_get_u32(arm11->reg_list[reg].value, 0, 32);
849 }
850
851 static void arm11_sim_set_reg(struct arm_sim_interface *sim,
852 int reg, uint32_t value)
853 {
854 struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
855
856 reg=armv4_5_to_arm11(reg);
857
858 buf_set_u32(arm11->reg_list[reg].value, 0, 32, value);
859 }
860
861 static uint32_t arm11_sim_get_cpsr(struct arm_sim_interface *sim,
862 int pos, int bits)
863 {
864 struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
865
866 return buf_get_u32(arm11->reg_list[ARM11_RC_CPSR].value, pos, bits);
867 }
868
869 static enum armv4_5_state arm11_sim_get_state(struct arm_sim_interface *sim)
870 {
871 // struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
872
873 /* FIX!!!! we should implement thumb for arm11 */
874 return ARMV4_5_STATE_ARM;
875 }
876
877 static void arm11_sim_set_state(struct arm_sim_interface *sim,
878 enum armv4_5_state mode)
879 {
880 // struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
881
882 /* FIX!!!! we should implement thumb for arm11 */
883 LOG_ERROR("Not implemetned!");
884 }
885
886
887 static enum armv4_5_mode arm11_sim_get_mode(struct arm_sim_interface *sim)
888 {
889 //struct arm11_common * arm11 = (struct arm11_common *)sim->user_data;
890
891 /* FIX!!!! we should implement something that returns the current mode here!!! */
892 return ARMV4_5_MODE_USR;
893 }
894
895 static int arm11_simulate_step(struct target *target, uint32_t *dry_run_pc)
896 {
897 struct arm_sim_interface sim;
898
899 sim.user_data=target->arch_info;
900 sim.get_reg=&arm11_sim_get_reg;
901 sim.set_reg=&arm11_sim_set_reg;
902 sim.get_reg_mode=&arm11_sim_get_reg;
903 sim.set_reg_mode=&arm11_sim_set_reg;
904 sim.get_cpsr=&arm11_sim_get_cpsr;
905 sim.get_mode=&arm11_sim_get_mode;
906 sim.get_state=&arm11_sim_get_state;
907 sim.set_state=&arm11_sim_set_state;
908
909 return arm_simulate_step_core(target, dry_run_pc, &sim);
910
911 }
912
913 static int arm11_step(struct target *target, int current,
914 uint32_t address, int handle_breakpoints)
915 {
916 FNC_INFO;
917
918 LOG_DEBUG("target->state: %s",
919 target_state_name(target));
920
921 if (target->state != TARGET_HALTED)
922 {
923 LOG_WARNING("target was not halted");
924 return ERROR_TARGET_NOT_HALTED;
925 }
926
927 struct arm11_common *arm11 = target_to_arm11(target);
928
929 if (!current)
930 R(PC) = address;
931
932 LOG_DEBUG("STEP PC %08" PRIx32 "%s", R(PC), !current ? "!" : "");
933
934
935 /** \todo TODO: Thumb not supported here */
936
937 uint32_t next_instruction;
938
939 CHECK_RETVAL(arm11_read_memory_word(arm11, R(PC), &next_instruction));
940
941 /* skip over BKPT */
942 if ((next_instruction & 0xFFF00070) == 0xe1200070)
943 {
944 R(PC) += 4;
945 arm11->reg_list[ARM11_RC_PC].valid = 1;
946 arm11->reg_list[ARM11_RC_PC].dirty = 0;
947 LOG_DEBUG("Skipping BKPT");
948 }
949 /* skip over Wait for interrupt / Standby */
950 /* mcr 15, 0, r?, cr7, cr0, {4} */
951 else if ((next_instruction & 0xFFFF0FFF) == 0xee070f90)
952 {
953 R(PC) += 4;
954 arm11->reg_list[ARM11_RC_PC].valid = 1;
955 arm11->reg_list[ARM11_RC_PC].dirty = 0;
956 LOG_DEBUG("Skipping WFI");
957 }
958 /* ignore B to self */
959 else if ((next_instruction & 0xFEFFFFFF) == 0xeafffffe)
960 {
961 LOG_DEBUG("Not stepping jump to self");
962 }
963 else
964 {
965 /** \todo TODO: check if break-/watchpoints make any sense at all in combination
966 * with this. */
967
968 /** \todo TODO: check if disabling IRQs might be a good idea here. Alternatively
969 * the VCR might be something worth looking into. */
970
971
972 /* Set up breakpoint for stepping */
973
974 struct arm11_sc7_action brp[2];
975
976 brp[0].write = 1;
977 brp[0].address = ARM11_SC7_BVR0;
978 brp[1].write = 1;
979 brp[1].address = ARM11_SC7_BCR0;
980
981 if (arm11_config_hardware_step)
982 {
983 /* hardware single stepping be used if possible or is it better to
984 * always use the same code path? Hardware single stepping is not supported
985 * on all hardware
986 */
987 brp[0].value = R(PC);
988 brp[1].value = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (2 << 21);
989 } else
990 {
991 /* sets a breakpoint on the next PC(calculated by simulation),
992 */
993 uint32_t next_pc;
994 int retval;
995 retval = arm11_simulate_step(target, &next_pc);
996 if (retval != ERROR_OK)
997 return retval;
998
999 brp[0].value = next_pc;
1000 brp[1].value = 0x1 | (3 << 1) | (0x0F << 5) | (0 << 14) | (0 << 16) | (0 << 20) | (0 << 21);
1001 }
1002
1003 CHECK_RETVAL(arm11_sc7_run(arm11, brp, ARRAY_SIZE(brp)));
1004
1005 /* resume */
1006
1007
1008 if (arm11_config_step_irq_enable)
1009 R(DSCR) &= ~ARM11_DSCR_INTERRUPTS_DISABLE; /* should be redundant */
1010 else
1011 R(DSCR) |= ARM11_DSCR_INTERRUPTS_DISABLE;
1012
1013
1014 CHECK_RETVAL(arm11_leave_debug_state(arm11));
1015
1016 arm11_add_IR(arm11, ARM11_RESTART, TAP_IDLE);
1017
1018 CHECK_RETVAL(jtag_execute_queue());
1019
1020 /* wait for halt */
1021 int i = 0;
1022 while (1)
1023 {
1024 uint32_t dscr;
1025
1026 CHECK_RETVAL(arm11_read_DSCR(arm11, &dscr));
1027
1028 LOG_DEBUG("DSCR %08" PRIx32 "e", dscr);
1029
1030 if ((dscr & (ARM11_DSCR_CORE_RESTARTED | ARM11_DSCR_CORE_HALTED)) ==
1031 (ARM11_DSCR_CORE_RESTARTED | ARM11_DSCR_CORE_HALTED))
1032 break;
1033
1034 long long then = 0;
1035 if (i == 1000)
1036 {
1037 then = timeval_ms();
1038 }
1039 if (i >= 1000)
1040 {
1041 if ((timeval_ms()-then) > 1000)
1042 {
1043 LOG_WARNING("Timeout (1000ms) waiting for instructions to complete");
1044 return ERROR_FAIL;
1045 }
1046 }
1047 i++;
1048 }
1049
1050 /* clear breakpoint */
1051 arm11_sc7_clear_vbw(arm11);
1052
1053 /* save state */
1054 CHECK_RETVAL(arm11_on_enter_debug_state(arm11));
1055
1056 /* restore default state */
1057 R(DSCR) &= ~ARM11_DSCR_INTERRUPTS_DISABLE;
1058
1059 }
1060
1061 // target->state = TARGET_HALTED;
1062 target->debug_reason = DBG_REASON_SINGLESTEP;
1063
1064 CHECK_RETVAL(target_call_event_callbacks(target, TARGET_EVENT_HALTED));
1065
1066 return ERROR_OK;
1067 }
1068
1069 static int arm11_assert_reset(struct target *target)
1070 {
1071 FNC_INFO;
1072 int retval;
1073 struct arm11_common *arm11 = target_to_arm11(target);
1074
1075 retval = arm11_check_init(arm11, NULL);
1076 if (retval != ERROR_OK)
1077 return retval;
1078
1079 target->state = TARGET_UNKNOWN;
1080
1081 /* we would very much like to reset into the halted, state,
1082 * but resetting and halting is second best... */
1083 if (target->reset_halt)
1084 {
1085 CHECK_RETVAL(target_halt(target));
1086 }
1087
1088
1089 /* srst is funny. We can not do *anything* else while it's asserted
1090 * and it has unkonwn side effects. Make sure no other code runs
1091 * meanwhile.
1092 *
1093 * Code below assumes srst:
1094 *
1095 * - Causes power-on-reset (but of what parts of the system?). Bug
1096 * in arm11?
1097 *
1098 * - Messes us TAP state without asserting trst.
1099 *
1100 * - There is another bug in the arm11 core. When you generate an access to
1101 * external logic (for example ddr controller via AHB bus) and that block
1102 * is not configured (perhaps it is still held in reset), that transaction
1103 * will never complete. This will hang arm11 core but it will also hang
1104 * JTAG controller. Nothing, short of srst assertion will bring it out of
1105 * this.
1106 *
1107 * Mysteries:
1108 *
1109 * - What should the PC be after an srst reset when starting in the halted
1110 * state?
1111 */
1112
1113 jtag_add_reset(0, 1);
1114 jtag_add_reset(0, 0);
1115
1116 /* How long do we have to wait? */
1117 jtag_add_sleep(5000);
1118
1119 /* un-mess up TAP state */
1120 jtag_add_tlr();
1121
1122 retval = jtag_execute_queue();
1123 if (retval != ERROR_OK)
1124 {
1125 return retval;
1126 }
1127
1128 return ERROR_OK;
1129 }
1130
1131 static int arm11_deassert_reset(struct target *target)
1132 {
1133 return ERROR_OK;
1134 }
1135
1136 static int arm11_soft_reset_halt(struct target *target)
1137 {
1138 FNC_INFO_NOTIMPLEMENTED;
1139
1140 return ERROR_OK;
1141 }
1142
1143 /* target register access for gdb */
1144 static int arm11_get_gdb_reg_list(struct target *target,
1145 struct reg **reg_list[], int *reg_list_size)
1146 {
1147 FNC_INFO;
1148 struct arm11_common *arm11 = target_to_arm11(target);
1149
1150 *reg_list_size = ARM11_GDB_REGISTER_COUNT;
1151 *reg_list = malloc(sizeof(struct reg*) * ARM11_GDB_REGISTER_COUNT);
1152
1153 /* nine unused legacy FPA registers are expected by GDB */
1154 for (size_t i = 16; i < 24; i++)
1155 (*reg_list)[i] = &arm_gdb_dummy_fp_reg;
1156 (*reg_list)[24] = &arm_gdb_dummy_fps_reg;
1157
1158 for (size_t i = 0; i < ARM11_REGCACHE_COUNT; i++)
1159 {
1160 if (arm11_reg_defs[i].gdb_num == -1)
1161 continue;
1162
1163 (*reg_list)[arm11_reg_defs[i].gdb_num] = arm11->reg_list + i;
1164 }
1165
1166 return ERROR_OK;
1167 }
1168
1169 /* target memory access
1170 * size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
1171 * count: number of items of <size>
1172 *
1173 * arm11_config_memrw_no_increment - in the future we may want to be able
1174 * to read/write a range of data to a "port". a "port" is an action on
1175 * read memory address for some peripheral.
1176 */
1177 static int arm11_read_memory_inner(struct target *target,
1178 uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer,
1179 bool arm11_config_memrw_no_increment)
1180 {
1181 /** \todo TODO: check if buffer cast to uint32_t* and uint16_t* might cause alignment problems */
1182 int retval;
1183
1184 FNC_INFO;
1185
1186 if (target->state != TARGET_HALTED)
1187 {
1188 LOG_WARNING("target was not halted");
1189 return ERROR_TARGET_NOT_HALTED;
1190 }
1191
1192 LOG_DEBUG("ADDR %08" PRIx32 " SIZE %08" PRIx32 " COUNT %08" PRIx32 "", address, size, count);
1193
1194 struct arm11_common *arm11 = target_to_arm11(target);
1195
1196 retval = arm11_run_instr_data_prepare(arm11);
1197 if (retval != ERROR_OK)
1198 return retval;
1199
1200 /* MRC p14,0,r0,c0,c5,0 */
1201 retval = arm11_run_instr_data_to_core1(arm11, 0xee100e15, address);
1202 if (retval != ERROR_OK)
1203 return retval;
1204
1205 switch (size)
1206 {
1207 case 1:
1208 /** \todo TODO: check if dirty is the right choice to force a rewrite on arm11_resume() */
1209 arm11->reg_list[ARM11_RC_R1].dirty = 1;
1210
1211 for (size_t i = 0; i < count; i++)
1212 {
1213 /* ldrb r1, [r0], #1 */
1214 /* ldrb r1, [r0] */
1215 arm11_run_instr_no_data1(arm11,
1216 !arm11_config_memrw_no_increment ? 0xe4d01001 : 0xe5d01000);
1217
1218 uint32_t res;
1219 /* MCR p14,0,R1,c0,c5,0 */
1220 arm11_run_instr_data_from_core(arm11, 0xEE001E15, &res, 1);
1221
1222 *buffer++ = res;
1223 }
1224
1225 break;
1226
1227 case 2:
1228 {
1229 arm11->reg_list[ARM11_RC_R1].dirty = 1;
1230
1231 for (size_t i = 0; i < count; i++)
1232 {
1233 /* ldrh r1, [r0], #2 */
1234 arm11_run_instr_no_data1(arm11,
1235 !arm11_config_memrw_no_increment ? 0xe0d010b2 : 0xe1d010b0);
1236
1237 uint32_t res;
1238
1239 /* MCR p14,0,R1,c0,c5,0 */
1240 arm11_run_instr_data_from_core(arm11, 0xEE001E15, &res, 1);
1241
1242 uint16_t svalue = res;
1243 memcpy(buffer + i * sizeof(uint16_t), &svalue, sizeof(uint16_t));
1244 }
1245
1246 break;
1247 }
1248
1249 case 4:
1250 {
1251 uint32_t instr = !arm11_config_memrw_no_increment ? 0xecb05e01 : 0xed905e00;
1252 /** \todo TODO: buffer cast to uint32_t* causes alignment warnings */
1253 uint32_t *words = (uint32_t *)buffer;
1254
1255 /* LDC p14,c5,[R0],#4 */
1256 /* LDC p14,c5,[R0] */
1257 arm11_run_instr_data_from_core(arm11, instr, words, count);
1258 break;
1259 }
1260 }
1261
1262 return arm11_run_instr_data_finish(arm11);
1263 }
1264
1265 static int arm11_read_memory(struct target *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
1266 {
1267 return arm11_read_memory_inner(target, address, size, count, buffer, false);
1268 }
1269
1270 /*
1271 * arm11_config_memrw_no_increment - in the future we may want to be able
1272 * to read/write a range of data to a "port". a "port" is an action on
1273 * read memory address for some peripheral.
1274 */
1275 static int arm11_write_memory_inner(struct target *target,
1276 uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer,
1277 bool arm11_config_memrw_no_increment)
1278 {
1279 int retval;
1280 FNC_INFO;
1281
1282 if (target->state != TARGET_HALTED)
1283 {
1284 LOG_WARNING("target was not halted");
1285 return ERROR_TARGET_NOT_HALTED;
1286 }
1287
1288 LOG_DEBUG("ADDR %08" PRIx32 " SIZE %08" PRIx32 " COUNT %08" PRIx32 "", address, size, count);
1289
1290 struct arm11_common *arm11 = target_to_arm11(target);
1291
1292 retval = arm11_run_instr_data_prepare(arm11);
1293 if (retval != ERROR_OK)
1294 return retval;
1295
1296 /* MRC p14,0,r0,c0,c5,0 */
1297 retval = arm11_run_instr_data_to_core1(arm11, 0xee100e15, address);
1298 if (retval != ERROR_OK)
1299 return retval;
1300
1301 /* burst writes are not used for single words as those may well be
1302 * reset init script writes.
1303 *
1304 * The other advantage is that as burst writes are default, we'll
1305 * now exercise both burst and non-burst code paths with the
1306 * default settings, increasing code coverage.
1307 */
1308 bool burst = arm11_config_memwrite_burst && (count > 1);
1309
1310 switch (size)
1311 {
1312 case 1:
1313 {
1314 arm11->reg_list[ARM11_RC_R1].dirty = 1;
1315
1316 for (size_t i = 0; i < count; i++)
1317 {
1318 /* MRC p14,0,r1,c0,c5,0 */
1319 retval = arm11_run_instr_data_to_core1(arm11, 0xee101e15, *buffer++);
1320 if (retval != ERROR_OK)
1321 return retval;
1322
1323 /* strb r1, [r0], #1 */
1324 /* strb r1, [r0] */
1325 retval = arm11_run_instr_no_data1(arm11,
1326 !arm11_config_memrw_no_increment ? 0xe4c01001 : 0xe5c01000);
1327 if (retval != ERROR_OK)
1328 return retval;
1329 }
1330
1331 break;
1332 }
1333
1334 case 2:
1335 {
1336 arm11->reg_list[ARM11_RC_R1].dirty = 1;
1337
1338 for (size_t i = 0; i < count; i++)
1339 {
1340 uint16_t value;
1341 memcpy(&value, buffer + i * sizeof(uint16_t), sizeof(uint16_t));
1342
1343 /* MRC p14,0,r1,c0,c5,0 */
1344 retval = arm11_run_instr_data_to_core1(arm11, 0xee101e15, value);
1345 if (retval != ERROR_OK)
1346 return retval;
1347
1348 /* strh r1, [r0], #2 */
1349 /* strh r1, [r0] */
1350 retval = arm11_run_instr_no_data1(arm11,
1351 !arm11_config_memrw_no_increment ? 0xe0c010b2 : 0xe1c010b0);
1352 if (retval != ERROR_OK)
1353 return retval;
1354 }
1355
1356 break;
1357 }
1358
1359 case 4: {
1360 uint32_t instr = !arm11_config_memrw_no_increment ? 0xeca05e01 : 0xed805e00;
1361
1362 /** \todo TODO: buffer cast to uint32_t* causes alignment warnings */
1363 uint32_t *words = (uint32_t*)buffer;
1364
1365 if (!burst)
1366 {
1367 /* STC p14,c5,[R0],#4 */
1368 /* STC p14,c5,[R0]*/
1369 retval = arm11_run_instr_data_to_core(arm11, instr, words, count);
1370 if (retval != ERROR_OK)
1371 return retval;
1372 }
1373 else
1374 {
1375 /* STC p14,c5,[R0],#4 */
1376 /* STC p14,c5,[R0]*/
1377 retval = arm11_run_instr_data_to_core_noack(arm11, instr, words, count);
1378 if (retval != ERROR_OK)
1379 return retval;
1380 }
1381
1382 break;
1383 }
1384 }
1385
1386 /* r0 verification */
1387 if (!arm11_config_memrw_no_increment)
1388 {
1389 uint32_t r0;
1390
1391 /* MCR p14,0,R0,c0,c5,0 */
1392 retval = arm11_run_instr_data_from_core(arm11, 0xEE000E15, &r0, 1);
1393 if (retval != ERROR_OK)
1394 return retval;
1395
1396 if (address + size * count != r0)
1397 {
1398 LOG_ERROR("Data transfer failed. Expected end "
1399 "address 0x%08x, got 0x%08x",
1400 (unsigned) (address + size * count),
1401 (unsigned) r0);
1402
1403 if (burst)
1404 LOG_ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode");
1405
1406 if (arm11_config_memwrite_error_fatal)
1407 return ERROR_FAIL;
1408 }
1409 }
1410
1411 return arm11_run_instr_data_finish(arm11);
1412 }
1413
1414 static int arm11_write_memory(struct target *target,
1415 uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
1416 {
1417 return arm11_write_memory_inner(target, address, size, count, buffer, false);
1418 }
1419
1420 /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */
1421 static int arm11_bulk_write_memory(struct target *target,
1422 uint32_t address, uint32_t count, uint8_t *buffer)
1423 {
1424 FNC_INFO;
1425
1426 if (target->state != TARGET_HALTED)
1427 {
1428 LOG_WARNING("target was not halted");
1429 return ERROR_TARGET_NOT_HALTED;
1430 }
1431
1432 return arm11_write_memory(target, address, 4, count, buffer);
1433 }
1434
1435 /* target break-/watchpoint control
1436 * rw: 0 = write, 1 = read, 2 = access
1437 */
1438 static int arm11_add_breakpoint(struct target *target,
1439 struct breakpoint *breakpoint)
1440 {
1441 FNC_INFO;
1442 struct arm11_common *arm11 = target_to_arm11(target);
1443
1444 #if 0
1445 if (breakpoint->type == BKPT_SOFT)
1446 {
1447 LOG_INFO("sw breakpoint requested, but software breakpoints not enabled");
1448 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1449 }
1450 #endif
1451
1452 if (!arm11->free_brps)
1453 {
1454 LOG_DEBUG("no breakpoint unit available for hardware breakpoint");
1455 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1456 }
1457
1458 if (breakpoint->length != 4)
1459 {
1460 LOG_DEBUG("only breakpoints of four bytes length supported");
1461 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1462 }
1463
1464 arm11->free_brps--;
1465
1466 return ERROR_OK;
1467 }
1468
1469 static int arm11_remove_breakpoint(struct target *target,
1470 struct breakpoint *breakpoint)
1471 {
1472 FNC_INFO;
1473 struct arm11_common *arm11 = target_to_arm11(target);
1474
1475 arm11->free_brps++;
1476
1477 return ERROR_OK;
1478 }
1479
1480 static int arm11_add_watchpoint(struct target *target,
1481 struct watchpoint *watchpoint)
1482 {
1483 FNC_INFO_NOTIMPLEMENTED;
1484
1485 return ERROR_OK;
1486 }
1487
1488 static int arm11_remove_watchpoint(struct target *target,
1489 struct watchpoint *watchpoint)
1490 {
1491 FNC_INFO_NOTIMPLEMENTED;
1492
1493 return ERROR_OK;
1494 }
1495
1496 // HACKHACKHACK - FIXME mode/state
1497 /* target algorithm support */
1498 static int arm11_run_algorithm(struct target *target,
1499 int num_mem_params, struct mem_param *mem_params,
1500 int num_reg_params, struct reg_param *reg_params,
1501 uint32_t entry_point, uint32_t exit_point,
1502 int timeout_ms, void *arch_info)
1503 {
1504 struct arm11_common *arm11 = target_to_arm11(target);
1505 // enum armv4_5_state core_state = arm11->core_state;
1506 // enum armv4_5_mode core_mode = arm11->core_mode;
1507 uint32_t context[16];
1508 uint32_t cpsr;
1509 int exit_breakpoint_size = 0;
1510 int retval = ERROR_OK;
1511 LOG_DEBUG("Running algorithm");
1512
1513
1514 if (target->state != TARGET_HALTED)
1515 {
1516 LOG_WARNING("target not halted");
1517 return ERROR_TARGET_NOT_HALTED;
1518 }
1519
1520 // FIXME
1521 // if (!is_arm_mode(arm11->core_mode))
1522 // return ERROR_FAIL;
1523
1524 // Save regs
1525 for (unsigned i = 0; i < 16; i++)
1526 {
1527 context[i] = buf_get_u32((uint8_t*)(&arm11->reg_values[i]),0,32);
1528 LOG_DEBUG("Save %u: 0x%" PRIx32 "", i, context[i]);
1529 }
1530
1531 cpsr = buf_get_u32((uint8_t*)(arm11->reg_values + ARM11_RC_CPSR),0,32);
1532 LOG_DEBUG("Save CPSR: 0x%" PRIx32 "", cpsr);
1533
1534 for (int i = 0; i < num_mem_params; i++)
1535 {
1536 target_write_buffer(target, mem_params[i].address, mem_params[i].size, mem_params[i].value);
1537 }
1538
1539 // Set register parameters
1540 for (int i = 0; i < num_reg_params; i++)
1541 {
1542 struct reg *reg = register_get_by_name(arm11->core_cache, reg_params[i].reg_name, 0);
1543 if (!reg)
1544 {
1545 LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
1546 return ERROR_INVALID_ARGUMENTS;
1547 }
1548
1549 if (reg->size != reg_params[i].size)
1550 {
1551 LOG_ERROR("BUG: register '%s' size doesn't match reg_params[i].size", reg_params[i].reg_name);
1552 return ERROR_INVALID_ARGUMENTS;
1553 }
1554 arm11_set_reg(reg,reg_params[i].value);
1555 // printf("%i: Set %s =%08x\n", i, reg_params[i].reg_name,val);
1556 }
1557
1558 exit_breakpoint_size = 4;
1559
1560 /* arm11->core_state = arm11_algorithm_info->core_state;
1561 if (arm11->core_state == ARMV4_5_STATE_ARM)
1562 exit_breakpoint_size = 4;
1563 else if (arm11->core_state == ARMV4_5_STATE_THUMB)
1564 exit_breakpoint_size = 2;
1565 else
1566 {
1567 LOG_ERROR("BUG: can't execute algorithms when not in ARM or Thumb state");
1568 exit(-1);
1569 }
1570 */
1571
1572
1573 /* arm11 at this point only supports ARM not THUMB mode
1574 however if this test needs to be reactivated the current state can be read back
1575 from CPSR */
1576 #if 0
1577 if (arm11_algorithm_info->core_mode != ARMV4_5_MODE_ANY)
1578 {
1579 LOG_DEBUG("setting core_mode: 0x%2.2x", arm11_algorithm_info->core_mode);
1580 buf_set_u32(arm11->reg_list[ARM11_RC_CPSR].value, 0, 5, arm11_algorithm_info->core_mode);
1581 arm11->reg_list[ARM11_RC_CPSR].dirty = 1;
1582 arm11->reg_list[ARM11_RC_CPSR].valid = 1;
1583 }
1584 #endif
1585
1586 if ((retval = breakpoint_add(target, exit_point, exit_breakpoint_size, BKPT_HARD)) != ERROR_OK)
1587 {
1588 LOG_ERROR("can't add breakpoint to finish algorithm execution");
1589 retval = ERROR_TARGET_FAILURE;
1590 goto restore;
1591 }
1592
1593 // no debug, otherwise breakpoint is not set
1594 CHECK_RETVAL(target_resume(target, 0, entry_point, 1, 0));
1595
1596 CHECK_RETVAL(target_wait_state(target, TARGET_HALTED, timeout_ms));
1597
1598 if (target->state != TARGET_HALTED)
1599 {
1600 CHECK_RETVAL(target_halt(target));
1601
1602 CHECK_RETVAL(target_wait_state(target, TARGET_HALTED, 500));
1603
1604 retval = ERROR_TARGET_TIMEOUT;
1605
1606 goto del_breakpoint;
1607 }
1608
1609 if (buf_get_u32(arm11->reg_list[15].value, 0, 32) != exit_point)
1610 {
1611 LOG_WARNING("target reentered debug state, but not at the desired exit point: 0x%4.4" PRIx32 "",
1612 buf_get_u32(arm11->reg_list[15].value, 0, 32));
1613 retval = ERROR_TARGET_TIMEOUT;
1614 goto del_breakpoint;
1615 }
1616
1617 for (int i = 0; i < num_mem_params; i++)
1618 {
1619 if (mem_params[i].direction != PARAM_OUT)
1620 target_read_buffer(target, mem_params[i].address, mem_params[i].size, mem_params[i].value);
1621 }
1622
1623 for (int i = 0; i < num_reg_params; i++)
1624 {
1625 if (reg_params[i].direction != PARAM_OUT)
1626 {
1627 struct reg *reg = register_get_by_name(arm11->core_cache, reg_params[i].reg_name, 0);
1628 if (!reg)
1629 {
1630 LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
1631 retval = ERROR_INVALID_ARGUMENTS;
1632 goto del_breakpoint;
1633 }
1634
1635 if (reg->size != reg_params[i].size)
1636 {
1637 LOG_ERROR("BUG: register '%s' size doesn't match reg_params[i].size", reg_params[i].reg_name);
1638 retval = ERROR_INVALID_ARGUMENTS;
1639 goto del_breakpoint;
1640 }
1641
1642 buf_set_u32(reg_params[i].value, 0, 32, buf_get_u32(reg->value, 0, 32));
1643 }
1644 }
1645
1646 del_breakpoint:
1647 breakpoint_remove(target, exit_point);
1648
1649 restore:
1650 // Restore context
1651 for (size_t i = 0; i < 16; i++)
1652 {
1653 LOG_DEBUG("restoring register %s with value 0x%8.8" PRIx32 "",
1654 arm11->reg_list[i].name, context[i]);
1655 arm11_set_reg(&arm11->reg_list[i], (uint8_t*)&context[i]);
1656 }
1657 LOG_DEBUG("restoring CPSR with value 0x%8.8" PRIx32 "", cpsr);
1658 arm11_set_reg(&arm11->reg_list[ARM11_RC_CPSR], (uint8_t*)&cpsr);
1659
1660 // arm11->core_state = core_state;
1661 // arm11->core_mode = core_mode;
1662
1663 return retval;
1664 }
1665
1666 static int arm11_target_create(struct target *target, Jim_Interp *interp)
1667 {
1668 FNC_INFO;
1669
1670 NEW(struct arm11_common, arm11, 1);
1671
1672 arm11->target = target;
1673
1674 if (target->tap == NULL)
1675 return ERROR_FAIL;
1676
1677 if (target->tap->ir_length != 5)
1678 {
1679 LOG_ERROR("'target arm11' expects IR LENGTH = 5");
1680 return ERROR_COMMAND_SYNTAX_ERROR;
1681 }
1682
1683 armv4_5_init_arch_info(target, &arm11->arm);
1684
1685 arm11->jtag_info.tap = target->tap;
1686 arm11->jtag_info.scann_size = 5;
1687 arm11->jtag_info.scann_instr = ARM11_SCAN_N;
1688 /* cur_scan_chain == 0 */
1689 arm11->jtag_info.intest_instr = ARM11_INTEST;
1690
1691 return ERROR_OK;
1692 }
1693
1694 static int arm11_init_target(struct command_context *cmd_ctx,
1695 struct target *target)
1696 {
1697 /* Initialize anything we can set up without talking to the target */
1698
1699 /* FIXME Switch to use the standard build_reg_cache() not custom
1700 * code. Do it from examine(), after we check whether we're
1701 * an arm1176 and thus support the Secure Monitor mode.
1702 */
1703 return arm11_build_reg_cache(target);
1704 }
1705
1706 /* talk to the target and set things up */
1707 static int arm11_examine(struct target *target)
1708 {
1709 int retval;
1710 char *type;
1711 FNC_INFO;
1712 struct arm11_common *arm11 = target_to_arm11(target);
1713
1714 /* check IDCODE */
1715
1716 arm11_add_IR(arm11, ARM11_IDCODE, ARM11_TAP_DEFAULT);
1717
1718 struct scan_field idcode_field;
1719
1720 arm11_setup_field(arm11, 32, NULL, &arm11->device_id, &idcode_field);
1721
1722 arm11_add_dr_scan_vc(1, &idcode_field, TAP_DRPAUSE);
1723
1724 /* check DIDR */
1725
1726 arm11_add_debug_SCAN_N(arm11, 0x00, ARM11_TAP_DEFAULT);
1727
1728 arm11_add_IR(arm11, ARM11_INTEST, ARM11_TAP_DEFAULT);
1729
1730 struct scan_field chain0_fields[2];
1731
1732 arm11_setup_field(arm11, 32, NULL, &arm11->didr, chain0_fields + 0);
1733 arm11_setup_field(arm11, 8, NULL, &arm11->implementor, chain0_fields + 1);
1734
1735 arm11_add_dr_scan_vc(ARRAY_SIZE(chain0_fields), chain0_fields, TAP_IDLE);
1736
1737 CHECK_RETVAL(jtag_execute_queue());
1738
1739 switch (arm11->device_id & 0x0FFFF000)
1740 {
1741 case 0x07B36000:
1742 type = "ARM1136";
1743 break;
1744 case 0x07B56000:
1745 type = "ARM1156";
1746 break;
1747 case 0x07B76000:
1748 arm11->arm.core_type = ARM_MODE_MON;
1749 type = "ARM1176";
1750 break;
1751 default:
1752 LOG_ERROR("'target arm11' expects IDCODE 0x*7B*7****");
1753 return ERROR_FAIL;
1754 }
1755 LOG_INFO("found %s", type);
1756
1757 arm11->debug_version = (arm11->didr >> 16) & 0x0F;
1758
1759 if (arm11->debug_version != ARM11_DEBUG_V6 &&
1760 arm11->debug_version != ARM11_DEBUG_V61)
1761 {
1762 LOG_ERROR("Only ARMv6 v6 and v6.1 architectures supported.");
1763 return ERROR_FAIL;
1764 }
1765
1766 arm11->brp = ((arm11->didr >> 24) & 0x0F) + 1;
1767 arm11->wrp = ((arm11->didr >> 28) & 0x0F) + 1;
1768
1769 /** \todo TODO: reserve one brp slot if we allow breakpoints during step */
1770 arm11->free_brps = arm11->brp;
1771 arm11->free_wrps = arm11->wrp;
1772
1773 LOG_DEBUG("IDCODE %08" PRIx32 " IMPLEMENTOR %02x DIDR %08" PRIx32 "",
1774 arm11->device_id,
1775 (int)(arm11->implementor),
1776 arm11->didr);
1777
1778 /* as a side-effect this reads DSCR and thus
1779 * clears the ARM11_DSCR_STICKY_PRECISE_DATA_ABORT / Sticky Precise Data Abort Flag
1780 * as suggested by the spec.
1781 */
1782
1783 retval = arm11_check_init(arm11, NULL);
1784 if (retval != ERROR_OK)
1785 return retval;
1786
1787 /* ETM on ARM11 still uses original scanchain 6 access mode */
1788 if (arm11->arm.etm && !target_was_examined(target)) {
1789 *register_get_last_cache_p(&target->reg_cache) =
1790 etm_build_reg_cache(target, &arm11->jtag_info,
1791 arm11->arm.etm);
1792 retval = etm_setup(target);
1793 }
1794
1795 target_set_examined(target);
1796
1797 return ERROR_OK;
1798 }
1799
1800
1801 /** Load a register that is marked !valid in the register cache */
1802 static int arm11_get_reg(struct reg *reg)
1803 {
1804 FNC_INFO;
1805
1806 struct target * target = ((struct arm11_reg_state *)reg->arch_info)->target;
1807
1808 if (target->state != TARGET_HALTED)
1809 {
1810 LOG_WARNING("target was not halted");
1811 return ERROR_TARGET_NOT_HALTED;
1812 }
1813
1814 /** \todo TODO: Check this. We assume that all registers are fetched at debug entry. */
1815
1816 #if 0
1817 struct arm11_common *arm11 = target_to_arm11(target);
1818 const struct arm11_reg_defs *arm11_reg_info = arm11_reg_defs + ((struct arm11_reg_state *)reg->arch_info)->def_index;
1819 #endif
1820
1821 return ERROR_OK;
1822 }
1823
1824 /** Change a value in the register cache */
1825 static int arm11_set_reg(struct reg *reg, uint8_t *buf)
1826 {
1827 FNC_INFO;
1828
1829 struct target *target = ((struct arm11_reg_state *)reg->arch_info)->target;
1830 struct arm11_common *arm11 = target_to_arm11(target);
1831 // const struct arm11_reg_defs *arm11_reg_info = arm11_reg_defs + ((struct arm11_reg_state *)reg->arch_info)->def_index;
1832
1833 arm11->reg_values[((struct arm11_reg_state *)reg->arch_info)->def_index] = buf_get_u32(buf, 0, 32);
1834 reg->valid = 1;
1835 reg->dirty = 1;
1836
1837 return ERROR_OK;
1838 }
1839
1840 static const struct reg_arch_type arm11_reg_type = {
1841 .get = arm11_get_reg,
1842 .set = arm11_set_reg,
1843 };
1844
1845 static int arm11_build_reg_cache(struct target *target)
1846 {
1847 struct arm11_common *arm11 = target_to_arm11(target);
1848
1849 NEW(struct reg_cache, cache, 1);
1850 NEW(struct reg, reg_list, ARM11_REGCACHE_COUNT);
1851 NEW(struct arm11_reg_state, arm11_reg_states, ARM11_REGCACHE_COUNT);
1852
1853 arm11->reg_list = reg_list;
1854
1855 /* Build the process context cache */
1856 cache->name = "arm11 registers";
1857 cache->next = NULL;
1858 cache->reg_list = reg_list;
1859 cache->num_regs = ARM11_REGCACHE_COUNT;
1860
1861 struct reg_cache **cache_p = register_get_last_cache_p(&target->reg_cache);
1862 (*cache_p) = cache;
1863
1864 arm11->core_cache = cache;
1865 // armv7m->process_context = cache;
1866
1867 size_t i;
1868
1869 /* Not very elegant assertion */
1870 if (ARM11_REGCACHE_COUNT != ARRAY_SIZE(arm11->reg_values) ||
1871 ARM11_REGCACHE_COUNT != ARRAY_SIZE(arm11_reg_defs) ||
1872 ARM11_REGCACHE_COUNT != ARM11_RC_MAX)
1873 {
1874 LOG_ERROR("BUG: arm11->reg_values inconsistent (%d %u %u %d)",
1875 ARM11_REGCACHE_COUNT,
1876 (unsigned) ARRAY_SIZE(arm11->reg_values),
1877 (unsigned) ARRAY_SIZE(arm11_reg_defs),
1878 ARM11_RC_MAX);
1879 /* FIXME minimally, use a build_bug_on(X) mechanism;
1880 * runtime exit() here is bad!
1881 */
1882 exit(-1);
1883 }
1884
1885 for (i = 0; i < ARM11_REGCACHE_COUNT; i++)
1886 {
1887 struct reg * r = reg_list + i;
1888 const struct arm11_reg_defs * rd = arm11_reg_defs + i;
1889 struct arm11_reg_state * rs = arm11_reg_states + i;
1890
1891 r->name = rd->name;
1892 r->size = 32;
1893 r->value = (uint8_t *)(arm11->reg_values + i);
1894 r->dirty = 0;
1895 r->valid = 0;
1896 r->type = &arm11_reg_type;
1897 r->arch_info = rs;
1898
1899 rs->def_index = i;
1900 rs->target = target;
1901 }
1902
1903 return ERROR_OK;
1904 }
1905
1906 #define ARM11_BOOL_WRAPPER(name, print_name) \
1907 COMMAND_HANDLER(arm11_handle_bool_##name) \
1908 { \
1909 return CALL_COMMAND_HANDLER(handle_command_parse_bool, \
1910 &arm11_config_##name, print_name); \
1911 }
1912
1913 ARM11_BOOL_WRAPPER(memwrite_burst, "memory write burst mode")
1914 ARM11_BOOL_WRAPPER(memwrite_error_fatal, "fatal error mode for memory writes")
1915 ARM11_BOOL_WRAPPER(step_irq_enable, "IRQs while stepping")
1916 ARM11_BOOL_WRAPPER(hardware_step, "hardware single step")
1917
1918 COMMAND_HANDLER(arm11_handle_vcr)
1919 {
1920 switch (CMD_ARGC) {
1921 case 0:
1922 break;
1923 case 1:
1924 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], arm11_vcr);
1925 break;
1926 default:
1927 return ERROR_COMMAND_SYNTAX_ERROR;
1928 }
1929
1930 LOG_INFO("VCR 0x%08" PRIx32 "", arm11_vcr);
1931 return ERROR_OK;
1932 }
1933
1934 static const uint32_t arm11_coproc_instruction_limits[] =
1935 {
1936 15, /* coprocessor */
1937 7, /* opcode 1 */
1938 15, /* CRn */
1939 15, /* CRm */
1940 7, /* opcode 2 */
1941 0xFFFFFFFF, /* value */
1942 };
1943
1944 static int arm11_mrc_inner(struct target *target, int cpnum,
1945 uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm,
1946 uint32_t *value, bool read)
1947 {
1948 int retval;
1949 struct arm11_common *arm11 = target_to_arm11(target);
1950
1951 if (target->state != TARGET_HALTED)
1952 {
1953 LOG_ERROR("Target not halted");
1954 return ERROR_FAIL;
1955 }
1956
1957 uint32_t instr = 0xEE000010 |
1958 (cpnum << 8) |
1959 (op1 << 21) |
1960 (CRn << 16) |
1961 (CRm << 0) |
1962 (op2 << 5);
1963
1964 if (read)
1965 instr |= 0x00100000;
1966
1967 retval = arm11_run_instr_data_prepare(arm11);
1968 if (retval != ERROR_OK)
1969 return retval;
1970
1971 if (read)
1972 {
1973 retval = arm11_run_instr_data_from_core_via_r0(arm11, instr, value);
1974 if (retval != ERROR_OK)
1975 return retval;
1976 }
1977 else
1978 {
1979 retval = arm11_run_instr_data_to_core_via_r0(arm11, instr, *value);
1980 if (retval != ERROR_OK)
1981 return retval;
1982 }
1983
1984 return arm11_run_instr_data_finish(arm11);
1985 }
1986
1987 static int arm11_mrc(struct target *target, int cpnum,
1988 uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
1989 {
1990 return arm11_mrc_inner(target, cpnum, op1, op2, CRn, CRm, value, true);
1991 }
1992
1993 static int arm11_mcr(struct target *target, int cpnum,
1994 uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
1995 {
1996 return arm11_mrc_inner(target, cpnum, op1, op2, CRn, CRm, &value, false);
1997 }
1998
1999 static int arm11_register_commands(struct command_context *cmd_ctx)
2000 {
2001 FNC_INFO;
2002
2003 struct command *top_cmd, *mw_cmd;
2004
2005 armv4_5_register_commands(cmd_ctx);
2006
2007 top_cmd = register_command(cmd_ctx, NULL, "arm11",
2008 NULL, COMMAND_ANY, NULL);
2009
2010 /* "hardware_step" is only here to check if the default
2011 * simulate + breakpoint implementation is broken.
2012 * TEMPORARY! NOT DOCUMENTED!
2013 */
2014 register_command(cmd_ctx, top_cmd, "hardware_step",
2015 arm11_handle_bool_hardware_step, COMMAND_ANY,
2016 "DEBUG ONLY - Hardware single stepping"
2017 " (default: disabled)");
2018
2019 mw_cmd = register_command(cmd_ctx, top_cmd, "memwrite",
2020 NULL, COMMAND_ANY, NULL);
2021 register_command(cmd_ctx, mw_cmd, "burst",
2022 arm11_handle_bool_memwrite_burst, COMMAND_ANY,
2023 "Enable/Disable non-standard but fast burst mode"
2024 " (default: enabled)");
2025 register_command(cmd_ctx, mw_cmd, "error_fatal",
2026 arm11_handle_bool_memwrite_error_fatal, COMMAND_ANY,
2027 "Terminate program if transfer error was found"
2028 " (default: enabled)");
2029
2030 register_command(cmd_ctx, top_cmd, "step_irq_enable",
2031 arm11_handle_bool_step_irq_enable, COMMAND_ANY,
2032 "Enable interrupts while stepping"
2033 " (default: disabled)");
2034 register_command(cmd_ctx, top_cmd, "vcr",
2035 arm11_handle_vcr, COMMAND_ANY,
2036 "Control (Interrupt) Vector Catch Register");
2037
2038 return etm_register_commands(cmd_ctx);
2039 }
2040
2041 /** Holds methods for ARM11xx targets. */
2042 struct target_type arm11_target = {
2043 .name = "arm11",
2044
2045 .poll = arm11_poll,
2046 .arch_state = arm11_arch_state,
2047
2048 .target_request_data = arm11_target_request_data,
2049
2050 .halt = arm11_halt,
2051 .resume = arm11_resume,
2052 .step = arm11_step,
2053
2054 .assert_reset = arm11_assert_reset,
2055 .deassert_reset = arm11_deassert_reset,
2056 .soft_reset_halt = arm11_soft_reset_halt,
2057
2058 .get_gdb_reg_list = arm11_get_gdb_reg_list,
2059
2060 .read_memory = arm11_read_memory,
2061 .write_memory = arm11_write_memory,
2062
2063 .bulk_write_memory = arm11_bulk_write_memory,
2064
2065 .checksum_memory = arm_checksum_memory,
2066 .blank_check_memory = arm_blank_check_memory,
2067
2068 .add_breakpoint = arm11_add_breakpoint,
2069 .remove_breakpoint = arm11_remove_breakpoint,
2070 .add_watchpoint = arm11_add_watchpoint,
2071 .remove_watchpoint = arm11_remove_watchpoint,
2072
2073 .run_algorithm = arm11_run_algorithm,
2074
2075 .register_commands = arm11_register_commands,
2076 .target_create = arm11_target_create,
2077 .init_target = arm11_init_target,
2078 .examine = arm11_examine,
2079
2080 .mrc = arm11_mrc,
2081 .mcr = arm11_mcr,
2082 };

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)