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

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)