- correctly enter debug state on a "soft_reset_halt" command
[fw/openocd] / 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 ((length != 2) && (length != 4))
285         {
286                 INFO("only breakpoints of two (Thumb) or four (ARM) bytes length supported");
287                 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
288         }
289         
290         if (type == BKPT_HARD)
291                 arm7_9->wp_available--;
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                 /* if the target wasn't running, there might be working areas allocated */
660                 target_free_all_working_areas(target);
661                 
662                 /* assert SRST and TRST */
663                 /* system would get ouf sync if we didn't reset test-logic, too */
664                 if ((retval = jtag_add_reset(1, 1)) != ERROR_OK)
665                 {
666                         if (retval == ERROR_JTAG_RESET_CANT_SRST)
667                         {
668                                 WARNING("can't assert srst");
669                                 return retval;
670                         }
671                         else
672                         {
673                                 ERROR("unknown error");
674                                 exit(-1);
675                         }
676                 }
677                 jtag_add_sleep(5000);
678                 if ((retval = jtag_add_reset(0, 1)) != ERROR_OK)
679                 {
680                         if (retval == ERROR_JTAG_RESET_WOULD_ASSERT_TRST)
681                         {
682                                 WARNING("srst resets test logic, too");
683                                 retval = jtag_add_reset(1, 1);
684                         }
685                 }
686         }
687         else
688         {
689                 if ((retval = jtag_add_reset(0, 1)) != ERROR_OK)
690                 {
691                         if (retval == ERROR_JTAG_RESET_WOULD_ASSERT_TRST)
692                         {
693                                 WARNING("srst resets test logic, too");
694                                 retval = jtag_add_reset(1, 1);
695                         }
696                         
697                         if (retval == ERROR_JTAG_RESET_CANT_SRST)
698                         {
699                                 WARNING("can't assert srst");
700                                 return retval;
701                         }
702                         else if (retval != ERROR_OK)
703                         {
704                                 ERROR("unknown error");
705                                 exit(-1);
706                         }
707                 }
708         }
709         
710         target->state = TARGET_RESET;
711         jtag_add_sleep(50000);
712         
713         armv4_5_invalidate_core_regs(target);
714
715         return ERROR_OK;
716
717 }
718
719 int arm7_9_deassert_reset(target_t *target)
720 {
721         DEBUG("target->state: %s", target_state_strings[target->state]);
722         
723         /* deassert reset lines */
724         jtag_add_reset(0, 0);
725                 
726         return ERROR_OK;
727
728 }
729
730 int arm7_9_clear_halt(target_t *target)
731 {
732         armv4_5_common_t *armv4_5 = target->arch_info;
733         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
734         reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
735         
736         if (arm7_9->use_dbgrq)
737         {
738                 /* program EmbeddedICE Debug Control Register to deassert DBGRQ
739                  */
740                 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGRQ, 1, 0);     
741                 embeddedice_store_reg(dbg_ctrl);
742         }
743         else
744         {
745                 /* restore registers if watchpoint unit 0 was in use
746                  */
747                 if (arm7_9->wp0_used)
748                 {
749                         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK]);
750                         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK]);
751                         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK]);
752                 }
753                 /* control value always has to be restored, as it was either disabled, 
754                  * or enabled with possibly different bits
755                  */
756                 embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE]);
757         }
758         
759         return ERROR_OK;
760 }
761
762 int arm7_9_soft_reset_halt(struct target_s *target)
763 {
764         armv4_5_common_t *armv4_5 = target->arch_info;
765         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
766         reg_t *dbg_stat = &arm7_9->eice_cache->reg_list[EICE_DBG_STAT];
767         reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
768         int i;
769         
770         if (target->state == TARGET_RUNNING)
771         {
772                 target->type->halt(target);
773         }
774         
775         while (buf_get_u32(dbg_stat->value, EICE_DBG_CONTROL_DBGACK, 1) == 0)
776         {
777                 embeddedice_read_reg(dbg_stat);
778                 jtag_execute_queue();
779         }
780         target->state = TARGET_HALTED;
781         
782         /* program EmbeddedICE Debug Control Register to assert DBGACK and INTDIS
783          * ensure that DBGRQ is cleared
784          */
785         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 1);
786         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGRQ, 1, 0);
787         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_INTDIS, 1, 1);
788         embeddedice_store_reg(dbg_ctrl);
789         
790         arm7_9_clear_halt(target);
791         
792         /* if the target is in Thumb state, change to ARM state */
793         if (buf_get_u32(dbg_stat->value, EICE_DBG_STATUS_ITBIT, 1))
794         {
795                 u32 r0_thumb, pc_thumb;
796                 DEBUG("target entered debug from Thumb state, changing to ARM");
797                 /* Entered debug from Thumb mode */
798                 armv4_5->core_state = ARMV4_5_STATE_THUMB;
799                 arm7_9->change_to_arm(target, &r0_thumb, &pc_thumb);
800         }
801         
802         /* all register content is now invalid */
803         armv4_5_invalidate_core_regs(target);
804         
805         /* SVC, ARM state, IRQ and FIQ disabled */
806         buf_set_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8, 0xd3);
807         armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty = 1;
808         armv4_5->core_cache->reg_list[ARMV4_5_CPSR].valid = 1;
809         
810         /* start fetching from 0x0 */
811         buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, 0x0);
812         armv4_5->core_cache->reg_list[15].dirty = 1;
813         armv4_5->core_cache->reg_list[15].valid = 1;
814         
815         armv4_5->core_mode = ARMV4_5_MODE_SVC;
816         armv4_5->core_state = ARMV4_5_STATE_ARM;
817         
818         /* reset registers */
819         for (i = 0; i <= 14; i++)
820         {       
821                 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).value, 0, 32, 0xffffffff);
822                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).dirty = 1;
823                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).valid = 1;
824         }
825         
826         target_call_event_callbacks(target, TARGET_EVENT_HALTED);
827         
828         return ERROR_OK;
829 }
830
831 int arm7_9_halt(target_t *target)
832 {
833         armv4_5_common_t *armv4_5 = target->arch_info;
834         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
835         reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
836         
837         DEBUG("target->state: %s", target_state_strings[target->state]);
838         
839         if (target->state == TARGET_HALTED)
840         {
841                 WARNING("target was already halted");
842                 return ERROR_TARGET_ALREADY_HALTED;
843         } 
844         
845         if (target->state == TARGET_UNKNOWN)
846         {
847                 WARNING("target was in unknown state when halt was requested");
848         }
849         
850         if ((target->state == TARGET_RESET) && (jtag_reset_config & RESET_SRST_PULLS_TRST) && (jtag_srst))
851         {
852                 ERROR("can't request a halt while in reset if nSRST pulls nTRST");
853                 return ERROR_TARGET_FAILURE;
854         }
855
856         if (arm7_9->use_dbgrq)
857         {
858                 /* program EmbeddedICE Debug Control Register to assert DBGRQ
859                  */
860                 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGRQ, 1, 1);     
861                 embeddedice_store_reg(dbg_ctrl);
862         }
863         else
864         {
865                 /* program watchpoint unit to match on any address
866                  */
867                 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], 0xffffffff);
868                 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], 0xffffffff);
869                 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x100);
870                 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], 0xf7);
871         }
872
873         target->debug_reason = DBG_REASON_DBGRQ;
874         
875         return ERROR_OK;
876 }
877
878 int arm7_9_debug_entry(target_t *target)
879 {
880         int i;
881         u32 context[16];
882         u32* context_p[16];
883         u32 r0_thumb, pc_thumb;
884         u32 cpsr;
885         int retval;
886         /* get pointers to arch-specific information */
887         armv4_5_common_t *armv4_5 = target->arch_info;
888         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
889         reg_t *dbg_stat = &arm7_9->eice_cache->reg_list[EICE_DBG_STAT];
890         reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
891
892 #ifdef _DEBUG_ARM7_9_
893         DEBUG("");
894 #endif
895
896         if (arm7_9->pre_debug_entry)
897                 arm7_9->pre_debug_entry(target);
898
899         /* program EmbeddedICE Debug Control Register to assert DBGACK and INTDIS
900          * ensure that DBGRQ is cleared
901          */
902         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 1);
903         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGRQ, 1, 0);
904         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_INTDIS, 1, 1);
905         embeddedice_store_reg(dbg_ctrl);
906         
907         arm7_9_clear_halt(target);
908         
909         if ((retval = jtag_execute_queue()) != ERROR_OK)
910         {
911                 switch (retval)
912                 {
913                         case ERROR_JTAG_QUEUE_FAILED:
914                                 ERROR("JTAG queue failed while writing EmbeddedICE control register");
915                                 exit(-1);
916                                 break;
917                         default:
918                                 break;
919                 }
920         }
921
922         if ((retval = arm7_9->examine_debug_reason(target)) != ERROR_OK)
923                 return retval;
924
925
926         if (target->state != TARGET_HALTED)
927         {
928                 WARNING("target not halted");
929                 return ERROR_TARGET_NOT_HALTED;
930         }
931         
932         /* if the target is in Thumb state, change to ARM state */
933         if (buf_get_u32(dbg_stat->value, EICE_DBG_STATUS_ITBIT, 1))
934         {
935                 DEBUG("target entered debug from Thumb state");
936                 /* Entered debug from Thumb mode */
937                 armv4_5->core_state = ARMV4_5_STATE_THUMB;
938                 arm7_9->change_to_arm(target, &r0_thumb, &pc_thumb);
939                 DEBUG("r0_thumb: 0x%8.8x, pc_thumb: 0x%8.8x", r0_thumb, pc_thumb);
940         }
941         else
942         {
943                 DEBUG("target entered debug from ARM state");
944                 /* Entered debug from ARM mode */
945                 armv4_5->core_state = ARMV4_5_STATE_ARM;
946         }
947         
948         for (i = 0; i < 16; i++)
949                 context_p[i] = &context[i];
950         /* save core registers (r0 - r15 of current core mode) */
951         arm7_9->read_core_regs(target, 0xffff, context_p);
952
953         arm7_9->read_xpsr(target, &cpsr, 0);
954         
955         if ((retval = jtag_execute_queue()) != ERROR_OK)
956                 return retval;
957         
958         /* if the core has been executing in Thumb state, set the T bit */
959         if (armv4_5->core_state == ARMV4_5_STATE_THUMB)
960                 cpsr |= 0x20;   
961         
962         buf_set_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32, cpsr);
963         armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty = 0;
964         armv4_5->core_cache->reg_list[ARMV4_5_CPSR].valid = 1;
965         
966         armv4_5->core_mode = cpsr & 0x1f;
967         
968         if (armv4_5_mode_to_number(armv4_5->core_mode) == -1)
969         {
970                 target->state = TARGET_UNKNOWN;
971                 ERROR("cpsr contains invalid mode value - communication failure");
972                 return ERROR_TARGET_FAILURE;
973         }
974
975         DEBUG("target entered debug state in %s mode", armv4_5_mode_strings[armv4_5_mode_to_number(armv4_5->core_mode)]);
976         
977         if (armv4_5->core_state == ARMV4_5_STATE_THUMB)
978         {
979                 DEBUG("thumb state, applying fixups");
980                 context[0] = r0_thumb;
981                 context[15] = pc_thumb;
982         } else if (armv4_5->core_state == ARMV4_5_STATE_ARM)
983         {
984                 /* adjust value stored by STM */
985                 context[15] -= 3 * 4;
986         }
987
988         if ((target->debug_reason == DBG_REASON_BREAKPOINT)
989                         || (target->debug_reason == DBG_REASON_SINGLESTEP)
990                         || (target->debug_reason == DBG_REASON_WATCHPOINT)
991                         || (target->debug_reason == DBG_REASON_WPTANDBKPT)
992                         || ((target->debug_reason == DBG_REASON_DBGRQ) && (arm7_9->use_dbgrq == 0)))
993                 context[15] -= 3 * ((armv4_5->core_state == ARMV4_5_STATE_ARM) ? 4 : 2);
994         else if (target->debug_reason == DBG_REASON_DBGRQ)
995                 context[15] -= arm7_9->dbgreq_adjust_pc * ((armv4_5->core_state == ARMV4_5_STATE_ARM) ? 4 : 2);
996         else
997         {
998                 ERROR("unknown debug reason: %i", target->debug_reason);
999         }
1000
1001         
1002         for (i=0; i<=15; i++)
1003         {
1004                 DEBUG("r%i: 0x%8.8x", i, context[i]);
1005                 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).value, 0, 32, context[i]);
1006                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).dirty = 0;
1007                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).valid = 1;
1008         }
1009         
1010         DEBUG("entered debug state at PC 0x%x", context[15]);
1011
1012         /* exceptions other than USR & SYS have a saved program status register */
1013         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))
1014         {
1015                 u32 spsr;
1016                 arm7_9->read_xpsr(target, &spsr, 1);
1017                 jtag_execute_queue();
1018                 buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 16).value, 0, 32, spsr);
1019                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 16).dirty = 0;
1020                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 16).valid = 1;
1021         }
1022
1023         /* r0 and r15 (pc) have to be restored later */
1024         ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 0).dirty = 1;
1025         ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, 15).dirty = 1;
1026
1027         if ((retval = jtag->execute_queue()) != ERROR_OK)
1028                 return retval;
1029
1030         if (arm7_9->post_debug_entry)
1031                 arm7_9->post_debug_entry(target);
1032
1033         return ERROR_OK;
1034 }
1035
1036 int arm7_9_full_context(target_t *target)
1037 {
1038         int i;
1039         int retval;
1040         armv4_5_common_t *armv4_5 = target->arch_info;
1041         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1042
1043         DEBUG("");
1044         
1045         if (target->state != TARGET_HALTED)
1046         {
1047                 WARNING("target not halted");
1048                 return ERROR_TARGET_NOT_HALTED;
1049         }
1050
1051         /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1052          * SYS shares registers with User, so we don't touch SYS
1053          */
1054         for(i = 0; i < 6; i++)
1055         {
1056                 u32 mask = 0;
1057                 u32* reg_p[16];
1058                 int j;
1059                 int valid = 1;
1060                 
1061                 /* check if there are invalid registers in the current mode 
1062                  */
1063                 for (j = 0; j <= 16; j++)
1064                 {
1065                         if (ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).valid == 0)
1066                                 valid = 0;
1067                 }
1068                 
1069                 if (!valid)
1070                 {
1071                         u32 tmp_cpsr;
1072                         
1073                         /* change processor mode (and mask T bit) */
1074                         tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1075                         tmp_cpsr |= armv4_5_number_to_mode(i);
1076                         tmp_cpsr &= ~0x20;
1077                         arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1078
1079                         for (j = 0; j < 15; j++)
1080                         {
1081                                 if (ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).valid == 0)
1082                                 {       
1083                                         reg_p[j] = (u32*)ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).value;
1084                                         mask |= 1 << j;
1085                                         ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).valid = 1;
1086                                         ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j).dirty = 0;
1087                                 }
1088                         }
1089                         
1090                         /* if only the PSR is invalid, mask is all zeroes */
1091                         if (mask)
1092                                 arm7_9->read_core_regs(target, mask, reg_p);
1093                         
1094                         /* check if the PSR has to be read */
1095                         if (ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16).valid == 0)
1096                         {
1097                                 arm7_9->read_xpsr(target, (u32*)ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16).value, 1);
1098                                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16).valid = 1;
1099                                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16).dirty = 0;
1100                         }
1101                 }
1102         }
1103
1104         /* restore processor mode (mask T bit) */
1105         arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & ~0x20, 0, 0);
1106         
1107         if ((retval = jtag_execute_queue()) != ERROR_OK)
1108         {
1109                 ERROR("JTAG failure");
1110                 exit(-1);
1111         }
1112         return ERROR_OK;
1113 }
1114
1115 int arm7_9_restore_context(target_t *target)
1116 {
1117         armv4_5_common_t *armv4_5 = target->arch_info;
1118         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1119         reg_t *reg; 
1120         armv4_5_core_reg_t *reg_arch_info;
1121         enum armv4_5_mode current_mode = armv4_5->core_mode;
1122         int i, j;
1123         int dirty;
1124         int mode_change;
1125         
1126         DEBUG("");
1127         
1128         if (target->state != TARGET_HALTED)
1129         {
1130                 WARNING("target not halted");
1131                 return ERROR_TARGET_NOT_HALTED;
1132         }
1133         
1134         if (arm7_9->pre_restore_context)
1135                 arm7_9->pre_restore_context(target);
1136         
1137         /* iterate through processor modes (User, FIQ, IRQ, SVC, ABT, UND)
1138          * SYS shares registers with User, so we don't touch SYS
1139          */
1140         for (i = 0; i < 6; i++)
1141         {
1142                 DEBUG("examining %s mode", armv4_5_mode_strings[i]);
1143                 dirty = 0;
1144                 mode_change = 0;
1145                 /* check if there are dirty registers in the current mode 
1146                 */
1147                 for (j = 0; j <= 16; j++)
1148                 {
1149                         reg = &ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j);
1150                         reg_arch_info = reg->arch_info;
1151                         if (reg->dirty == 1)
1152                         {
1153                                 if (reg->valid == 1)
1154                                 {
1155                                         dirty = 1;
1156                                         DEBUG("examining dirty reg: %s", reg->name);
1157                                         if ((reg_arch_info->mode != ARMV4_5_MODE_ANY)
1158                                                 && (reg_arch_info->mode != current_mode)
1159                                                 && !((reg_arch_info->mode == ARMV4_5_MODE_USR) && (armv4_5->core_mode == ARMV4_5_MODE_SYS)) 
1160                                                 && !((reg_arch_info->mode == ARMV4_5_MODE_SYS) && (armv4_5->core_mode == ARMV4_5_MODE_USR)))
1161                                         {
1162                                                 mode_change = 1;
1163                                                 DEBUG("require mode change");
1164                                         }
1165                                 }
1166                                 else
1167                                 {
1168                                         ERROR("BUG: dirty register '%s', but no valid data", reg->name);
1169                                         exit(-1);
1170                                 }
1171                         }
1172                 }
1173                 
1174                 if (dirty)
1175                 {
1176                         u32 mask = 0x0;
1177                         int num_regs = 0;
1178                         u32 regs[16];
1179
1180                         if (mode_change)
1181                         {
1182                                 u32 tmp_cpsr;
1183                         
1184                                 /* change processor mode (mask T bit) */
1185                                 tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1186                                 tmp_cpsr |= armv4_5_number_to_mode(i);
1187                                 tmp_cpsr &= ~0x20;
1188                                 arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1189                                 current_mode = armv4_5_number_to_mode(i);
1190                         }
1191                         
1192                         for (j = 0; j <= 14; j++)
1193                         {
1194                                 reg = &ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), j);
1195                                 reg_arch_info = reg->arch_info;
1196                                 
1197                                 
1198                                 if (reg->dirty == 1)
1199                                 {
1200                                         regs[j] = buf_get_u32(reg->value, 0, 32);
1201                                         mask |= 1 << j;
1202                                         num_regs++;
1203                                         reg->dirty = 0;
1204                                         reg->valid = 1;
1205                                         DEBUG("writing register %i of mode %s with value 0x%8.8x", j, armv4_5_mode_strings[i], regs[j]);
1206                                 }
1207                         }
1208                         
1209                         if (mask)
1210                         {
1211                                 arm7_9->write_core_regs(target, mask, regs);
1212                         }
1213                         
1214                         reg = &ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5_number_to_mode(i), 16);
1215                         reg_arch_info = reg->arch_info;
1216                         if ((reg->dirty) && (reg_arch_info->mode != ARMV4_5_MODE_ANY))
1217                         {
1218                                 DEBUG("writing SPSR of mode %i with value 0x%8.8x", i, buf_get_u32(reg->value, 0, 32));
1219                                 arm7_9->write_xpsr(target, buf_get_u32(reg->value, 0, 32), 1);
1220                         }
1221                 }
1222         }
1223         
1224         if ((armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty == 0) && (armv4_5->core_mode != current_mode))
1225         {
1226                 /* restore processor mode (mask T bit) */
1227                 u32 tmp_cpsr;
1228                         
1229                 tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1230                 tmp_cpsr |= armv4_5_number_to_mode(i);
1231                 tmp_cpsr &= ~0x20;
1232                 DEBUG("writing lower 8 bit of cpsr with value 0x%2.2x", tmp_cpsr);
1233                 arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1234         }
1235         else if (armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty == 1)
1236         {
1237                 /* CPSR has been changed, full restore necessary (mask T bit) */
1238                 DEBUG("writing cpsr with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32));
1239                 arm7_9->write_xpsr(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 32) & ~0x20, 0);
1240                 armv4_5->core_cache->reg_list[ARMV4_5_CPSR].dirty = 0;
1241                 armv4_5->core_cache->reg_list[ARMV4_5_CPSR].valid = 1;
1242         }
1243         
1244         /* restore PC */
1245         DEBUG("writing PC with value 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
1246         arm7_9->write_pc(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
1247         armv4_5->core_cache->reg_list[15].dirty = 0;
1248                         
1249         if (arm7_9->post_restore_context)
1250                 arm7_9->post_restore_context(target);
1251
1252         return ERROR_OK;
1253 }
1254
1255 int arm7_9_restart_core(struct target_s *target)
1256 {
1257         armv4_5_common_t *armv4_5 = target->arch_info;
1258         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1259         arm_jtag_t *jtag_info = &arm7_9->jtag_info;
1260         
1261         /* set RESTART instruction */
1262         jtag_add_end_state(TAP_RTI);
1263         arm_jtag_set_instr(jtag_info, 0x4);
1264         
1265         jtag_add_runtest(1, TAP_RTI);
1266         if ((jtag_execute_queue()) != ERROR_OK)
1267         {
1268                 exit(-1);
1269         }
1270         
1271         return ERROR_OK;
1272 }
1273
1274 void arm7_9_enable_watchpoints(struct target_s *target)
1275 {
1276         watchpoint_t *watchpoint = target->watchpoints;
1277         
1278         while (watchpoint)
1279         {
1280                 if (watchpoint->set == 0)
1281                         arm7_9_set_watchpoint(target, watchpoint);
1282                 watchpoint = watchpoint->next;
1283         }
1284 }
1285
1286 void arm7_9_enable_breakpoints(struct target_s *target)
1287 {
1288         breakpoint_t *breakpoint = target->breakpoints;
1289         
1290         /* set any pending breakpoints */
1291         while (breakpoint)
1292         {
1293                 if (breakpoint->set == 0)
1294                         arm7_9_set_breakpoint(target, breakpoint);
1295                 breakpoint = breakpoint->next;
1296         }
1297 }
1298
1299 void arm7_9_disable_bkpts_and_wpts(struct target_s *target)
1300 {
1301         breakpoint_t *breakpoint = target->breakpoints;
1302         watchpoint_t *watchpoint = target->watchpoints;
1303
1304         /* set any pending breakpoints */
1305         while (breakpoint)
1306         {
1307                 if (breakpoint->set != 0)
1308                         arm7_9_unset_breakpoint(target, breakpoint);
1309                 breakpoint = breakpoint->next;
1310         }
1311         
1312         while (watchpoint)
1313         {
1314                 if (watchpoint->set != 0)
1315                         arm7_9_unset_watchpoint(target, watchpoint);
1316                 watchpoint = watchpoint->next;
1317         }
1318 }
1319
1320 int arm7_9_resume(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution)
1321 {
1322         armv4_5_common_t *armv4_5 = target->arch_info;
1323         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1324         breakpoint_t *breakpoint = target->breakpoints;
1325         reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
1326         
1327         DEBUG("");
1328         
1329         if (target->state != TARGET_HALTED)
1330         {
1331                 WARNING("target not halted");
1332                 return ERROR_TARGET_NOT_HALTED;
1333         }
1334         
1335         if (!debug_execution)
1336         {
1337                 target_free_all_working_areas(target);
1338         }
1339         
1340         /* current = 1: continue on current pc, otherwise continue at <address> */
1341         if (!current)
1342                 buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, address);
1343         
1344         /* the front-end may request us not to handle breakpoints */
1345         if (handle_breakpoints)
1346         {
1347                 if ((breakpoint = breakpoint_find(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32))))
1348                 {
1349                         DEBUG("unset breakpoint at 0x%8.8x", breakpoint->address);
1350                         arm7_9_unset_breakpoint(target, breakpoint);
1351                         
1352                         DEBUG("enable single-step");
1353                         arm7_9->enable_single_step(target);
1354                         
1355                         target->debug_reason = DBG_REASON_SINGLESTEP;
1356
1357                         arm7_9_restore_context(target);
1358                         
1359                         if (armv4_5->core_state == ARMV4_5_STATE_ARM)
1360                                 arm7_9->branch_resume(target);
1361                         else if (armv4_5->core_state == ARMV4_5_STATE_THUMB)
1362                         {
1363                                 arm7_9->branch_resume_thumb(target);
1364                         }
1365                         else
1366                         {
1367                                 ERROR("unhandled core state");
1368                                 exit(-1);
1369                         }
1370                                 
1371                         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 0);
1372                         embeddedice_write_reg(dbg_ctrl, buf_get_u32(dbg_ctrl->value, 0, dbg_ctrl->size));
1373                         arm7_9_execute_sys_speed(target);
1374                         
1375                         DEBUG("disable single-step");
1376                         arm7_9->disable_single_step(target);
1377                         
1378                         arm7_9_debug_entry(target);
1379                         DEBUG("new PC after step: 0x%8.8x", buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32));
1380                 
1381                         DEBUG("set breakpoint at 0x%8.8x", breakpoint->address);
1382                         arm7_9_set_breakpoint(target, breakpoint);
1383                 }
1384         }
1385         
1386         /* enable any pending breakpoints and watchpoints */
1387         arm7_9_enable_breakpoints(target);
1388         arm7_9_enable_watchpoints(target);
1389         
1390         arm7_9_restore_context(target);
1391         
1392         if (armv4_5->core_state == ARMV4_5_STATE_ARM)
1393         {
1394                 arm7_9->branch_resume(target);
1395         }
1396         else if (armv4_5->core_state == ARMV4_5_STATE_THUMB)
1397         {
1398                 arm7_9->branch_resume_thumb(target);
1399         }
1400         else
1401         {
1402                 ERROR("unhandled core state");
1403                 exit(-1);
1404         }
1405         
1406         /* deassert DBGACK and INTDIS */
1407         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 0);
1408         /* INTDIS only when we really resume, not during debug execution */
1409         if (!debug_execution)
1410                 buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_INTDIS, 1, 0);
1411         embeddedice_write_reg(dbg_ctrl, buf_get_u32(dbg_ctrl->value, 0, dbg_ctrl->size));
1412         
1413         arm7_9_restart_core(target);
1414         
1415         target->debug_reason = DBG_REASON_NOTHALTED;
1416         
1417         if (!debug_execution)
1418         {
1419                 /* registers are now invalid */
1420                 armv4_5_invalidate_core_regs(target);
1421                 target->state = TARGET_RUNNING;
1422                 target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
1423         }
1424         else
1425         {
1426                 target->state = TARGET_DEBUG_RUNNING;
1427                 target_call_event_callbacks(target, TARGET_EVENT_DEBUG_RESUMED);
1428         }
1429         
1430         DEBUG("target resumed");
1431         
1432         return ERROR_OK;
1433 }
1434
1435 void arm7_9_enable_eice_step(target_t *target)
1436 {
1437         armv4_5_common_t *armv4_5 = target->arch_info;
1438         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1439         
1440         /* setup an inverse breakpoint on the current PC
1441         * - comparator 1 matches the current address
1442         * - rangeout from comparator 1 is connected to comparator 0 rangein
1443         * - comparator 0 matches any address, as long as rangein is low */
1444         embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK], 0xffffffff);
1445         embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK], 0xffffffff);
1446         embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE], 0x100);
1447         embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK], 0x77);
1448         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));
1449         embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_MASK], 0);
1450         embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_DATA_MASK], 0xffffffff);
1451         embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE], 0x0);
1452         embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_MASK], 0xf7);
1453 }
1454
1455 void arm7_9_disable_eice_step(target_t *target)
1456 {
1457         armv4_5_common_t *armv4_5 = target->arch_info;
1458         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1459
1460         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_ADDR_MASK]);
1461         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_DATA_MASK]);
1462         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_VALUE]);
1463         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W0_CONTROL_MASK]);
1464         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_VALUE]);
1465         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_ADDR_MASK]);
1466         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_DATA_MASK]);
1467         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_MASK]);
1468         embeddedice_store_reg(&arm7_9->eice_cache->reg_list[EICE_W1_CONTROL_VALUE]);
1469 }
1470
1471 int arm7_9_step(struct target_s *target, int current, u32 address, int handle_breakpoints)
1472 {
1473         armv4_5_common_t *armv4_5 = target->arch_info;
1474         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1475         breakpoint_t *breakpoint = NULL;
1476
1477         if (target->state != TARGET_HALTED)
1478         {
1479                 WARNING("target not halted");
1480                 return ERROR_TARGET_NOT_HALTED;
1481         }
1482         
1483         /* current = 1: continue on current pc, otherwise continue at <address> */
1484         if (!current)
1485                 buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, address);
1486         
1487         /* the front-end may request us not to handle breakpoints */
1488         if (handle_breakpoints)
1489                 if ((breakpoint = breakpoint_find(target, buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32))))
1490                         arm7_9_unset_breakpoint(target, breakpoint);
1491         
1492         target->debug_reason = DBG_REASON_SINGLESTEP;
1493
1494         arm7_9_restore_context(target);
1495         
1496         arm7_9->enable_single_step(target);
1497         
1498         if (armv4_5->core_state == ARMV4_5_STATE_ARM)
1499         {
1500                 arm7_9->branch_resume(target);
1501         }
1502         else if (armv4_5->core_state == ARMV4_5_STATE_THUMB)
1503         {
1504                 arm7_9->branch_resume_thumb(target);
1505         }
1506         else
1507         {
1508                 ERROR("unhandled core state");
1509                 exit(-1);
1510         }
1511         
1512         target_call_event_callbacks(target, TARGET_EVENT_RESUMED);
1513
1514         arm7_9_execute_sys_speed(target);
1515         arm7_9->disable_single_step(target);
1516         
1517         /* registers are now invalid */
1518         armv4_5_invalidate_core_regs(target);
1519         
1520         arm7_9_debug_entry(target);
1521         
1522         target_call_event_callbacks(target, TARGET_EVENT_HALTED);
1523
1524         if (breakpoint)
1525                 arm7_9_set_breakpoint(target, breakpoint);
1526         
1527         DEBUG("target stepped");
1528
1529         return ERROR_OK;
1530
1531 }
1532
1533 int arm7_9_read_core_reg(struct target_s *target, int num, enum armv4_5_mode mode)
1534 {
1535         u32* reg_p[16];
1536         u32 value;
1537         int retval;
1538         armv4_5_common_t *armv4_5 = target->arch_info;
1539         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1540         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;
1541         
1542         if ((num < 0) || (num > 16))
1543                 return ERROR_INVALID_ARGUMENTS;
1544         
1545         if ((mode != ARMV4_5_MODE_ANY)
1546                         && (mode != armv4_5->core_mode)
1547                         && (reg_mode != ARMV4_5_MODE_ANY))
1548         {
1549                 u32 tmp_cpsr;
1550                         
1551                 /* change processor mode (mask T bit) */
1552                 tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1553                 tmp_cpsr |= mode;
1554                 tmp_cpsr &= ~0x20;
1555                 arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1556         }
1557         
1558         if ((num >= 0) && (num <= 15))
1559         {
1560                 /* read a normal core register */
1561                 reg_p[num] = &value;
1562                 
1563                 arm7_9->read_core_regs(target, 1 << num, reg_p);
1564         }
1565         else
1566         {
1567                 /* read a program status register
1568                  * if the register mode is MODE_ANY, we read the cpsr, otherwise a spsr
1569                  */
1570                 armv4_5_core_reg_t *arch_info = ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).arch_info;
1571                 int spsr = (arch_info->mode == ARMV4_5_MODE_ANY) ? 0 : 1;
1572                 
1573                 arm7_9->read_xpsr(target, &value, spsr);
1574         }
1575         
1576         if ((retval = jtag_execute_queue()) != ERROR_OK)
1577         {
1578                 ERROR("JTAG failure");
1579                 exit(-1);
1580         }
1581                 
1582         ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).valid = 1;
1583         ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).dirty = 0;
1584         buf_set_u32(ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).value, 0, 32, value);
1585                 
1586         if ((mode != ARMV4_5_MODE_ANY)
1587                         && (mode != armv4_5->core_mode)
1588                         && (reg_mode != ARMV4_5_MODE_ANY))      {
1589                 /* restore processor mode (mask T bit) */
1590                 arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & ~0x20, 0, 0);
1591         }
1592         
1593         return ERROR_OK;
1594         
1595 }
1596
1597 int arm7_9_write_core_reg(struct target_s *target, int num, enum armv4_5_mode mode, u32 value)
1598 {
1599         u32 reg[16];
1600         int retval;
1601         armv4_5_common_t *armv4_5 = target->arch_info;
1602         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1603         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;
1604
1605         if ((num < 0) || (num > 16))
1606                 return ERROR_INVALID_ARGUMENTS;
1607         
1608         if ((mode != ARMV4_5_MODE_ANY)
1609                         && (mode != armv4_5->core_mode)
1610                         && (reg_mode != ARMV4_5_MODE_ANY))      {
1611                 u32 tmp_cpsr;
1612                         
1613                 /* change processor mode (mask T bit) */
1614                 tmp_cpsr = buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & 0xE0;
1615                 tmp_cpsr |= mode;
1616                 tmp_cpsr &= ~0x20;
1617                 arm7_9->write_xpsr_im8(target, tmp_cpsr & 0xff, 0, 0);
1618         }
1619         
1620         if ((num >= 0) && (num <= 15))
1621         {
1622                 /* write a normal core register */
1623                 reg[num] = value;
1624                 
1625                 arm7_9->write_core_regs(target, 1 << num, reg);
1626         }
1627         else
1628         {
1629                 /* write a program status register
1630                 * if the register mode is MODE_ANY, we write the cpsr, otherwise a spsr
1631                 */
1632                 armv4_5_core_reg_t *arch_info = ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).arch_info;
1633                 int spsr = (arch_info->mode == ARMV4_5_MODE_ANY) ? 0 : 1;
1634                 
1635                 /* if we're writing the CPSR, mask the T bit */
1636                 if (!spsr)
1637                         value &= ~0x20;
1638                 
1639                 arm7_9->write_xpsr(target, value, spsr);
1640         }
1641         
1642         ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).valid = 1;
1643         ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, mode, num).dirty = 0;
1644                 
1645         if ((mode != ARMV4_5_MODE_ANY)
1646                         && (mode != armv4_5->core_mode)
1647                         && (reg_mode != ARMV4_5_MODE_ANY))      {
1648                 /* restore processor mode (mask T bit) */
1649                 arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & ~0x20, 0, 0);
1650         }
1651         
1652         if ((retval = jtag_execute_queue()) != ERROR_OK)
1653         {
1654                 ERROR("JTAG failure");
1655                 exit(-1);
1656         }
1657         
1658         return ERROR_OK;
1659         
1660 }
1661
1662 int arm7_9_read_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
1663 {
1664         armv4_5_common_t *armv4_5 = target->arch_info;
1665         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1666         
1667         u32 reg[16];
1668         int num_accesses = 0;
1669         int thisrun_accesses;
1670         int i;
1671         u32 cpsr;
1672         int retval;
1673         int last_reg = 0;
1674         
1675         DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address, size, count);
1676
1677         if (target->state != TARGET_HALTED)
1678         {
1679                 WARNING("target not halted");
1680                 return ERROR_TARGET_NOT_HALTED;
1681         }
1682
1683         /* sanitize arguments */
1684         if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer))
1685                 return ERROR_INVALID_ARGUMENTS;
1686
1687         if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u)))
1688                 return ERROR_TARGET_UNALIGNED_ACCESS;
1689         
1690         /* load the base register with the address of the first word */
1691         reg[0] = address;
1692         arm7_9->write_core_regs(target, 0x1, reg);
1693         
1694         switch (size)
1695         {
1696                 case 4:
1697                         while (num_accesses < count)
1698                         {
1699                                 u32 reg_list;
1700                                 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1701                                 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1702                                 
1703                                 if (last_reg <= thisrun_accesses)
1704                                         last_reg = thisrun_accesses;
1705                                 
1706                                 arm7_9->load_word_regs(target, reg_list);
1707                                 
1708                                 /* fast memory reads are only safe when the target is running
1709                                  * from a sufficiently high clock (32 kHz is usually too slow)
1710                                  */
1711                                 if (arm7_9->fast_memory_access)
1712                                         arm7_9_execute_fast_sys_speed(target);
1713                                 else
1714                                         arm7_9_execute_sys_speed(target);
1715                                                                         
1716                                 arm7_9->read_core_regs_target_buffer(target, reg_list, buffer, 4);
1717                                 
1718                                 /* advance buffer, count number of accesses */
1719                                 buffer += thisrun_accesses * 4;
1720                                 num_accesses += thisrun_accesses;
1721                         }       
1722                         break;
1723                 case 2:
1724                         while (num_accesses < count)
1725                         {
1726                                 u32 reg_list;
1727                                 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1728                                 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1729                                 
1730                                 for (i = 1; i <= thisrun_accesses; i++)
1731                                 {
1732                                         if (i > last_reg)
1733                                                 last_reg = i;
1734                                         arm7_9->load_hword_reg(target, i);
1735                                         /* fast memory reads are only safe when the target is running
1736                                          * from a sufficiently high clock (32 kHz is usually too slow)
1737                                          */
1738                                         if (arm7_9->fast_memory_access)
1739                                                 arm7_9_execute_fast_sys_speed(target);
1740                                         else
1741                                                 arm7_9_execute_sys_speed(target);
1742                                 }
1743                                 
1744                                 arm7_9->read_core_regs_target_buffer(target, reg_list, buffer, 2);
1745                                 
1746                                 /* advance buffer, count number of accesses */
1747                                 buffer += thisrun_accesses * 2;
1748                                 num_accesses += thisrun_accesses;
1749                         }       
1750                         break;
1751                 case 1:
1752                         while (num_accesses < count)
1753                         {
1754                                 u32 reg_list;
1755                                 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1756                                 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1757                                 
1758                                 for (i = 1; i <= thisrun_accesses; i++)
1759                                 {
1760                                         if (i > last_reg)
1761                                                 last_reg = i;
1762                                         arm7_9->load_byte_reg(target, i);
1763                                         /* fast memory reads are only safe when the target is running
1764                                          * from a sufficiently high clock (32 kHz is usually too slow)
1765                                          */
1766                                         if (arm7_9->fast_memory_access)
1767                                                 arm7_9_execute_fast_sys_speed(target);
1768                                         else
1769                                                 arm7_9_execute_sys_speed(target);
1770                                 }
1771                                 
1772                                 arm7_9->read_core_regs_target_buffer(target, reg_list, buffer, 1);
1773                                 
1774                                 /* advance buffer, count number of accesses */
1775                                 buffer += thisrun_accesses * 1;
1776                                 num_accesses += thisrun_accesses;
1777                         }       
1778                         break;
1779                 default:
1780                         ERROR("BUG: we shouldn't get here");
1781                         exit(-1);
1782                         break;
1783         }
1784         
1785         for (i=0; i<=last_reg; i++)
1786                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).dirty = 1;
1787
1788         arm7_9->read_xpsr(target, &cpsr, 0);
1789         if ((retval = jtag_execute_queue()) != ERROR_OK)
1790         {
1791                 ERROR("JTAG error while reading cpsr");
1792                 exit(-1);
1793         }
1794
1795         if (((cpsr & 0x1f) == ARMV4_5_MODE_ABT) && (armv4_5->core_mode != ARMV4_5_MODE_ABT))
1796         {
1797                 WARNING("memory read caused data abort (address: 0x%8.8x, size: 0x%x, count: 0x%x)", address, size, count);
1798
1799                 arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & ~0x20, 0, 0);
1800
1801                 return ERROR_TARGET_DATA_ABORT;
1802         }
1803         
1804         return ERROR_OK;
1805 }
1806
1807 int arm7_9_write_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
1808 {
1809         armv4_5_common_t *armv4_5 = target->arch_info;
1810         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1811         reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
1812         
1813         u32 reg[16];
1814         int num_accesses = 0;
1815         int thisrun_accesses;
1816         int i;
1817         u32 cpsr;
1818         int retval;
1819         int last_reg = 0;
1820
1821         DEBUG("address: 0x%8.8x, size: 0x%8.8x, count: 0x%8.8x", address, size, count);
1822
1823         if (target->state != TARGET_HALTED)
1824         {
1825                 WARNING("target not halted");
1826                 return ERROR_TARGET_NOT_HALTED;
1827         }
1828
1829         /* sanitize arguments */
1830         if (((size != 4) && (size != 2) && (size != 1)) || (count == 0) || !(buffer))
1831                 return ERROR_INVALID_ARGUMENTS;
1832
1833         if (((size == 4) && (address & 0x3u)) || ((size == 2) && (address & 0x1u)))
1834                 return ERROR_TARGET_UNALIGNED_ACCESS;
1835         
1836         /* load the base register with the address of the first word */
1837         reg[0] = address;
1838         arm7_9->write_core_regs(target, 0x1, reg);
1839         
1840         /* Clear DBGACK, to make sure memory fetches work as expected */
1841         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 0);
1842         embeddedice_store_reg(dbg_ctrl);
1843         
1844         switch (size)
1845         {
1846                 case 4:
1847                         while (num_accesses < count)
1848                         {
1849                                 u32 reg_list;
1850                                 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1851                                 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1852                                 
1853                                 for (i = 1; i <= thisrun_accesses; i++)
1854                                 {
1855                                         if (i > last_reg)
1856                                                 last_reg = i;
1857                                         reg[i] = target_buffer_get_u32(target, buffer);
1858                                         buffer += 4;
1859                                 }
1860                                 
1861                                 arm7_9->write_core_regs(target, reg_list, reg);
1862                                 
1863                                 arm7_9->store_word_regs(target, reg_list);
1864                                 
1865                                 /* fast memory writes are only safe when the target is running
1866                                  * from a sufficiently high clock (32 kHz is usually too slow)
1867                                  */
1868                                 if (arm7_9->fast_memory_access)
1869                                         arm7_9_execute_fast_sys_speed(target);
1870                                 else
1871                                         arm7_9_execute_sys_speed(target);
1872                                 
1873                                 num_accesses += thisrun_accesses;
1874                         }       
1875                         break;
1876                 case 2:
1877                         while (num_accesses < count)
1878                         {
1879                                 u32 reg_list;
1880                                 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1881                                 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1882                                 
1883                                 for (i = 1; i <= thisrun_accesses; i++)
1884                                 {
1885                                         if (i > last_reg)
1886                                                 last_reg = i;
1887                                         reg[i] = target_buffer_get_u16(target, buffer) & 0xffff;
1888                                         buffer += 2;
1889                                 }
1890                                 
1891                                 arm7_9->write_core_regs(target, reg_list, reg);
1892                                 
1893                                 for (i = 1; i <= thisrun_accesses; i++)
1894                                 {
1895                                         arm7_9->store_hword_reg(target, i);
1896                                         
1897                                         /* fast memory writes are only safe when the target is running
1898                                          * from a sufficiently high clock (32 kHz is usually too slow)
1899                                          */
1900                                         if (arm7_9->fast_memory_access)
1901                                                 arm7_9_execute_fast_sys_speed(target);
1902                                         else
1903                                                 arm7_9_execute_sys_speed(target);
1904                                 }
1905                                 
1906                                 num_accesses += thisrun_accesses;
1907                         }       
1908                         break;
1909                 case 1:
1910                         while (num_accesses < count)
1911                         {
1912                                 u32 reg_list;
1913                                 thisrun_accesses = ((count - num_accesses) >= 14) ? 14 : (count - num_accesses);
1914                                 reg_list = (0xffff >> (15 - thisrun_accesses)) & 0xfffe;
1915                                 
1916                                 for (i = 1; i <= thisrun_accesses; i++)
1917                                 {
1918                                         if (i > last_reg)
1919                                                 last_reg = i;
1920                                         reg[i] = *buffer++ & 0xff;
1921                                 }
1922                                 
1923                                 arm7_9->write_core_regs(target, reg_list, reg);
1924                                 
1925                                 for (i = 1; i <= thisrun_accesses; i++)
1926                                 {
1927                                         arm7_9->store_byte_reg(target, i);
1928                                         /* fast memory writes are only safe when the target is running
1929                                          * from a sufficiently high clock (32 kHz is usually too slow)
1930                                          */
1931                                         if (arm7_9->fast_memory_access)
1932                                                 arm7_9_execute_fast_sys_speed(target);
1933                                         else
1934                                                 arm7_9_execute_sys_speed(target);
1935                                 }
1936                                 
1937                                 num_accesses += thisrun_accesses;
1938                         }       
1939                         break;
1940                 default:
1941                         ERROR("BUG: we shouldn't get here");
1942                         exit(-1);
1943                         break;
1944         }
1945         
1946         /* Re-Set DBGACK */
1947         buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGACK, 1, 1);
1948         embeddedice_store_reg(dbg_ctrl);
1949         
1950         for (i=0; i<=last_reg; i++)
1951                 ARMV4_5_CORE_REG_MODE(armv4_5->core_cache, armv4_5->core_mode, i).dirty = 1;
1952
1953         arm7_9->read_xpsr(target, &cpsr, 0);
1954         if ((retval = jtag_execute_queue()) != ERROR_OK)
1955         {
1956                 ERROR("JTAG error while reading cpsr");
1957                 exit(-1);
1958         }
1959
1960         if (((cpsr & 0x1f) == ARMV4_5_MODE_ABT) && (armv4_5->core_mode != ARMV4_5_MODE_ABT))
1961         {
1962                 WARNING("memory write caused data abort (address: 0x%8.8x, size: 0x%x, count: 0x%x)", address, size, count);
1963
1964                 arm7_9->write_xpsr_im8(target, buf_get_u32(armv4_5->core_cache->reg_list[ARMV4_5_CPSR].value, 0, 8) & ~0x20, 0, 0);
1965
1966                 return ERROR_TARGET_DATA_ABORT;
1967         }
1968         
1969         return ERROR_OK;
1970 }
1971
1972 int arm7_9_bulk_write_memory(target_t *target, u32 address, u32 count, u8 *buffer)
1973 {
1974         armv4_5_common_t *armv4_5 = target->arch_info;
1975         arm7_9_common_t *arm7_9 = armv4_5->arch_info;
1976         enum armv4_5_state core_state = armv4_5->core_state;
1977         u32 r0 = buf_get_u32(armv4_5->core_cache->reg_list[0].value, 0, 32);
1978         u32 r1 = buf_get_u32(armv4_5->core_cache->reg_list[1].value, 0, 32);
1979         u32 pc = buf_get_u32(armv4_5->core_cache->reg_list[15].value, 0, 32);
1980         int i;
1981         
1982         u32 dcc_code[] = 
1983         {
1984                 /* MRC      TST         BNE         MRC         STR         B */
1985                 0xee101e10, 0xe3110001, 0x0afffffc, 0xee111e10, 0xe4801004, 0xeafffff9
1986         };
1987         
1988         if (!arm7_9->dcc_downloads)
1989                 return target->type->write_memory(target, address, 4, count, buffer);
1990
1991         /* regrab previously allocated working_area, or allocate a new one */
1992         if (!arm7_9->dcc_working_area)
1993         {
1994                 u8 dcc_code_buf[6 * 4];
1995                 
1996                 /* make sure we have a working area */
1997                 if (target_alloc_working_area(target, 24, &arm7_9->dcc_working_area) != ERROR_OK)
1998                 {
1999                         INFO("no working area available, falling back to memory writes");
2000                         return target->type->write_memory(target, address, 4, count, buffer);
2001                 }
2002                 
2003                 /* copy target instructions to target endianness */
2004                 for (i = 0; i < 6; i++)
2005                 {
2006                         target_buffer_set_u32(target, dcc_code_buf + i*4, dcc_code[i]);
2007                 }
2008                 
2009                 /* write DCC code to working area */
2010                 target->type->write_memory(target, arm7_9->dcc_working_area->address, 4, 6, dcc_code_buf);
2011         }
2012         
2013         buf_set_u32(armv4_5->core_cache->reg_list[0].value, 0, 32, address);
2014         armv4_5->core_cache->reg_list[0].valid = 1;
2015         armv4_5->core_cache->reg_list[0].dirty = 1;
2016         armv4_5->core_state = ARMV4_5_STATE_ARM;
2017
2018         arm7_9_resume(target, 0, arm7_9->dcc_working_area->address, 1, 1);
2019         
2020         for (i = 0; i < count; i++)
2021         {
2022                 embeddedice_write_reg(&arm7_9->eice_cache->reg_list[EICE_COMMS_DATA], target_buffer_get_u32(target, buffer));
2023                 buffer += 4;
2024         }
2025         
2026         target->type->halt(target);
2027         
2028         while (target->state != TARGET_HALTED)
2029                 target->type->poll(target);
2030         
2031         /* restore target state */
2032         buf_set_u32(armv4_5->core_cache->reg_list[0].value, 0, 32, r0);
2033         armv4_5->core_cache->reg_list[0].valid = 1;
2034         armv4_5->core_cache->reg_list[0].dirty = 1;
2035         buf_set_u32(armv4_5->core_cache->reg_list[1].value, 0, 32, r1);
2036         armv4_5->core_cache->reg_list[1].valid = 1;
2037         armv4_5->core_cache->reg_list[1].dirty = 1;
2038         buf_set_u32(armv4_5->core_cache->reg_list[15].value, 0, 32, pc);
2039         armv4_5->core_cache->reg_list[15].valid = 1;
2040         armv4_5->core_cache->reg_list[15].dirty = 1;
2041         armv4_5->core_state = core_state;
2042         
2043         return ERROR_OK;
2044 }
2045
2046 int arm7_9_register_commands(struct command_context_s *cmd_ctx)
2047 {
2048         command_t *arm7_9_cmd;
2049         
2050         arm7_9_cmd = register_command(cmd_ctx, NULL, "arm7_9", NULL, COMMAND_ANY, "arm7/9 specific commands");
2051         
2052         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>");
2053         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>");
2054         
2055         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>");        
2056         
2057         register_command(cmd_ctx, arm7_9_cmd, "sw_bkpts", handle_arm7_9_sw_bkpts_command, COMMAND_EXEC, "support for software breakpoints <enable|disable>");
2058         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>");
2059         register_command(cmd_ctx, arm7_9_cmd, "dbgrq", handle_arm7_9_dbgrq_command,
2060                 COMMAND_ANY, "use EmbeddedICE dbgrq instead of breakpoint for target halt requests <enable|disable>");
2061         register_command(cmd_ctx, arm7_9_cmd, "fast_writes", handle_arm7_9_fast_memory_access_command,
2062                  COMMAND_ANY, "(deprecated, see: arm7_9 fast_memory_access)");
2063         register_command(cmd_ctx, arm7_9_cmd, "fast_memory_access", handle_arm7_9_fast_memory_access_command,
2064                  COMMAND_ANY, "use fast memory accesses instead of slower but potentially unsafe slow accesses <enable|disable>");
2065         register_command(cmd_ctx, arm7_9_cmd, "dcc_downloads", handle_arm7_9_dcc_downloads_command,
2066                 COMMAND_ANY, "use DCC downloads for larger memory writes <enable|disable>");
2067
2068         armv4_5_register_commands(cmd_ctx);
2069         
2070         return ERROR_OK;
2071 }
2072
2073 int handle_arm7_9_write_xpsr_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2074 {
2075         u32 value;
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 < 2)
2095         {
2096                 command_print(cmd_ctx, "usage: write_xpsr <value> <not cpsr|spsr>");
2097                 return ERROR_OK;
2098         }
2099         
2100         value = strtoul(args[0], NULL, 0);
2101         spsr = strtol(args[1], NULL, 0);
2102         
2103         /* if we're writing the CPSR, mask the T bit */
2104         if (!spsr)
2105                 value &= ~0x20;
2106         
2107         arm7_9->write_xpsr(target, value, spsr);
2108         if ((retval = jtag_execute_queue()) != ERROR_OK)
2109         {
2110                 ERROR("JTAG error while writing to xpsr");
2111                 exit(-1);
2112         }
2113         
2114         return ERROR_OK;
2115 }
2116
2117 int handle_arm7_9_write_xpsr_im8_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2118 {
2119         u32 value;
2120         int rotate;
2121         int spsr;
2122         int retval;
2123         target_t *target = get_current_target(cmd_ctx);
2124         armv4_5_common_t *armv4_5;
2125         arm7_9_common_t *arm7_9;
2126
2127         if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2128         {
2129                 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2130                 return ERROR_OK;
2131         }
2132         
2133         if (target->state != TARGET_HALTED)
2134         {
2135                 command_print(cmd_ctx, "can't write registers while running");
2136                 return ERROR_OK;
2137         }
2138         
2139         if (argc < 3)
2140         {
2141                 command_print(cmd_ctx, "usage: write_xpsr_im8 <im8> <rotate> <not cpsr|spsr>");
2142                 return ERROR_OK;
2143         }
2144         
2145         value = strtoul(args[0], NULL, 0);
2146         rotate = strtol(args[1], NULL, 0);
2147         spsr = strtol(args[2], NULL, 0);
2148                 
2149         arm7_9->write_xpsr_im8(target, value, rotate, spsr);
2150         if ((retval = jtag_execute_queue()) != ERROR_OK)
2151         {
2152                 ERROR("JTAG error while writing 8-bit immediate to xpsr");
2153                 exit(-1);
2154         }
2155         
2156         return ERROR_OK;
2157 }
2158
2159 int handle_arm7_9_write_core_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2160 {
2161         u32 value;
2162         u32 mode;
2163         int num;
2164         target_t *target = get_current_target(cmd_ctx);
2165         armv4_5_common_t *armv4_5;
2166         arm7_9_common_t *arm7_9;
2167                 
2168         if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2169         {
2170                 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2171                 return ERROR_OK;
2172         }
2173         
2174         if (target->state != TARGET_HALTED)
2175         {
2176                 command_print(cmd_ctx, "can't write registers while running");
2177                 return ERROR_OK;
2178         }
2179         
2180         if (argc < 3)
2181         {
2182                 command_print(cmd_ctx, "usage: write_core_reg <num> <mode> <value>");
2183                 return ERROR_OK;
2184         }
2185         
2186         num = strtol(args[0], NULL, 0);
2187         mode = strtoul(args[1], NULL, 0);
2188         value = strtoul(args[2], NULL, 0);
2189         
2190         arm7_9_write_core_reg(target, num, mode, value);
2191         
2192         return ERROR_OK;
2193 }
2194
2195 int handle_arm7_9_sw_bkpts_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2196 {
2197         target_t *target = get_current_target(cmd_ctx);
2198         armv4_5_common_t *armv4_5;
2199         arm7_9_common_t *arm7_9;
2200         
2201         if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2202         {
2203                 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2204                 return ERROR_OK;
2205         }
2206         
2207         if (argc == 0)
2208         {
2209                 command_print(cmd_ctx, "software breakpoints %s", (arm7_9->sw_bkpts_enabled) ? "enabled" : "disabled");
2210                 return ERROR_OK;
2211         }
2212         
2213         if (strcmp("enable", args[0]) == 0)
2214         {
2215                 if (arm7_9->sw_bkpts_use_wp)
2216                 {
2217                         arm7_9_enable_sw_bkpts(target);
2218                 }
2219                 else
2220                 {
2221                         arm7_9->sw_bkpts_enabled = 1;
2222                 }
2223         }
2224         else if (strcmp("disable", args[0]) == 0)
2225         {
2226                 if (arm7_9->sw_bkpts_use_wp)
2227                 {
2228                         arm7_9_disable_sw_bkpts(target);
2229                 }
2230                 else
2231                 {
2232                         arm7_9->sw_bkpts_enabled = 0;
2233                 }
2234         }
2235         else
2236         {
2237                 command_print(cmd_ctx, "usage: arm7_9 sw_bkpts <enable|disable>");
2238         }
2239         
2240         command_print(cmd_ctx, "software breakpoints %s", (arm7_9->sw_bkpts_enabled) ? "enabled" : "disabled");
2241         
2242         return ERROR_OK;
2243 }
2244
2245 int handle_arm7_9_force_hw_bkpts_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2246 {
2247         target_t *target = get_current_target(cmd_ctx);
2248         armv4_5_common_t *armv4_5;
2249         arm7_9_common_t *arm7_9;
2250         
2251         if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2252         {
2253                 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2254                 return ERROR_OK;
2255         }
2256         
2257         if ((argc >= 1) && (strcmp("enable", args[0]) == 0))
2258         {
2259                 arm7_9->force_hw_bkpts = 1;
2260                 if (arm7_9->sw_bkpts_use_wp)
2261                 {
2262                         arm7_9_disable_sw_bkpts(target);
2263                 }
2264         }
2265         else if ((argc >= 1) && (strcmp("disable", args[0]) == 0))
2266         {
2267                 arm7_9->force_hw_bkpts = 0;
2268         }
2269         else
2270         {
2271                 command_print(cmd_ctx, "usage: arm7_9 force_hw_bkpts <enable|disable>");
2272         }
2273                 
2274         command_print(cmd_ctx, "force hardware breakpoints %s", (arm7_9->force_hw_bkpts) ? "enabled" : "disabled");
2275
2276         return ERROR_OK;
2277 }
2278
2279 int handle_arm7_9_dbgrq_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2280 {
2281         target_t *target = get_current_target(cmd_ctx);
2282         armv4_5_common_t *armv4_5;
2283         arm7_9_common_t *arm7_9;
2284         
2285         if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2286         {
2287                 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2288                 return ERROR_OK;
2289         }
2290         
2291         if (argc > 0)
2292         {
2293                 if (strcmp("enable", args[0]) == 0)
2294                 {
2295                         arm7_9->use_dbgrq = 1;
2296                 }
2297                 else if (strcmp("disable", args[0]) == 0)
2298                 {
2299                         arm7_9->use_dbgrq = 0;
2300                 }
2301                 else
2302                 {
2303                         command_print(cmd_ctx, "usage: arm7_9 dbgrq <enable|disable>");
2304                 }
2305         }
2306                 
2307         command_print(cmd_ctx, "use of EmbeddedICE dbgrq instead of breakpoint for target halt %s", (arm7_9->use_dbgrq) ? "enabled" : "disabled");
2308
2309         return ERROR_OK;
2310 }
2311
2312 int handle_arm7_9_fast_memory_access_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2313 {
2314         target_t *target = get_current_target(cmd_ctx);
2315         armv4_5_common_t *armv4_5;
2316         arm7_9_common_t *arm7_9;
2317         
2318         if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2319         {
2320                 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2321                 return ERROR_OK;
2322         }
2323         
2324         if (argc > 0)
2325         {
2326                 if (strcmp("enable", args[0]) == 0)
2327                 {
2328                         arm7_9->fast_memory_access = 1;
2329                 }
2330                 else if (strcmp("disable", args[0]) == 0)
2331                 {
2332                         arm7_9->fast_memory_access = 0;
2333                 }
2334                 else
2335                 {
2336                         command_print(cmd_ctx, "usage: arm7_9 fast_memory_access <enable|disable>");
2337                 }
2338         }
2339                 
2340         command_print(cmd_ctx, "fast memory access is %s", (arm7_9->fast_memory_access) ? "enabled" : "disabled");
2341
2342         return ERROR_OK;
2343 }
2344
2345 int handle_arm7_9_dcc_downloads_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2346 {
2347         target_t *target = get_current_target(cmd_ctx);
2348         armv4_5_common_t *armv4_5;
2349         arm7_9_common_t *arm7_9;
2350         
2351         if (arm7_9_get_arch_pointers(target, &armv4_5, &arm7_9) != ERROR_OK)
2352         {
2353                 command_print(cmd_ctx, "current target isn't an ARM7/ARM9 target");
2354                 return ERROR_OK;
2355         }
2356         
2357         if (argc > 0)
2358         {
2359                 if (strcmp("enable", args[0]) == 0)
2360                 {
2361                         arm7_9->dcc_downloads = 1;
2362                 }
2363                 else if (strcmp("disable", args[0]) == 0)
2364                 {
2365                         arm7_9->dcc_downloads = 0;
2366                 }
2367                 else
2368                 {
2369                         command_print(cmd_ctx, "usage: arm7_9 dcc_downloads <enable|disable>");
2370                 }
2371         }
2372                 
2373         command_print(cmd_ctx, "dcc downloads are %s", (arm7_9->dcc_downloads) ? "enabled" : "disabled");
2374
2375         return ERROR_OK;
2376 }
2377
2378 int arm7_9_init_arch_info(target_t *target, arm7_9_common_t *arm7_9)
2379 {
2380         armv4_5_common_t *armv4_5 = &arm7_9->armv4_5_common;
2381         
2382         arm7_9->common_magic = ARM7_9_COMMON_MAGIC;
2383         
2384         arm_jtag_setup_connection(&arm7_9->jtag_info);
2385         arm7_9->wp_available = 2;
2386         arm7_9->wp0_used = 0;
2387         arm7_9->wp1_used = 0;
2388         arm7_9->force_hw_bkpts = 0;
2389         arm7_9->use_dbgrq = 0;
2390         arm7_9->has_etm = 0;
2391         
2392         arm7_9->reinit_embeddedice = 0;
2393         
2394         arm7_9->dcc_working_area = NULL;
2395         
2396         arm7_9->fast_memory_access = 0;
2397         arm7_9->dcc_downloads = 0;
2398
2399         jtag_register_event_callback(arm7_9_jtag_callback, target);
2400
2401         armv4_5->arch_info = arm7_9;
2402         armv4_5->read_core_reg = arm7_9_read_core_reg;
2403         armv4_5->write_core_reg = arm7_9_write_core_reg;
2404         armv4_5->full_context = arm7_9_full_context;
2405         
2406         armv4_5_init_arch_info(target, armv4_5);
2407         
2408         return ERROR_OK;
2409 }