- endianess fixes everywhere but in the flash code. flashing might still be broken...
[openocd.git] / src / target / arm7_9_common.c
1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include "replacements.h"
25
26 #include "embeddedice.h"
27 #include "target.h"
28 #include "armv4_5.h"
29 #include "arm_jtag.h"
30 #include "jtag.h"
31 #include "log.h"
32 #include "arm7_9_common.h"
33 #include "breakpoints.h"
34
35 #include <stdlib.h>
36 #include <string.h>
37 #include <unistd.h>
38
39 #include <sys/types.h>
40 #include <sys/stat.h>
41 #include <sys/time.h>
42 #include <errno.h>
43
44 int arm7_9_debug_entry(target_t *target);
45 int arm7_9_enable_sw_bkpts(struct target_s *target);
46
47 /* command handler forward declarations */
48 int handle_arm7_9_write_xpsr_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
49 int handle_arm7_9_write_xpsr_im8_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
50 int handle_arm7_9_read_core_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
51 int handle_arm7_9_write_core_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
52 int handle_arm7_9_sw_bkpts_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
53 int handle_arm7_9_force_hw_bkpts_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
54 int handle_arm7_9_dbgrq_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
55 int handle_arm7_9_fast_memory_access_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
56 int handle_arm7_9_dcc_downloads_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
57
58 int arm7_9_reinit_embeddedice(target_t *target)
59 {
60 armv4_5_common_t *armv4_5 = target->arch_info;
61 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
62
63 breakpoint_t *breakpoint = target->breakpoints;
64
65 arm7_9->wp_available = 2;
66 arm7_9->wp0_used = 0;
67 arm7_9->wp1_used = 0;
68
69 /* mark all hardware breakpoints as unset */
70 while (breakpoint)
71 {
72 if (breakpoint->type == BKPT_HARD)
73 {
74 breakpoint->set = 0;
75 }
76 breakpoint = breakpoint->next;
77 }
78
79 if (arm7_9->sw_bkpts_enabled && arm7_9->sw_bkpts_use_wp)
80 {
81 arm7_9->sw_bkpts_enabled = 0;
82 arm7_9_enable_sw_bkpts(target);
83 }
84
85 arm7_9->reinit_embeddedice = 0;
86
87 return ERROR_OK;
88 }
89
90 int arm7_9_jtag_callback(enum jtag_event event, void *priv)
91 {
92 target_t *target = priv;
93 armv4_5_common_t *armv4_5 = target->arch_info;
94 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
95
96 /* a test-logic reset occured
97 * the EmbeddedICE registers have been reset
98 * hardware breakpoints have been cleared
99 */
100 if (event == JTAG_TRST_ASSERTED)
101 {
102 arm7_9->reinit_embeddedice = 1;
103 }
104
105 return ERROR_OK;
106 }
107
108 int arm7_9_get_arch_pointers(target_t *target, armv4_5_common_t **armv4_5_p, arm7_9_common_t **arm7_9_p)
109 {
110 armv4_5_common_t *armv4_5 = target->arch_info;
111 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
112
113 if (armv4_5->common_magic != ARMV4_5_COMMON_MAGIC)
114 {
115 return -1;
116 }
117
118 if (arm7_9->common_magic != ARM7_9_COMMON_MAGIC)
119 {
120 return -1;
121 }
122
123 *armv4_5_p = armv4_5;
124 *arm7_9_p = arm7_9;
125
126 return ERROR_OK;
127 }
128
129 int arm7_9_set_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
130 {
131 armv4_5_common_t *armv4_5 = target->arch_info;
132 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
133
134 if (target->state != TARGET_HALTED)
135 {
136 WARNING("target not halted");
137 return ERROR_TARGET_NOT_HALTED;
138 }
139
140 if (arm7_9->force_hw_bkpts)
141 breakpoint->type = BKPT_HARD;
142
143 if (breakpoint->set)
144 {
145 WARNING("breakpoint already set");
146 return ERROR_OK;
147 }
148
149 if (breakpoint->type == BKPT_HARD)
150 {
151 /* either an ARM (4 byte) or Thumb (2 byte) breakpoint */
152 u32 mask = (breakpoint->length == 4) ? 0x3u : 0x1u;
153 if (!arm7_9->wp0_used)
154 {
155 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_VALUE], breakpoint->address);
156 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], mask);
157 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], 0xffffffffu);
158 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], ~EICE_W_CTRL_nOPC & 0xff);
159 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], EICE_W_CTRL_ENABLE);
160
161 jtag_execute_queue();
162 arm7_9->wp0_used = 1;
163 breakpoint->set = 1;
164 }
165 else if (!arm7_9->wp1_used)
166 {
167 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_VALUE], breakpoint->address);
168 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_MASK], mask);
169 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_DATA_MASK], 0xffffffffu);
170 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_MASK], ~EICE_W_CTRL_nOPC & 0xff);
171 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], EICE_W_CTRL_ENABLE);
172
173 jtag_execute_queue();
174 arm7_9->wp1_used = 1;
175 breakpoint->set = 2;
176 }
177 else
178 {
179 ERROR("BUG: no hardware comparator available");
180 return ERROR_OK;
181 }
182 }
183 else if (breakpoint->type == BKPT_SOFT)
184 {
185 if (breakpoint->length == 4)
186 {
187 /* keep the original instruction in target endianness */
188 target->type->read_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr);
189 /* write the original instruction in target endianness (arm7_9->arm_bkpt is host endian) */
190 target_write_u32(target, breakpoint->address, arm7_9->arm_bkpt);
191 }
192 else
193 {
194 /* keep the original instruction in target endianness */
195 target->type->read_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr);
196 /* write the original instruction in target endianness (arm7_9->arm_bkpt is host endian) */
197 target_write_u32(target, breakpoint->address, arm7_9->thumb_bkpt);
198 }
199 breakpoint->set = 1;
200 }
201
202 return ERROR_OK;
203
204 }
205
206 int arm7_9_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
207 {
208 armv4_5_common_t *armv4_5 = target->arch_info;
209 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
210
211 if (target->state != TARGET_HALTED)
212 {
213 WARNING("target not halted");
214 return ERROR_TARGET_NOT_HALTED;
215 }
216
217 if (!breakpoint->set)
218 {
219 WARNING("breakpoint not set");
220 return ERROR_OK;
221 }
222
223 if (breakpoint->type == BKPT_HARD)
224 {
225 if (breakpoint->set == 1)
226 {
227 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x0);
228 jtag_execute_queue();
229 arm7_9->wp0_used = 0;
230 }
231 else if (breakpoint->set == 2)
232 {
233 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], 0x0);
234 jtag_execute_queue();
235 arm7_9->wp1_used = 0;
236 }
237 breakpoint->set = 0;
238 }
239 else
240 {
241 /* restore original instruction (kept in target endianness) */
242 if (breakpoint->length == 4)
243 {
244 target->type->write_memory(target, breakpoint->address, 4, 1, breakpoint->orig_instr);
245 }
246 else
247 {
248 target->type->write_memory(target, breakpoint->address, 2, 1, breakpoint->orig_instr);
249 }
250 breakpoint->set = 0;
251 }
252
253 return ERROR_OK;
254 }
255
256 int arm7_9_add_breakpoint(struct target_s *target, u32 address, u32 length, enum breakpoint_type type)
257 {
258 armv4_5_common_t *armv4_5 = target->arch_info;
259 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
260
261 if (target->state != TARGET_HALTED)
262 {
263 WARNING("target not halted");
264 return ERROR_TARGET_NOT_HALTED;
265 }
266
267 if (arm7_9->force_hw_bkpts)
268 {
269 type = BKPT_HARD;
270 }
271
272 if ((type == BKPT_SOFT) && (arm7_9->sw_bkpts_enabled == 0))
273 {
274 INFO("sw breakpoint requested, but software breakpoints not enabled");
275 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
276 }
277
278 if ((type == BKPT_HARD) && (arm7_9->wp_available < 1))
279 {
280 INFO("no watchpoint unit available for hardware breakpoint");
281 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
282 }
283
284 if (type == BKPT_HARD)
285 arm7_9->wp_available--;
286
287 if ((length != 2) && (length != 4))
288 {
289 INFO("only breakpoints of two (Thumb) or four (ARM) bytes length supported");
290 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
291 }
292
293 return ERROR_OK;
294 }
295
296 int arm7_9_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
297 {
298 armv4_5_common_t *armv4_5 = target->arch_info;
299 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
300
301 if (target->state != TARGET_HALTED)
302 {
303 WARNING("target not halted");
304 return ERROR_TARGET_NOT_HALTED;
305 }
306
307 if (breakpoint->set)
308 {
309 arm7_9_unset_breakpoint(target, breakpoint);
310 }
311
312 if (breakpoint->type == BKPT_HARD)
313 arm7_9->wp_available++;
314
315 return ERROR_OK;
316 }
317
318 int arm7_9_set_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
319 {
320 armv4_5_common_t *armv4_5 = target->arch_info;
321 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
322 int rw_mask = 1;
323 u32 mask;
324
325 mask = watchpoint->length - 1;
326
327 if (target->state != TARGET_HALTED)
328 {
329 WARNING("target not halted");
330 return ERROR_TARGET_NOT_HALTED;
331 }
332
333 if (watchpoint->rw == WPT_ACCESS)
334 rw_mask = 0;
335 else
336 rw_mask = 1;
337
338 if (!arm7_9->wp0_used)
339 {
340 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_VALUE], watchpoint->address);
341 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], mask);
342 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], watchpoint->mask);
343 if( watchpoint->mask != 0xffffffffu )
344 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_VALUE], watchpoint->value);
345 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], 0xff & ~EICE_W_CTRL_nOPC & ~rw_mask);
346 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], EICE_W_CTRL_ENABLE | EICE_W_CTRL_nOPC | (watchpoint->rw & 1));
347
348 jtag_execute_queue();
349 watchpoint->set = 1;
350 arm7_9->wp0_used = 2;
351 }
352 else if (!arm7_9->wp1_used)
353 {
354 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_VALUE], watchpoint->address);
355 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_MASK], mask);
356 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_DATA_MASK], watchpoint->mask);
357 if( watchpoint->mask != 0xffffffffu )
358 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_DATA_VALUE], watchpoint->value);
359 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_MASK], 0xff & ~EICE_W_CTRL_nOPC & ~rw_mask);
360 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], EICE_W_CTRL_ENABLE | EICE_W_CTRL_nOPC | (watchpoint->rw & 1));
361
362 jtag_execute_queue();
363 watchpoint->set = 2;
364 arm7_9->wp1_used = 2;
365 }
366 else
367 {
368 ERROR("BUG: no hardware comparator available");
369 return ERROR_OK;
370 }
371
372 return ERROR_OK;
373 }
374
375 int arm7_9_unset_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
376 {
377 armv4_5_common_t *armv4_5 = target->arch_info;
378 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
379
380 if (target->state != TARGET_HALTED)
381 {
382 WARNING("target not halted");
383 return ERROR_TARGET_NOT_HALTED;
384 }
385
386 if (!watchpoint->set)
387 {
388 WARNING("breakpoint not set");
389 return ERROR_OK;
390 }
391
392 if (watchpoint->set == 1)
393 {
394 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x0);
395 jtag_execute_queue();
396 arm7_9->wp0_used = 0;
397 }
398 else if (watchpoint->set == 2)
399 {
400 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], 0x0);
401 jtag_execute_queue();
402 arm7_9->wp1_used = 0;
403 }
404 watchpoint->set = 0;
405
406 return ERROR_OK;
407 }
408
409 int arm7_9_add_watchpoint(struct target_s *target, u32 address, u32 length, enum watchpoint_rw rw)
410 {
411 armv4_5_common_t *armv4_5 = target->arch_info;
412 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
413
414 if (target->state != TARGET_HALTED)
415 {
416 WARNING("target not halted");
417 return ERROR_TARGET_NOT_HALTED;
418 }
419
420 if (arm7_9->wp_available < 1)
421 {
422 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
423 }
424
425 if ((length != 1) && (length != 2) && (length != 4))
426 {
427 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
428 }
429
430 arm7_9->wp_available--;
431
432 return ERROR_OK;
433 }
434
435 int arm7_9_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
436 {
437 armv4_5_common_t *armv4_5 = target->arch_info;
438 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
439
440 if (target->state != TARGET_HALTED)
441 {
442 WARNING("target not halted");
443 return ERROR_TARGET_NOT_HALTED;
444 }
445
446 if (watchpoint->set)
447 {
448 arm7_9_unset_watchpoint(target, watchpoint);
449 }
450
451 arm7_9->wp_available++;
452
453 return ERROR_OK;
454 }
455
456 int arm7_9_enable_sw_bkpts(struct target_s *target)
457 {
458 armv4_5_common_t *armv4_5 = target->arch_info;
459 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
460 int retval;
461
462 if (arm7_9->sw_bkpts_enabled)
463 return ERROR_OK;
464
465 if (arm7_9->wp_available < 1)
466 {
467 WARNING("can't enable sw breakpoints with no watchpoint unit available");
468 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
469 }
470 arm7_9->wp_available--;
471
472 if (!arm7_9->wp0_used)
473 {
474 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_VALUE], arm7_9->arm_bkpt);
475 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], 0x0);
476 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], 0xffffffffu);
477 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], ~EICE_W_CTRL_nOPC & 0xff);
478 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], EICE_W_CTRL_ENABLE);
479 arm7_9->sw_bkpts_enabled = 1;
480 arm7_9->wp0_used = 3;
481 }
482 else if (!arm7_9->wp1_used)
483 {
484 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_DATA_VALUE], arm7_9->arm_bkpt);
485 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_DATA_MASK], 0x0);
486 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_MASK], 0xffffffffu);
487 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_MASK], ~EICE_W_CTRL_nOPC & 0xff);
488 embeddedice_set_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], EICE_W_CTRL_ENABLE);
489 arm7_9->sw_bkpts_enabled = 2;
490 arm7_9->wp1_used = 3;
491 }
492 else
493 {
494 ERROR("BUG: both watchpoints used, but wp_available >= 1");
495 exit(-1);
496 }
497
498 if ((retval = jtag_execute_queue()) != ERROR_OK)
499 {
500 ERROR("error writing EmbeddedICE registers to enable sw breakpoints");
501 exit(-1);
502 };
503
504 return ERROR_OK;
505 }
506
507 int arm7_9_disable_sw_bkpts(struct target_s *target)
508 {
509 armv4_5_common_t *armv4_5 = target->arch_info;
510 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
511
512 if (!arm7_9->sw_bkpts_enabled)
513 return ERROR_OK;
514
515 if (arm7_9->sw_bkpts_enabled == 1)
516 {
517 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x0);
518 arm7_9->sw_bkpts_enabled = 0;
519 arm7_9->wp0_used = 0;
520 arm7_9->wp_available++;
521 }
522 else if (arm7_9->sw_bkpts_enabled == 2)
523 {
524 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], 0x0);
525 arm7_9->sw_bkpts_enabled = 0;
526 arm7_9->wp1_used = 0;
527 arm7_9->wp_available++;
528 }
529
530 return ERROR_OK;
531 }
532
533 int arm7_9_execute_sys_speed(struct target_s *target)
534 {
535 int timeout;
536 int retval;
537
538 armv4_5_common_t *armv4_5 = target->arch_info;
539 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
540 arm_jtag_t *jtag_info = &arm7_9->jtag_info;
541 reg_t *dbg_stat = &arm7_9->eice_cache->reg_list[EICE_DBG_STAT];
542
543 /* set RESTART instruction */
544 jtag_add_end_state(TAP_RTI);
545 arm_jtag_set_instr(jtag_info, 0x4);
546
547 for (timeout=0; timeout<50; timeout++)
548 {
549 /* read debug status register */
550 embeddedice_read_reg(dbg_stat);
551 if ((retval = jtag_execute_queue()) != ERROR_OK)
552 return retval;
553 if ((buf_get_u32(dbg_stat->value, EICE_DBG_STATUS_DBGACK, 1))
554 && (buf_get_u32(dbg_stat->value, EICE_DBG_STATUS_SYSCOMP, 1)))
555 break;
556 usleep(100000);
557 }
558 if (timeout == 50)
559 {
560 ERROR("timeout waiting for SYSCOMP & DBGACK, last DBG_STATUS: %x", buf_get_u32(dbg_stat->value, 0, dbg_stat->size));
561 return ERROR_TARGET_TIMEOUT;
562 }
563
564 return ERROR_OK;
565 }
566
567 int arm7_9_execute_fast_sys_speed(struct target_s *target)
568 {
569 u8 check_value[4], check_mask[4];
570
571 armv4_5_common_t *armv4_5 = target->arch_info;
572 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
573 arm_jtag_t *jtag_info = &arm7_9->jtag_info;
574 reg_t *dbg_stat = &arm7_9->eice_cache->reg_list[EICE_DBG_STAT];
575
576 /* set RESTART instruction */
577 jtag_add_end_state(TAP_RTI);
578 arm_jtag_set_instr(jtag_info, 0x4);
579
580 /* check for DBGACK and SYSCOMP set (others don't care) */
581 buf_set_u32(check_value, 0, 32, 0x9);
582 buf_set_u32(check_mask, 0, 32, 0x9);
583
584 /* read debug status register */
585 embeddedice_read_reg_w_check(dbg_stat, check_value, check_value);
586
587 return ERROR_OK;
588 }
589
590 enum target_state arm7_9_poll(target_t *target)
591 {
592 int retval;
593 armv4_5_common_t *armv4_5 = target->arch_info;
594 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
595 reg_t *dbg_stat = &arm7_9->eice_cache->reg_list[EICE_DBG_STAT];
596
597 if (arm7_9->reinit_embeddedice)
598 {
599 arm7_9_reinit_embeddedice(target);
600 }
601
602 /* read debug status register */
603 embeddedice_read_reg(dbg_stat);
604 if ((retval = jtag_execute_queue()) != ERROR_OK)
605 {
606 switch (retval)
607 {
608 case ERROR_JTAG_QUEUE_FAILED:
609 ERROR("JTAG queue failed while reading EmbeddedICE status register");
610 exit(-1);
611 break;
612 default:
613 break;
614 }
615 }
616
617 if (buf_get_u32(dbg_stat->value, EICE_DBG_STATUS_DBGACK, 1))
618 {
619 DEBUG("DBGACK set, dbg_state->value: 0x%x", buf_get_u32(dbg_stat->value, 0, 32));
620 if ((target->state == TARGET_UNKNOWN))
621 {
622 WARNING("DBGACK set while target was in unknown state. Reset or initialize target before resuming");
623 target->state = TARGET_RUNNING;
624 }
625 if ((target->state == TARGET_RUNNING) || (target->state == TARGET_RESET))
626 {
627 target->state = TARGET_HALTED;
628 if ((retval = arm7_9_debug_entry(target)) != ERROR_OK)
629 return retval;
630
631 target_call_event_callbacks(target, TARGET_EVENT_HALTED);
632 }
633 if (target->state == TARGET_DEBUG_RUNNING)
634 {
635 target->state = TARGET_HALTED;
636 if ((retval = arm7_9_debug_entry(target)) != ERROR_OK)
637 return retval;
638
639 target_call_event_callbacks(target, TARGET_EVENT_DEBUG_HALTED);
640 }
641 }
642 else
643 {
644 if (target->state != TARGET_DEBUG_RUNNING)
645 target->state = TARGET_RUNNING;
646 }
647
648 return target->state;
649 }
650
651 int arm7_9_assert_reset(target_t *target)
652 {
653 int retval;
654
655 DEBUG("target->state: %s", target_state_strings[target->state]);
656
657 if (target->state == TARGET_HALTED || target->state == TARGET_UNKNOWN)
658 {
659 /* assert SRST and TRST */
660 /* system would get ouf sync if we didn't reset test-logic, too */
661 if ((retval = jtag_add_reset(1, 1)) != ERROR_OK)
662 {
663 if (retval == ERROR_JTAG_RESET_CANT_SRST)
664 {
665 WARNING("can't assert srst");
666 return retval;
667 }
668 else
669 {
670 ERROR("unknown error");
671 exit(-1);
672 }
673 }
674 jtag_add_sleep(5000);
675 if ((retval = jtag_add_reset(0, 1)) != ERROR_OK)
676 {
677 if (retval == ERROR_JTAG_RESET_WOULD_ASSERT_TRST)
678 {
679 WARNING("srst resets test logic, too");
680 retval = jtag_add_reset(1, 1);
681 }
682 }
683 }
684 else
685 {
686 if ((retval = jtag_add_reset(0, 1)) != ERROR_OK)
687 {
688 if (retval == ERROR_JTAG_RESET_WOULD_ASSERT_TRST)
689 {
690 WARNING("srst resets test logic, too");
691 retval = jtag_add_reset(1, 1);
692 }
693
694 if (retval == ERROR_JTAG_RESET_CANT_SRST)
695 {
696 WARNING("can't assert srst");
697 return retval;
698 }
699 else if (retval != ERROR_OK)
700 {
701 ERROR("unknown error");
702 exit(-1);
703 }
704 }
705 }
706
707 target->state = TARGET_RESET;
708 jtag_add_sleep(50000);
709
710 armv4_5_invalidate_core_regs(target);
711
712 return ERROR_OK;
713
714 }
715
716 int arm7_9_deassert_reset(target_t *target)
717 {
718 DEBUG("target->state: %s", target_state_strings[target->state]);
719
720 /* deassert reset lines */
721 jtag_add_reset(0, 0);
722
723 return ERROR_OK;
724
725 }
726
727 int arm7_9_soft_reset_halt(struct target_s *target)
728 {
729 armv4_5_common_t *armv4_5 = target->arch_info;
730 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
731 reg_t *dbg_stat = &arm7_9->eice_cache->reg_list[EICE_DBG_STAT];
732 int i;
733
734 if (target->state == TARGET_RUNNING)
735 {
736 target->type->halt(target);
737 }
738
739 while (buf_get_u32(dbg_stat->value, EICE_DBG_CONTROL_DBGACK, 1) == 0)
740 {
741 embeddedice_read_reg(dbg_stat);
742 jtag_execute_queue();
743 }
744 target->state = TARGET_HALTED;
745
746 /* all register content is now invalid */
747 armv4_5_invalidate_core_regs(target);
748
749 /* SVC, ARM state, IRQ and FIQ disabled */
750 buf_set_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8, 0xd3);
751 armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty = 1;
752 armv4_5->core_cache->reg_list[ARMV4_5_CPSR].valid = 1;
753
754 /* start fetching from 0x0 */
755 buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, 0x0);
756 armv4_5->core_cache->reg_list[15].dirty = 1;
757 armv4_5->core_cache->reg_list[15].valid = 1;
758
759 armv4_5->core_mode = ARMV4_5_MODE_SVC;
760 armv4_5->core_state = ARMV4_5_STATE_ARM;
761
762 /* reset registers */
763 for (i = 0; i <= 14; i++)
764 {
765 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).value, 0, 32, 0xffffffff);
766 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).dirty = 1;
767 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).valid = 1;
768 }
769
770 target_call_event_callbacks(target, TARGET_EVENT_HALTED);
771
772 return ERROR_OK;
773 }
774
775 int arm7_9_halt(target_t *target)
776 {
777 armv4_5_common_t *armv4_5 = target->arch_info;
778 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
779 reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
780
781 DEBUG("target->state: %s", target_state_strings[target->state]);
782
783 if (target->state == TARGET_HALTED)
784 {
785 WARNING("target was already halted");
786 return ERROR_TARGET_ALREADY_HALTED;
787 }
788
789 if (target->state == TARGET_UNKNOWN)
790 {
791 WARNING("target was in unknown state when halt was requested");
792 }
793
794 if ((target->state == TARGET_RESET) && (jtag_reset_config & RESET_SRST_PULLS_TRST) && (jtag_srst))
795 {
796 ERROR("can't request a halt while in reset if nSRST pulls nTRST");
797 return ERROR_TARGET_FAILURE;
798 }
799
800 if (arm7_9->use_dbgrq)
801 {
802 /* program EmbeddedICE Debug Control Register to assert DBGRQ
803 */
804 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGRQ, 1, 1);
805 embeddedice_store_reg(dbg_ctrl);
806 }
807 else
808 {
809 /* program watchpoint unit to match on any address
810 */
811 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], 0xffffffff);
812 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], 0xffffffff);
813 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x100);
814 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], 0xf7);
815 }
816
817 target->debug_reason = DBG_REASON_DBGRQ;
818
819 return ERROR_OK;
820 }
821
822 int arm7_9_clear_halt(target_t *target)
823 {
824 armv4_5_common_t *armv4_5 = target->arch_info;
825 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
826 reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
827
828 if (arm7_9->use_dbgrq)
829 {
830 /* program EmbeddedICE Debug Control Register to deassert DBGRQ
831 */
832 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGRQ, 1, 0);
833 embeddedice_store_reg(dbg_ctrl);
834 }
835 else
836 {
837 /* restore registers if watchpoint unit 0 was in use
838 */
839 if (arm7_9->wp0_used)
840 {
841 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK]);
842 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK]);
843 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK]);
844 }
845 /* control value always has to be restored, as it was either disabled,
846 * or enabled with possibly different bits
847 */
848 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE]);
849 }
850
851 return ERROR_OK;
852 }
853
854 int arm7_9_debug_entry(target_t *target)
855 {
856 int i;
857 u32 context[16];
858 u32* context_p[16];
859 u32 r0_thumb, pc_thumb;
860 u32 cpsr;
861 int retval;
862 /* get pointers to arch-specific information */
863 armv4_5_common_t *armv4_5 = target->arch_info;
864 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
865 reg_t *dbg_stat = &arm7_9->eice_cache->reg_list[EICE_DBG_STAT];
866 reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
867
868 #ifdef _DEBUG_ARM7_9_
869 DEBUG("");
870 #endif
871
872 if (arm7_9->pre_debug_entry)
873 arm7_9->pre_debug_entry(target);
874
875 /* program EmbeddedICE Debug Control Register to assert DBGACK and INTDIS
876 * ensure that DBGRQ is cleared
877 */
878 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 1);
879 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGRQ, 1, 0);
880 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_INTDIS, 1, 1);
881 embeddedice_store_reg(dbg_ctrl);
882
883 arm7_9_clear_halt(target);
884
885 if ((retval = jtag_execute_queue()) != ERROR_OK)
886 {
887 switch (retval)
888 {
889 case ERROR_JTAG_QUEUE_FAILED:
890 ERROR("JTAG queue failed while writing EmbeddedICE control register");
891 exit(-1);
892 break;
893 default:
894 break;
895 }
896 }
897
898 if ((retval = arm7_9->examine_debug_reason(target)) != ERROR_OK)
899 return retval;
900
901
902 if (target->state != TARGET_HALTED)
903 {
904 WARNING("target not halted");
905 return ERROR_TARGET_NOT_HALTED;
906 }
907
908 /* if the target is in Thumb state, change to ARM state */
909 if (buf_get_u32(dbg_stat->value, EICE_DBG_STATUS_ITBIT, 1))
910 {
911 DEBUG("target entered debug from Thumb state");
912 /* Entered debug from Thumb mode */
913 armv4_5->core_state = ARMV4_5_STATE_THUMB;
914 arm7_9->change_to_arm(target, &r0_thumb, &pc_thumb);
915 DEBUG("r0_thumb: 0x%8.8x, pc_thumb: 0x%8.8x", r0_thumb, pc_thumb);
916 }
917 else
918 {
919 DEBUG("target entered debug from ARM state");
920 /* Entered debug from ARM mode */
921 armv4_5->core_state = ARMV4_5_STATE_ARM;
922 }
923
924 for (i = 0; i < 16; i++)
925 context_p[i] = &context[i];
926 /* save core registers (r0 - r15 of current core mode) */
927 arm7_9->read_core_regs(target, 0xffff, context_p);
928
929 arm7_9->read_xpsr(target, &cpsr, 0);
930
931 if ((retval = jtag_execute_queue()) != ERROR_OK)
932 return retval;
933 buf_set_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32, cpsr);
934 armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty = 0;
935 armv4_5->core_cache->reg_list[ARMV4_5_CPSR].valid = 1;
936
937 armv4_5->core_mode = cpsr & 0x1f;
938 DEBUG("target entered debug state in %s mode", armv4_5_mode_strings[armv4_5_mode_to_number(armv4_5->core_mode)]);
939
940 if (armv4_5_mode_to_number(armv4_5->core_mode) == -1)
941 {
942 target->state = TARGET_UNKNOWN;
943 ERROR("cpsr contains invalid mode value - communication failure");
944 return ERROR_TARGET_FAILURE;
945 }
946
947 if (armv4_5->core_state == ARMV4_5_STATE_THUMB)
948 {
949 DEBUG("thumb state, applying fixups");
950 context[0] = r0_thumb;
951 context[15] = pc_thumb;
952 } else if (armv4_5->core_state == ARMV4_5_STATE_ARM)
953 {
954 /* adjust value stored by STM */
955 context[15] -= 3 * 4;
956 }
957
958 if ((target->debug_reason == DBG_REASON_BREAKPOINT)
959 || (target->debug_reason == DBG_REASON_SINGLESTEP)
960 || (target->debug_reason == DBG_REASON_WATCHPOINT)
961 || (target->debug_reason == DBG_REASON_WPTANDBKPT)
962 || ((target->debug_reason == DBG_REASON_DBGRQ) && (arm7_9->use_dbgrq == 0)))
963 context[15] -= 3 * ((armv4_5->core_state == ARMV4_5_STATE_ARM) ? 4 : 2);
964 else if (target->debug_reason == DBG_REASON_DBGRQ)
965 context[15] -= arm7_9->dbgreq_adjust_pc * ((armv4_5->core_state == ARMV4_5_STATE_ARM) ? 4 : 2);
966 else
967 {
968 ERROR("unknown debug reason: %i", target->debug_reason);
969 }
970
971
972 for (i=0; i<=15; i++)
973 {
974 DEBUG("r%i: 0x%8.8x", i, context[i]);
975 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).value, 0, 32, context[i]);
976 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).dirty = 0;
977 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).valid = 1;
978 }
979
980 DEBUG("entered debug state at PC 0x%x", context[15]);
981
982 /* exceptions other than USR & SYS have a saved program status register */
983 if ((armv4_5_mode_to_number(armv4_5->core_mode) != ARMV4_5_MODE_USR) && (armv4_5_mode_to_number(armv4_5->core_mode) != ARMV4_5_MODE_SYS))
984 {
985 u32 spsr;
986 arm7_9->read_xpsr(target, &spsr, 1);
987 jtag_execute_queue();
988 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 16).value, 0, 32, spsr);
989 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 16).dirty = 0;
990 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 16).valid = 1;
991 }
992
993 /* r0 and r15 (pc) have to be restored later */
994 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 0).dirty = 1;
995 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 15).dirty = 1;
996
997 if ((retval = jtag->execute_queue()) != ERROR_OK)
998 return retval;
999
1000 if (arm7_9->post_debug_entry)
1001 arm7_9->post_debug_entry(target);
1002
1003 return ERROR_OK;
1004 }
1005
1006 int arm7_9_full_context(target_t *target)
1007 {
1008 int i;
1009 int retval;
1010 armv4_5_common_t *armv4_5 = target->arch_info;
1011 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1012
1013 DEBUG("");
1014
1015 if (target->state != TARGET_HALTED)
1016 {
1017 WARNING("target not halted");
1018 return ERROR_TARGET_NOT_HALTED;
1019 }
1020
1021 /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1022 * SYS shares registers with User, so we don't touch SYS
1023 */
1024 for(i = 0; i < 6; i++)
1025 {
1026 u32 mask = 0;
1027 u32* reg_p[16];
1028 int j;
1029 int valid = 1;
1030
1031 /* check if there are invalid registers in the current mode
1032 */
1033 for (j = 0; j <= 16; j++)
1034 {
1035 if (ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).valid == 0)
1036 valid = 0;
1037 }
1038
1039 if (!valid)
1040 {
1041 u32 tmp_cpsr;
1042
1043 /* change processor mode */
1044 tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1045 tmp_cpsr |= armv4_5_number_to_mode(i);
1046 arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1047
1048 for (j = 0; j < 15; j++)
1049 {
1050 if (ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).valid == 0)
1051 {
1052 reg_p[j] = (u32*)ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).value;
1053 mask |= 1 << j;
1054 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).valid = 1;
1055 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).dirty = 0;
1056 }
1057 }
1058
1059 /* if only the PSR is invalid, mask is all zeroes */
1060 if (mask)
1061 arm7_9->read_core_regs(target, mask, reg_p);
1062
1063 /* check if the PSR has to be read */
1064 if (ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16).valid == 0)
1065 {
1066 arm7_9->read_xpsr(target, (u32*)ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16).value, 1);
1067 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16).valid = 1;
1068 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16).dirty = 0;
1069 }
1070 }
1071 }
1072
1073 /* restore processor mode */
1074 arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8), 0, 0);
1075
1076 if ((retval = jtag_execute_queue()) != ERROR_OK)
1077 {
1078 ERROR("JTAG failure");
1079 exit(-1);
1080 }
1081 return ERROR_OK;
1082 }
1083
1084 int arm7_9_restore_context(target_t *target)
1085 {
1086 armv4_5_common_t *armv4_5 = target->arch_info;
1087 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1088 reg_t *reg;
1089 armv4_5_core_reg_t *reg_arch_info;
1090 enum armv4_5_mode current_mode = armv4_5->core_mode;
1091 int i, j;
1092 int dirty;
1093 int mode_change;
1094
1095 DEBUG("");
1096
1097 if (target->state != TARGET_HALTED)
1098 {
1099 WARNING("target not halted");
1100 return ERROR_TARGET_NOT_HALTED;
1101 }
1102
1103 if (arm7_9->pre_restore_context)
1104 arm7_9->pre_restore_context(target);
1105
1106 /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1107 * SYS shares registers with User, so we don't touch SYS
1108 */
1109 for (i = 0; i < 6; i++)
1110 {
1111 DEBUG("examining %s mode", armv4_5_mode_strings[i]);
1112 dirty = 0;
1113 mode_change = 0;
1114 /* check if there are dirty registers in the current mode
1115 */
1116 for (j = 0; j <= 16; j++)
1117 {
1118 reg = &ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j);
1119 reg_arch_info = reg->arch_info;
1120 if (reg->dirty == 1)
1121 {
1122 if (reg->valid == 1)
1123 {
1124 dirty = 1;
1125 DEBUG("examining dirty reg: %s", reg->name);
1126 if ((reg_arch_info->mode != ARMV4_5_MODE_ANY)
1127 && (reg_arch_info->mode != current_mode)
1128 && !((reg_arch_info->mode == ARMV4_5_MODE_USR) && (armv4_5->core_mode == ARMV4_5_MODE_SYS))
1129 && !((reg_arch_info->mode == ARMV4_5_MODE_SYS) && (armv4_5->core_mode == ARMV4_5_MODE_USR)))
1130 {
1131 mode_change = 1;
1132 DEBUG("require mode change");
1133 }
1134 }
1135 else
1136 {
1137 ERROR("BUG: dirty register '%s', but no valid data", reg->name);
1138 exit(-1);
1139 }
1140 }
1141 }
1142
1143 if (dirty)
1144 {
1145 u32 mask = 0x0;
1146 int num_regs = 0;
1147 u32 regs[16];
1148
1149 if (mode_change)
1150 {
1151 u32 tmp_cpsr;
1152
1153 /* change processor mode */
1154 tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1155 tmp_cpsr |= armv4_5_number_to_mode(i);
1156 arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1157 current_mode = armv4_5_number_to_mode(i);
1158 }
1159
1160 for (j = 0; j <= 14; j++)
1161 {
1162 reg = &ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j);
1163 reg_arch_info = reg->arch_info;
1164
1165
1166 if (reg->dirty == 1)
1167 {
1168 regs[j] = buf_get_u32(reg->value, 0, 32);
1169 mask |= 1 << j;
1170 num_regs++;
1171 reg->dirty = 0;
1172 reg->valid = 1;
1173 DEBUG("writing register %i of mode %s with value 0x%8.8x", j, armv4_5_mode_strings[i], regs[j]);
1174 }
1175 }
1176
1177 if (mask)
1178 {
1179 arm7_9->write_core_regs(target, mask, regs);
1180 }
1181
1182 reg = &ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16);
1183 reg_arch_info = reg->arch_info;
1184 if ((reg->dirty) && (reg_arch_info->mode != ARMV4_5_MODE_ANY))
1185 {
1186 DEBUG("writing SPSR of mode %i with value 0x%8.8x", i, buf_get_u32(reg->value, 0, 32));
1187 arm7_9->write_xpsr(target, buf_get_u32(reg->value, 0, 32), 1);
1188 }
1189 }
1190 }
1191
1192 if ((armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty == 0) && (armv4_5->core_mode != current_mode))
1193 {
1194 /* restore processor mode */
1195 u32 tmp_cpsr;
1196
1197 tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1198 tmp_cpsr |= armv4_5_number_to_mode(i);
1199 DEBUG("writing lower 8 bit of cpsr with value 0x%2.2x", tmp_cpsr);
1200 arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1201 }
1202 else if (armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty == 1)
1203 {
1204 /* CPSR has been changed, full restore necessary */
1205 DEBUG("writing cpsr with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
1206 arm7_9->write_xpsr(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32), 0);
1207 armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty = 0;
1208 armv4_5->core_cache->reg_list[ARMV4_5_CPSR].valid = 1;
1209 }
1210
1211 /* restore PC */
1212 DEBUG("writing PC with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
1213 arm7_9->write_pc(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
1214 armv4_5->core_cache->reg_list[15].dirty = 0;
1215
1216 if (arm7_9->post_restore_context)
1217 arm7_9->post_restore_context(target);
1218
1219 return ERROR_OK;
1220 }
1221
1222 int arm7_9_restart_core(struct target_s *target)
1223 {
1224 armv4_5_common_t *armv4_5 = target->arch_info;
1225 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1226 arm_jtag_t *jtag_info = &arm7_9->jtag_info;
1227
1228 /* set RESTART instruction */
1229 jtag_add_end_state(TAP_RTI);
1230 arm_jtag_set_instr(jtag_info, 0x4);
1231
1232 jtag_add_runtest(1, TAP_RTI);
1233 if ((jtag_execute_queue()) != ERROR_OK)
1234 {
1235 exit(-1);
1236 }
1237
1238 return ERROR_OK;
1239 }
1240
1241 void arm7_9_enable_watchpoints(struct target_s *target)
1242 {
1243 watchpoint_t *watchpoint = target->watchpoints;
1244
1245 while (watchpoint)
1246 {
1247 if (watchpoint->set == 0)
1248 arm7_9_set_watchpoint(target, watchpoint);
1249 watchpoint = watchpoint->next;
1250 }
1251 }
1252
1253 void arm7_9_enable_breakpoints(struct target_s *target)
1254 {
1255 breakpoint_t *breakpoint = target->breakpoints;
1256
1257 /* set any pending breakpoints */
1258 while (breakpoint)
1259 {
1260 if (breakpoint->set == 0)
1261 arm7_9_set_breakpoint(target, breakpoint);
1262 breakpoint = breakpoint->next;
1263 }
1264 }
1265
1266 void arm7_9_disable_bkpts_and_wpts(struct target_s *target)
1267 {
1268 breakpoint_t *breakpoint = target->breakpoints;
1269 watchpoint_t *watchpoint = target->watchpoints;
1270
1271 /* set any pending breakpoints */
1272 while (breakpoint)
1273 {
1274 if (breakpoint->set != 0)
1275 arm7_9_unset_breakpoint(target, breakpoint);
1276 breakpoint = breakpoint->next;
1277 }
1278
1279 while (watchpoint)
1280 {
1281 if (watchpoint->set != 0)
1282 arm7_9_unset_watchpoint(target, watchpoint);
1283 watchpoint = watchpoint->next;
1284 }
1285 }
1286
1287 int arm7_9_resume(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution)
1288 {
1289 armv4_5_common_t *armv4_5 = target->arch_info;
1290 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1291 breakpoint_t *breakpoint = target->breakpoints;
1292 reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
1293
1294 DEBUG("");
1295
1296 if (target->state != TARGET_HALTED)
1297 {
1298 WARNING("target not halted");
1299 return ERROR_TARGET_NOT_HALTED;
1300 }
1301
1302 if (!debug_execution)
1303 {
1304 target_free_all_working_areas(target);
1305 }
1306
1307 /* current = 1: continue on current pc, otherwise continue at <address> */
1308 if (!current)
1309 buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, address);
1310
1311 /* the front-end may request us not to handle breakpoints */
1312 if (handle_breakpoints)
1313 {
1314 if ((breakpoint = breakpoint_find(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32))))
1315 {
1316 DEBUG("unset breakpoint at 0x%8.8x", breakpoint->address);
1317 arm7_9_unset_breakpoint(target, breakpoint);
1318
1319 DEBUG("enable single-step");
1320 arm7_9->enable_single_step(target);
1321
1322 target->debug_reason = DBG_REASON_SINGLESTEP;
1323
1324 arm7_9_restore_context(target);
1325
1326 if (armv4_5->core_state == ARMV4_5_STATE_ARM)
1327 arm7_9->branch_resume(target);
1328 else if (armv4_5->core_state == ARMV4_5_STATE_THUMB)
1329 {
1330 arm7_9->branch_resume_thumb(target);
1331 }
1332 else
1333 {
1334 ERROR("unhandled core state");
1335 exit(-1);
1336 }
1337
1338 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 0);
1339 embeddedice_write_reg(dbg_ctrl, buf_get_u32(dbg_ctrl->value, 0, dbg_ctrl->size));
1340 arm7_9_execute_sys_speed(target);
1341
1342 DEBUG("disable single-step");
1343 arm7_9->disable_single_step(target);
1344
1345 arm7_9_debug_entry(target);
1346 DEBUG("new PC after step: 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
1347
1348 DEBUG("set breakpoint at 0x%8.8x", breakpoint->address);
1349 arm7_9_set_breakpoint(target, breakpoint);
1350 }
1351 }
1352
1353 /* enable any pending breakpoints and watchpoints */
1354 arm7_9_enable_breakpoints(target);
1355 arm7_9_enable_watchpoints(target);
1356
1357 arm7_9_restore_context(target);
1358
1359 if (armv4_5->core_state == ARMV4_5_STATE_ARM)
1360 {
1361 arm7_9->branch_resume(target);
1362 }
1363 else if (armv4_5->core_state == ARMV4_5_STATE_THUMB)
1364 {
1365 arm7_9->branch_resume_thumb(target);
1366 }
1367 else
1368 {
1369 ERROR("unhandled core state");
1370 exit(-1);
1371 }
1372
1373 /* deassert DBGACK and INTDIS */
1374 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 0);
1375 /* INTDIS only when we really resume, not during debug execution */
1376 if (!debug_execution)
1377 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_INTDIS, 1, 0);
1378 embeddedice_write_reg(dbg_ctrl, buf_get_u32(dbg_ctrl->value, 0, dbg_ctrl->size));
1379
1380 arm7_9_restart_core(target);
1381
1382 target->debug_reason = DBG_REASON_NOTHALTED;
1383
1384 if (!debug_execution)
1385 {
1386 /* registers are now invalid */
1387 armv4_5_invalidate_core_regs(target);
1388 target->state = TARGET_RUNNING;
1389 target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
1390 }
1391 else
1392 {
1393 target->state = TARGET_DEBUG_RUNNING;
1394 target_call_event_callbacks(target, TARGET_EVENT_DEBUG_RESUMED);
1395 }
1396
1397 DEBUG("target resumed");
1398
1399 return ERROR_OK;
1400 }
1401
1402 void arm7_9_enable_eice_step(target_t *target)
1403 {
1404 armv4_5_common_t *armv4_5 = target->arch_info;
1405 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1406
1407 /* setup an inverse breakpoint on the current PC
1408 * - comparator 1 matches the current address
1409 * - rangeout from comparator 1 is connected to comparator 0 rangein
1410 * - comparator 0 matches any address, as long as rangein is low */
1411 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], 0xffffffff);
1412 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], 0xffffffff);
1413 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x100);
1414 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], 0x77);
1415 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_VALUE], buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
1416 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_MASK], 0);
1417 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_DATA_MASK], 0xffffffff);
1418 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], 0x0);
1419 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_MASK], 0xf7);
1420 }
1421
1422 void arm7_9_disable_eice_step(target_t *target)
1423 {
1424 armv4_5_common_t *armv4_5 = target->arch_info;
1425 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1426
1427 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK]);
1428 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK]);
1429 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE]);
1430 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK]);
1431 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_VALUE]);
1432 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_MASK]);
1433 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_DATA_MASK]);
1434 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_MASK]);
1435 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE]);
1436 }
1437
1438 int arm7_9_step(struct target_s *target, int current, u32 address, int handle_breakpoints)
1439 {
1440 armv4_5_common_t *armv4_5 = target->arch_info;
1441 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1442 breakpoint_t *breakpoint = target->breakpoints;
1443
1444 if (target->state != TARGET_HALTED)
1445 {
1446 WARNING("target not halted");
1447 return ERROR_TARGET_NOT_HALTED;
1448 }
1449
1450 /* current = 1: continue on current pc, otherwise continue at <address> */
1451 if (!current)
1452 buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, address);
1453
1454 /* the front-end may request us not to handle breakpoints */
1455 if (handle_breakpoints)
1456 if ((breakpoint = breakpoint_find(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32))))
1457 arm7_9_unset_breakpoint(target, breakpoint);
1458
1459 target->debug_reason = DBG_REASON_SINGLESTEP;
1460
1461 arm7_9_restore_context(target);
1462
1463 arm7_9->enable_single_step(target);
1464
1465 if (armv4_5->core_state == ARMV4_5_STATE_ARM)
1466 {
1467 arm7_9->branch_resume(target);
1468 }
1469 else if (armv4_5->core_state == ARMV4_5_STATE_THUMB)
1470 {
1471 arm7_9->branch_resume_thumb(target);
1472 }
1473 else
1474 {
1475 ERROR("unhandled core state");
1476 exit(-1);
1477 }
1478
1479 target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
1480
1481 arm7_9_execute_sys_speed(target);
1482 arm7_9->disable_single_step(target);
1483
1484 /* registers are now invalid */
1485 armv4_5_invalidate_core_regs(target);
1486
1487 arm7_9_debug_entry(target);
1488
1489 target_call_event_callbacks(target, TARGET_EVENT_HALTED);
1490
1491 if (breakpoint)
1492 arm7_9_set_breakpoint(target, breakpoint);
1493
1494 DEBUG("target stepped");
1495
1496 return ERROR_OK;
1497
1498 }
1499
1500 int arm7_9_read_core_reg(struct target_s *target, int num, enum armv4_5_mode mode)
1501 {
1502 u32* reg_p[16];
1503 int retval;
1504 armv4_5_common_t *armv4_5 = target->arch_info;
1505 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1506 enum armv4_5_mode reg_mode = ((armv4_5_core_reg_t*)ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).arch_info)->mode;
1507
1508 if ((num < 0) || (num > 16))
1509 return ERROR_INVALID_ARGUMENTS;
1510
1511 if ((mode != ARMV4_5_MODE_ANY)
1512 && (mode != armv4_5->core_mode)
1513 && (reg_mode != ARMV4_5_MODE_ANY))
1514 {
1515 u32 tmp_cpsr;
1516
1517 /* change processor mode */
1518 tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1519 tmp_cpsr |= mode;
1520 arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1521 }
1522
1523 if ((num >= 0) && (num <= 15))
1524 {
1525 /* read a normal core register */
1526 reg_p[num] = (u32*)ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).value;
1527
1528 arm7_9->read_core_regs(target, 1 << num, reg_p);
1529 }
1530 else
1531 {
1532 /* read a program status register
1533 * if the register mode is MODE_ANY, we read the cpsr, otherwise a spsr
1534 */
1535 armv4_5_core_reg_t *arch_info = ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).arch_info;
1536 int spsr = (arch_info->mode == ARMV4_5_MODE_ANY) ? 0 : 1;
1537
1538 arm7_9->read_xpsr(target, (u32*)ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).value, spsr);
1539 }
1540
1541 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).valid = 1;
1542 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).dirty = 0;
1543
1544 if ((mode != ARMV4_5_MODE_ANY)
1545 && (mode != armv4_5->core_mode)
1546 && (reg_mode != ARMV4_5_MODE_ANY)) {
1547 /* restore processor mode */
1548 arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8), 0, 0);
1549 }
1550
1551 if ((retval = jtag_execute_queue()) != ERROR_OK)
1552 {
1553 ERROR("JTAG failure");
1554 exit(-1);
1555 }
1556
1557 return ERROR_OK;
1558
1559 }
1560
1561 int arm7_9_write_core_reg(struct target_s *target, int num, enum armv4_5_mode mode, u32 value)
1562 {
1563 u32 reg[16];
1564 int retval;
1565 armv4_5_common_t *armv4_5 = target->arch_info;
1566 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1567 enum armv4_5_mode reg_mode = ((armv4_5_core_reg_t*)ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).arch_info)->mode;
1568
1569 if ((num < 0) || (num > 16))
1570 return ERROR_INVALID_ARGUMENTS;
1571
1572 if ((mode != ARMV4_5_MODE_ANY)
1573 && (mode != armv4_5->core_mode)
1574 && (reg_mode != ARMV4_5_MODE_ANY)) {
1575 u32 tmp_cpsr;
1576
1577 /* change processor mode */
1578 tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1579 tmp_cpsr |= mode;
1580 arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1581 }
1582
1583 if ((num >= 0) && (num <= 15))
1584 {
1585 /* write a normal core register */
1586 reg[num] = value;
1587
1588 arm7_9->write_core_regs(target, 1 << num, reg);
1589 }
1590 else
1591 {
1592 /* write a program status register
1593 * if the register mode is MODE_ANY, we write the cpsr, otherwise a spsr
1594 */
1595 armv4_5_core_reg_t *arch_info = ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).arch_info;
1596 int spsr = (arch_info->mode == ARMV4_5_MODE_ANY) ? 0 : 1;
1597
1598 arm7_9->write_xpsr(target, value, spsr);
1599 }
1600
1601 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).valid = 1;
1602 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).dirty = 0;
1603
1604 if ((mode != ARMV4_5_MODE_ANY)
1605 && (mode != armv4_5->core_mode)
1606 && (reg_mode != ARMV4_5_MODE_ANY)) {
1607 /* restore processor mode */
1608 arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8), 0, 0);
1609 }
1610
1611 if ((retval = jtag_execute_queue()) != ERROR_OK)
1612 {
1613 ERROR("JTAG failure");
1614 exit(-1);
1615 }
1616
1617 return ERROR_OK;
1618
1619 }
1620
1621 int arm7_9_read_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
1622 {
1623 armv4_5_common_t *armv4_5 = target->arch_info;
1624 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1625
1626 u32 reg[16];
1627 int num_accesses = 0;
1628 int thisrun_accesses;
1629 int i;
1630 u32 cpsr;
1631 int retval;
1632 int last_reg = 0;
1633
1634 DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address, size, count);
1635
1636 if (target->state != TARGET_HALTED)
1637 {
1638 WARNING("target not halted");
1639 return ERROR_TARGET_NOT_HALTED;
1640 }
1641
1642 /* sanitize arguments */
1643 if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer))
1644 return ERROR_INVALID_ARGUMENTS;
1645
1646 if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u)))
1647 return ERROR_TARGET_UNALIGNED_ACCESS;
1648
1649 /* load the base register with the address of the first word */
1650 reg[0] = address;
1651 arm7_9->write_core_regs(target, 0x1, reg);
1652
1653 switch (size)
1654 {
1655 case 4:
1656 while (num_accesses < count)
1657 {
1658 u32 reg_list;
1659 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1660 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1661
1662 if (last_reg <= thisrun_accesses)
1663 last_reg = thisrun_accesses;
1664
1665 arm7_9->load_word_regs(target, reg_list);
1666
1667 /* fast memory reads are only safe when the target is running
1668 * from a sufficiently high clock (32 kHz is usually too slow)
1669 */
1670 if (arm7_9->fast_memory_access)
1671 arm7_9_execute_fast_sys_speed(target);
1672 else
1673 arm7_9_execute_sys_speed(target);
1674
1675 arm7_9->read_core_regs_target_buffer(target, reg_list, buffer, 4);
1676
1677 /* advance buffer, count number of accesses */
1678 buffer += thisrun_accesses * 4;
1679 num_accesses += thisrun_accesses;
1680 }
1681 break;
1682 case 2:
1683 while (num_accesses < count)
1684 {
1685 u32 reg_list;
1686 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1687 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1688
1689 for (i = 1; i <= thisrun_accesses; i++)
1690 {
1691 if (i > last_reg)
1692 last_reg = i;
1693 arm7_9->load_hword_reg(target, i);
1694 /* fast memory reads are only safe when the target is running
1695 * from a sufficiently high clock (32 kHz is usually too slow)
1696 */
1697 if (arm7_9->fast_memory_access)
1698 arm7_9_execute_fast_sys_speed(target);
1699 else
1700 arm7_9_execute_sys_speed(target);
1701 }
1702
1703 arm7_9->read_core_regs_target_buffer(target, reg_list, buffer, 2);
1704
1705 /* advance buffer, count number of accesses */
1706 buffer += thisrun_accesses * 2;
1707 num_accesses += thisrun_accesses;
1708 }
1709 break;
1710 case 1:
1711 while (num_accesses < count)
1712 {
1713 u32 reg_list;
1714 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1715 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1716
1717 for (i = 1; i <= thisrun_accesses; i++)
1718 {
1719 if (i > last_reg)
1720 last_reg = i;
1721 arm7_9->load_byte_reg(target, i);
1722 /* fast memory reads are only safe when the target is running
1723 * from a sufficiently high clock (32 kHz is usually too slow)
1724 */
1725 if (arm7_9->fast_memory_access)
1726 arm7_9_execute_fast_sys_speed(target);
1727 else
1728 arm7_9_execute_sys_speed(target);
1729 }
1730
1731 arm7_9->read_core_regs_target_buffer(target, reg_list, buffer, 1);
1732
1733 /* advance buffer, count number of accesses */
1734 buffer += thisrun_accesses * 1;
1735 num_accesses += thisrun_accesses;
1736 }
1737 break;
1738 default:
1739 ERROR("BUG: we shouldn't get here");
1740 exit(-1);
1741 break;
1742 }
1743
1744 for (i=0; i<=last_reg; i++)
1745 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).dirty = 1;
1746
1747 arm7_9->read_xpsr(target, &cpsr, 0);
1748 if ((retval = jtag_execute_queue()) != ERROR_OK)
1749 {
1750 ERROR("JTAG error while reading cpsr");
1751 exit(-1);
1752 }
1753
1754 if (((cpsr & 0x1f) == ARMV4_5_MODE_ABT) && (armv4_5->core_mode != ARMV4_5_MODE_ABT))
1755 {
1756 ERROR("memory read caused data abort");
1757
1758 arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8), 0, 0);
1759
1760 return ERROR_TARGET_DATA_ABORT;
1761 }
1762
1763 return ERROR_OK;
1764 }
1765
1766 int arm7_9_write_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
1767 {
1768 armv4_5_common_t *armv4_5 = target->arch_info;
1769 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1770 reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
1771
1772 u32 reg[16];
1773 int num_accesses = 0;
1774 int thisrun_accesses;
1775 int i;
1776 u32 cpsr;
1777 int retval;
1778 int last_reg = 0;
1779
1780 DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address, size, count);
1781
1782 if (target->state != TARGET_HALTED)
1783 {
1784 WARNING("target not halted");
1785 return ERROR_TARGET_NOT_HALTED;
1786 }
1787
1788 /* sanitize arguments */
1789 if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer))
1790 return ERROR_INVALID_ARGUMENTS;
1791
1792 if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u)))
1793 return ERROR_TARGET_UNALIGNED_ACCESS;
1794
1795 /* load the base register with the address of the first word */
1796 reg[0] = address;
1797 arm7_9->write_core_regs(target, 0x1, reg);
1798
1799 /* Clear DBGACK, to make sure memory fetches work as expected */
1800 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 0);
1801 embeddedice_store_reg(dbg_ctrl);
1802
1803 switch (size)
1804 {
1805 case 4:
1806 while (num_accesses < count)
1807 {
1808 u32 reg_list;
1809 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1810 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1811
1812 for (i = 1; i <= thisrun_accesses; i++)
1813 {
1814 if (i > last_reg)
1815 last_reg = i;
1816 reg[i] = target_buffer_get_u32(target, buffer);
1817 buffer += 4;
1818 }
1819
1820 arm7_9->write_core_regs(target, reg_list, reg);
1821
1822 arm7_9->store_word_regs(target, reg_list);
1823
1824 /* fast memory writes are only safe when the target is running
1825 * from a sufficiently high clock (32 kHz is usually too slow)
1826 */
1827 if (arm7_9->fast_memory_access)
1828 arm7_9_execute_fast_sys_speed(target);
1829 else
1830 arm7_9_execute_sys_speed(target);
1831
1832 num_accesses += thisrun_accesses;
1833 }
1834 break;
1835 case 2:
1836 while (num_accesses < count)
1837 {
1838 u32 reg_list;
1839 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1840 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1841
1842 for (i = 1; i <= thisrun_accesses; i++)
1843 {
1844 if (i > last_reg)
1845 last_reg = i;
1846 reg[i] = target_buffer_get_u16(target, buffer) & 0xffff;
1847 buffer += 2;
1848 }
1849
1850 arm7_9->write_core_regs(target, reg_list, reg);
1851
1852 for (i = 1; i <= thisrun_accesses; i++)
1853 {
1854 arm7_9->store_hword_reg(target, i);
1855
1856 /* fast memory writes are only safe when the target is running
1857 * from a sufficiently high clock (32 kHz is usually too slow)
1858 */
1859 if (arm7_9->fast_memory_access)
1860 arm7_9_execute_fast_sys_speed(target);
1861 else
1862 arm7_9_execute_sys_speed(target);
1863 }
1864
1865 num_accesses += thisrun_accesses;
1866 }
1867 break;
1868 case 1:
1869 while (num_accesses < count)
1870 {
1871 u32 reg_list;
1872 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1873 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1874
1875 for (i = 1; i <= thisrun_accesses; i++)
1876 {
1877 if (i > last_reg)
1878 last_reg = i;
1879 reg[i] = *buffer++ & 0xff;
1880 }
1881
1882 arm7_9->write_core_regs(target, reg_list, reg);
1883
1884 for (i = 1; i <= thisrun_accesses; i++)
1885 {
1886 arm7_9->store_byte_reg(target, i);
1887 /* fast memory writes are only safe when the target is running
1888 * from a sufficiently high clock (32 kHz is usually too slow)
1889 */
1890 if (arm7_9->fast_memory_access)
1891 arm7_9_execute_fast_sys_speed(target);
1892 else
1893 arm7_9_execute_sys_speed(target);
1894 }
1895
1896 num_accesses += thisrun_accesses;
1897 }
1898 break;
1899 default:
1900 ERROR("BUG: we shouldn't get here");
1901 exit(-1);
1902 break;
1903 }
1904
1905 /* Re-Set DBGACK */
1906 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 1);
1907 embeddedice_store_reg(dbg_ctrl);
1908
1909 for (i=0; i<=last_reg; i++)
1910 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).dirty = 1;
1911
1912 arm7_9->read_xpsr(target, &cpsr, 0);
1913 if ((retval = jtag_execute_queue()) != ERROR_OK)
1914 {
1915 ERROR("JTAG error while reading cpsr");
1916 exit(-1);
1917 }
1918
1919 if (((cpsr & 0x1f) == ARMV4_5_MODE_ABT) && (armv4_5->core_mode != ARMV4_5_MODE_ABT))
1920 {
1921 ERROR("memory write caused data abort");
1922
1923 arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8), 0, 0);
1924
1925 return ERROR_TARGET_DATA_ABORT;
1926 }
1927
1928 return ERROR_OK;
1929 }
1930
1931 int arm7_9_bulk_write_memory(target_t *target, u32 address, u32 count, u8 *buffer)
1932 {
1933 armv4_5_common_t *armv4_5 = target->arch_info;
1934 arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1935 enum armv4_5_state core_state = armv4_5->core_state;
1936 u32 r0 = buf_get_u32(armv4_5->core_cache->reg_list[0].value, 0, 32);
1937 u32 r1 = buf_get_u32(armv4_5->core_cache->reg_list[1].value, 0, 32);
1938 u32 pc = buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32);
1939 int i;
1940
1941 u32 dcc_code[] =
1942 {
1943 /* MRC TST BNE MRC STR B */
1944 0xee101e10, 0xe3110001, 0x0afffffc, 0xee111e10, 0xe4801004, 0xeafffff9
1945 };
1946
1947 if (!arm7_9->dcc_downloads)
1948 return target->type->write_memory(target, address, 4, count, buffer);
1949
1950 /* regrab previously allocated working_area, or allocate a new one */
1951 if (!arm7_9->dcc_working_area)
1952 {
1953 u8 dcc_code_buf[6 * 4];
1954
1955 /* make sure we have a working area */
1956 if (target_alloc_working_area(target, 24, &arm7_9->dcc_working_area) != ERROR_OK)
1957 {
1958 INFO("no working area available, falling back to memory writes");
1959 return target->type->write_memory(target, address, 4, count, buffer);
1960 }
1961
1962 /* copy target instructions to target endianness */
1963 for (i = 0; i < 6; i++)
1964 {
1965 target_buffer_set_u32(target, dcc_code_buf + i*4, dcc_code[i]);
1966 }
1967
1968 /* write DCC code to working area */
1969 target->type->write_memory(target, arm7_9->dcc_working_area->address, 4, 6, dcc_code_buf);
1970 }
1971
1972 buf_set_u32(armv4_5->core_cache->reg_list[0].value, 0, 32, address);
1973 armv4_5->core_cache->reg_list[0].valid = 1;
1974 armv4_5->core_cache->reg_list[0].dirty = 1;
1975 armv4_5->core_state = ARMV4_5_STATE_ARM;
1976
1977 arm7_9_resume(target, 0, arm7_9->dcc_working_area->address, 1, 1);
1978
1979 for (i = 0; i < count; i++)
1980 {
1981 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_COMMS_DATA], target_buffer_get_u32(target, buffer));
1982 buffer += 4;
1983 }
1984
1985 target->type->halt(target);
1986
1987 while (target->state != TARGET_HALTED)
1988 target->type->poll(target);
1989
1990 /* restore target state */
1991 buf_set_u32(armv4_5->core_cache->reg_list[0].value, 0, 32, r0);
1992 armv4_5->core_cache->reg_list[0].valid = 1;
1993 armv4_5->core_cache->reg_list[0].dirty = 1;
1994 buf_set_u32(armv4_5->core_cache->reg_list[1].value, 0, 32, r1);
1995 armv4_5->core_cache->reg_list[1].valid = 1;
1996 armv4_5->core_cache->reg_list[1].dirty = 1;
1997 buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, pc);
1998 armv4_5->core_cache->reg_list[15].valid = 1;
1999 armv4_5->core_cache->reg_list[15].dirty = 1;
2000 armv4_5->core_state = core_state;
2001
2002 return ERROR_OK;
2003 }
2004
2005 int arm7_9_register_commands(struct command_context_s *cmd_ctx)
2006 {
2007 command_t *arm7_9_cmd;
2008
2009 arm7_9_cmd = register_command(cmd_ctx, NULL, "arm7_9", NULL, COMMAND_ANY, "arm7/9 specific commands");
2010
2011 register_command(cmd_ctx, arm7_9_cmd, "write_xpsr", handle_arm7_9_write_xpsr_command, COMMAND_EXEC, "write program status register <value> <not cpsr|spsr>");
2012 register_command(cmd_ctx, arm7_9_cmd, "write_xpsr_im8", handle_arm7_9_write_xpsr_im8_command, COMMAND_EXEC, "write program status register <8bit immediate> <rotate> <not cpsr|spsr>");
2013
2014 register_command(cmd_ctx, arm7_9_cmd, "write_core_reg", handle_arm7_9_write_core_reg_command, COMMAND_EXEC, "write core register <num> <mode> <value>");
2015
2016 register_command(cmd_ctx, arm7_9_cmd, "sw_bkpts", handle_arm7_9_sw_bkpts_command, COMMAND_EXEC, "support for software breakpoints <enable|disable>");
2017 register_command(cmd_ctx, arm7_9_cmd, "force_hw_bkpts", handle_arm7_9_force_hw_bkpts_command, COMMAND_EXEC, "use hardware breakpoints for all breakpoints (disables sw breakpoint support) <enable|disable>");
2018 register_command(cmd_ctx, arm7_9_cmd, "dbgrq", handle_arm7_9_dbgrq_command,
2019 COMMAND_ANY, "use EmbeddedICE dbgrq instead of breakpoint for target halt requests <enable|disable>");
2020 register_command(cmd_ctx, arm7_9_cmd, "fast_writes", handle_arm7_9_fast_memory_access_command,
2021 COMMAND_ANY, "(deprecated, see: arm7_9 fast_memory_access)");
2022 register_command(cmd_ctx, arm7_9_cmd, "fast_memory_access", handle_arm7_9_fast_memory_access_command,
2023 COMMAND_ANY, "use fast memory accesses instead of slower but potentially unsafe slow accesses <enable|disable>");
2024 register_command(cmd_ctx, arm7_9_cmd, "dcc_downloads", handle_arm7_9_dcc_downloads_command,
2025 COMMAND_ANY, "use DCC downloads for larger memory writes <enable|disable>");
2026
2027 armv4_5_register_commands(cmd_ctx);
2028
2029 return ERROR_OK;
2030 }
2031
2032 int handle_arm7_9_write_xpsr_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2033 {
2034 u32 value;
2035 int spsr;
2036 int retval;
2037 target_t *target = get_current_target(cmd_ctx);
2038 armv4_5_common_t *armv4_5;
2039 arm7_9_common_t *arm7_9;
2040
2041 if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2042 {
2043 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2044 return ERROR_OK;
2045 }
2046
2047 if (target->state != TARGET_HALTED)
2048 {
2049 command_print(cmd_ctx, "can't write registers while running");
2050 return ERROR_OK;
2051 }
2052
2053 if (argc < 2)
2054 {
2055 command_print(cmd_ctx, "usage: write_xpsr <value> <not cpsr|spsr>");
2056 return ERROR_OK;
2057 }
2058
2059 value = strtoul(args[0], NULL, 0);
2060 spsr = strtol(args[1], NULL, 0);
2061
2062 arm7_9->write_xpsr(target, value, spsr);
2063 if ((retval = jtag_execute_queue()) != ERROR_OK)
2064 {
2065 ERROR("JTAG error while writing to xpsr");
2066 exit(-1);
2067 }
2068
2069 return ERROR_OK;
2070 }
2071
2072 int handle_arm7_9_write_xpsr_im8_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2073 {
2074 u32 value;
2075 int rotate;
2076 int spsr;
2077 int retval;
2078 target_t *target = get_current_target(cmd_ctx);
2079 armv4_5_common_t *armv4_5;
2080 arm7_9_common_t *arm7_9;
2081
2082 if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2083 {
2084 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2085 return ERROR_OK;
2086 }
2087
2088 if (target->state != TARGET_HALTED)
2089 {
2090 command_print(cmd_ctx, "can't write registers while running");
2091 return ERROR_OK;
2092 }
2093
2094 if (argc < 3)
2095 {
2096 command_print(cmd_ctx, "usage: write_xpsr_im8 <im8> <rotate> <not cpsr|spsr>");
2097 return ERROR_OK;
2098 }
2099
2100 value = strtoul(args[0], NULL, 0);
2101 rotate = strtol(args[1], NULL, 0);
2102 spsr = strtol(args[2], NULL, 0);
2103
2104 arm7_9->write_xpsr_im8(target, value, rotate, spsr);
2105 if ((retval = jtag_execute_queue()) != ERROR_OK)
2106 {
2107 ERROR("JTAG error while writing 8-bit immediate to xpsr");
2108 exit(-1);
2109 }
2110
2111 return ERROR_OK;
2112 }
2113
2114 int handle_arm7_9_write_core_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2115 {
2116 u32 value;
2117 u32 mode;
2118 int num;
2119 target_t *target = get_current_target(cmd_ctx);
2120 armv4_5_common_t *armv4_5;
2121 arm7_9_common_t *arm7_9;
2122
2123 if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2124 {
2125 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2126 return ERROR_OK;
2127 }
2128
2129 if (target->state != TARGET_HALTED)
2130 {
2131 command_print(cmd_ctx, "can't write registers while running");
2132 return ERROR_OK;
2133 }
2134
2135 if (argc < 3)
2136 {
2137 command_print(cmd_ctx, "usage: write_core_reg <num> <mode> <value>");
2138 return ERROR_OK;
2139 }
2140
2141 num = strtol(args[0], NULL, 0);
2142 mode = strtoul(args[1], NULL, 0);
2143 value = strtoul(args[2], NULL, 0);
2144
2145 arm7_9_write_core_reg(target, num, mode, value);
2146
2147 return ERROR_OK;
2148 }
2149
2150 int handle_arm7_9_sw_bkpts_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2151 {
2152 target_t *target = get_current_target(cmd_ctx);
2153 armv4_5_common_t *armv4_5;
2154 arm7_9_common_t *arm7_9;
2155
2156 if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2157 {
2158 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2159 return ERROR_OK;
2160 }
2161
2162 if (argc == 0)
2163 {
2164 command_print(cmd_ctx, "software breakpoints %s", (arm7_9->sw_bkpts_enabled) ? "enabled" : "disabled");
2165 return ERROR_OK;
2166 }
2167
2168 if (strcmp("enable", args[0]) == 0)
2169 {
2170 if (arm7_9->sw_bkpts_use_wp)
2171 {
2172 arm7_9_enable_sw_bkpts(target);
2173 }
2174 else
2175 {
2176 arm7_9->sw_bkpts_enabled = 1;
2177 }
2178 }
2179 else if (strcmp("disable", args[0]) == 0)
2180 {
2181 if (arm7_9->sw_bkpts_use_wp)
2182 {
2183 arm7_9_disable_sw_bkpts(target);
2184 }
2185 else
2186 {
2187 arm7_9->sw_bkpts_enabled = 0;
2188 }
2189 }
2190 else
2191 {
2192 command_print(cmd_ctx, "usage: arm7_9 sw_bkpts <enable|disable>");
2193 }
2194
2195 command_print(cmd_ctx, "software breakpoints %s", (arm7_9->sw_bkpts_enabled) ? "enabled" : "disabled");
2196
2197 return ERROR_OK;
2198 }
2199
2200 int handle_arm7_9_force_hw_bkpts_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2201 {
2202 target_t *target = get_current_target(cmd_ctx);
2203 armv4_5_common_t *armv4_5;
2204 arm7_9_common_t *arm7_9;
2205
2206 if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2207 {
2208 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2209 return ERROR_OK;
2210 }
2211
2212 if ((argc >= 1) && (strcmp("enable", args[0]) == 0))
2213 {
2214 arm7_9->force_hw_bkpts = 1;
2215 if (arm7_9->sw_bkpts_use_wp)
2216 {
2217 arm7_9_disable_sw_bkpts(target);
2218 }
2219 }
2220 else if ((argc >= 1) && (strcmp("disable", args[0]) == 0))
2221 {
2222 arm7_9->force_hw_bkpts = 0;
2223 }
2224 else
2225 {
2226 command_print(cmd_ctx, "usage: arm7_9 force_hw_bkpts <enable|disable>");
2227 }
2228
2229 command_print(cmd_ctx, "force hardware breakpoints %s", (arm7_9->force_hw_bkpts) ? "enabled" : "disabled");
2230
2231 return ERROR_OK;
2232 }
2233
2234 int handle_arm7_9_dbgrq_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2235 {
2236 target_t *target = get_current_target(cmd_ctx);
2237 armv4_5_common_t *armv4_5;
2238 arm7_9_common_t *arm7_9;
2239
2240 if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2241 {
2242 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2243 return ERROR_OK;
2244 }
2245
2246 if (argc > 0)
2247 {
2248 if (strcmp("enable", args[0]) == 0)
2249 {
2250 arm7_9->use_dbgrq = 1;
2251 }
2252 else if (strcmp("disable", args[0]) == 0)
2253 {
2254 arm7_9->use_dbgrq = 0;
2255 }
2256 else
2257 {
2258 command_print(cmd_ctx, "usage: arm7_9 dbgrq <enable|disable>");
2259 }
2260 }
2261
2262 command_print(cmd_ctx, "use of EmbeddedICE dbgrq instead of breakpoint for target halt %s", (arm7_9->use_dbgrq) ? "enabled" : "disabled");
2263
2264 return ERROR_OK;
2265 }
2266
2267 int handle_arm7_9_fast_memory_access_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2268 {
2269 target_t *target = get_current_target(cmd_ctx);
2270 armv4_5_common_t *armv4_5;
2271 arm7_9_common_t *arm7_9;
2272
2273 if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2274 {
2275 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2276 return ERROR_OK;
2277 }
2278
2279 if (argc > 0)
2280 {
2281 if (strcmp("enable", args[0]) == 0)
2282 {
2283 arm7_9->fast_memory_access = 1;
2284 }
2285 else if (strcmp("disable", args[0]) == 0)
2286 {
2287 arm7_9->fast_memory_access = 0;
2288 }
2289 else
2290 {
2291 command_print(cmd_ctx, "usage: arm7_9 fast_memory_access <enable|disable>");
2292 }
2293 }
2294
2295 command_print(cmd_ctx, "fast memory access is %s", (arm7_9->fast_memory_access) ? "enabled" : "disabled");
2296
2297 return ERROR_OK;
2298 }
2299
2300 int handle_arm7_9_dcc_downloads_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2301 {
2302 target_t *target = get_current_target(cmd_ctx);
2303 armv4_5_common_t *armv4_5;
2304 arm7_9_common_t *arm7_9;
2305
2306 if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2307 {
2308 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2309 return ERROR_OK;
2310 }
2311
2312 if (argc > 0)
2313 {
2314 if (strcmp("enable", args[0]) == 0)
2315 {
2316 arm7_9->dcc_downloads = 1;
2317 }
2318 else if (strcmp("disable", args[0]) == 0)
2319 {
2320 arm7_9->dcc_downloads = 0;
2321 }
2322 else
2323 {
2324 command_print(cmd_ctx, "usage: arm7_9 dcc_downloads <enable|disable>");
2325 }
2326 }
2327
2328 command_print(cmd_ctx, "dcc downloads are %s", (arm7_9->dcc_downloads) ? "enabled" : "disabled");
2329
2330 return ERROR_OK;
2331 }
2332
2333 int arm7_9_init_arch_info(target_t *target, arm7_9_common_t *arm7_9)
2334 {
2335 armv4_5_common_t *armv4_5 = &arm7_9->armv4_5_common;
2336
2337 arm7_9->common_magic = ARM7_9_COMMON_MAGIC;
2338
2339 arm_jtag_setup_connection(&arm7_9->jtag_info);
2340 arm7_9->wp_available = 2;
2341 arm7_9->wp0_used = 0;
2342 arm7_9->wp1_used = 0;
2343 arm7_9->force_hw_bkpts = 0;
2344 arm7_9->use_dbgrq = 0;
2345 arm7_9->has_etm = 0;
2346
2347 arm7_9->reinit_embeddedice = 0;
2348
2349 arm7_9->dcc_working_area = NULL;
2350
2351 arm7_9->fast_memory_access = 0;
2352 arm7_9->dcc_downloads = 0;
2353
2354 jtag_register_event_callback(arm7_9_jtag_callback, target);
2355
2356 armv4_5->arch_info = arm7_9;
2357 armv4_5->read_core_reg = arm7_9_read_core_reg;
2358 armv4_5->write_core_reg = arm7_9_write_core_reg;
2359 armv4_5->full_context = arm7_9_full_context;
2360
2361 armv4_5_init_arch_info(target, armv4_5);
2362
2363 return ERROR_OK;
2364 }

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)