- added mingw elf patches from Vincent Palatin
[fw/openocd] / src / target / target.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 #include "target.h"
26
27 #include "log.h"
28 #include "configuration.h"
29 #include "binarybuffer.h"
30 #include "jtag.h"
31
32 #include <string.h>
33 #include <stdlib.h>
34 #include <inttypes.h>
35
36 #include <sys/types.h>
37 #include <sys/stat.h>
38 #include <unistd.h>
39 #include <errno.h>
40
41 #include <sys/time.h>
42 #include <time.h>
43
44 #include <time_support.h>
45
46 #include <fileio.h>
47 #include <image.h>
48
49 int cli_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv);
50
51 int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
52 int handle_daemon_startup_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
53 int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
54
55 int handle_target_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
56 int handle_run_and_halt_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
57 int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
58
59 int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
60 int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
61 int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
62 int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
63 int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
64 int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
65 int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
66 int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
67 int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
68 int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
69 int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
70 int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
71 int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
72 int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
73 int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
74 int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
75
76 /* targets
77  */
78 extern target_type_t arm7tdmi_target;
79 extern target_type_t arm720t_target;
80 extern target_type_t arm9tdmi_target;
81 extern target_type_t arm920t_target;
82 extern target_type_t arm966e_target;
83 extern target_type_t arm926ejs_target;
84 extern target_type_t xscale_target;
85 extern target_type_t cortexm3_target;
86
87 target_type_t *target_types[] =
88 {
89         &arm7tdmi_target,
90         &arm9tdmi_target,
91         &arm920t_target,
92         &arm720t_target,
93         &arm966e_target,
94         &arm926ejs_target,
95         &xscale_target,
96         &cortexm3_target,
97         NULL,
98 };
99
100 target_t *targets = NULL;
101 target_event_callback_t *target_event_callbacks = NULL;
102 target_timer_callback_t *target_timer_callbacks = NULL;
103
104 char *target_state_strings[] =
105 {
106         "unknown",
107         "running",
108         "halted",
109         "reset",
110         "debug_running",
111 };
112
113 char *target_debug_reason_strings[] =
114 {
115         "debug request", "breakpoint", "watchpoint",
116         "watchpoint and breakpoint", "single step",
117         "target not halted"
118 };
119
120 char *target_endianess_strings[] =
121 {
122         "big endian",
123         "little endian",
124 };
125
126 enum daemon_startup_mode startup_mode = DAEMON_ATTACH;
127
128 static int target_continous_poll = 1;
129
130 /* read a u32 from a buffer in target memory endianness */
131 u32 target_buffer_get_u32(target_t *target, u8 *buffer)
132 {
133         if (target->endianness == TARGET_LITTLE_ENDIAN)
134                 return le_to_h_u32(buffer);
135         else
136                 return be_to_h_u32(buffer);
137 }
138
139 /* read a u16 from a buffer in target memory endianness */
140 u16 target_buffer_get_u16(target_t *target, u8 *buffer)
141 {
142         if (target->endianness == TARGET_LITTLE_ENDIAN)
143                 return le_to_h_u16(buffer);
144         else
145                 return be_to_h_u16(buffer);
146 }
147
148 /* write a u32 to a buffer in target memory endianness */
149 void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value)
150 {
151         if (target->endianness == TARGET_LITTLE_ENDIAN)
152                 h_u32_to_le(buffer, value);
153         else
154                 h_u32_to_be(buffer, value);
155 }
156
157 /* write a u16 to a buffer in target memory endianness */
158 void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value)
159 {
160         if (target->endianness == TARGET_LITTLE_ENDIAN)
161                 h_u16_to_le(buffer, value);
162         else
163                 h_u16_to_be(buffer, value);
164 }
165
166 /* returns a pointer to the n-th configured target */
167 target_t* get_target_by_num(int num)
168 {
169         target_t *target = targets;
170         int i = 0;
171
172         while (target)
173         {
174                 if (num == i)
175                         return target;
176                 target = target->next;
177                 i++;
178         }
179
180         return NULL;
181 }
182
183 int get_num_by_target(target_t *query_target)
184 {
185         target_t *target = targets;
186         int i = 0;      
187         
188         while (target)
189         {
190                 if (target == query_target)
191                         return i;
192                 target = target->next;
193                 i++;
194         }
195         
196         return -1;
197 }
198
199 target_t* get_current_target(command_context_t *cmd_ctx)
200 {
201         target_t *target = get_target_by_num(cmd_ctx->current_target);
202         
203         if (target == NULL)
204         {
205                 ERROR("BUG: current_target out of bounds");
206                 exit(-1);
207         }
208         
209         return target;
210 }
211
212 /* Process target initialization, when target entered debug out of reset
213  * the handler is unregistered at the end of this function, so it's only called once
214  */
215 int target_init_handler(struct target_s *target, enum target_event event, void *priv)
216 {
217         FILE *script;
218         struct command_context_s *cmd_ctx = priv;
219         
220         if ((event == TARGET_EVENT_HALTED) && (target->reset_script))
221         {
222                 target_unregister_event_callback(target_init_handler, priv);
223
224                 script = fopen(target->reset_script, "r");
225                 if (!script)
226                 {
227                         ERROR("couldn't open script file %s", target->reset_script);
228                                 return ERROR_OK;
229                 }
230
231                 INFO("executing reset script '%s'", target->reset_script);
232                 command_run_file(cmd_ctx, script, COMMAND_EXEC);
233                 fclose(script);
234
235                 jtag_execute_queue();
236         }
237         
238         return ERROR_OK;
239 }
240
241 int target_run_and_halt_handler(void *priv)
242 {
243         target_t *target = priv;
244         
245         target->type->halt(target);
246         
247         return ERROR_OK;
248 }
249
250 int target_process_reset(struct command_context_s *cmd_ctx)
251 {
252         int retval = ERROR_OK;
253         target_t *target;
254         
255         /* prepare reset_halt where necessary */
256         target = targets;
257         while (target)
258         {
259                 switch (target->reset_mode)
260                 {
261                         case RESET_HALT:
262                         case RESET_INIT:
263                                 target->type->prepare_reset_halt(target);
264                                 break;
265                         default:
266                                 break;
267                 }
268                 target = target->next;
269         }
270         
271         target = targets;
272         while (target)
273         {
274                 target->type->assert_reset(target);
275                 target = target->next;
276         }
277         jtag_execute_queue();
278         
279         /* request target halt if necessary, and schedule further action */
280         target = targets;
281         while (target)
282         {
283                 switch (target->reset_mode)
284                 {
285                         case RESET_RUN:
286                                 /* nothing to do if target just wants to be run */
287                                 break;
288                         case RESET_RUN_AND_HALT:
289                                 /* schedule halt */
290                                 target_register_timer_callback(target_run_and_halt_handler, target->run_and_halt_time, 0, target);
291                                 break;
292                         case RESET_RUN_AND_INIT:
293                                 /* schedule halt */
294                                 target_register_timer_callback(target_run_and_halt_handler, target->run_and_halt_time, 0, target);
295                                 target_register_event_callback(target_init_handler, cmd_ctx);
296                                 break;
297                         case RESET_HALT:
298                                 target->type->halt(target);
299                                 break;
300                         case RESET_INIT:
301                                 target->type->halt(target);
302                                 target_register_event_callback(target_init_handler, cmd_ctx);
303                                 break;
304                         default:
305                                 ERROR("BUG: unknown target->reset_mode");
306                 }
307                 target = target->next;
308         }
309         
310         target = targets;
311         while (target)
312         {
313                 target->type->deassert_reset(target);
314                 target = target->next;
315         }
316         jtag_execute_queue();
317         
318         return retval;
319 }       
320
321 int target_init(struct command_context_s *cmd_ctx)
322 {
323         target_t *target = targets;
324         
325         while (target)
326         {
327                 if (target->type->init_target(cmd_ctx, target) != ERROR_OK)
328                 {
329                         ERROR("target '%s' init failed", target->type->name);
330                         exit(-1);
331                 }
332                 target = target->next;
333         }
334         
335         if (targets)
336         {
337                 target_register_user_commands(cmd_ctx);
338                 target_register_timer_callback(handle_target, 100, 1, NULL);
339         }
340                 
341         if (startup_mode == DAEMON_RESET)
342                 target_process_reset(cmd_ctx);
343         
344         return ERROR_OK;
345 }
346
347 int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
348 {
349         target_event_callback_t **callbacks_p = &target_event_callbacks;
350         
351         if (callback == NULL)
352         {
353                 return ERROR_INVALID_ARGUMENTS;
354         }
355         
356         if (*callbacks_p)
357         {
358                 while ((*callbacks_p)->next)
359                         callbacks_p = &((*callbacks_p)->next);
360                 callbacks_p = &((*callbacks_p)->next);
361         }
362         
363         (*callbacks_p) = malloc(sizeof(target_event_callback_t));
364         (*callbacks_p)->callback = callback;
365         (*callbacks_p)->priv = priv;
366         (*callbacks_p)->next = NULL;
367         
368         return ERROR_OK;
369 }
370
371 int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv)
372 {
373         target_timer_callback_t **callbacks_p = &target_timer_callbacks;
374         struct timeval now;
375         
376         if (callback == NULL)
377         {
378                 return ERROR_INVALID_ARGUMENTS;
379         }
380         
381         if (*callbacks_p)
382         {
383                 while ((*callbacks_p)->next)
384                         callbacks_p = &((*callbacks_p)->next);
385                 callbacks_p = &((*callbacks_p)->next);
386         }
387         
388         (*callbacks_p) = malloc(sizeof(target_timer_callback_t));
389         (*callbacks_p)->callback = callback;
390         (*callbacks_p)->periodic = periodic;
391         (*callbacks_p)->time_ms = time_ms;
392         
393         gettimeofday(&now, NULL);
394         (*callbacks_p)->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
395         time_ms -= (time_ms % 1000);
396         (*callbacks_p)->when.tv_sec = now.tv_sec + (time_ms / 1000);
397         if ((*callbacks_p)->when.tv_usec > 1000000)
398         {
399                 (*callbacks_p)->when.tv_usec = (*callbacks_p)->when.tv_usec - 1000000;
400                 (*callbacks_p)->when.tv_sec += 1;
401         }
402         
403         (*callbacks_p)->priv = priv;
404         (*callbacks_p)->next = NULL;
405         
406         return ERROR_OK;
407 }
408
409 int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
410 {
411         target_event_callback_t **p = &target_event_callbacks;
412         target_event_callback_t *c = target_event_callbacks;
413         
414         if (callback == NULL)
415         {
416                 return ERROR_INVALID_ARGUMENTS;
417         }
418                 
419         while (c)
420         {
421                 target_event_callback_t *next = c->next;
422                 if ((c->callback == callback) && (c->priv == priv))
423                 {
424                         *p = next;
425                         free(c);
426                         return ERROR_OK;
427                 }
428                 else
429                         p = &(c->next);
430                 c = next;
431         }
432         
433         return ERROR_OK;
434 }
435
436 int target_unregister_timer_callback(int (*callback)(void *priv), void *priv)
437 {
438         target_timer_callback_t **p = &target_timer_callbacks;
439         target_timer_callback_t *c = target_timer_callbacks;
440         
441         if (callback == NULL)
442         {
443                 return ERROR_INVALID_ARGUMENTS;
444         }
445                 
446         while (c)
447         {
448                 target_timer_callback_t *next = c->next;
449                 if ((c->callback == callback) && (c->priv == priv))
450                 {
451                         *p = next;
452                         free(c);
453                         return ERROR_OK;
454                 }
455                 else
456                         p = &(c->next);
457                 c = next;
458         }
459         
460         return ERROR_OK;
461 }
462
463 int target_call_event_callbacks(target_t *target, enum target_event event)
464 {
465         target_event_callback_t *callback = target_event_callbacks;
466         target_event_callback_t *next_callback;
467         
468         DEBUG("target event %i", event);
469         
470         while (callback)
471         {
472                 next_callback = callback->next;
473                 callback->callback(target, event, callback->priv);
474                 callback = next_callback;
475         }
476         
477         return ERROR_OK;
478 }
479
480 int target_call_timer_callbacks()
481 {
482         target_timer_callback_t *callback = target_timer_callbacks;
483         target_timer_callback_t *next_callback;
484         struct timeval now;
485
486         gettimeofday(&now, NULL);
487         
488         while (callback)
489         {
490                 next_callback = callback->next;
491                 
492                 if (((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
493                         || (now.tv_sec > callback->when.tv_sec))
494                 {
495                         callback->callback(callback->priv);
496                         if (callback->periodic)
497                         {
498                                 int time_ms = callback->time_ms;
499                                 callback->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
500                                 time_ms -= (time_ms % 1000);
501                                 callback->when.tv_sec = now.tv_sec + time_ms / 1000;
502                                 if (callback->when.tv_usec > 1000000)
503                                 {
504                                         callback->when.tv_usec = callback->when.tv_usec - 1000000;
505                                         callback->when.tv_sec += 1;
506                                 }
507                         }
508                         else
509                                 target_unregister_timer_callback(callback->callback, callback->priv);
510                 }
511                         
512                 callback = next_callback;
513         }
514         
515         return ERROR_OK;
516 }
517
518 int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area)
519 {
520         working_area_t *c = target->working_areas;
521         working_area_t *new_wa = NULL;
522         
523         /* only allocate multiples of 4 byte */
524         if (size % 4)
525         {
526                 ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
527                 size = CEIL(size, 4);
528         }
529         
530         /* see if there's already a matching working area */
531         while (c)
532         {
533                 if ((c->free) && (c->size == size))
534                 {
535                         new_wa = c;
536                         break;
537                 }
538                 c = c->next;
539         }
540         
541         /* if not, allocate a new one */
542         if (!new_wa)
543         {
544                 working_area_t **p = &target->working_areas;
545                 u32 first_free = target->working_area;
546                 u32 free_size = target->working_area_size;
547                 
548                 DEBUG("allocating new working area");
549                 
550                 c = target->working_areas;
551                 while (c)
552                 {
553                         first_free += c->size;
554                         free_size -= c->size;
555                         p = &c->next;
556                         c = c->next;
557                 }
558                 
559                 if (free_size < size)
560                 {
561                         WARNING("not enough working area available");
562                         return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
563                 }
564                 
565                 new_wa = malloc(sizeof(working_area_t));
566                 new_wa->next = NULL;
567                 new_wa->size = size;
568                 new_wa->address = first_free;
569                 
570                 if (target->backup_working_area)
571                 {
572                         new_wa->backup = malloc(new_wa->size);
573                         target->type->read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup);
574                 }
575                 else
576                 {
577                         new_wa->backup = NULL;
578                 }
579                 
580                 /* put new entry in list */
581                 *p = new_wa;
582         }
583         
584         /* mark as used, and return the new (reused) area */
585         new_wa->free = 0;
586         *area = new_wa;
587         
588         /* user pointer */
589         new_wa->user = area;
590         
591         return ERROR_OK;
592 }
593
594 int target_free_working_area(struct target_s *target, working_area_t *area)
595 {
596         if (area->free)
597                 return ERROR_OK;
598         
599         if (target->backup_working_area)
600                 target->type->write_memory(target, area->address, 4, area->size / 4, area->backup);
601         
602         area->free = 1;
603         
604         /* mark user pointer invalid */
605         *area->user = NULL;
606         area->user = NULL;
607         
608         return ERROR_OK;
609 }
610
611 int target_free_all_working_areas(struct target_s *target)
612 {
613         working_area_t *c = target->working_areas;
614
615         while (c)
616         {
617                 working_area_t *next = c->next;
618                 target_free_working_area(target, c);
619                 
620                 if (c->backup)
621                         free(c->backup);
622                 
623                 free(c);
624                 
625                 c = next;
626         }
627         
628         target->working_areas = NULL;
629         
630         return ERROR_OK;
631 }
632
633 int target_register_commands(struct command_context_s *cmd_ctx)
634 {
635         register_command(cmd_ctx, NULL, "target", handle_target_command, COMMAND_CONFIG, NULL);
636         register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, NULL);
637         register_command(cmd_ctx, NULL, "daemon_startup", handle_daemon_startup_command, COMMAND_CONFIG, NULL);
638         register_command(cmd_ctx, NULL, "target_script", handle_target_script_command, COMMAND_CONFIG, NULL);
639         register_command(cmd_ctx, NULL, "run_and_halt_time", handle_run_and_halt_time_command, COMMAND_CONFIG, NULL);
640         register_command(cmd_ctx, NULL, "working_area", handle_working_area_command, COMMAND_CONFIG, NULL);
641
642         return ERROR_OK;
643 }
644
645 int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
646 {
647         int retval;
648         
649         DEBUG("writing buffer of %i byte at 0x%8.8x", size, address);
650         
651         /* handle writes of less than 4 byte */
652         if (size < 4)
653         {
654                 if ((retval = target->type->write_memory(target, address, 1, size, buffer)) != ERROR_OK)
655                         return retval;
656         }
657         
658         /* handle unaligned head bytes */
659         if (address % 4)
660         {
661                 int unaligned = 4 - (address % 4);
662                 
663                 if ((retval = target->type->write_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
664                         return retval;
665                 
666                 buffer += unaligned;
667                 address += unaligned;
668                 size -= unaligned;
669         }
670                 
671         /* handle aligned words */
672         if (size >= 4)
673         {
674                 int aligned = size - (size % 4);
675         
676                 /* use bulk writes above a certain limit. This may have to be changed */
677                 if (aligned > 128)
678                 {
679                         if ((retval = target->type->bulk_write_memory(target, address, aligned / 4, buffer)) != ERROR_OK)
680                                 return retval;
681                 }
682                 else
683                 {
684                         if ((retval = target->type->write_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
685                                 return retval;
686                 }
687                 
688                 buffer += aligned;
689                 address += aligned;
690                 size -= aligned;
691         }
692         
693         /* handle tail writes of less than 4 bytes */
694         if (size > 0)
695         {
696                 if ((retval = target->type->write_memory(target, address, 1, size, buffer)) != ERROR_OK)
697                         return retval;
698         }
699         
700         return ERROR_OK;
701 }
702
703 int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
704 {
705         int retval;
706         
707         DEBUG("reading buffer of %i byte at 0x%8.8x", size, address);
708         
709         /* handle reads of less than 4 byte */
710         if (size < 4)
711         {
712                 if ((retval = target->type->read_memory(target, address, 1, size, buffer)) != ERROR_OK)
713                         return retval;
714         }
715         
716         /* handle unaligned head bytes */
717         if (address % 4)
718         {
719                 int unaligned = 4 - (address % 4);
720                 
721                 if ((retval = target->type->read_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
722                         return retval;
723                 
724                 buffer += unaligned;
725                 address += unaligned;
726                 size -= unaligned;
727         }
728                 
729         /* handle aligned words */
730         if (size >= 4)
731         {
732                 int aligned = size - (size % 4);
733         
734                 if ((retval = target->type->read_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
735                         return retval;
736                 
737                 buffer += aligned;
738                 address += aligned;
739                 size -= aligned;
740         }
741         
742         /* handle tail writes of less than 4 bytes */
743         if (size > 0)
744         {
745                 if ((retval = target->type->read_memory(target, address, 1, size, buffer)) != ERROR_OK)
746                         return retval;
747         }
748         
749         return ERROR_OK;
750 }
751
752 int target_read_u32(struct target_s *target, u32 address, u32 *value)
753 {
754         u8 value_buf[4];
755
756         int retval = target->type->read_memory(target, address, 4, 1, value_buf);
757         
758         if (retval == ERROR_OK)
759         {
760                 *value = target_buffer_get_u32(target, value_buf);
761                 DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, *value);
762         }
763         else
764         {
765                 *value = 0x0;
766                 DEBUG("address: 0x%8.8x failed", address);
767         }
768         
769         return retval;
770 }
771
772 int target_read_u16(struct target_s *target, u32 address, u16 *value)
773 {
774         u8 value_buf[2];
775         
776         int retval = target->type->read_memory(target, address, 2, 1, value_buf);
777         
778         if (retval == ERROR_OK)
779         {
780                 *value = target_buffer_get_u16(target, value_buf);
781                 DEBUG("address: 0x%8.8x, value: 0x%4.4x", address, *value);
782         }
783         else
784         {
785                 *value = 0x0;
786                 DEBUG("address: 0x%8.8x failed", address);
787         }
788         
789         return retval;
790 }
791
792 int target_read_u8(struct target_s *target, u32 address, u8 *value)
793 {
794         int retval = target->type->read_memory(target, address, 1, 1, value);
795
796         if (retval == ERROR_OK)
797         {
798                 DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, *value);
799         }
800         else
801         {
802                 *value = 0x0;
803                 DEBUG("address: 0x%8.8x failed", address);
804         }
805         
806         return retval;
807 }
808
809 int target_write_u32(struct target_s *target, u32 address, u32 value)
810 {
811         int retval;
812         u8 value_buf[4];
813
814         DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
815
816         target_buffer_set_u32(target, value_buf, value);        
817         if ((retval = target->type->write_memory(target, address, 4, 1, value_buf)) != ERROR_OK)
818         {
819                 DEBUG("failed: %i", retval);
820         }
821         
822         return retval;
823 }
824
825 int target_write_u16(struct target_s *target, u32 address, u16 value)
826 {
827         int retval;
828         u8 value_buf[2];
829         
830         DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
831
832         target_buffer_set_u16(target, value_buf, value);        
833         if ((retval = target->type->write_memory(target, address, 2, 1, value_buf)) != ERROR_OK)
834         {
835                 DEBUG("failed: %i", retval);
836         }
837         
838         return retval;
839 }
840
841 int target_write_u8(struct target_s *target, u32 address, u8 value)
842 {
843         int retval;
844         
845         DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, value);
846
847         if ((retval = target->type->read_memory(target, address, 1, 1, &value)) != ERROR_OK)
848         {
849                 DEBUG("failed: %i", retval);
850         }
851         
852         return retval;
853 }
854
855 int target_register_user_commands(struct command_context_s *cmd_ctx)
856 {
857         register_command(cmd_ctx,  NULL, "reg", handle_reg_command, COMMAND_EXEC, NULL);
858         register_command(cmd_ctx,  NULL, "poll", handle_poll_command, COMMAND_EXEC, "poll target state");
859         register_command(cmd_ctx,  NULL, "wait_halt", handle_wait_halt_command, COMMAND_EXEC, "wait for target halt [time (s)]");
860         register_command(cmd_ctx,  NULL, "halt", handle_halt_command, COMMAND_EXEC, "halt target");
861         register_command(cmd_ctx,  NULL, "resume", handle_resume_command, COMMAND_EXEC, "resume target [addr]");
862         register_command(cmd_ctx,  NULL, "step", handle_step_command, COMMAND_EXEC, "step one instruction");
863         register_command(cmd_ctx,  NULL, "reset", handle_reset_command, COMMAND_EXEC, "reset target [run|halt|init|run_and_halt|run_and_init]");
864         register_command(cmd_ctx,  NULL, "soft_reset_halt", handle_soft_reset_halt_command, COMMAND_EXEC, "halt the target and do a soft reset");
865
866         register_command(cmd_ctx,  NULL, "mdw", handle_md_command, COMMAND_EXEC, "display memory words <addr> [count]");
867         register_command(cmd_ctx,  NULL, "mdh", handle_md_command, COMMAND_EXEC, "display memory half-words <addr> [count]");
868         register_command(cmd_ctx,  NULL, "mdb", handle_md_command, COMMAND_EXEC, "display memory bytes <addr> [count]");
869         
870         register_command(cmd_ctx,  NULL, "mww", handle_mw_command, COMMAND_EXEC, "write memory word <addr> <value>");
871         register_command(cmd_ctx,  NULL, "mwh", handle_mw_command, COMMAND_EXEC, "write memory half-word <addr> <value>");
872         register_command(cmd_ctx,  NULL, "mwb", handle_mw_command, COMMAND_EXEC, "write memory byte <addr> <value>");
873         
874         register_command(cmd_ctx,  NULL, "bp", handle_bp_command, COMMAND_EXEC, "set breakpoint <address> <length> [hw]");      
875         register_command(cmd_ctx,  NULL, "rbp", handle_rbp_command, COMMAND_EXEC, "remove breakpoint <adress>");
876         register_command(cmd_ctx,  NULL, "wp", handle_wp_command, COMMAND_EXEC, "set watchpoint <address> <length> <r/w/a> [value] [mask]");    
877         register_command(cmd_ctx,  NULL, "rwp", handle_rwp_command, COMMAND_EXEC, "remove watchpoint <adress>");
878         
879         register_command(cmd_ctx,  NULL, "load_image", handle_load_image_command, COMMAND_EXEC, "load_image <file> <address> ['bin'|'ihex'|'elf']");
880         register_command(cmd_ctx,  NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image <file> <address> <size>");
881         register_command(cmd_ctx,  NULL, "load_binary", handle_load_image_command, COMMAND_EXEC, "[DEPRECATED] load_binary <file> <address>");
882         register_command(cmd_ctx,  NULL, "dump_binary", handle_dump_image_command, COMMAND_EXEC, "[DEPRECATED] dump_binary <file> <address> <size>");
883         
884         return ERROR_OK;
885 }
886
887 int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
888 {
889         target_t *target = targets;
890         int count = 0;
891         
892         if (argc == 1)
893         {
894                 int num = strtoul(args[0], NULL, 0);
895                 
896                 while (target)
897                 {
898                         count++;
899                         target = target->next;
900                 }
901                 
902                 if (num < count)
903                         cmd_ctx->current_target = num;
904                 else
905                         command_print(cmd_ctx, "%i is out of bounds, only %i targets are configured", num, count);
906                         
907                 return ERROR_OK;
908         }
909                 
910         while (target)
911         {
912                 command_print(cmd_ctx, "%i: %s (%s), state: %s", count++, target->type->name, target_endianess_strings[target->endianness], target_state_strings[target->state]);
913                 target = target->next;
914         }
915         
916         return ERROR_OK;
917 }
918
919 int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
920 {
921         int i;
922         int found = 0;
923         
924         if (argc < 3)
925         {
926                 ERROR("target command requires at least three arguments: <type> <endianess> <reset_mode>");
927                 exit(-1);
928         }
929         
930         /* search for the specified target */
931         if (args[0] && (args[0][0] != 0))
932         {
933                 for (i = 0; target_types[i]; i++)
934                 {
935                         if (strcmp(args[0], target_types[i]->name) == 0)
936                         {
937                                 target_t **last_target_p = &targets;
938                                 
939                                 /* register target specific commands */
940                                 if (target_types[i]->register_commands(cmd_ctx) != ERROR_OK)
941                                 {
942                                         ERROR("couldn't register '%s' commands", args[0]);
943                                         exit(-1);
944                                 }
945
946                                 if (*last_target_p)
947                                 {
948                                         while ((*last_target_p)->next)
949                                                 last_target_p = &((*last_target_p)->next);
950                                         last_target_p = &((*last_target_p)->next);
951                                 }
952
953                                 *last_target_p = malloc(sizeof(target_t));
954                                 
955                                 (*last_target_p)->type = target_types[i];
956                                 
957                                 if (strcmp(args[1], "big") == 0)
958                                         (*last_target_p)->endianness = TARGET_BIG_ENDIAN;
959                                 else if (strcmp(args[1], "little") == 0)
960                                         (*last_target_p)->endianness = TARGET_LITTLE_ENDIAN;
961                                 else
962                                 {
963                                         ERROR("endianness must be either 'little' or 'big', not '%s'", args[1]);
964                                         exit(-1);
965                                 }
966                                 
967                                 /* what to do on a target reset */
968                                 if (strcmp(args[2], "reset_halt") == 0)
969                                         (*last_target_p)->reset_mode = RESET_HALT;
970                                 else if (strcmp(args[2], "reset_run") == 0)
971                                         (*last_target_p)->reset_mode = RESET_RUN;
972                                 else if (strcmp(args[2], "reset_init") == 0)
973                                         (*last_target_p)->reset_mode = RESET_INIT;
974                                 else if (strcmp(args[2], "run_and_halt") == 0)
975                                         (*last_target_p)->reset_mode = RESET_RUN_AND_HALT;
976                                 else if (strcmp(args[2], "run_and_init") == 0)
977                                         (*last_target_p)->reset_mode = RESET_RUN_AND_INIT;
978                                 else
979                                 {
980                                         ERROR("unknown target startup mode %s", args[2]);
981                                         exit(-1);
982                                 }
983                                 (*last_target_p)->run_and_halt_time = 1000; /* default 1s */
984                                 
985                                 (*last_target_p)->reset_script = NULL;
986                                 (*last_target_p)->post_halt_script = NULL;
987                                 (*last_target_p)->pre_resume_script = NULL;
988                                 
989                                 (*last_target_p)->working_area = 0x0;
990                                 (*last_target_p)->working_area_size = 0x0;
991                                 (*last_target_p)->working_areas = NULL;
992                                 (*last_target_p)->backup_working_area = 0;
993                                 
994                                 (*last_target_p)->state = TARGET_UNKNOWN;
995                                 (*last_target_p)->reg_cache = NULL;
996                                 (*last_target_p)->breakpoints = NULL;
997                                 (*last_target_p)->watchpoints = NULL;
998                                 (*last_target_p)->next = NULL;
999                                 (*last_target_p)->arch_info = NULL;
1000                                 
1001                                 (*last_target_p)->type->target_command(cmd_ctx, cmd, args, argc, *last_target_p);
1002                                 
1003                                 found = 1;
1004                                 break;
1005                         }
1006                 }
1007         }
1008         
1009         /* no matching target found */
1010         if (!found)
1011         {
1012                 ERROR("target '%s' not found", args[0]);
1013                 exit(-1);
1014         }
1015
1016         return ERROR_OK;
1017 }
1018
1019 /* usage: target_script <target#> <event> <script_file> */
1020 int handle_target_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1021 {
1022         target_t *target = NULL;
1023         
1024         if (argc < 3)
1025         {
1026                 ERROR("incomplete target_script command");
1027                 exit(-1);
1028         }
1029         
1030         target = get_target_by_num(strtoul(args[0], NULL, 0));
1031         
1032         if (!target)
1033         {
1034                 ERROR("target number '%s' not defined", args[0]);
1035                 exit(-1);
1036         }
1037         
1038         if (strcmp(args[1], "reset") == 0)
1039         {
1040                 if (target->reset_script)
1041                         free(target->reset_script);
1042                 target->reset_script = strdup(args[2]);
1043         }
1044         else if (strcmp(args[1], "post_halt") == 0)
1045         {
1046                 if (target->post_halt_script)
1047                         free(target->post_halt_script);
1048                 target->post_halt_script = strdup(args[2]);
1049         }
1050         else if (strcmp(args[1], "pre_resume") == 0)
1051         {
1052                 if (target->pre_resume_script)
1053                         free(target->pre_resume_script);
1054                 target->pre_resume_script = strdup(args[2]);
1055         }
1056         else
1057         {
1058                 ERROR("unknown event type: '%s", args[1]);
1059                 exit(-1);       
1060         }
1061         
1062         return ERROR_OK;
1063 }
1064
1065 int handle_run_and_halt_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1066 {
1067         target_t *target = NULL;
1068         
1069         if (argc < 2)
1070         {
1071                 ERROR("incomplete run_and_halt_time command");
1072                 exit(-1);
1073         }
1074         
1075         target = get_target_by_num(strtoul(args[0], NULL, 0));
1076         
1077         if (!target)
1078         {
1079                 ERROR("target number '%s' not defined", args[0]);
1080                 exit(-1);
1081         }
1082         
1083         target->run_and_halt_time = strtoul(args[1], NULL, 0);
1084         
1085         return ERROR_OK;
1086 }
1087
1088 int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1089 {
1090         target_t *target = NULL;
1091         
1092         if (argc < 4)
1093         {
1094                 ERROR("incomplete working_area command. usage: working_area <target#> <address> <size> <'backup'|'nobackup'>");
1095                 exit(-1);
1096         }
1097         
1098         target = get_target_by_num(strtoul(args[0], NULL, 0));
1099         
1100         if (!target)
1101         {
1102                 ERROR("target number '%s' not defined", args[0]);
1103                 exit(-1);
1104         }
1105         
1106         target->working_area = strtoul(args[1], NULL, 0);
1107         target->working_area_size = strtoul(args[2], NULL, 0);
1108         
1109         if (strcmp(args[3], "backup") == 0)
1110         {
1111                 target->backup_working_area = 1;
1112         }
1113         else if (strcmp(args[3], "nobackup") == 0)
1114         {
1115                 target->backup_working_area = 0;
1116         }
1117         else
1118         {
1119                 ERROR("unrecognized <backup|nobackup> argument (%s)", args[3]);
1120                 exit(-1);
1121         }
1122         
1123         return ERROR_OK;
1124 }
1125
1126
1127 /* process target state changes */
1128 int handle_target(void *priv)
1129 {
1130         int retval;
1131         target_t *target = targets;
1132         
1133         while (target)
1134         {
1135                 /* only poll if target isn't already halted */
1136                 if (target->state != TARGET_HALTED)
1137                 {
1138                         if (target_continous_poll)
1139                                 if ((retval = target->type->poll(target)) < 0)
1140                                 {
1141                                         ERROR("couldn't poll target, exiting");
1142                                         exit(-1);
1143                                 }
1144                 }
1145         
1146                 target = target->next;
1147         }
1148         
1149         return ERROR_OK;
1150 }
1151
1152 int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1153 {
1154         target_t *target;
1155         reg_t *reg = NULL;
1156         int count = 0;
1157         char *value;
1158         
1159         DEBUG("-");
1160         
1161         target = get_current_target(cmd_ctx);
1162         
1163         /* list all available registers for the current target */
1164         if (argc == 0)
1165         {
1166                 reg_cache_t *cache = target->reg_cache;
1167                 
1168                 count = 0;
1169                 while(cache)
1170                 {
1171                         int i;
1172                         for (i = 0; i < cache->num_regs; i++)
1173                         {
1174                                 value = buf_to_str(cache->reg_list[i].value, cache->reg_list[i].size, 16);
1175                                 command_print(cmd_ctx, "(%i) %s (/%i): 0x%s (dirty: %i, valid: %i)", count++, cache->reg_list[i].name, cache->reg_list[i].size, value, cache->reg_list[i].dirty, cache->reg_list[i].valid);
1176                                 free(value);
1177                         }
1178                         cache = cache->next;
1179                 }
1180                 
1181                 return ERROR_OK;
1182         }
1183         
1184         /* access a single register by its ordinal number */
1185         if ((args[0][0] >= '0') && (args[0][0] <= '9'))
1186         {
1187                 int num = strtoul(args[0], NULL, 0);
1188                 reg_cache_t *cache = target->reg_cache;
1189                 
1190                 count = 0;
1191                 while(cache)
1192                 {
1193                         int i;
1194                         for (i = 0; i < cache->num_regs; i++)
1195                         {
1196                                 if (count++ == num)
1197                                 {
1198                                         reg = &cache->reg_list[i];
1199                                         break;
1200                                 }
1201                         }
1202                         if (reg)
1203                                 break;
1204                         cache = cache->next;
1205                 }
1206                 
1207                 if (!reg)
1208                 {
1209                         command_print(cmd_ctx, "%i is out of bounds, the current target has only %i registers (0 - %i)", num, count, count - 1);
1210                         return ERROR_OK;
1211                 }
1212         } else /* access a single register by its name */
1213         {
1214                 reg = register_get_by_name(target->reg_cache, args[0], 1);
1215                 
1216                 if (!reg)
1217                 {
1218                         command_print(cmd_ctx, "register %s not found in current target", args[0]);
1219                         return ERROR_OK;
1220                 }
1221         }
1222
1223         /* display a register */
1224         if ((argc == 1) || ((argc == 2) && !((args[1][0] >= '0') && (args[1][0] <= '9'))))
1225         {
1226                 if ((argc == 2) && (strcmp(args[1], "force") == 0))
1227                         reg->valid = 0;
1228                 
1229                 if (reg->valid == 0)
1230                 {
1231                         reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
1232                         if (arch_type == NULL)
1233                         {
1234                                 ERROR("BUG: encountered unregistered arch type");
1235                                 return ERROR_OK;
1236                         }
1237                         arch_type->get(reg);
1238                 }
1239                 value = buf_to_str(reg->value, reg->size, 16);
1240                 command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
1241                 free(value);
1242                 return ERROR_OK;
1243         }
1244         
1245         /* set register value */
1246         if (argc == 2)
1247         {
1248                 u8 *buf = malloc(CEIL(reg->size, 8));
1249                 str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0);
1250
1251                 reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
1252                 if (arch_type == NULL)
1253                 {
1254                         ERROR("BUG: encountered unregistered arch type");
1255                         return ERROR_OK;
1256                 }
1257                 
1258                 arch_type->set(reg, buf);
1259                 
1260                 value = buf_to_str(reg->value, reg->size, 16);
1261                 command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
1262                 free(value);
1263                 
1264                 free(buf);
1265                 
1266                 return ERROR_OK;
1267         }
1268         
1269         command_print(cmd_ctx, "usage: reg <#|name> [value]");
1270         
1271         return ERROR_OK;
1272 }
1273
1274 int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1275 {
1276         target_t *target = get_current_target(cmd_ctx);
1277         char buffer[512];
1278
1279         if (argc == 0)
1280         {
1281                 command_print(cmd_ctx, "target state: %s", target_state_strings[target->type->poll(target)]);
1282                 if (target->state == TARGET_HALTED)
1283                 {
1284                         target->type->arch_state(target, buffer, 512);
1285                         buffer[511] = 0;
1286                         command_print(cmd_ctx, "%s", buffer);
1287                 }
1288         }
1289         else
1290         {
1291                 if (strcmp(args[0], "on") == 0)
1292                 {
1293                         target_continous_poll = 1;
1294                 }
1295                 else if (strcmp(args[0], "off") == 0)
1296                 {
1297                         target_continous_poll = 0;
1298                 }
1299         }
1300         
1301         
1302         return ERROR_OK;
1303 }
1304
1305 int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1306 {
1307         target_t *target = get_current_target(cmd_ctx);
1308         struct timeval timeout, now;
1309         
1310         gettimeofday(&timeout, NULL);
1311         if (!argc)
1312                 timeval_add_time(&timeout, 5, 0);
1313         else {
1314                 char *end;
1315
1316                 timeval_add_time(&timeout, strtoul(args[0], &end, 0), 0);
1317                 if (*end) {
1318                         command_print(cmd_ctx, "usage: wait_halt [seconds]");
1319                         return ERROR_OK;
1320                 }
1321         }
1322
1323         command_print(cmd_ctx, "waiting for target halted...");
1324
1325         while(target->type->poll(target))
1326         {
1327                 if (target->state == TARGET_HALTED)
1328                 {
1329                         command_print(cmd_ctx, "target halted");
1330                         break;
1331                 }
1332                 target_call_timer_callbacks();
1333                 
1334                 gettimeofday(&now, NULL);
1335                 if ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec))
1336                 {
1337                         command_print(cmd_ctx, "timed out while waiting for target halt");
1338                         ERROR("timed out while waiting for target halt");
1339                         break;
1340                 }
1341         }
1342         
1343         return ERROR_OK;
1344 }
1345
1346 int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1347 {
1348         int retval;
1349         target_t *target = get_current_target(cmd_ctx);
1350
1351         DEBUG("-");
1352         
1353         command_print(cmd_ctx, "requesting target halt...");
1354
1355         if ((retval = target->type->halt(target)) != ERROR_OK)
1356         {       
1357                 switch (retval)
1358                 {
1359                         case ERROR_TARGET_ALREADY_HALTED:
1360                                 command_print(cmd_ctx, "target already halted");
1361                                 break;
1362                         case ERROR_TARGET_TIMEOUT:
1363                                 command_print(cmd_ctx, "target timed out... shutting down");
1364                                 exit(-1);
1365                         default:
1366                                 command_print(cmd_ctx, "unknown error... shutting down");
1367                                 exit(-1);
1368                 }
1369         }
1370         
1371         return ERROR_OK;
1372
1373 }
1374
1375 /* what to do on daemon startup */
1376 int handle_daemon_startup_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1377 {
1378         if (argc == 1)
1379         {
1380                 if (strcmp(args[0], "attach") == 0)
1381                 {
1382                         startup_mode = DAEMON_ATTACH;
1383                         return ERROR_OK;
1384                 }
1385                 else if (strcmp(args[0], "reset") == 0)
1386                 {
1387                         startup_mode = DAEMON_RESET;
1388                         return ERROR_OK;
1389                 }
1390         }
1391         
1392         WARNING("invalid daemon_startup configuration directive: %s", args[0]);
1393         return ERROR_OK;
1394
1395 }
1396                 
1397 int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1398 {
1399         target_t *target = get_current_target(cmd_ctx);
1400         int retval;
1401         
1402         command_print(cmd_ctx, "requesting target halt and executing a soft reset");
1403         
1404         if ((retval = target->type->soft_reset_halt(target)) != ERROR_OK)
1405         {       
1406                 switch (retval)
1407                 {
1408                         case ERROR_TARGET_TIMEOUT:
1409                                 command_print(cmd_ctx, "target timed out... shutting down");
1410                                 exit(-1);
1411                         default:
1412                                 command_print(cmd_ctx, "unknown error... shutting down");
1413                                 exit(-1);
1414                 }
1415         }
1416         
1417         return ERROR_OK;
1418 }
1419
1420 int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1421 {
1422         target_t *target = get_current_target(cmd_ctx);
1423         enum target_reset_mode reset_mode = RESET_RUN;
1424         
1425         DEBUG("-");
1426         
1427         if (argc >= 1)
1428         {
1429                 if (strcmp("run", args[0]) == 0)
1430                         reset_mode = RESET_RUN;
1431                 else if (strcmp("halt", args[0]) == 0)
1432                         reset_mode = RESET_HALT;
1433                 else if (strcmp("init", args[0]) == 0)
1434                         reset_mode = RESET_INIT;
1435                 else if (strcmp("run_and_halt", args[0]) == 0)
1436                 {
1437                         reset_mode = RESET_RUN_AND_HALT;
1438                         if (argc >= 2)
1439                         {
1440                                 target->run_and_halt_time = strtoul(args[1], NULL, 0);
1441                         }
1442                 }
1443                 else if (strcmp("run_and_init", args[0]) == 0)
1444                 {
1445                         reset_mode = RESET_RUN_AND_INIT;
1446                         if (argc >= 2)
1447                         {
1448                                 target->run_and_halt_time = strtoul(args[1], NULL, 0);
1449                         }
1450                 }
1451                 else
1452                 {
1453                         command_print(cmd_ctx, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1454                         return ERROR_OK;
1455                 }
1456                 target->reset_mode = reset_mode;
1457         }
1458         
1459         target_process_reset(cmd_ctx);
1460         
1461         return ERROR_OK;
1462 }
1463
1464 int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1465 {
1466         int retval;
1467         target_t *target = get_current_target(cmd_ctx);
1468         
1469         DEBUG("-");
1470         
1471         if (argc == 0)
1472                 retval = target->type->resume(target, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1473         else if (argc == 1)
1474                 retval = target->type->resume(target, 0, strtoul(args[0], NULL, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1475         else
1476         {
1477                 command_print(cmd_ctx, "usage: resume [address]");
1478                 return ERROR_OK;
1479         }
1480         
1481         if (retval != ERROR_OK)
1482         {       
1483                 switch (retval)
1484                 {
1485                         case ERROR_TARGET_NOT_HALTED:
1486                                 command_print(cmd_ctx, "target not halted");
1487                                 break;
1488                         default:
1489                                 command_print(cmd_ctx, "unknown error... shutting down");
1490                                 exit(-1);
1491                 }
1492         }
1493
1494         return ERROR_OK;
1495 }
1496
1497 int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1498 {
1499         target_t *target = get_current_target(cmd_ctx);
1500         
1501         DEBUG("-");
1502         
1503         if (argc == 0)
1504                 target->type->step(target, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1505
1506         if (argc == 1)
1507                 target->type->step(target, 0, strtoul(args[0], NULL, 0), 1); /* addr = args[0], handle breakpoints */
1508         
1509         return ERROR_OK;
1510 }
1511
1512 int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1513 {
1514         int count = 1;
1515         int size = 4;
1516         u32 address = 0;
1517         int i;
1518
1519         char output[128];
1520         int output_len;
1521
1522         int retval;
1523
1524         u8 *buffer;
1525         target_t *target = get_current_target(cmd_ctx);
1526
1527         if (argc < 1)
1528                 return ERROR_OK;
1529
1530         if (argc == 2)
1531                 count = strtoul(args[1], NULL, 0);
1532
1533         address = strtoul(args[0], NULL, 0);
1534         
1535
1536         switch (cmd[2])
1537         {
1538                 case 'w':
1539                         size = 4;
1540                         break;
1541                 case 'h':
1542                         size = 2;
1543                         break;
1544                 case 'b':
1545                         size = 1;
1546                         break;
1547                 default:
1548                         return ERROR_OK;
1549         }
1550
1551         buffer = calloc(count, size);
1552         if ((retval  = target->type->read_memory(target, address, size, count, buffer)) != ERROR_OK)
1553         {
1554                 switch (retval)
1555                 {
1556                         case ERROR_TARGET_UNALIGNED_ACCESS:
1557                                 command_print(cmd_ctx, "error: address not aligned");
1558                                 break;
1559                         case ERROR_TARGET_NOT_HALTED:
1560                                 command_print(cmd_ctx, "error: target must be halted for memory accesses");
1561                                 break;                  
1562                         case ERROR_TARGET_DATA_ABORT:
1563                                 command_print(cmd_ctx, "error: access caused data abort, system possibly corrupted");
1564                                 break;
1565                         default:
1566                                 command_print(cmd_ctx, "error: unknown error");
1567                                 break;
1568                 }
1569                 return ERROR_OK;
1570         }
1571
1572         output_len = 0;
1573
1574         for (i = 0; i < count; i++)
1575         {
1576                 if (i%8 == 0)
1577                         output_len += snprintf(output + output_len, 128 - output_len, "0x%8.8x: ", address + (i*size));
1578                 
1579                 switch (size)
1580                 {
1581                         case 4:
1582                                 output_len += snprintf(output + output_len, 128 - output_len, "%8.8x ", target_buffer_get_u32(target, &buffer[i*4]));
1583                                 break;
1584                         case 2:
1585                                 output_len += snprintf(output + output_len, 128 - output_len, "%4.4x ", target_buffer_get_u16(target, &buffer[i*2]));
1586                                 break;
1587                         case 1:
1588                                 output_len += snprintf(output + output_len, 128 - output_len, "%2.2x ", buffer[i*1]);
1589                                 break;
1590                 }
1591
1592                 if ((i%8 == 7) || (i == count - 1))
1593                 {
1594                         command_print(cmd_ctx, output);
1595                         output_len = 0;
1596                 }
1597         }
1598
1599         free(buffer);
1600         
1601         return ERROR_OK;
1602 }
1603
1604 int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1605 {
1606         u32 address = 0;
1607         u32 value = 0;
1608         int retval;
1609         target_t *target = get_current_target(cmd_ctx);
1610         u8 value_buf[4];
1611
1612         if (argc < 2)
1613                 return ERROR_OK;
1614
1615         address = strtoul(args[0], NULL, 0);
1616         value = strtoul(args[1], NULL, 0);
1617
1618         switch (cmd[2])
1619         {
1620                 case 'w':
1621                         target_buffer_set_u32(target, value_buf, value);
1622                         retval = target->type->write_memory(target, address, 4, 1, value_buf);
1623                         break;
1624                 case 'h':
1625                         target_buffer_set_u16(target, value_buf, value);
1626                         retval = target->type->write_memory(target, address, 2, 1, value_buf);
1627                         break;
1628                 case 'b':
1629                         value_buf[0] = value;
1630                         retval = target->type->write_memory(target, address, 1, 1, value_buf);
1631                         break;
1632                 default:
1633                         return ERROR_OK;
1634         }
1635
1636         switch (retval)
1637         {
1638                 case ERROR_TARGET_UNALIGNED_ACCESS:
1639                         command_print(cmd_ctx, "error: address not aligned");
1640                         break;
1641                 case ERROR_TARGET_DATA_ABORT:
1642                         command_print(cmd_ctx, "error: access caused data abort, system possibly corrupted");
1643                         break;
1644                 case ERROR_TARGET_NOT_HALTED:
1645                         command_print(cmd_ctx, "error: target must be halted for memory accesses");
1646                         break;
1647                 case ERROR_OK:
1648                         break;
1649                 default:
1650                         command_print(cmd_ctx, "error: unknown error");
1651                         break;
1652         }
1653
1654         return ERROR_OK;
1655
1656 }
1657
1658 int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1659 {
1660         u8 *buffer;
1661         u32 buf_cnt;
1662         u32 image_size;
1663         int i;
1664         int retval;
1665
1666         image_t image;  
1667         
1668         duration_t duration;
1669         char *duration_text;
1670         
1671         target_t *target = get_current_target(cmd_ctx);
1672
1673         if (argc < 1)
1674         {
1675                 command_print(cmd_ctx, "usage: load_image <filename> [address] [type]");
1676                 return ERROR_OK;
1677         }
1678         
1679         /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1680         if (argc >= 2)
1681         {
1682                 image.base_address_set = 1;
1683                 image.base_address = strtoul(args[1], NULL, 0);
1684         }
1685         else
1686         {
1687                 image.base_address_set = 0;
1688         }
1689         
1690         image.start_address_set = 0;
1691
1692         duration_start_measure(&duration);
1693         
1694         if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
1695         {
1696                 command_print(cmd_ctx, "load_image error: %s", image.error_str);
1697                 return ERROR_OK;
1698         }
1699         
1700         image_size = 0x0;
1701         for (i = 0; i < image.num_sections; i++)
1702         {
1703                 buffer = malloc(image.sections[i].size);
1704                 if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
1705                 {
1706                         ERROR("image_read_section failed with error code: %i", retval);
1707                         command_print(cmd_ctx, "image reading failed, download aborted");
1708                         free(buffer);
1709                         image_close(&image);
1710                         return ERROR_OK;
1711                 }
1712                 target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer);
1713                 image_size += buf_cnt;
1714                 command_print(cmd_ctx, "%u byte written at address 0x%8.8x", buf_cnt, image.sections[i].base_address);
1715                 
1716                 free(buffer);
1717         }
1718
1719         duration_stop_measure(&duration, &duration_text);
1720         command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text);
1721         free(duration_text);
1722         
1723         image_close(&image);
1724
1725         return ERROR_OK;
1726
1727 }
1728
1729 int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1730 {
1731         fileio_t fileio;
1732         
1733         u32 address;
1734         u32 size;
1735         u8 buffer[560];
1736         
1737         duration_t duration;
1738         char *duration_text;
1739         
1740         target_t *target = get_current_target(cmd_ctx);
1741
1742         if (argc != 3)
1743         {
1744                 command_print(cmd_ctx, "usage: dump_image <filename> <address> <size>");
1745                 return ERROR_OK;
1746         }
1747
1748         address = strtoul(args[1], NULL, 0);
1749         size = strtoul(args[2], NULL, 0);
1750
1751         if ((address & 3) || (size & 3))
1752         {
1753                 command_print(cmd_ctx, "only 32-bit aligned address and size are supported");
1754                 return ERROR_OK;
1755         }
1756         
1757         if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
1758         {
1759                 command_print(cmd_ctx, "dump_image error: %s", fileio.error_str);
1760                 return ERROR_OK;
1761         }
1762         
1763         duration_start_measure(&duration);
1764         
1765         while (size > 0)
1766         {
1767                 u32 size_written;
1768                 u32 this_run_size = (size > 560) ? 560 : size;
1769                 
1770                 target->type->read_memory(target, address, 4, this_run_size / 4, buffer);
1771                 fileio_write(&fileio, this_run_size, buffer, &size_written);
1772                 
1773                 size -= this_run_size;
1774                 address += this_run_size;
1775         }
1776
1777         fileio_close(&fileio);
1778
1779         duration_stop_measure(&duration, &duration_text);
1780         command_print(cmd_ctx, "dumped %"PRIi64" byte in %s", fileio.size, duration_text);
1781         free(duration_text);
1782         
1783         return ERROR_OK;
1784
1785 }
1786
1787 int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1788 {
1789         int retval;
1790         target_t *target = get_current_target(cmd_ctx);
1791
1792         if (argc == 0)
1793         {
1794                 breakpoint_t *breakpoint = target->breakpoints;
1795
1796                 while (breakpoint)
1797                 {
1798                         if (breakpoint->type == BKPT_SOFT)
1799                         {
1800                                 char* buf = buf_to_str(breakpoint->orig_instr, breakpoint->length, 16);
1801                                 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint->address, breakpoint->length, breakpoint->set, buf);
1802                                 free(buf);
1803                         }
1804                         else
1805                         {
1806                                 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i", breakpoint->address, breakpoint->length, breakpoint->set);
1807                         }
1808                         breakpoint = breakpoint->next;
1809                 }
1810         }
1811         else if (argc >= 2)
1812         {
1813                 int hw = BKPT_SOFT;
1814                 u32 length = 0;
1815
1816                 length = strtoul(args[1], NULL, 0);
1817                 
1818                 if (argc >= 3)
1819                         if (strcmp(args[2], "hw") == 0)
1820                                 hw = BKPT_HARD;
1821
1822                 if ((retval = breakpoint_add(target, strtoul(args[0], NULL, 0), length, hw)) != ERROR_OK)
1823                 {
1824                         switch (retval)
1825                         {
1826                                 case ERROR_TARGET_NOT_HALTED:
1827                                         command_print(cmd_ctx, "target must be halted to set breakpoints");
1828                                         break;
1829                                 case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
1830                                         command_print(cmd_ctx, "no more breakpoints available");
1831                                         break;
1832                                 default:
1833                                         command_print(cmd_ctx, "unknown error, breakpoint not set");
1834                                         break;
1835                         }
1836                 }
1837                 else
1838                 {
1839                         command_print(cmd_ctx, "breakpoint added at address 0x%8.8x", strtoul(args[0], NULL, 0));
1840                 }
1841         }
1842         else
1843         {
1844                 command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
1845         }
1846
1847         return ERROR_OK;
1848 }
1849
1850 int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1851 {
1852         target_t *target = get_current_target(cmd_ctx);
1853
1854         if (argc > 0)
1855                 breakpoint_remove(target, strtoul(args[0], NULL, 0));
1856
1857         return ERROR_OK;
1858 }
1859
1860 int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1861 {
1862         target_t *target = get_current_target(cmd_ctx);
1863
1864         if (argc == 0)
1865         {
1866                 watchpoint_t *watchpoint = target->watchpoints;
1867
1868                 while (watchpoint)
1869                 {
1870                         command_print(cmd_ctx, "address: 0x%8.8x, mask: 0x%8.8x, r/w/a: %i, value: 0x%8.8x, mask: 0x%8.8x", watchpoint->address, watchpoint->length, watchpoint->rw, watchpoint->value, watchpoint->mask);
1871                         watchpoint = watchpoint->next;
1872                 }
1873         } 
1874         else if (argc >= 2)
1875         {
1876                 enum watchpoint_rw type = WPT_ACCESS;
1877                 u32 data_value = 0x0;
1878                 u32 data_mask = 0xffffffff;
1879                 
1880                 if (argc >= 3)
1881                 {
1882                         switch(args[2][0])
1883                         {
1884                                 case 'r':
1885                                         type = WPT_READ;
1886                                         break;
1887                                 case 'w':
1888                                         type = WPT_WRITE;
1889                                         break;
1890                                 case 'a':
1891                                         type = WPT_ACCESS;
1892                                         break;
1893                                 default:
1894                                         command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
1895                                         return ERROR_OK;
1896                         }
1897                 }
1898                 if (argc >= 4)
1899                 {
1900                         data_value = strtoul(args[3], NULL, 0);
1901                 }
1902                 if (argc >= 5)
1903                 {
1904                         data_mask = strtoul(args[4], NULL, 0);
1905                 }
1906                 watchpoint_add(target, strtoul(args[0], NULL, 0), strtoul(args[1], NULL, 0), type, data_value, data_mask);
1907         }
1908         else
1909         {
1910                 command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
1911         }
1912                 
1913         return ERROR_OK;
1914 }
1915
1916 int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1917 {
1918         target_t *target = get_current_target(cmd_ctx);
1919
1920         if (argc > 0)
1921                 watchpoint_remove(target, strtoul(args[0], NULL, 0));
1922         
1923         return ERROR_OK;
1924 }
1925