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

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)