added target->type->examine(). Eventually this will allow for bringing up telnet...
[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 #include "target_request.h"
27
28 #include "log.h"
29 #include "configuration.h"
30 #include "binarybuffer.h"
31 #include "jtag.h"
32
33 #include <string.h>
34 #include <stdlib.h>
35 #include <inttypes.h>
36
37 #include <sys/types.h>
38 #include <sys/stat.h>
39 #include <unistd.h>
40 #include <errno.h>
41
42 #include <sys/time.h>
43 #include <time.h>
44
45 #include <time_support.h>
46
47 #include <fileio.h>
48 #include <image.h>
49
50 int cli_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv);
51
52
53 int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
54 int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
55
56 int handle_target_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
57 int handle_run_and_halt_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
58 int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
59
60 int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
61 int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
62 int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
63 int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
64 int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
65 int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
66 int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
67 int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
68 int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
69 int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
70 int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
71 int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
72 int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
73 int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
74 int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
75 int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
76 int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
77 int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc);
78 int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
79
80 /* targets
81  */
82 extern target_type_t arm7tdmi_target;
83 extern target_type_t arm720t_target;
84 extern target_type_t arm9tdmi_target;
85 extern target_type_t arm920t_target;
86 extern target_type_t arm966e_target;
87 extern target_type_t arm926ejs_target;
88 extern target_type_t feroceon_target;
89 extern target_type_t xscale_target;
90 extern target_type_t cortexm3_target;
91 extern target_type_t arm11_target;
92
93 target_type_t *target_types[] =
94 {
95         &arm7tdmi_target,
96         &arm9tdmi_target,
97         &arm920t_target,
98         &arm720t_target,
99         &arm966e_target,
100         &arm926ejs_target,
101         &feroceon_target,
102         &xscale_target,
103         &cortexm3_target,
104         &arm11_target,
105         NULL,
106 };
107
108 target_t *targets = NULL;
109 target_event_callback_t *target_event_callbacks = NULL;
110 target_timer_callback_t *target_timer_callbacks = NULL;
111
112 char *target_state_strings[] =
113 {
114         "unknown",
115         "running",
116         "halted",
117         "reset",
118         "debug_running",
119 };
120
121 char *target_debug_reason_strings[] =
122 {
123         "debug request", "breakpoint", "watchpoint",
124         "watchpoint and breakpoint", "single step",
125         "target not halted", "undefined"
126 };
127
128 char *target_endianess_strings[] =
129 {
130         "big endian",
131         "little endian",
132 };
133
134 static int target_continous_poll = 1;
135
136 /* read a u32 from a buffer in target memory endianness */
137 u32 target_buffer_get_u32(target_t *target, u8 *buffer)
138 {
139         if (target->endianness == TARGET_LITTLE_ENDIAN)
140                 return le_to_h_u32(buffer);
141         else
142                 return be_to_h_u32(buffer);
143 }
144
145 /* read a u16 from a buffer in target memory endianness */
146 u16 target_buffer_get_u16(target_t *target, u8 *buffer)
147 {
148         if (target->endianness == TARGET_LITTLE_ENDIAN)
149                 return le_to_h_u16(buffer);
150         else
151                 return be_to_h_u16(buffer);
152 }
153
154 /* write a u32 to a buffer in target memory endianness */
155 void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value)
156 {
157         if (target->endianness == TARGET_LITTLE_ENDIAN)
158                 h_u32_to_le(buffer, value);
159         else
160                 h_u32_to_be(buffer, value);
161 }
162
163 /* write a u16 to a buffer in target memory endianness */
164 void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value)
165 {
166         if (target->endianness == TARGET_LITTLE_ENDIAN)
167                 h_u16_to_le(buffer, value);
168         else
169                 h_u16_to_be(buffer, value);
170 }
171
172 /* returns a pointer to the n-th configured target */
173 target_t* get_target_by_num(int num)
174 {
175         target_t *target = targets;
176         int i = 0;
177
178         while (target)
179         {
180                 if (num == i)
181                         return target;
182                 target = target->next;
183                 i++;
184         }
185
186         return NULL;
187 }
188
189 int get_num_by_target(target_t *query_target)
190 {
191         target_t *target = targets;
192         int i = 0;      
193         
194         while (target)
195         {
196                 if (target == query_target)
197                         return i;
198                 target = target->next;
199                 i++;
200         }
201         
202         return -1;
203 }
204
205 target_t* get_current_target(command_context_t *cmd_ctx)
206 {
207         target_t *target = get_target_by_num(cmd_ctx->current_target);
208         
209         if (target == NULL)
210         {
211                 LOG_ERROR("BUG: current_target out of bounds");
212                 exit(-1);
213         }
214         
215         return target;
216 }
217
218 /* Process target initialization, when target entered debug out of reset
219  * the handler is unregistered at the end of this function, so it's only called once
220  */
221 int target_init_handler(struct target_s *target, enum target_event event, void *priv)
222 {
223         FILE *script;
224         struct command_context_s *cmd_ctx = priv;
225         
226         if ((event == TARGET_EVENT_HALTED) && (target->reset_script))
227         {
228                 target_unregister_event_callback(target_init_handler, priv);
229
230                 script = open_file_from_path(target->reset_script, "r");
231                 if (!script)
232                 {
233                         LOG_ERROR("couldn't open script file %s", target->reset_script);
234                                 return ERROR_OK;
235                 }
236
237                 LOG_INFO("executing reset script '%s'", target->reset_script);
238                 command_run_file(cmd_ctx, script, COMMAND_EXEC);
239                 fclose(script);
240
241                 jtag_execute_queue();
242         }
243         
244         return ERROR_OK;
245 }
246
247 int target_run_and_halt_handler(void *priv)
248 {
249         target_t *target = priv;
250         
251         target->type->halt(target);
252         
253         return ERROR_OK;
254 }
255
256 int target_process_reset(struct command_context_s *cmd_ctx)
257 {
258         int retval = ERROR_OK;
259         target_t *target;
260         struct timeval timeout, now;
261
262         jtag->speed(jtag_speed);
263
264         if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
265                 return retval;
266         
267         if ((retval = target_examine(cmd_ctx)) != ERROR_OK)
268                 return retval;
269         
270         /* prepare reset_halt where necessary */
271         target = targets;
272         while (target)
273         {
274                 if (jtag_reset_config & RESET_SRST_PULLS_TRST)
275                 {
276                         switch (target->reset_mode)
277                         {
278                                 case RESET_HALT:
279                                         command_print(cmd_ctx, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
280                                         target->reset_mode = RESET_RUN_AND_HALT;
281                                         break;
282                                 case RESET_INIT:
283                                         command_print(cmd_ctx, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
284                                         target->reset_mode = RESET_RUN_AND_INIT;
285                                         break;
286                                 default:
287                                         break;
288                         } 
289                 }
290                 target = target->next;
291         }
292         
293         target = targets;
294         while (target)
295         {
296                 /* we have no idea what state the target is in, so we
297                  * have to drop working areas
298                  */
299                 target_free_all_working_areas_restore(target, 0);
300                 target->type->assert_reset(target);
301                 target = target->next;
302         }
303         if ((retval = jtag_execute_queue()) != ERROR_OK)
304         {
305                 LOG_WARNING("JTAG communication failed asserting reset.");
306                 retval = ERROR_OK;
307         }
308         
309         /* request target halt if necessary, and schedule further action */
310         target = targets;
311         while (target)
312         {
313                 switch (target->reset_mode)
314                 {
315                         case RESET_RUN:
316                                 /* nothing to do if target just wants to be run */
317                                 break;
318                         case RESET_RUN_AND_HALT:
319                                 /* schedule halt */
320                                 target_register_timer_callback(target_run_and_halt_handler, target->run_and_halt_time, 0, target);
321                                 break;
322                         case RESET_RUN_AND_INIT:
323                                 /* schedule halt */
324                                 target_register_timer_callback(target_run_and_halt_handler, target->run_and_halt_time, 0, target);
325                                 target_register_event_callback(target_init_handler, cmd_ctx);
326                                 break;
327                         case RESET_HALT:
328                                 target->type->halt(target);
329                                 break;
330                         case RESET_INIT:
331                                 target->type->halt(target);
332                                 target_register_event_callback(target_init_handler, cmd_ctx);
333                                 break;
334                         default:
335                                 LOG_ERROR("BUG: unknown target->reset_mode");
336                 }
337                 target = target->next;
338         }
339         
340         if ((retval = jtag_execute_queue()) != ERROR_OK)
341         {
342                 LOG_WARNING("JTAG communication failed while reset was asserted. Consider using srst_only for reset_config.");
343                 retval = ERROR_OK;              
344         }
345         
346         target = targets;
347         while (target)
348         {
349                 target->type->deassert_reset(target);
350                 target = target->next;
351         }
352         
353         if ((retval = jtag_execute_queue()) != ERROR_OK)
354         {
355                 LOG_WARNING("JTAG communication failed while deasserting reset.");
356                 retval = ERROR_OK;
357         }
358         
359         LOG_DEBUG("Waiting for halted stated as approperiate");
360         
361         /* Wait for reset to complete, maximum 5 seconds. */    
362         gettimeofday(&timeout, NULL);
363         timeval_add_time(&timeout, 5, 0);
364         for(;;)
365         {
366                 gettimeofday(&now, NULL);
367                 
368                 target_call_timer_callbacks_now();
369                 
370                 target = targets;
371                 while (target)
372                 {
373                         LOG_DEBUG("Polling target");
374                         target->type->poll(target);
375                         if ((target->reset_mode == RESET_RUN_AND_INIT) || 
376                                         (target->reset_mode == RESET_RUN_AND_HALT) ||
377                                         (target->reset_mode == RESET_HALT) ||
378                                         (target->reset_mode == RESET_INIT))
379                         {
380                                 if (target->state != TARGET_HALTED)
381                                 {
382                                         if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
383                                         {
384                                                 LOG_USER("Timed out waiting for halt after reset");
385                                                 goto done;
386                                         }
387                                         /* this will send alive messages on e.g. GDB remote protocol. */
388                                         usleep(500*1000); 
389                                         LOG_USER_N("%s", ""); /* avoid warning about zero length formatting message*/ 
390                                         goto again;
391                                 }
392                         }
393                         target = target->next;
394                 }
395                 /* All targets we're waiting for are halted */
396                 break;
397                 
398                 again:;
399         }
400         done:
401         
402         
403         /* We want any events to be processed before the prompt */
404         target_call_timer_callbacks_now();
405
406         /* if we timed out we need to unregister these handlers */
407         target = targets;
408         while (target)
409         {
410                 target_unregister_timer_callback(target_run_and_halt_handler, target);
411                 target = target->next;
412         }
413         target_unregister_event_callback(target_init_handler, cmd_ctx);
414                                 
415         
416         jtag->speed(jtag_speed_post_reset);
417         
418         return retval;
419 }
420
421 static int default_virt2phys(struct target_s *target, u32 virtual, u32 *physical)
422 {
423         *physical = virtual;
424         return ERROR_OK;
425 }
426
427 static int default_mmu(struct target_s *target, int *enabled)
428 {
429         *enabled = 0;
430         return ERROR_OK;
431 }
432
433 static int default_examine(struct command_context_s *cmd_ctx, struct target_s *target)
434 {
435         return ERROR_OK;
436 }
437
438
439 int target_examine(struct command_context_s *cmd_ctx)
440 {
441         int retval = ERROR_OK;
442         target_t *target = targets;
443         while (target)
444         {
445                 if ((retval = target->type->examine(cmd_ctx, target))!=ERROR_OK)
446                         return retval;
447                 target = target->next;
448         }
449         return retval;
450 }
451 int target_init(struct command_context_s *cmd_ctx)
452 {
453         target_t *target = targets;
454         
455         while (target)
456         {
457                 target->type->examined = 0;
458                 if (target->type->examine == NULL)
459                 {
460                         target->type->examine = default_examine;
461                 }
462                 
463                 if (target->type->init_target(cmd_ctx, target) != ERROR_OK)
464                 {
465                         LOG_ERROR("target '%s' init failed", target->type->name);
466                         exit(-1);
467                 }
468                 
469                 /* Set up default functions if none are provided by target */
470                 if (target->type->virt2phys == NULL)
471                 {
472                         target->type->virt2phys = default_virt2phys;
473                 }
474                 if (target->type->mmu == NULL)
475                 {
476                         target->type->mmu = default_mmu;
477                 }
478                 target = target->next;
479         }
480         
481         if (targets)
482         {
483                 target_register_user_commands(cmd_ctx);
484                 target_register_timer_callback(handle_target, 100, 1, NULL);
485         }
486                 
487         return ERROR_OK;
488 }
489
490 int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
491 {
492         target_event_callback_t **callbacks_p = &target_event_callbacks;
493         
494         if (callback == NULL)
495         {
496                 return ERROR_INVALID_ARGUMENTS;
497         }
498         
499         if (*callbacks_p)
500         {
501                 while ((*callbacks_p)->next)
502                         callbacks_p = &((*callbacks_p)->next);
503                 callbacks_p = &((*callbacks_p)->next);
504         }
505         
506         (*callbacks_p) = malloc(sizeof(target_event_callback_t));
507         (*callbacks_p)->callback = callback;
508         (*callbacks_p)->priv = priv;
509         (*callbacks_p)->next = NULL;
510         
511         return ERROR_OK;
512 }
513
514 int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv)
515 {
516         target_timer_callback_t **callbacks_p = &target_timer_callbacks;
517         struct timeval now;
518         
519         if (callback == NULL)
520         {
521                 return ERROR_INVALID_ARGUMENTS;
522         }
523         
524         if (*callbacks_p)
525         {
526                 while ((*callbacks_p)->next)
527                         callbacks_p = &((*callbacks_p)->next);
528                 callbacks_p = &((*callbacks_p)->next);
529         }
530         
531         (*callbacks_p) = malloc(sizeof(target_timer_callback_t));
532         (*callbacks_p)->callback = callback;
533         (*callbacks_p)->periodic = periodic;
534         (*callbacks_p)->time_ms = time_ms;
535         
536         gettimeofday(&now, NULL);
537         (*callbacks_p)->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
538         time_ms -= (time_ms % 1000);
539         (*callbacks_p)->when.tv_sec = now.tv_sec + (time_ms / 1000);
540         if ((*callbacks_p)->when.tv_usec > 1000000)
541         {
542                 (*callbacks_p)->when.tv_usec = (*callbacks_p)->when.tv_usec - 1000000;
543                 (*callbacks_p)->when.tv_sec += 1;
544         }
545         
546         (*callbacks_p)->priv = priv;
547         (*callbacks_p)->next = NULL;
548         
549         return ERROR_OK;
550 }
551
552 int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
553 {
554         target_event_callback_t **p = &target_event_callbacks;
555         target_event_callback_t *c = target_event_callbacks;
556         
557         if (callback == NULL)
558         {
559                 return ERROR_INVALID_ARGUMENTS;
560         }
561                 
562         while (c)
563         {
564                 target_event_callback_t *next = c->next;
565                 if ((c->callback == callback) && (c->priv == priv))
566                 {
567                         *p = next;
568                         free(c);
569                         return ERROR_OK;
570                 }
571                 else
572                         p = &(c->next);
573                 c = next;
574         }
575         
576         return ERROR_OK;
577 }
578
579 int target_unregister_timer_callback(int (*callback)(void *priv), void *priv)
580 {
581         target_timer_callback_t **p = &target_timer_callbacks;
582         target_timer_callback_t *c = target_timer_callbacks;
583         
584         if (callback == NULL)
585         {
586                 return ERROR_INVALID_ARGUMENTS;
587         }
588                 
589         while (c)
590         {
591                 target_timer_callback_t *next = c->next;
592                 if ((c->callback == callback) && (c->priv == priv))
593                 {
594                         *p = next;
595                         free(c);
596                         return ERROR_OK;
597                 }
598                 else
599                         p = &(c->next);
600                 c = next;
601         }
602         
603         return ERROR_OK;
604 }
605
606 int target_call_event_callbacks(target_t *target, enum target_event event)
607 {
608         target_event_callback_t *callback = target_event_callbacks;
609         target_event_callback_t *next_callback;
610         
611         LOG_DEBUG("target event %i", event);
612         
613         while (callback)
614         {
615                 next_callback = callback->next;
616                 callback->callback(target, event, callback->priv);
617                 callback = next_callback;
618         }
619         
620         return ERROR_OK;
621 }
622
623 static int target_call_timer_callbacks_check_time(int checktime)
624 {
625         target_timer_callback_t *callback = target_timer_callbacks;
626         target_timer_callback_t *next_callback;
627         struct timeval now;
628
629         gettimeofday(&now, NULL);
630         
631         while (callback)
632         {
633                 next_callback = callback->next;
634                 
635                 if ((!checktime&&callback->periodic)||
636                                 (((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
637                                                 || (now.tv_sec > callback->when.tv_sec)))
638                 {
639                         callback->callback(callback->priv);
640                         if (callback->periodic)
641                         {
642                                 int time_ms = callback->time_ms;
643                                 callback->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
644                                 time_ms -= (time_ms % 1000);
645                                 callback->when.tv_sec = now.tv_sec + time_ms / 1000;
646                                 if (callback->when.tv_usec > 1000000)
647                                 {
648                                         callback->when.tv_usec = callback->when.tv_usec - 1000000;
649                                         callback->when.tv_sec += 1;
650                                 }
651                         }
652                         else
653                                 target_unregister_timer_callback(callback->callback, callback->priv);
654                 }
655                         
656                 callback = next_callback;
657         }
658         
659         return ERROR_OK;
660 }
661
662 int target_call_timer_callbacks()
663 {
664         return target_call_timer_callbacks_check_time(1);
665 }
666
667 /* invoke periodic callbacks immediately */
668 int target_call_timer_callbacks_now()
669 {
670         return target_call_timer_callbacks(0);
671 }
672
673
674 int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area)
675 {
676         working_area_t *c = target->working_areas;
677         working_area_t *new_wa = NULL;
678         
679         /* Reevaluate working area address based on MMU state*/
680         if (target->working_areas == NULL)
681         {
682                 int retval;
683                 int enabled;
684                 retval = target->type->mmu(target, &enabled);
685                 if (retval != ERROR_OK)
686                 {
687                         return retval;
688                 }
689                 if (enabled)
690                 {
691                         target->working_area = target->working_area_virt;
692                 }
693                 else
694                 {
695                         target->working_area = target->working_area_phys;
696                 }
697         }
698         
699         /* only allocate multiples of 4 byte */
700         if (size % 4)
701         {
702                 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
703                 size = CEIL(size, 4);
704         }
705         
706         /* see if there's already a matching working area */
707         while (c)
708         {
709                 if ((c->free) && (c->size == size))
710                 {
711                         new_wa = c;
712                         break;
713                 }
714                 c = c->next;
715         }
716         
717         /* if not, allocate a new one */
718         if (!new_wa)
719         {
720                 working_area_t **p = &target->working_areas;
721                 u32 first_free = target->working_area;
722                 u32 free_size = target->working_area_size;
723                 
724                 LOG_DEBUG("allocating new working area");
725                 
726                 c = target->working_areas;
727                 while (c)
728                 {
729                         first_free += c->size;
730                         free_size -= c->size;
731                         p = &c->next;
732                         c = c->next;
733                 }
734                 
735                 if (free_size < size)
736                 {
737                         LOG_WARNING("not enough working area available(requested %d, free %d)", size, free_size);
738                         return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
739                 }
740                 
741                 new_wa = malloc(sizeof(working_area_t));
742                 new_wa->next = NULL;
743                 new_wa->size = size;
744                 new_wa->address = first_free;
745                 
746                 if (target->backup_working_area)
747                 {
748                         new_wa->backup = malloc(new_wa->size);
749                         target->type->read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup);
750                 }
751                 else
752                 {
753                         new_wa->backup = NULL;
754                 }
755                 
756                 /* put new entry in list */
757                 *p = new_wa;
758         }
759         
760         /* mark as used, and return the new (reused) area */
761         new_wa->free = 0;
762         *area = new_wa;
763         
764         /* user pointer */
765         new_wa->user = area;
766         
767         return ERROR_OK;
768 }
769
770 int target_free_working_area_restore(struct target_s *target, working_area_t *area, int restore)
771 {
772         if (area->free)
773                 return ERROR_OK;
774         
775         if (restore&&target->backup_working_area)
776                 target->type->write_memory(target, area->address, 4, area->size / 4, area->backup);
777         
778         area->free = 1;
779         
780         /* mark user pointer invalid */
781         *area->user = NULL;
782         area->user = NULL;
783         
784         return ERROR_OK;
785 }
786
787 int target_free_working_area(struct target_s *target, working_area_t *area)
788 {
789         return target_free_working_area_restore(target, area, 1);
790 }
791
792 int target_free_all_working_areas_restore(struct target_s *target, int restore)
793 {
794         working_area_t *c = target->working_areas;
795
796         while (c)
797         {
798                 working_area_t *next = c->next;
799                 target_free_working_area_restore(target, c, restore);
800                 
801                 if (c->backup)
802                         free(c->backup);
803                 
804                 free(c);
805                 
806                 c = next;
807         }
808         
809         target->working_areas = NULL;
810         
811         return ERROR_OK;
812 }
813
814 int target_free_all_working_areas(struct target_s *target)
815 {
816         return target_free_all_working_areas_restore(target, 1); 
817 }
818
819 int target_register_commands(struct command_context_s *cmd_ctx)
820 {
821         register_command(cmd_ctx, NULL, "target", handle_target_command, COMMAND_CONFIG, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
822         register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, NULL);
823         register_command(cmd_ctx, NULL, "target_script", handle_target_script_command, COMMAND_CONFIG, NULL);
824         register_command(cmd_ctx, NULL, "run_and_halt_time", handle_run_and_halt_time_command, COMMAND_CONFIG, "<target> <run time ms>");
825         register_command(cmd_ctx, NULL, "working_area", handle_working_area_command, COMMAND_ANY, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
826         register_command(cmd_ctx, NULL, "virt2phys", handle_virt2phys_command, COMMAND_ANY, "virt2phys <virtual address>");
827         register_command(cmd_ctx, NULL, "profile", handle_profile_command, COMMAND_EXEC, "PRELIMINARY! - profile <seconds> <gmon.out>");
828
829         return ERROR_OK;
830 }
831
832 int target_arch_state(struct target_s *target)
833 {
834         int retval;
835         if (target==NULL)
836         {
837                 LOG_USER("No target has been configured");
838                 return ERROR_OK;
839         }
840         
841         LOG_USER("target state: %s", target_state_strings[target->state]);
842         
843         if (target->state!=TARGET_HALTED)
844                 return ERROR_OK;
845         
846         retval=target->type->arch_state(target);
847         return retval;
848 }
849
850 /* Single aligned words are guaranteed to use 16 or 32 bit access 
851  * mode respectively, otherwise data is handled as quickly as 
852  * possible
853  */
854 int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
855 {
856         int retval;
857         
858         LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size, address);
859         
860         if (((address % 2) == 0) && (size == 2))
861         {
862                 return target->type->write_memory(target, address, 2, 1, buffer);
863         }
864         
865         /* handle unaligned head bytes */
866         if (address % 4)
867         {
868                 int unaligned = 4 - (address % 4);
869                 
870                 if (unaligned > size)
871                         unaligned = size;
872
873                 if ((retval = target->type->write_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
874                         return retval;
875                 
876                 buffer += unaligned;
877                 address += unaligned;
878                 size -= unaligned;
879         }
880                 
881         /* handle aligned words */
882         if (size >= 4)
883         {
884                 int aligned = size - (size % 4);
885         
886                 /* use bulk writes above a certain limit. This may have to be changed */
887                 if (aligned > 128)
888                 {
889                         if ((retval = target->type->bulk_write_memory(target, address, aligned / 4, buffer)) != ERROR_OK)
890                                 return retval;
891                 }
892                 else
893                 {
894                         if ((retval = target->type->write_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
895                                 return retval;
896                 }
897                 
898                 buffer += aligned;
899                 address += aligned;
900                 size -= aligned;
901         }
902         
903         /* handle tail writes of less than 4 bytes */
904         if (size > 0)
905         {
906                 if ((retval = target->type->write_memory(target, address, 1, size, buffer)) != ERROR_OK)
907                         return retval;
908         }
909         
910         return ERROR_OK;
911 }
912
913
914 /* Single aligned words are guaranteed to use 16 or 32 bit access 
915  * mode respectively, otherwise data is handled as quickly as 
916  * possible
917  */
918 int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
919 {
920         int retval;
921         
922         LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size, address);
923         
924         if (((address % 2) == 0) && (size == 2))
925         {
926                 return target->type->read_memory(target, address, 2, 1, buffer);
927         }
928         
929         /* handle unaligned head bytes */
930         if (address % 4)
931         {
932                 int unaligned = 4 - (address % 4);
933                 
934                 if (unaligned > size)
935                         unaligned = size;
936
937                 if ((retval = target->type->read_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
938                         return retval;
939                 
940                 buffer += unaligned;
941                 address += unaligned;
942                 size -= unaligned;
943         }
944                 
945         /* handle aligned words */
946         if (size >= 4)
947         {
948                 int aligned = size - (size % 4);
949         
950                 if ((retval = target->type->read_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
951                         return retval;
952                 
953                 buffer += aligned;
954                 address += aligned;
955                 size -= aligned;
956         }
957         
958         /* handle tail writes of less than 4 bytes */
959         if (size > 0)
960         {
961                 if ((retval = target->type->read_memory(target, address, 1, size, buffer)) != ERROR_OK)
962                         return retval;
963         }
964         
965         return ERROR_OK;
966 }
967
968 int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc)
969 {
970         u8 *buffer;
971         int retval;
972         int i;
973         u32 checksum = 0;
974         
975         if ((retval = target->type->checksum_memory(target, address,
976                 size, &checksum)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
977         {
978                 buffer = malloc(size);
979                 if (buffer == NULL)
980                 {
981                         LOG_ERROR("error allocating buffer for section (%d bytes)", size);
982                         return ERROR_INVALID_ARGUMENTS;
983                 }
984                 retval = target_read_buffer(target, address, size, buffer);
985                 if (retval != ERROR_OK)
986                 {
987                         free(buffer);
988                         return retval;
989                 }
990
991                 /* convert to target endianess */
992                 for (i = 0; i < (size/sizeof(u32)); i++)
993                 {
994                         u32 target_data;
995                         target_data = target_buffer_get_u32(target, &buffer[i*sizeof(u32)]);
996                         target_buffer_set_u32(target, &buffer[i*sizeof(u32)], target_data);
997                 }
998
999                 retval = image_calculate_checksum( buffer, size, &checksum );
1000                 free(buffer);
1001         }
1002         
1003         *crc = checksum;
1004         
1005         return retval;
1006 }
1007
1008 int target_read_u32(struct target_s *target, u32 address, u32 *value)
1009 {
1010         u8 value_buf[4];
1011
1012         int retval = target->type->read_memory(target, address, 4, 1, value_buf);
1013         
1014         if (retval == ERROR_OK)
1015         {
1016                 *value = target_buffer_get_u32(target, value_buf);
1017                 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, *value);
1018         }
1019         else
1020         {
1021                 *value = 0x0;
1022                 LOG_DEBUG("address: 0x%8.8x failed", address);
1023         }
1024         
1025         return retval;
1026 }
1027
1028 int target_read_u16(struct target_s *target, u32 address, u16 *value)
1029 {
1030         u8 value_buf[2];
1031         
1032         int retval = target->type->read_memory(target, address, 2, 1, value_buf);
1033         
1034         if (retval == ERROR_OK)
1035         {
1036                 *value = target_buffer_get_u16(target, value_buf);
1037                 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address, *value);
1038         }
1039         else
1040         {
1041                 *value = 0x0;
1042                 LOG_DEBUG("address: 0x%8.8x failed", address);
1043         }
1044         
1045         return retval;
1046 }
1047
1048 int target_read_u8(struct target_s *target, u32 address, u8 *value)
1049 {
1050         int retval = target->type->read_memory(target, address, 1, 1, value);
1051
1052         if (retval == ERROR_OK)
1053         {
1054                 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, *value);
1055         }
1056         else
1057         {
1058                 *value = 0x0;
1059                 LOG_DEBUG("address: 0x%8.8x failed", address);
1060         }
1061         
1062         return retval;
1063 }
1064
1065 int target_write_u32(struct target_s *target, u32 address, u32 value)
1066 {
1067         int retval;
1068         u8 value_buf[4];
1069
1070         LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
1071
1072         target_buffer_set_u32(target, value_buf, value);        
1073         if ((retval = target->type->write_memory(target, address, 4, 1, value_buf)) != ERROR_OK)
1074         {
1075                 LOG_DEBUG("failed: %i", retval);
1076         }
1077         
1078         return retval;
1079 }
1080
1081 int target_write_u16(struct target_s *target, u32 address, u16 value)
1082 {
1083         int retval;
1084         u8 value_buf[2];
1085         
1086         LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
1087
1088         target_buffer_set_u16(target, value_buf, value);        
1089         if ((retval = target->type->write_memory(target, address, 2, 1, value_buf)) != ERROR_OK)
1090         {
1091                 LOG_DEBUG("failed: %i", retval);
1092         }
1093         
1094         return retval;
1095 }
1096
1097 int target_write_u8(struct target_s *target, u32 address, u8 value)
1098 {
1099         int retval;
1100         
1101         LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, value);
1102
1103         if ((retval = target->type->read_memory(target, address, 1, 1, &value)) != ERROR_OK)
1104         {
1105                 LOG_DEBUG("failed: %i", retval);
1106         }
1107         
1108         return retval;
1109 }
1110
1111 int target_register_user_commands(struct command_context_s *cmd_ctx)
1112 {
1113         register_command(cmd_ctx,  NULL, "reg", handle_reg_command, COMMAND_EXEC, NULL);
1114         register_command(cmd_ctx,  NULL, "poll", handle_poll_command, COMMAND_EXEC, "poll target state");
1115         register_command(cmd_ctx,  NULL, "wait_halt", handle_wait_halt_command, COMMAND_EXEC, "wait for target halt [time (s)]");
1116         register_command(cmd_ctx,  NULL, "halt", handle_halt_command, COMMAND_EXEC, "halt target");
1117         register_command(cmd_ctx,  NULL, "resume", handle_resume_command, COMMAND_EXEC, "resume target [addr]");
1118         register_command(cmd_ctx,  NULL, "step", handle_step_command, COMMAND_EXEC, "step one instruction from current PC or [addr]");
1119         register_command(cmd_ctx,  NULL, "reset", handle_reset_command, COMMAND_EXEC, "reset target [run|halt|init|run_and_halt|run_and_init]");
1120         register_command(cmd_ctx,  NULL, "soft_reset_halt", handle_soft_reset_halt_command, COMMAND_EXEC, "halt the target and do a soft reset");
1121
1122         register_command(cmd_ctx,  NULL, "mdw", handle_md_command, COMMAND_EXEC, "display memory words <addr> [count]");
1123         register_command(cmd_ctx,  NULL, "mdh", handle_md_command, COMMAND_EXEC, "display memory half-words <addr> [count]");
1124         register_command(cmd_ctx,  NULL, "mdb", handle_md_command, COMMAND_EXEC, "display memory bytes <addr> [count]");
1125         
1126         register_command(cmd_ctx,  NULL, "mww", handle_mw_command, COMMAND_EXEC, "write memory word <addr> <value> [count]");
1127         register_command(cmd_ctx,  NULL, "mwh", handle_mw_command, COMMAND_EXEC, "write memory half-word <addr> <value> [count]");
1128         register_command(cmd_ctx,  NULL, "mwb", handle_mw_command, COMMAND_EXEC, "write memory byte <addr> <value> [count]");
1129         
1130         register_command(cmd_ctx,  NULL, "bp", handle_bp_command, COMMAND_EXEC, "set breakpoint <address> <length> [hw]");      
1131         register_command(cmd_ctx,  NULL, "rbp", handle_rbp_command, COMMAND_EXEC, "remove breakpoint <adress>");
1132         register_command(cmd_ctx,  NULL, "wp", handle_wp_command, COMMAND_EXEC, "set watchpoint <address> <length> <r/w/a> [value] [mask]");    
1133         register_command(cmd_ctx,  NULL, "rwp", handle_rwp_command, COMMAND_EXEC, "remove watchpoint <adress>");
1134         
1135         register_command(cmd_ctx,  NULL, "load_image", handle_load_image_command, COMMAND_EXEC, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1136         register_command(cmd_ctx,  NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image <file> <address> <size>");
1137         register_command(cmd_ctx,  NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image <file> [offset] [type]");
1138         register_command(cmd_ctx,  NULL, "load_binary", handle_load_image_command, COMMAND_EXEC, "[DEPRECATED] load_binary <file> <address>");
1139         register_command(cmd_ctx,  NULL, "dump_binary", handle_dump_image_command, COMMAND_EXEC, "[DEPRECATED] dump_binary <file> <address> <size>");
1140         
1141         target_request_register_commands(cmd_ctx);
1142         trace_register_commands(cmd_ctx);
1143         
1144         return ERROR_OK;
1145 }
1146
1147 int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1148 {
1149         target_t *target = targets;
1150         int count = 0;
1151         
1152         if (argc == 1)
1153         {
1154                 int num = strtoul(args[0], NULL, 0);
1155                 
1156                 while (target)
1157                 {
1158                         count++;
1159                         target = target->next;
1160                 }
1161                 
1162                 if (num < count)
1163                         cmd_ctx->current_target = num;
1164                 else
1165                         command_print(cmd_ctx, "%i is out of bounds, only %i targets are configured", num, count);
1166                         
1167                 return ERROR_OK;
1168         }
1169                 
1170         while (target)
1171         {
1172                 command_print(cmd_ctx, "%i: %s (%s), state: %s", count++, target->type->name, target_endianess_strings[target->endianness], target_state_strings[target->state]);
1173                 target = target->next;
1174         }
1175         
1176         return ERROR_OK;
1177 }
1178
1179 int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1180 {
1181         int i;
1182         int found = 0;
1183         
1184         if (argc < 3)
1185         {
1186                 return ERROR_COMMAND_SYNTAX_ERROR;
1187         }
1188         
1189         /* search for the specified target */
1190         if (args[0] && (args[0][0] != 0))
1191         {
1192                 for (i = 0; target_types[i]; i++)
1193                 {
1194                         if (strcmp(args[0], target_types[i]->name) == 0)
1195                         {
1196                                 target_t **last_target_p = &targets;
1197                                 
1198                                 /* register target specific commands */
1199                                 if (target_types[i]->register_commands(cmd_ctx) != ERROR_OK)
1200                                 {
1201                                         LOG_ERROR("couldn't register '%s' commands", args[0]);
1202                                         exit(-1);
1203                                 }
1204
1205                                 if (*last_target_p)
1206                                 {
1207                                         while ((*last_target_p)->next)
1208                                                 last_target_p = &((*last_target_p)->next);
1209                                         last_target_p = &((*last_target_p)->next);
1210                                 }
1211
1212                                 *last_target_p = malloc(sizeof(target_t));
1213                                 
1214                                 (*last_target_p)->type = target_types[i];
1215                                 
1216                                 if (strcmp(args[1], "big") == 0)
1217                                         (*last_target_p)->endianness = TARGET_BIG_ENDIAN;
1218                                 else if (strcmp(args[1], "little") == 0)
1219                                         (*last_target_p)->endianness = TARGET_LITTLE_ENDIAN;
1220                                 else
1221                                 {
1222                                         LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args[1]);
1223                                         return ERROR_COMMAND_SYNTAX_ERROR;
1224                                 }
1225                                 
1226                                 /* what to do on a target reset */
1227                                 (*last_target_p)->reset_mode = RESET_INIT; /* default */
1228                                 if (strcmp(args[2], "reset_halt") == 0)
1229                                         (*last_target_p)->reset_mode = RESET_HALT;
1230                                 else if (strcmp(args[2], "reset_run") == 0)
1231                                         (*last_target_p)->reset_mode = RESET_RUN;
1232                                 else if (strcmp(args[2], "reset_init") == 0)
1233                                         (*last_target_p)->reset_mode = RESET_INIT;
1234                                 else if (strcmp(args[2], "run_and_halt") == 0)
1235                                         (*last_target_p)->reset_mode = RESET_RUN_AND_HALT;
1236                                 else if (strcmp(args[2], "run_and_init") == 0)
1237                                         (*last_target_p)->reset_mode = RESET_RUN_AND_INIT;
1238                                 else
1239                                 {
1240                                         /* Kludge! we want to make this reset arg optional while remaining compatible! */
1241                                         args--;
1242                                         argc++;
1243                                 }
1244                                 (*last_target_p)->run_and_halt_time = 1000; /* default 1s */
1245                                 
1246                                 (*last_target_p)->reset_script = NULL;
1247                                 (*last_target_p)->post_halt_script = NULL;
1248                                 (*last_target_p)->pre_resume_script = NULL;
1249                                 (*last_target_p)->gdb_program_script = NULL;
1250                                 
1251                                 (*last_target_p)->working_area = 0x0;
1252                                 (*last_target_p)->working_area_size = 0x0;
1253                                 (*last_target_p)->working_areas = NULL;
1254                                 (*last_target_p)->backup_working_area = 0;
1255                                 
1256                                 (*last_target_p)->state = TARGET_UNKNOWN;
1257                                 (*last_target_p)->debug_reason = DBG_REASON_UNDEFINED;
1258                                 (*last_target_p)->reg_cache = NULL;
1259                                 (*last_target_p)->breakpoints = NULL;
1260                                 (*last_target_p)->watchpoints = NULL;
1261                                 (*last_target_p)->next = NULL;
1262                                 (*last_target_p)->arch_info = NULL;
1263                                 
1264                                 /* initialize trace information */
1265                                 (*last_target_p)->trace_info = malloc(sizeof(trace_t));
1266                                 (*last_target_p)->trace_info->num_trace_points = 0;
1267                                 (*last_target_p)->trace_info->trace_points_size = 0;
1268                                 (*last_target_p)->trace_info->trace_points = NULL;
1269                                 (*last_target_p)->trace_info->trace_history_size = 0;
1270                                 (*last_target_p)->trace_info->trace_history = NULL;
1271                                 (*last_target_p)->trace_info->trace_history_pos = 0;
1272                                 (*last_target_p)->trace_info->trace_history_overflowed = 0;
1273                                 
1274                                 (*last_target_p)->dbgmsg = NULL;
1275                                 (*last_target_p)->dbg_msg_enabled = 0;
1276                                                                 
1277                                 (*last_target_p)->type->target_command(cmd_ctx, cmd, args, argc, *last_target_p);
1278                                 
1279                                 found = 1;
1280                                 break;
1281                         }
1282                 }
1283         }
1284         
1285         /* no matching target found */
1286         if (!found)
1287         {
1288                 LOG_ERROR("target '%s' not found", args[0]);
1289                 return ERROR_COMMAND_SYNTAX_ERROR;
1290         }
1291
1292         return ERROR_OK;
1293 }
1294
1295 /* usage: target_script <target#> <event> <script_file> */
1296 int handle_target_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1297 {
1298         target_t *target = NULL;
1299         
1300         if (argc < 3)
1301         {
1302                 LOG_ERROR("incomplete target_script command");
1303                 return ERROR_COMMAND_SYNTAX_ERROR;
1304         }
1305         
1306         target = get_target_by_num(strtoul(args[0], NULL, 0));
1307         
1308         if (!target)
1309         {
1310                 return ERROR_COMMAND_SYNTAX_ERROR;
1311         }
1312         
1313         if (strcmp(args[1], "reset") == 0)
1314         {
1315                 if (target->reset_script)
1316                         free(target->reset_script);
1317                 target->reset_script = strdup(args[2]);
1318         }
1319         else if (strcmp(args[1], "post_halt") == 0)
1320         {
1321                 if (target->post_halt_script)
1322                         free(target->post_halt_script);
1323                 target->post_halt_script = strdup(args[2]);
1324         }
1325         else if (strcmp(args[1], "pre_resume") == 0)
1326         {
1327                 if (target->pre_resume_script)
1328                         free(target->pre_resume_script);
1329                 target->pre_resume_script = strdup(args[2]);
1330         }
1331         else if (strcmp(args[1], "gdb_program_config") == 0)
1332         {
1333                 if (target->gdb_program_script)
1334                         free(target->gdb_program_script);
1335                 target->gdb_program_script = strdup(args[2]);
1336         }
1337         else
1338         {
1339                 LOG_ERROR("unknown event type: '%s", args[1]);
1340                 return ERROR_COMMAND_SYNTAX_ERROR;
1341         }
1342         
1343         return ERROR_OK;
1344 }
1345
1346 int handle_run_and_halt_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1347 {
1348         target_t *target = NULL;
1349         
1350         if (argc < 2)
1351         {
1352                 return ERROR_COMMAND_SYNTAX_ERROR;
1353         }
1354         
1355         target = get_target_by_num(strtoul(args[0], NULL, 0));
1356         if (!target)
1357         {
1358                 return ERROR_COMMAND_SYNTAX_ERROR;
1359         }
1360         
1361         target->run_and_halt_time = strtoul(args[1], NULL, 0);
1362         
1363         return ERROR_OK;
1364 }
1365
1366 int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1367 {
1368         target_t *target = NULL;
1369         
1370         if ((argc < 4) || (argc > 5))
1371         {
1372                 return ERROR_COMMAND_SYNTAX_ERROR;
1373         }
1374         
1375         target = get_target_by_num(strtoul(args[0], NULL, 0));
1376         if (!target)
1377         {
1378                 return ERROR_COMMAND_SYNTAX_ERROR;
1379         }
1380         target_free_all_working_areas(target);
1381         
1382         target->working_area_phys = target->working_area_virt = strtoul(args[1], NULL, 0);
1383         if (argc == 5)
1384         {
1385                 target->working_area_virt = strtoul(args[4], NULL, 0);
1386         }
1387         target->working_area_size = strtoul(args[2], NULL, 0);
1388         
1389         if (strcmp(args[3], "backup") == 0)
1390         {
1391                 target->backup_working_area = 1;
1392         }
1393         else if (strcmp(args[3], "nobackup") == 0)
1394         {
1395                 target->backup_working_area = 0;
1396         }
1397         else
1398         {
1399                 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args[3]);
1400                 return ERROR_COMMAND_SYNTAX_ERROR;
1401         }
1402         
1403         return ERROR_OK;
1404 }
1405
1406
1407 /* process target state changes */
1408 int handle_target(void *priv)
1409 {
1410         int retval;
1411         target_t *target = targets;
1412         
1413         while (target)
1414         {
1415                 /* only poll if target isn't already halted */
1416                 if (target->state != TARGET_HALTED)
1417                 {
1418                         if (target_continous_poll)
1419                                 if ((retval = target->type->poll(target)) != ERROR_OK)
1420                                 {
1421                                         LOG_ERROR("couldn't poll target(%d). It's due for a reset.", retval);
1422                                 }
1423                 }
1424         
1425                 target = target->next;
1426         }
1427         
1428         return ERROR_OK;
1429 }
1430
1431 int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1432 {
1433         target_t *target;
1434         reg_t *reg = NULL;
1435         int count = 0;
1436         char *value;
1437         
1438         LOG_DEBUG("-");
1439         
1440         target = get_current_target(cmd_ctx);
1441         
1442         /* list all available registers for the current target */
1443         if (argc == 0)
1444         {
1445                 reg_cache_t *cache = target->reg_cache;
1446                 
1447                 count = 0;
1448                 while(cache)
1449                 {
1450                         int i;
1451                         for (i = 0; i < cache->num_regs; i++)
1452                         {
1453                                 value = buf_to_str(cache->reg_list[i].value, cache->reg_list[i].size, 16);
1454                                 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);
1455                                 free(value);
1456                         }
1457                         cache = cache->next;
1458                 }
1459                 
1460                 return ERROR_OK;
1461         }
1462         
1463         /* access a single register by its ordinal number */
1464         if ((args[0][0] >= '0') && (args[0][0] <= '9'))
1465         {
1466                 int num = strtoul(args[0], NULL, 0);
1467                 reg_cache_t *cache = target->reg_cache;
1468                 
1469                 count = 0;
1470                 while(cache)
1471                 {
1472                         int i;
1473                         for (i = 0; i < cache->num_regs; i++)
1474                         {
1475                                 if (count++ == num)
1476                                 {
1477                                         reg = &cache->reg_list[i];
1478                                         break;
1479                                 }
1480                         }
1481                         if (reg)
1482                                 break;
1483                         cache = cache->next;
1484                 }
1485                 
1486                 if (!reg)
1487                 {
1488                         command_print(cmd_ctx, "%i is out of bounds, the current target has only %i registers (0 - %i)", num, count, count - 1);
1489                         return ERROR_OK;
1490                 }
1491         } else /* access a single register by its name */
1492         {
1493                 reg = register_get_by_name(target->reg_cache, args[0], 1);
1494                 
1495                 if (!reg)
1496                 {
1497                         command_print(cmd_ctx, "register %s not found in current target", args[0]);
1498                         return ERROR_OK;
1499                 }
1500         }
1501
1502         /* display a register */
1503         if ((argc == 1) || ((argc == 2) && !((args[1][0] >= '0') && (args[1][0] <= '9'))))
1504         {
1505                 if ((argc == 2) && (strcmp(args[1], "force") == 0))
1506                         reg->valid = 0;
1507                 
1508                 if (reg->valid == 0)
1509                 {
1510                         reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
1511                         if (arch_type == NULL)
1512                         {
1513                                 LOG_ERROR("BUG: encountered unregistered arch type");
1514                                 return ERROR_OK;
1515                         }
1516                         arch_type->get(reg);
1517                 }
1518                 value = buf_to_str(reg->value, reg->size, 16);
1519                 command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
1520                 free(value);
1521                 return ERROR_OK;
1522         }
1523         
1524         /* set register value */
1525         if (argc == 2)
1526         {
1527                 u8 *buf = malloc(CEIL(reg->size, 8));
1528                 str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0);
1529
1530                 reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
1531                 if (arch_type == NULL)
1532                 {
1533                         LOG_ERROR("BUG: encountered unregistered arch type");
1534                         return ERROR_OK;
1535                 }
1536                 
1537                 arch_type->set(reg, buf);
1538                 
1539                 value = buf_to_str(reg->value, reg->size, 16);
1540                 command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
1541                 free(value);
1542                 
1543                 free(buf);
1544                 
1545                 return ERROR_OK;
1546         }
1547         
1548         command_print(cmd_ctx, "usage: reg <#|name> [value]");
1549         
1550         return ERROR_OK;
1551 }
1552
1553 static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_state state, int ms);
1554
1555 int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1556 {
1557         target_t *target = get_current_target(cmd_ctx);
1558
1559         if (argc == 0)
1560         {
1561                 target->type->poll(target);
1562                 target_arch_state(target);
1563         }
1564         else
1565         {
1566                 if (strcmp(args[0], "on") == 0)
1567                 {
1568                         target_continous_poll = 1;
1569                 }
1570                 else if (strcmp(args[0], "off") == 0)
1571                 {
1572                         target_continous_poll = 0;
1573                 }
1574                 else
1575                 {
1576                         command_print(cmd_ctx, "arg is \"on\" or \"off\"");
1577                 }
1578         }
1579         
1580         
1581         return ERROR_OK;
1582 }
1583
1584 int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1585 {
1586         int ms = 5000;
1587         
1588         if (argc > 0)
1589         {
1590                 char *end;
1591
1592                 ms = strtoul(args[0], &end, 0) * 1000;
1593                 if (*end)
1594                 {
1595                         command_print(cmd_ctx, "usage: %s [seconds]", cmd);
1596                         return ERROR_OK;
1597                 }
1598         }
1599
1600         return wait_state(cmd_ctx, cmd, TARGET_HALTED, ms); 
1601 }
1602
1603 static void target_process_events(struct command_context_s *cmd_ctx)
1604 {
1605         target_t *target = get_current_target(cmd_ctx);
1606         target->type->poll(target);
1607         target_call_timer_callbacks_now();
1608 }
1609
1610 static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_state state, int ms)
1611 {
1612         int retval;
1613         struct timeval timeout, now;
1614         int once=1;
1615         gettimeofday(&timeout, NULL);
1616         timeval_add_time(&timeout, 0, ms * 1000);
1617         
1618         target_t *target = get_current_target(cmd_ctx);
1619         for (;;)
1620         {
1621                 if ((retval=target->type->poll(target))!=ERROR_OK)
1622                         return retval;
1623                 target_call_timer_callbacks_now();
1624                 if (target->state == state)
1625                 {
1626                         break;
1627                 }
1628                 if (once)
1629                 {
1630                         once=0;
1631                         command_print(cmd_ctx, "waiting for target %s...", target_state_strings[state]);
1632                 }
1633                 
1634                 gettimeofday(&now, NULL);
1635                 if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
1636                 {
1637                         LOG_ERROR("timed out while waiting for target %s", target_state_strings[state]);
1638                         break;
1639                 }
1640         }
1641         
1642         return ERROR_OK;
1643 }
1644
1645 int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1646 {
1647         int retval;
1648         target_t *target = get_current_target(cmd_ctx);
1649
1650         LOG_DEBUG("-");
1651
1652         if ((retval = target->type->halt(target)) != ERROR_OK)
1653         {
1654                 return retval;
1655         }
1656         
1657         return handle_wait_halt_command(cmd_ctx, cmd, args, argc);
1658 }
1659
1660                 
1661 int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1662 {
1663         target_t *target = get_current_target(cmd_ctx);
1664         
1665         LOG_USER("requesting target halt and executing a soft reset");
1666         
1667         target->type->soft_reset_halt(target);
1668         
1669         return ERROR_OK;
1670 }
1671
1672 int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1673 {
1674         target_t *target = get_current_target(cmd_ctx);
1675         enum target_reset_mode reset_mode = target->reset_mode;
1676         enum target_reset_mode save = target->reset_mode;
1677         
1678         LOG_DEBUG("-");
1679         
1680         if (argc >= 1)
1681         {
1682                 if (strcmp("run", args[0]) == 0)
1683                         reset_mode = RESET_RUN;
1684                 else if (strcmp("halt", args[0]) == 0)
1685                         reset_mode = RESET_HALT;
1686                 else if (strcmp("init", args[0]) == 0)
1687                         reset_mode = RESET_INIT;
1688                 else if (strcmp("run_and_halt", args[0]) == 0)
1689                 {
1690                         reset_mode = RESET_RUN_AND_HALT;
1691                         if (argc >= 2)
1692                         {
1693                                 target->run_and_halt_time = strtoul(args[1], NULL, 0);
1694                         }
1695                 }
1696                 else if (strcmp("run_and_init", args[0]) == 0)
1697                 {
1698                         reset_mode = RESET_RUN_AND_INIT;
1699                         if (argc >= 2)
1700                         {
1701                                 target->run_and_halt_time = strtoul(args[1], NULL, 0);
1702                         }
1703                 }
1704                 else
1705                 {
1706                         command_print(cmd_ctx, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1707                         return ERROR_OK;
1708                 }
1709         }
1710         
1711         /* temporarily modify mode of current reset target */
1712         target->reset_mode = reset_mode;
1713
1714         /* reset *all* targets */
1715         target_process_reset(cmd_ctx);
1716         
1717         /* Restore default reset mode for this target */
1718     target->reset_mode = save;
1719         
1720         return ERROR_OK;
1721 }
1722
1723 int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1724 {
1725         int retval;
1726         target_t *target = get_current_target(cmd_ctx);
1727         
1728         if (argc == 0)
1729                 retval = target->type->resume(target, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1730         else if (argc == 1)
1731                 retval = target->type->resume(target, 0, strtoul(args[0], NULL, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1732         else
1733         {
1734                 return ERROR_COMMAND_SYNTAX_ERROR;
1735         }
1736
1737         target_process_events(cmd_ctx);
1738         
1739         return retval;
1740 }
1741
1742 int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1743 {
1744         target_t *target = get_current_target(cmd_ctx);
1745         
1746         LOG_DEBUG("-");
1747         
1748         if (argc == 0)
1749                 target->type->step(target, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1750
1751         if (argc == 1)
1752                 target->type->step(target, 0, strtoul(args[0], NULL, 0), 1); /* addr = args[0], handle breakpoints */
1753         
1754         return ERROR_OK;
1755 }
1756
1757 int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1758 {
1759         const int line_bytecnt = 32;
1760         int count = 1;
1761         int size = 4;
1762         u32 address = 0;
1763         int line_modulo;
1764         int i;
1765
1766         char output[128];
1767         int output_len;
1768
1769         int retval;
1770
1771         u8 *buffer;
1772         target_t *target = get_current_target(cmd_ctx);
1773
1774         if (argc < 1)
1775                 return ERROR_OK;
1776
1777         if (argc == 2)
1778                 count = strtoul(args[1], NULL, 0);
1779
1780         address = strtoul(args[0], NULL, 0);
1781         
1782
1783         switch (cmd[2])
1784         {
1785                 case 'w':
1786                         size = 4; line_modulo = line_bytecnt / 4;
1787                         break;
1788                 case 'h':
1789                         size = 2; line_modulo = line_bytecnt / 2;
1790                         break;
1791                 case 'b':
1792                         size = 1; line_modulo = line_bytecnt / 1;
1793                         break;
1794                 default:
1795                         return ERROR_OK;
1796         }
1797
1798         buffer = calloc(count, size);
1799         retval  = target->type->read_memory(target, address, size, count, buffer);
1800         if (retval == ERROR_OK)
1801         {
1802                 output_len = 0;
1803         
1804                 for (i = 0; i < count; i++)
1805                 {
1806                         if (i%line_modulo == 0)
1807                                 output_len += snprintf(output + output_len, 128 - output_len, "0x%8.8x: ", address + (i*size));
1808                         
1809                         switch (size)
1810                         {
1811                                 case 4:
1812                                         output_len += snprintf(output + output_len, 128 - output_len, "%8.8x ", target_buffer_get_u32(target, &buffer[i*4]));
1813                                         break;
1814                                 case 2:
1815                                         output_len += snprintf(output + output_len, 128 - output_len, "%4.4x ", target_buffer_get_u16(target, &buffer[i*2]));
1816                                         break;
1817                                 case 1:
1818                                         output_len += snprintf(output + output_len, 128 - output_len, "%2.2x ", buffer[i*1]);
1819                                         break;
1820                         }
1821         
1822                         if ((i%line_modulo == line_modulo-1) || (i == count - 1))
1823                         {
1824                                 command_print(cmd_ctx, output);
1825                                 output_len = 0;
1826                         }
1827                 }
1828         } else
1829         {
1830                 LOG_ERROR("Failure examining memory");
1831         }
1832
1833         free(buffer);
1834         
1835         return ERROR_OK;
1836 }
1837
1838 int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1839 {
1840         u32 address = 0;
1841         u32 value = 0;
1842         int count = 1;
1843         int i;
1844         int wordsize;
1845         target_t *target = get_current_target(cmd_ctx);
1846         u8 value_buf[4];
1847
1848          if ((argc < 2) || (argc > 3))
1849                 return ERROR_COMMAND_SYNTAX_ERROR;
1850
1851         address = strtoul(args[0], NULL, 0);
1852         value = strtoul(args[1], NULL, 0);
1853         if (argc == 3)
1854                 count = strtoul(args[2], NULL, 0);
1855
1856
1857         switch (cmd[2])
1858         {
1859                 case 'w':
1860                         wordsize = 4;
1861                         target_buffer_set_u32(target, value_buf, value);
1862                         break;
1863                 case 'h':
1864                         wordsize = 2;
1865                         target_buffer_set_u16(target, value_buf, value);
1866                         break;
1867                 case 'b':
1868                         wordsize = 1;
1869                         value_buf[0] = value;
1870                         break;
1871                 default:
1872                         return ERROR_COMMAND_SYNTAX_ERROR;
1873         }
1874         for (i=0; i<count; i++)
1875         {
1876                 int retval;
1877                 switch (wordsize)
1878                 {
1879                         case 4:
1880                                 retval = target->type->write_memory(target, address + i*wordsize, 4, 1, value_buf);
1881                                 break;
1882                         case 2:
1883                                 retval = target->type->write_memory(target, address + i*wordsize, 2, 1, value_buf);
1884                                 break;
1885                         case 1:
1886                                 retval = target->type->write_memory(target, address + i*wordsize, 1, 1, value_buf);
1887                         break;
1888                         default:
1889                         return ERROR_OK;
1890                 }
1891                 if (retval!=ERROR_OK)
1892                 {
1893                         return retval;
1894                 }
1895         }
1896
1897         return ERROR_OK;
1898
1899 }
1900
1901 int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1902 {
1903         u8 *buffer;
1904         u32 buf_cnt;
1905         u32 image_size;
1906         int i;
1907         int retval;
1908
1909         image_t image;  
1910         
1911         duration_t duration;
1912         char *duration_text;
1913         
1914         target_t *target = get_current_target(cmd_ctx);
1915
1916         if (argc < 1)
1917         {
1918                 command_print(cmd_ctx, "usage: load_image <filename> [address] [type]");
1919                 return ERROR_OK;
1920         }
1921         
1922         /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
1923         if (argc >= 2)
1924         {
1925                 image.base_address_set = 1;
1926                 image.base_address = strtoul(args[1], NULL, 0);
1927         }
1928         else
1929         {
1930                 image.base_address_set = 0;
1931         }
1932         
1933         image.start_address_set = 0;
1934
1935         duration_start_measure(&duration);
1936         
1937         if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
1938         {
1939                 return ERROR_OK;
1940         }
1941         
1942         image_size = 0x0;
1943         retval = ERROR_OK;
1944         for (i = 0; i < image.num_sections; i++)
1945         {
1946                 buffer = malloc(image.sections[i].size);
1947                 if (buffer == NULL)
1948                 {
1949                         command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
1950                         break;
1951                 }
1952                 
1953                 if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
1954                 {
1955                         free(buffer);
1956                         break;
1957                 }
1958                 if ((retval = target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer)) != ERROR_OK)
1959                 {
1960                         free(buffer);
1961                         break;
1962                 }
1963                 image_size += buf_cnt;
1964                 command_print(cmd_ctx, "%u byte written at address 0x%8.8x", buf_cnt, image.sections[i].base_address);
1965                 
1966                 free(buffer);
1967         }
1968
1969         duration_stop_measure(&duration, &duration_text);
1970         if (retval==ERROR_OK)
1971         {
1972                 command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text);
1973         }
1974         free(duration_text);
1975         
1976         image_close(&image);
1977
1978         return retval;
1979
1980 }
1981
1982 int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1983 {
1984         fileio_t fileio;
1985         
1986         u32 address;
1987         u32 size;
1988         u8 buffer[560];
1989         int retval=ERROR_OK;
1990         
1991         duration_t duration;
1992         char *duration_text;
1993         
1994         target_t *target = get_current_target(cmd_ctx);
1995
1996         if (argc != 3)
1997         {
1998                 command_print(cmd_ctx, "usage: dump_image <filename> <address> <size>");
1999                 return ERROR_OK;
2000         }
2001
2002         address = strtoul(args[1], NULL, 0);
2003         size = strtoul(args[2], NULL, 0);
2004
2005         if ((address & 3) || (size & 3))
2006         {
2007                 command_print(cmd_ctx, "only 32-bit aligned address and size are supported");
2008                 return ERROR_OK;
2009         }
2010         
2011         if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
2012         {
2013                 return ERROR_OK;
2014         }
2015         
2016         duration_start_measure(&duration);
2017         
2018         while (size > 0)
2019         {
2020                 u32 size_written;
2021                 u32 this_run_size = (size > 560) ? 560 : size;
2022                 
2023                 retval = target->type->read_memory(target, address, 4, this_run_size / 4, buffer);
2024                 if (retval != ERROR_OK)
2025                 {
2026                         break;
2027                 }
2028                 
2029                 retval = fileio_write(&fileio, this_run_size, buffer, &size_written);
2030                 if (retval != ERROR_OK)
2031                 {
2032                         break;
2033                 }
2034                 
2035                 size -= this_run_size;
2036                 address += this_run_size;
2037         }
2038
2039         fileio_close(&fileio);
2040
2041         duration_stop_measure(&duration, &duration_text);
2042         if (retval==ERROR_OK)
2043         {
2044                 command_print(cmd_ctx, "dumped %"PRIi64" byte in %s", fileio.size, duration_text);
2045         }
2046         free(duration_text);
2047         
2048         return ERROR_OK;
2049 }
2050
2051 int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2052 {
2053         u8 *buffer;
2054         u32 buf_cnt;
2055         u32 image_size;
2056         int i;
2057         int retval;
2058         u32 checksum = 0;
2059         u32 mem_checksum = 0;
2060
2061         image_t image;  
2062         
2063         duration_t duration;
2064         char *duration_text;
2065         
2066         target_t *target = get_current_target(cmd_ctx);
2067         
2068         if (argc < 1)
2069         {
2070                 return ERROR_COMMAND_SYNTAX_ERROR;
2071         }
2072         
2073         if (!target)
2074         {
2075                 LOG_ERROR("no target selected");
2076                 return ERROR_FAIL;
2077         }
2078         
2079         duration_start_measure(&duration);
2080         
2081         if (argc >= 2)
2082         {
2083                 image.base_address_set = 1;
2084                 image.base_address = strtoul(args[1], NULL, 0);
2085         }
2086         else
2087         {
2088                 image.base_address_set = 0;
2089                 image.base_address = 0x0;
2090         }
2091
2092         image.start_address_set = 0;
2093
2094         if ((retval=image_open(&image, args[0], (argc == 3) ? args[2] : NULL)) != ERROR_OK)
2095         {
2096                 return retval;
2097         }
2098         
2099         image_size = 0x0;
2100         retval=ERROR_OK;
2101         for (i = 0; i < image.num_sections; i++)
2102         {
2103                 buffer = malloc(image.sections[i].size);
2104                 if (buffer == NULL)
2105                 {
2106                         command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
2107                         break;
2108                 }
2109                 if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
2110                 {
2111                         free(buffer);
2112                         break;
2113                 }
2114                 
2115                 /* calculate checksum of image */
2116                 image_calculate_checksum( buffer, buf_cnt, &checksum );
2117                 
2118                 retval = target_checksum_memory(target, image.sections[i].base_address, buf_cnt, &mem_checksum);
2119                 if( retval != ERROR_OK )
2120                 {
2121                         free(buffer);
2122                         break;
2123                 }
2124                 
2125                 if( checksum != mem_checksum )
2126                 {
2127                         /* failed crc checksum, fall back to a binary compare */
2128                         u8 *data;
2129                         
2130                         command_print(cmd_ctx, "checksum mismatch - attempting binary compare");
2131                         
2132                         data = (u8*)malloc(buf_cnt);
2133                         
2134                         /* Can we use 32bit word accesses? */
2135                         int size = 1;
2136                         int count = buf_cnt;
2137                         if ((count % 4) == 0)
2138                         {
2139                                 size *= 4;
2140                                 count /= 4;
2141                         }
2142                         retval = target->type->read_memory(target, image.sections[i].base_address, size, count, data);
2143                         if (retval == ERROR_OK)
2144                         {
2145                                 int t;
2146                                 for (t = 0; t < buf_cnt; t++)
2147                                 {
2148                                         if (data[t] != buffer[t])
2149                                         {
2150                                                 command_print(cmd_ctx, "Verify operation failed address 0x%08x. Was 0x%02x instead of 0x%02x\n", t + image.sections[i].base_address, data[t], buffer[t]);
2151                                                 free(data);
2152                                                 free(buffer);
2153                                                 retval=ERROR_FAIL;
2154                                                 goto done;
2155                                         }
2156                                 }
2157                         }
2158                         
2159                         free(data);
2160                 }
2161                 
2162                 free(buffer);
2163                 image_size += buf_cnt;
2164         }
2165 done:   
2166         duration_stop_measure(&duration, &duration_text);
2167         if (retval==ERROR_OK)
2168         {
2169                 command_print(cmd_ctx, "verified %u bytes in %s", image_size, duration_text);
2170         }
2171         free(duration_text);
2172         
2173         image_close(&image);
2174         
2175         return retval;
2176 }
2177
2178 int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2179 {
2180         int retval;
2181         target_t *target = get_current_target(cmd_ctx);
2182
2183         if (argc == 0)
2184         {
2185                 breakpoint_t *breakpoint = target->breakpoints;
2186
2187                 while (breakpoint)
2188                 {
2189                         if (breakpoint->type == BKPT_SOFT)
2190                         {
2191                                 char* buf = buf_to_str(breakpoint->orig_instr, breakpoint->length, 16);
2192                                 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint->address, breakpoint->length, breakpoint->set, buf);
2193                                 free(buf);
2194                         }
2195                         else
2196                         {
2197                                 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i", breakpoint->address, breakpoint->length, breakpoint->set);
2198                         }
2199                         breakpoint = breakpoint->next;
2200                 }
2201         }
2202         else if (argc >= 2)
2203         {
2204                 int hw = BKPT_SOFT;
2205                 u32 length = 0;
2206
2207                 length = strtoul(args[1], NULL, 0);
2208                 
2209                 if (argc >= 3)
2210                         if (strcmp(args[2], "hw") == 0)
2211                                 hw = BKPT_HARD;
2212
2213                 if ((retval = breakpoint_add(target, strtoul(args[0], NULL, 0), length, hw)) != ERROR_OK)
2214                 {
2215                         LOG_ERROR("Failure setting breakpoints");
2216                 }
2217                 else
2218                 {
2219                         command_print(cmd_ctx, "breakpoint added at address 0x%8.8x", strtoul(args[0], NULL, 0));
2220                 }
2221         }
2222         else
2223         {
2224                 command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
2225         }
2226
2227         return ERROR_OK;
2228 }
2229
2230 int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2231 {
2232         target_t *target = get_current_target(cmd_ctx);
2233
2234         if (argc > 0)
2235                 breakpoint_remove(target, strtoul(args[0], NULL, 0));
2236
2237         return ERROR_OK;
2238 }
2239
2240 int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2241 {
2242         target_t *target = get_current_target(cmd_ctx);
2243         int retval;
2244
2245         if (argc == 0)
2246         {
2247                 watchpoint_t *watchpoint = target->watchpoints;
2248
2249                 while (watchpoint)
2250                 {
2251                         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);
2252                         watchpoint = watchpoint->next;
2253                 }
2254         } 
2255         else if (argc >= 2)
2256         {
2257                 enum watchpoint_rw type = WPT_ACCESS;
2258                 u32 data_value = 0x0;
2259                 u32 data_mask = 0xffffffff;
2260                 
2261                 if (argc >= 3)
2262                 {
2263                         switch(args[2][0])
2264                         {
2265                                 case 'r':
2266                                         type = WPT_READ;
2267                                         break;
2268                                 case 'w':
2269                                         type = WPT_WRITE;
2270                                         break;
2271                                 case 'a':
2272                                         type = WPT_ACCESS;
2273                                         break;
2274                                 default:
2275                                         command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2276                                         return ERROR_OK;
2277                         }
2278                 }
2279                 if (argc >= 4)
2280                 {
2281                         data_value = strtoul(args[3], NULL, 0);
2282                 }
2283                 if (argc >= 5)
2284                 {
2285                         data_mask = strtoul(args[4], NULL, 0);
2286                 }
2287                 
2288                 if ((retval = watchpoint_add(target, strtoul(args[0], NULL, 0),
2289                                 strtoul(args[1], NULL, 0), type, data_value, data_mask)) != ERROR_OK)
2290                 {
2291                         LOG_ERROR("Failure setting breakpoints");
2292                 }
2293         }
2294         else
2295         {
2296                 command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2297         }
2298                 
2299         return ERROR_OK;
2300 }
2301
2302 int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2303 {
2304         target_t *target = get_current_target(cmd_ctx);
2305
2306         if (argc > 0)
2307                 watchpoint_remove(target, strtoul(args[0], NULL, 0));
2308         
2309         return ERROR_OK;
2310 }
2311
2312 int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
2313 {
2314         int retval;
2315         target_t *target = get_current_target(cmd_ctx);
2316         u32 va;
2317         u32 pa;
2318
2319         if (argc != 1)
2320         {
2321                 return ERROR_COMMAND_SYNTAX_ERROR;
2322         }
2323         va = strtoul(args[0], NULL, 0);
2324
2325         retval = target->type->virt2phys(target, va, &pa);
2326         if (retval == ERROR_OK)
2327         {
2328                 command_print(cmd_ctx, "Physical address 0x%08x", pa);
2329         }
2330         else
2331         {
2332                 /* lower levels will have logged a detailed error which is 
2333                  * forwarded to telnet/GDB session.  
2334                  */
2335         }
2336         return retval;
2337 }
2338 static void writeLong(FILE *f, int l)
2339 {
2340         int i;
2341         for (i=0; i<4; i++)
2342         {
2343                 char c=(l>>(i*8))&0xff;
2344                 fwrite(&c, 1, 1, f); 
2345         }
2346         
2347 }
2348 static void writeString(FILE *f, char *s)
2349 {
2350         fwrite(s, 1, strlen(s), f); 
2351 }
2352
2353
2354
2355 // Dump a gmon.out histogram file.
2356 static void writeGmon(u32 *samples, int sampleNum, char *filename)
2357 {
2358         int i;
2359         FILE *f=fopen(filename, "w");
2360         if (f==NULL)
2361                 return;
2362         fwrite("gmon", 1, 4, f);
2363         writeLong(f, 0x00000001); // Version
2364         writeLong(f, 0); // padding
2365         writeLong(f, 0); // padding
2366         writeLong(f, 0); // padding
2367                                 
2368         fwrite("", 1, 1, f);  // GMON_TAG_TIME_HIST 
2369
2370         // figure out bucket size
2371         u32 min=samples[0];
2372         u32 max=samples[0];
2373         for (i=0; i<sampleNum; i++)
2374         {
2375                 if (min>samples[i])
2376                 {
2377                         min=samples[i];
2378                 }
2379                 if (max<samples[i])
2380                 {
2381                         max=samples[i];
2382                 }
2383         }
2384
2385         int addressSpace=(max-min+1);
2386         
2387         static int const maxBuckets=256*1024; // maximum buckets.
2388         int length=addressSpace;
2389         if (length > maxBuckets)
2390         {
2391                 length=maxBuckets; 
2392         }
2393         int *buckets=malloc(sizeof(int)*length);
2394         if (buckets==NULL)
2395         {
2396                 fclose(f);
2397                 return;
2398         }
2399         memset(buckets, 0, sizeof(int)*length);
2400         for (i=0; i<sampleNum;i++)
2401         {
2402                 u32 address=samples[i];
2403                 long long a=address-min;
2404                 long long b=length-1;
2405                 long long c=addressSpace-1;
2406                 int index=(a*b)/c; // danger!!!! int32 overflows 
2407                 buckets[index]++;
2408         }
2409         
2410         //                         append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2411         writeLong(f, min);                                      // low_pc
2412         writeLong(f, max);              // high_pc
2413         writeLong(f, length);           // # of samples
2414         writeLong(f, 64000000);                         // 64MHz
2415         writeString(f, "seconds");
2416         for (i=0; i<(15-strlen("seconds")); i++)
2417         {
2418                 fwrite("", 1, 1, f);  // padding
2419         }
2420         writeString(f, "s");
2421                 
2422 //                         append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2423         
2424         char *data=malloc(2*length);
2425         if (data!=NULL)
2426         {
2427                 for (i=0; i<length;i++)
2428                 {
2429                         int val;
2430                         val=buckets[i];
2431                         if (val>65535)
2432                         {
2433                                 val=65535;
2434                         }
2435                         data[i*2]=val&0xff;
2436                         data[i*2+1]=(val>>8)&0xff;
2437                 }
2438                 free(buckets);
2439                 fwrite(data, 1, length*2, f);
2440                 free(data);
2441         } else
2442         {
2443                 free(buckets);
2444         }
2445
2446         fclose(f);
2447 }
2448
2449 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2450 int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2451 {
2452         target_t *target = get_current_target(cmd_ctx);
2453         struct timeval timeout, now;
2454         
2455         gettimeofday(&timeout, NULL);
2456         if (argc!=2)
2457         {
2458                 return ERROR_COMMAND_SYNTAX_ERROR;
2459         }
2460         char *end;
2461         timeval_add_time(&timeout, strtoul(args[0], &end, 0), 0);
2462         if (*end) 
2463         {
2464                 return ERROR_OK;
2465         }
2466         
2467         command_print(cmd_ctx, "Starting profiling. Halting and resuming the target as often as we can...");
2468
2469         static const int maxSample=10000;
2470         u32 *samples=malloc(sizeof(u32)*maxSample);
2471         if (samples==NULL)
2472                 return ERROR_OK;
2473         
2474         int numSamples=0;
2475         int retval=ERROR_OK;
2476         // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2477         reg_t *reg = register_get_by_name(target->reg_cache, "pc", 1);
2478         
2479         for (;;)
2480         {
2481                 target->type->poll(target);
2482                 if (target->state == TARGET_HALTED)
2483                 {
2484                         u32 t=*((u32 *)reg->value);
2485                         samples[numSamples++]=t;
2486                         retval = target->type->resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2487                         target->type->poll(target);
2488                         usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2489                 } else if (target->state == TARGET_RUNNING)
2490                 {
2491                         // We want to quickly sample the PC.
2492                         target->type->halt(target);
2493                 } else
2494                 {
2495                         command_print(cmd_ctx, "Target not halted or running");
2496                         retval=ERROR_OK;
2497                         break;
2498                 }
2499                 if (retval!=ERROR_OK)
2500                 {
2501                         break;
2502                 }
2503                 
2504                 gettimeofday(&now, NULL);
2505                 if ((numSamples>=maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
2506                 {
2507                         command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples);
2508                         target->type->poll(target);
2509                         if (target->state == TARGET_HALTED)
2510                         {
2511                                 target->type->resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2512                         }
2513                         target->type->poll(target);
2514                         writeGmon(samples, numSamples, args[1]);
2515                         command_print(cmd_ctx, "Wrote %s", args[1]);
2516                         break;
2517                 }
2518         }
2519         free(samples);
2520         
2521         return ERROR_OK;
2522 }
2523