]> git.sur5r.net Git - openocd/blob - src/target/target.c
1. GDB will print cryptic error messages if it is not fed keep-alive packets
[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 int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
53 int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
54
55 int handle_run_and_halt_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
56 int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
57
58 int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
59 int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
60 int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
61 int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
62 int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
63 int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
64 int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
65 int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
66 int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
67 int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
68 int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
69 int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
70 int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
71 int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
72 int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
73 int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
74 int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
75 int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc);
76 int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
77 static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
78 static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
79
80
81 /* targets */
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         struct command_context_s *cmd_ctx = priv;
224         
225         if (event == TARGET_EVENT_HALTED)
226         {
227                 target_unregister_event_callback(target_init_handler, priv);
228                 target_invoke_script(cmd_ctx, target, "post_reset");
229                 jtag_execute_queue();
230         }
231         
232         return ERROR_OK;
233 }
234
235 int target_run_and_halt_handler(void *priv)
236 {
237         target_t *target = priv;
238         
239         target_halt(target);
240         
241         return ERROR_OK;
242 }
243
244 int target_poll(struct target_s *target)
245 {
246         /* We can't poll until after examine */
247         if (!target->type->examined)
248         {
249                 /* Fail silently lest we pollute the log */
250                 return ERROR_FAIL;
251         }
252         return target->type->poll(target);
253 }
254
255 int target_halt(struct target_s *target)
256 {
257         /* We can't poll until after examine */
258         if (!target->type->examined)
259         {
260                 LOG_ERROR("Target not examined yet");
261                 return ERROR_FAIL;
262         }
263         return target->type->halt(target);
264 }
265
266 int target_resume(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution)
267 {
268         int retval;
269         int timeout_ms = 5000;
270         
271         enum target_state resume_state = debug_execution ? TARGET_DEBUG_RUNNING : TARGET_RUNNING;
272         
273         /* We can't poll until after examine */
274         if (!target->type->examined)
275         {
276                 LOG_ERROR("Target not examined yet");
277                 return ERROR_FAIL;
278         }
279         
280         if ((retval = target->type->resume(target, current, address, handle_breakpoints, debug_execution)) != ERROR_OK)
281                 return retval;
282         
283         /* wait for target to exit halted mode */
284         target_poll(target);
285         
286         while (target->state != resume_state)
287         {
288                 target_call_timer_callbacks();
289                 usleep(10000);
290                 target_poll(target);
291                 if ((timeout_ms -= 10) <= 0)
292                 {
293                         LOG_ERROR("timeout waiting for target resume");
294                         return ERROR_TARGET_TIMEOUT;
295                 }
296         }
297
298         return retval;
299 }
300
301 int target_process_reset(struct command_context_s *cmd_ctx)
302 {
303         int retval = ERROR_OK;
304         target_t *target;
305         struct timeval timeout, now;
306
307         jtag->speed(jtag_speed);
308
309         target = targets;
310         while (target)
311         {
312                 target_invoke_script(cmd_ctx, target, "pre_reset");
313                 target = target->next;
314         }
315         
316         if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
317                 return retval;
318         
319         /* First time this is executed after launching OpenOCD, it will read out 
320          * the type of CPU, etc. and init Embedded ICE registers in host
321          * memory. 
322          * 
323          * It will also set up ICE registers in the target.
324          * 
325          * However, if we assert TRST later, we need to set up the registers again. 
326          * 
327          * For the "reset halt/init" case we must only set up the registers here.
328          */
329         if ((retval = target_examine(cmd_ctx)) != ERROR_OK)
330                 return retval;
331         
332         /* prepare reset_halt where necessary */
333         target = targets;
334         while (target)
335         {
336                 if (jtag_reset_config & RESET_SRST_PULLS_TRST)
337                 {
338                         switch (target->reset_mode)
339                         {
340                                 case RESET_HALT:
341                                         command_print(cmd_ctx, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
342                                         target->reset_mode = RESET_RUN_AND_HALT;
343                                         break;
344                                 case RESET_INIT:
345                                         command_print(cmd_ctx, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
346                                         target->reset_mode = RESET_RUN_AND_INIT;
347                                         break;
348                                 default:
349                                         break;
350                         } 
351                 }
352                 target = target->next;
353         }
354         
355         target = targets;
356         while (target)
357         {
358                 /* we have no idea what state the target is in, so we
359                  * have to drop working areas
360                  */
361                 target_free_all_working_areas_restore(target, 0);
362                 target->type->assert_reset(target);
363                 target = target->next;
364         }
365         if ((retval = jtag_execute_queue()) != ERROR_OK)
366         {
367                 LOG_WARNING("JTAG communication failed asserting reset.");
368                 retval = ERROR_OK;
369         }
370         
371         /* request target halt if necessary, and schedule further action */
372         target = targets;
373         while (target)
374         {
375                 switch (target->reset_mode)
376                 {
377                         case RESET_RUN:
378                                 /* nothing to do if target just wants to be run */
379                                 break;
380                         case RESET_RUN_AND_HALT:
381                                 /* schedule halt */
382                                 target_register_timer_callback(target_run_and_halt_handler, target->run_and_halt_time, 0, target);
383                                 break;
384                         case RESET_RUN_AND_INIT:
385                                 /* schedule halt */
386                                 target_register_timer_callback(target_run_and_halt_handler, target->run_and_halt_time, 0, target);
387                                 target_register_event_callback(target_init_handler, cmd_ctx);
388                                 break;
389                         case RESET_HALT:
390                                 target_halt(target);
391                                 break;
392                         case RESET_INIT:
393                                 target_halt(target);
394                                 target_register_event_callback(target_init_handler, cmd_ctx);
395                                 break;
396                         default:
397                                 LOG_ERROR("BUG: unknown target->reset_mode");
398                 }
399                 target = target->next;
400         }
401         
402         if ((retval = jtag_execute_queue()) != ERROR_OK)
403         {
404                 LOG_WARNING("JTAG communication failed while reset was asserted. Consider using srst_only for reset_config.");
405                 retval = ERROR_OK;              
406         }
407         
408         target = targets;
409         while (target)
410         {
411                 target->type->deassert_reset(target);
412                 target = target->next;
413         }
414         
415         if ((retval = jtag_execute_queue()) != ERROR_OK)
416         {
417                 LOG_WARNING("JTAG communication failed while deasserting reset.");
418                 retval = ERROR_OK;
419         }
420
421         if (jtag_reset_config & RESET_SRST_PULLS_TRST)
422         {
423                 /* If TRST was asserted we need to set up registers again */
424                 if ((retval = target_examine(cmd_ctx)) != ERROR_OK)
425                         return retval;
426         }               
427         
428         /* post reset scripts can be quite long, increase speed now. If post
429          * reset scripts needs a different speed, they can set the speed to
430          * whatever they need.
431          */
432         jtag->speed(jtag_speed_post_reset);
433         
434         LOG_DEBUG("Waiting for halted stated as approperiate");
435         
436         /* Wait for reset to complete, maximum 5 seconds. */    
437         gettimeofday(&timeout, NULL);
438         timeval_add_time(&timeout, 5, 0);
439         for(;;)
440         {
441                 gettimeofday(&now, NULL);
442                 
443                 target_call_timer_callbacks_now();
444                 
445                 target = targets;
446                 while (target)
447                 {
448                         LOG_DEBUG("Polling target");
449                         target_poll(target);
450                         if ((target->reset_mode == RESET_RUN_AND_INIT) || 
451                                         (target->reset_mode == RESET_RUN_AND_HALT) ||
452                                         (target->reset_mode == RESET_HALT) ||
453                                         (target->reset_mode == RESET_INIT))
454                         {
455                                 if (target->state != TARGET_HALTED)
456                                 {
457                                         if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
458                                         {
459                                                 LOG_USER("Timed out waiting for halt after reset");
460                                                 goto done;
461                                         }
462                                         /* this will send alive messages on e.g. GDB remote protocol. */
463                                         usleep(500*1000); 
464                                         LOG_USER_N("%s", ""); /* avoid warning about zero length formatting message*/ 
465                                         goto again;
466                                 }
467                         }
468                         target = target->next;
469                 }
470                 /* All targets we're waiting for are halted */
471                 break;
472                 
473                 again:;
474         }
475         done:
476         
477         
478         /* We want any events to be processed before the prompt */
479         target_call_timer_callbacks_now();
480
481         /* if we timed out we need to unregister these handlers */
482         target = targets;
483         while (target)
484         {
485                 target_unregister_timer_callback(target_run_and_halt_handler, target);
486                 target = target->next;
487         }
488         target_unregister_event_callback(target_init_handler, cmd_ctx);
489         
490         
491         return retval;
492 }
493
494 static int default_virt2phys(struct target_s *target, u32 virtual, u32 *physical)
495 {
496         *physical = virtual;
497         return ERROR_OK;
498 }
499
500 static int default_mmu(struct target_s *target, int *enabled)
501 {
502         *enabled = 0;
503         return ERROR_OK;
504 }
505
506 static int default_examine(struct command_context_s *cmd_ctx, struct target_s *target)
507 {
508         target->type->examined = 1;
509         return ERROR_OK;
510 }
511
512
513 /* Targets that correctly implement init+examine, i.e.
514  * no communication with target during init:
515  * 
516  * XScale 
517  */
518 int target_examine(struct command_context_s *cmd_ctx)
519 {
520         int retval = ERROR_OK;
521         target_t *target = targets;
522         while (target)
523         {
524                 if ((retval = target->type->examine(cmd_ctx, target))!=ERROR_OK)
525                         return retval;
526                 target = target->next;
527         }
528         return retval;
529 }
530
531 static int target_write_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
532 {
533         if (!target->type->examined)
534         {
535                 LOG_ERROR("Target not examined yet");
536                 return ERROR_FAIL;
537         }
538         return target->type->write_memory_imp(target, address, size, count, buffer);
539 }
540
541 static int target_read_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer)
542 {
543         if (!target->type->examined)
544         {
545                 LOG_ERROR("Target not examined yet");
546                 return ERROR_FAIL;
547         }
548         return target->type->read_memory_imp(target, address, size, count, buffer);
549 }
550
551 static int target_soft_reset_halt_imp(struct target_s *target)
552 {
553         if (!target->type->examined)
554         {
555                 LOG_ERROR("Target not examined yet");
556                 return ERROR_FAIL;
557         }
558         return target->type->soft_reset_halt_imp(target);
559 }
560
561 static int target_run_algorithm_imp(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info)
562 {
563         if (!target->type->examined)
564         {
565                 LOG_ERROR("Target not examined yet");
566                 return ERROR_FAIL;
567         }
568         return target->type->run_algorithm_imp(target, num_mem_params, mem_params, num_reg_params, reg_param, entry_point, exit_point, timeout_ms, arch_info);
569 }
570
571 int target_init(struct command_context_s *cmd_ctx)
572 {
573         target_t *target = targets;
574         
575         while (target)
576         {
577                 target->type->examined = 0;
578                 if (target->type->examine == NULL)
579                 {
580                         target->type->examine = default_examine;
581                 }
582                 
583                 if (target->type->init_target(cmd_ctx, target) != ERROR_OK)
584                 {
585                         LOG_ERROR("target '%s' init failed", target->type->name);
586                         exit(-1);
587                 }
588                 
589                 /* Set up default functions if none are provided by target */
590                 if (target->type->virt2phys == NULL)
591                 {
592                         target->type->virt2phys = default_virt2phys;
593                 }
594                 target->type->virt2phys = default_virt2phys;
595                 /* a non-invasive way(in terms of patches) to add some code that
596                  * runs before the type->write/read_memory implementation
597                  */
598                 target->type->write_memory_imp = target->type->write_memory;
599                 target->type->write_memory = target_write_memory_imp;
600                 target->type->read_memory_imp = target->type->read_memory;
601                 target->type->read_memory = target_read_memory_imp;
602                 target->type->soft_reset_halt_imp = target->type->soft_reset_halt;
603                 target->type->soft_reset_halt = target_soft_reset_halt_imp;
604                 target->type->run_algorithm_imp = target->type->run_algorithm;
605                 target->type->run_algorithm = target_run_algorithm_imp;
606
607                 
608                 if (target->type->mmu == NULL)
609                 {
610                         target->type->mmu = default_mmu;
611                 }
612                 target = target->next;
613         }
614         
615         if (targets)
616         {
617                 target_register_user_commands(cmd_ctx);
618                 target_register_timer_callback(handle_target, 100, 1, NULL);
619         }
620                 
621         return ERROR_OK;
622 }
623
624 int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
625 {
626         target_event_callback_t **callbacks_p = &target_event_callbacks;
627         
628         if (callback == NULL)
629         {
630                 return ERROR_INVALID_ARGUMENTS;
631         }
632         
633         if (*callbacks_p)
634         {
635                 while ((*callbacks_p)->next)
636                         callbacks_p = &((*callbacks_p)->next);
637                 callbacks_p = &((*callbacks_p)->next);
638         }
639         
640         (*callbacks_p) = malloc(sizeof(target_event_callback_t));
641         (*callbacks_p)->callback = callback;
642         (*callbacks_p)->priv = priv;
643         (*callbacks_p)->next = NULL;
644         
645         return ERROR_OK;
646 }
647
648 int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv)
649 {
650         target_timer_callback_t **callbacks_p = &target_timer_callbacks;
651         struct timeval now;
652         
653         if (callback == NULL)
654         {
655                 return ERROR_INVALID_ARGUMENTS;
656         }
657         
658         if (*callbacks_p)
659         {
660                 while ((*callbacks_p)->next)
661                         callbacks_p = &((*callbacks_p)->next);
662                 callbacks_p = &((*callbacks_p)->next);
663         }
664         
665         (*callbacks_p) = malloc(sizeof(target_timer_callback_t));
666         (*callbacks_p)->callback = callback;
667         (*callbacks_p)->periodic = periodic;
668         (*callbacks_p)->time_ms = time_ms;
669         
670         gettimeofday(&now, NULL);
671         (*callbacks_p)->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
672         time_ms -= (time_ms % 1000);
673         (*callbacks_p)->when.tv_sec = now.tv_sec + (time_ms / 1000);
674         if ((*callbacks_p)->when.tv_usec > 1000000)
675         {
676                 (*callbacks_p)->when.tv_usec = (*callbacks_p)->when.tv_usec - 1000000;
677                 (*callbacks_p)->when.tv_sec += 1;
678         }
679         
680         (*callbacks_p)->priv = priv;
681         (*callbacks_p)->next = NULL;
682         
683         return ERROR_OK;
684 }
685
686 int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
687 {
688         target_event_callback_t **p = &target_event_callbacks;
689         target_event_callback_t *c = target_event_callbacks;
690         
691         if (callback == NULL)
692         {
693                 return ERROR_INVALID_ARGUMENTS;
694         }
695                 
696         while (c)
697         {
698                 target_event_callback_t *next = c->next;
699                 if ((c->callback == callback) && (c->priv == priv))
700                 {
701                         *p = next;
702                         free(c);
703                         return ERROR_OK;
704                 }
705                 else
706                         p = &(c->next);
707                 c = next;
708         }
709         
710         return ERROR_OK;
711 }
712
713 int target_unregister_timer_callback(int (*callback)(void *priv), void *priv)
714 {
715         target_timer_callback_t **p = &target_timer_callbacks;
716         target_timer_callback_t *c = target_timer_callbacks;
717         
718         if (callback == NULL)
719         {
720                 return ERROR_INVALID_ARGUMENTS;
721         }
722                 
723         while (c)
724         {
725                 target_timer_callback_t *next = c->next;
726                 if ((c->callback == callback) && (c->priv == priv))
727                 {
728                         *p = next;
729                         free(c);
730                         return ERROR_OK;
731                 }
732                 else
733                         p = &(c->next);
734                 c = next;
735         }
736         
737         return ERROR_OK;
738 }
739
740 int target_call_event_callbacks(target_t *target, enum target_event event)
741 {
742         target_event_callback_t *callback = target_event_callbacks;
743         target_event_callback_t *next_callback;
744         
745         LOG_DEBUG("target event %i", event);
746         
747         while (callback)
748         {
749                 next_callback = callback->next;
750                 callback->callback(target, event, callback->priv);
751                 callback = next_callback;
752         }
753         
754         return ERROR_OK;
755 }
756
757 static int target_call_timer_callbacks_check_time(int checktime)
758 {
759         target_timer_callback_t *callback = target_timer_callbacks;
760         target_timer_callback_t *next_callback;
761         struct timeval now;
762
763         keep_alive();
764         
765         gettimeofday(&now, NULL);
766         
767         while (callback)
768         {
769                 next_callback = callback->next;
770                 
771                 if ((!checktime&&callback->periodic)||
772                                 (((now.tv_sec >= callback->when.tv_sec) && (now.tv_usec >= callback->when.tv_usec))
773                                                 || (now.tv_sec > callback->when.tv_sec)))
774                 {
775                         if(callback->callback != NULL)
776                         {
777                                 callback->callback(callback->priv);
778                                 if (callback->periodic)
779                                 {
780                                         int time_ms = callback->time_ms;
781                                         callback->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
782                                         time_ms -= (time_ms % 1000);
783                                         callback->when.tv_sec = now.tv_sec + time_ms / 1000;
784                                         if (callback->when.tv_usec > 1000000)
785                                         {
786                                                 callback->when.tv_usec = callback->when.tv_usec - 1000000;
787                                                 callback->when.tv_sec += 1;
788                                         }
789                                 }
790                                 else
791                                         target_unregister_timer_callback(callback->callback, callback->priv);
792                         }
793                 }
794                         
795                 callback = next_callback;
796         }
797         
798         return ERROR_OK;
799 }
800
801 int target_call_timer_callbacks()
802 {
803         return target_call_timer_callbacks_check_time(1);
804 }
805
806 /* invoke periodic callbacks immediately */
807 int target_call_timer_callbacks_now()
808 {
809         return target_call_timer_callbacks(0);
810 }
811
812 int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area)
813 {
814         working_area_t *c = target->working_areas;
815         working_area_t *new_wa = NULL;
816         
817         /* Reevaluate working area address based on MMU state*/
818         if (target->working_areas == NULL)
819         {
820                 int retval;
821                 int enabled;
822                 retval = target->type->mmu(target, &enabled);
823                 if (retval != ERROR_OK)
824                 {
825                         return retval;
826                 }
827                 if (enabled)
828                 {
829                         target->working_area = target->working_area_virt;
830                 }
831                 else
832                 {
833                         target->working_area = target->working_area_phys;
834                 }
835         }
836         
837         /* only allocate multiples of 4 byte */
838         if (size % 4)
839         {
840                 LOG_ERROR("BUG: code tried to allocate unaligned number of bytes, padding");
841                 size = CEIL(size, 4);
842         }
843         
844         /* see if there's already a matching working area */
845         while (c)
846         {
847                 if ((c->free) && (c->size == size))
848                 {
849                         new_wa = c;
850                         break;
851                 }
852                 c = c->next;
853         }
854         
855         /* if not, allocate a new one */
856         if (!new_wa)
857         {
858                 working_area_t **p = &target->working_areas;
859                 u32 first_free = target->working_area;
860                 u32 free_size = target->working_area_size;
861                 
862                 LOG_DEBUG("allocating new working area");
863                 
864                 c = target->working_areas;
865                 while (c)
866                 {
867                         first_free += c->size;
868                         free_size -= c->size;
869                         p = &c->next;
870                         c = c->next;
871                 }
872                 
873                 if (free_size < size)
874                 {
875                         LOG_WARNING("not enough working area available(requested %d, free %d)", size, free_size);
876                         return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
877                 }
878                 
879                 new_wa = malloc(sizeof(working_area_t));
880                 new_wa->next = NULL;
881                 new_wa->size = size;
882                 new_wa->address = first_free;
883                 
884                 if (target->backup_working_area)
885                 {
886                         new_wa->backup = malloc(new_wa->size);
887                         target->type->read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup);
888                 }
889                 else
890                 {
891                         new_wa->backup = NULL;
892                 }
893                 
894                 /* put new entry in list */
895                 *p = new_wa;
896         }
897         
898         /* mark as used, and return the new (reused) area */
899         new_wa->free = 0;
900         *area = new_wa;
901         
902         /* user pointer */
903         new_wa->user = area;
904         
905         return ERROR_OK;
906 }
907
908 int target_free_working_area_restore(struct target_s *target, working_area_t *area, int restore)
909 {
910         if (area->free)
911                 return ERROR_OK;
912         
913         if (restore&&target->backup_working_area)
914                 target->type->write_memory(target, area->address, 4, area->size / 4, area->backup);
915         
916         area->free = 1;
917         
918         /* mark user pointer invalid */
919         *area->user = NULL;
920         area->user = NULL;
921         
922         return ERROR_OK;
923 }
924
925 int target_free_working_area(struct target_s *target, working_area_t *area)
926 {
927         return target_free_working_area_restore(target, area, 1);
928 }
929
930 int target_free_all_working_areas_restore(struct target_s *target, int restore)
931 {
932         working_area_t *c = target->working_areas;
933
934         while (c)
935         {
936                 working_area_t *next = c->next;
937                 target_free_working_area_restore(target, c, restore);
938                 
939                 if (c->backup)
940                         free(c->backup);
941                 
942                 free(c);
943                 
944                 c = next;
945         }
946         
947         target->working_areas = NULL;
948         
949         return ERROR_OK;
950 }
951
952 int target_free_all_working_areas(struct target_s *target)
953 {
954         return target_free_all_working_areas_restore(target, 1); 
955 }
956
957 int target_register_commands(struct command_context_s *cmd_ctx)
958 {
959         register_command(cmd_ctx, NULL, "target", handle_target_command, COMMAND_CONFIG, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
960         register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, NULL);
961         register_command(cmd_ctx, NULL, "run_and_halt_time", handle_run_and_halt_time_command, COMMAND_CONFIG, "<target> <run time ms>");
962         register_command(cmd_ctx, NULL, "working_area", handle_working_area_command, COMMAND_ANY, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
963         register_command(cmd_ctx, NULL, "virt2phys", handle_virt2phys_command, COMMAND_ANY, "virt2phys <virtual address>");
964         register_command(cmd_ctx, NULL, "profile", handle_profile_command, COMMAND_EXEC, "PRELIMINARY! - profile <seconds> <gmon.out>");
965
966
967         /* script procedures */
968         register_jim(cmd_ctx, "openocd_mem2array", jim_mem2array, "read memory and return as a TCL array for script processing");
969         register_jim(cmd_ctx, "openocd_array2mem", jim_mem2array, "convert a TCL array to memory locations and write the values");
970         return ERROR_OK;
971 }
972
973 int target_arch_state(struct target_s *target)
974 {
975         int retval;
976         if (target==NULL)
977         {
978                 LOG_USER("No target has been configured");
979                 return ERROR_OK;
980         }
981         
982         LOG_USER("target state: %s", target_state_strings[target->state]);
983         
984         if (target->state!=TARGET_HALTED)
985                 return ERROR_OK;
986         
987         retval=target->type->arch_state(target);
988         return retval;
989 }
990
991 /* Single aligned words are guaranteed to use 16 or 32 bit access 
992  * mode respectively, otherwise data is handled as quickly as 
993  * possible
994  */
995 int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
996 {
997         int retval;
998         if (!target->type->examined)
999         {
1000                 LOG_ERROR("Target not examined yet");
1001                 return ERROR_FAIL;
1002         }
1003         
1004         LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size, address);
1005         
1006         if (((address % 2) == 0) && (size == 2))
1007         {
1008                 return target->type->write_memory(target, address, 2, 1, buffer);
1009         }
1010         
1011         /* handle unaligned head bytes */
1012         if (address % 4)
1013         {
1014                 int unaligned = 4 - (address % 4);
1015                 
1016                 if (unaligned > size)
1017                         unaligned = size;
1018
1019                 if ((retval = target->type->write_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
1020                         return retval;
1021                 
1022                 buffer += unaligned;
1023                 address += unaligned;
1024                 size -= unaligned;
1025         }
1026                 
1027         /* handle aligned words */
1028         if (size >= 4)
1029         {
1030                 int aligned = size - (size % 4);
1031         
1032                 /* use bulk writes above a certain limit. This may have to be changed */
1033                 if (aligned > 128)
1034                 {
1035                         if ((retval = target->type->bulk_write_memory(target, address, aligned / 4, buffer)) != ERROR_OK)
1036                                 return retval;
1037                 }
1038                 else
1039                 {
1040                         if ((retval = target->type->write_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
1041                                 return retval;
1042                 }
1043                 
1044                 buffer += aligned;
1045                 address += aligned;
1046                 size -= aligned;
1047         }
1048         
1049         /* handle tail writes of less than 4 bytes */
1050         if (size > 0)
1051         {
1052                 if ((retval = target->type->write_memory(target, address, 1, size, buffer)) != ERROR_OK)
1053                         return retval;
1054         }
1055         
1056         return ERROR_OK;
1057 }
1058
1059
1060 /* Single aligned words are guaranteed to use 16 or 32 bit access 
1061  * mode respectively, otherwise data is handled as quickly as 
1062  * possible
1063  */
1064 int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer)
1065 {
1066         int retval;
1067         if (!target->type->examined)
1068         {
1069                 LOG_ERROR("Target not examined yet");
1070                 return ERROR_FAIL;
1071         }
1072
1073         LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size, address);
1074         
1075         if (((address % 2) == 0) && (size == 2))
1076         {
1077                 return target->type->read_memory(target, address, 2, 1, buffer);
1078         }
1079         
1080         /* handle unaligned head bytes */
1081         if (address % 4)
1082         {
1083                 int unaligned = 4 - (address % 4);
1084                 
1085                 if (unaligned > size)
1086                         unaligned = size;
1087
1088                 if ((retval = target->type->read_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
1089                         return retval;
1090                 
1091                 buffer += unaligned;
1092                 address += unaligned;
1093                 size -= unaligned;
1094         }
1095                 
1096         /* handle aligned words */
1097         if (size >= 4)
1098         {
1099                 int aligned = size - (size % 4);
1100         
1101                 if ((retval = target->type->read_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
1102                         return retval;
1103                 
1104                 buffer += aligned;
1105                 address += aligned;
1106                 size -= aligned;
1107         }
1108         
1109         /* handle tail writes of less than 4 bytes */
1110         if (size > 0)
1111         {
1112                 if ((retval = target->type->read_memory(target, address, 1, size, buffer)) != ERROR_OK)
1113                         return retval;
1114         }
1115         
1116         return ERROR_OK;
1117 }
1118
1119 int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc)
1120 {
1121         u8 *buffer;
1122         int retval;
1123         int i;
1124         u32 checksum = 0;
1125         if (!target->type->examined)
1126         {
1127                 LOG_ERROR("Target not examined yet");
1128                 return ERROR_FAIL;
1129         }
1130         
1131         if ((retval = target->type->checksum_memory(target, address,
1132                 size, &checksum)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
1133         {
1134                 buffer = malloc(size);
1135                 if (buffer == NULL)
1136                 {
1137                         LOG_ERROR("error allocating buffer for section (%d bytes)", size);
1138                         return ERROR_INVALID_ARGUMENTS;
1139                 }
1140                 retval = target_read_buffer(target, address, size, buffer);
1141                 if (retval != ERROR_OK)
1142                 {
1143                         free(buffer);
1144                         return retval;
1145                 }
1146
1147                 /* convert to target endianess */
1148                 for (i = 0; i < (size/sizeof(u32)); i++)
1149                 {
1150                         u32 target_data;
1151                         target_data = target_buffer_get_u32(target, &buffer[i*sizeof(u32)]);
1152                         target_buffer_set_u32(target, &buffer[i*sizeof(u32)], target_data);
1153                 }
1154
1155                 retval = image_calculate_checksum( buffer, size, &checksum );
1156                 free(buffer);
1157         }
1158         
1159         *crc = checksum;
1160         
1161         return retval;
1162 }
1163
1164 int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank)
1165 {
1166         int retval;
1167         if (!target->type->examined)
1168         {
1169                 LOG_ERROR("Target not examined yet");
1170                 return ERROR_FAIL;
1171         }
1172         
1173         if (target->type->blank_check_memory == 0)
1174                 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1175         
1176         retval = target->type->blank_check_memory(target, address, size, blank);
1177                         
1178         return retval;
1179 }
1180
1181 int target_read_u32(struct target_s *target, u32 address, u32 *value)
1182 {
1183         u8 value_buf[4];
1184         if (!target->type->examined)
1185         {
1186                 LOG_ERROR("Target not examined yet");
1187                 return ERROR_FAIL;
1188         }
1189
1190         int retval = target->type->read_memory(target, address, 4, 1, value_buf);
1191         
1192         if (retval == ERROR_OK)
1193         {
1194                 *value = target_buffer_get_u32(target, value_buf);
1195                 LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, *value);
1196         }
1197         else
1198         {
1199                 *value = 0x0;
1200                 LOG_DEBUG("address: 0x%8.8x failed", address);
1201         }
1202         
1203         return retval;
1204 }
1205
1206 int target_read_u16(struct target_s *target, u32 address, u16 *value)
1207 {
1208         u8 value_buf[2];
1209         if (!target->type->examined)
1210         {
1211                 LOG_ERROR("Target not examined yet");
1212                 return ERROR_FAIL;
1213         }
1214
1215         int retval = target->type->read_memory(target, address, 2, 1, value_buf);
1216         
1217         if (retval == ERROR_OK)
1218         {
1219                 *value = target_buffer_get_u16(target, value_buf);
1220                 LOG_DEBUG("address: 0x%8.8x, value: 0x%4.4x", address, *value);
1221         }
1222         else
1223         {
1224                 *value = 0x0;
1225                 LOG_DEBUG("address: 0x%8.8x failed", address);
1226         }
1227         
1228         return retval;
1229 }
1230
1231 int target_read_u8(struct target_s *target, u32 address, u8 *value)
1232 {
1233         int retval = target->type->read_memory(target, address, 1, 1, value);
1234         if (!target->type->examined)
1235         {
1236                 LOG_ERROR("Target not examined yet");
1237                 return ERROR_FAIL;
1238         }
1239
1240         if (retval == ERROR_OK)
1241         {
1242                 LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, *value);
1243         }
1244         else
1245         {
1246                 *value = 0x0;
1247                 LOG_DEBUG("address: 0x%8.8x failed", address);
1248         }
1249         
1250         return retval;
1251 }
1252
1253 int target_write_u32(struct target_s *target, u32 address, u32 value)
1254 {
1255         int retval;
1256         u8 value_buf[4];
1257         if (!target->type->examined)
1258         {
1259                 LOG_ERROR("Target not examined yet");
1260                 return ERROR_FAIL;
1261         }
1262
1263         LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
1264
1265         target_buffer_set_u32(target, value_buf, value);        
1266         if ((retval = target->type->write_memory(target, address, 4, 1, value_buf)) != ERROR_OK)
1267         {
1268                 LOG_DEBUG("failed: %i", retval);
1269         }
1270         
1271         return retval;
1272 }
1273
1274 int target_write_u16(struct target_s *target, u32 address, u16 value)
1275 {
1276         int retval;
1277         u8 value_buf[2];
1278         if (!target->type->examined)
1279         {
1280                 LOG_ERROR("Target not examined yet");
1281                 return ERROR_FAIL;
1282         }
1283
1284         LOG_DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
1285
1286         target_buffer_set_u16(target, value_buf, value);        
1287         if ((retval = target->type->write_memory(target, address, 2, 1, value_buf)) != ERROR_OK)
1288         {
1289                 LOG_DEBUG("failed: %i", retval);
1290         }
1291         
1292         return retval;
1293 }
1294
1295 int target_write_u8(struct target_s *target, u32 address, u8 value)
1296 {
1297         int retval;
1298         if (!target->type->examined)
1299         {
1300                 LOG_ERROR("Target not examined yet");
1301                 return ERROR_FAIL;
1302         }
1303
1304         LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, value);
1305
1306         if ((retval = target->type->read_memory(target, address, 1, 1, &value)) != ERROR_OK)
1307         {
1308                 LOG_DEBUG("failed: %i", retval);
1309         }
1310         
1311         return retval;
1312 }
1313
1314 int target_register_user_commands(struct command_context_s *cmd_ctx)
1315 {
1316         register_command(cmd_ctx,  NULL, "reg", handle_reg_command, COMMAND_EXEC, NULL);
1317         register_command(cmd_ctx,  NULL, "poll", handle_poll_command, COMMAND_EXEC, "poll target state");
1318         register_command(cmd_ctx,  NULL, "wait_halt", handle_wait_halt_command, COMMAND_EXEC, "wait for target halt [time (s)]");
1319         register_command(cmd_ctx,  NULL, "halt", handle_halt_command, COMMAND_EXEC, "halt target");
1320         register_command(cmd_ctx,  NULL, "resume", handle_resume_command, COMMAND_EXEC, "resume target [addr]");
1321         register_command(cmd_ctx,  NULL, "step", handle_step_command, COMMAND_EXEC, "step one instruction from current PC or [addr]");
1322         register_command(cmd_ctx,  NULL, "reset", handle_reset_command, COMMAND_EXEC, "reset target [run|halt|init|run_and_halt|run_and_init]");
1323         register_command(cmd_ctx,  NULL, "soft_reset_halt", handle_soft_reset_halt_command, COMMAND_EXEC, "halt the target and do a soft reset");
1324
1325         register_command(cmd_ctx,  NULL, "mdw", handle_md_command, COMMAND_EXEC, "display memory words <addr> [count]");
1326         register_command(cmd_ctx,  NULL, "mdh", handle_md_command, COMMAND_EXEC, "display memory half-words <addr> [count]");
1327         register_command(cmd_ctx,  NULL, "mdb", handle_md_command, COMMAND_EXEC, "display memory bytes <addr> [count]");
1328         
1329         register_command(cmd_ctx,  NULL, "mww", handle_mw_command, COMMAND_EXEC, "write memory word <addr> <value> [count]");
1330         register_command(cmd_ctx,  NULL, "mwh", handle_mw_command, COMMAND_EXEC, "write memory half-word <addr> <value> [count]");
1331         register_command(cmd_ctx,  NULL, "mwb", handle_mw_command, COMMAND_EXEC, "write memory byte <addr> <value> [count]");
1332         
1333         register_command(cmd_ctx,  NULL, "bp", handle_bp_command, COMMAND_EXEC, "set breakpoint <address> <length> [hw]");      
1334         register_command(cmd_ctx,  NULL, "rbp", handle_rbp_command, COMMAND_EXEC, "remove breakpoint <adress>");
1335         register_command(cmd_ctx,  NULL, "wp", handle_wp_command, COMMAND_EXEC, "set watchpoint <address> <length> <r/w/a> [value] [mask]");    
1336         register_command(cmd_ctx,  NULL, "rwp", handle_rwp_command, COMMAND_EXEC, "remove watchpoint <adress>");
1337         
1338         register_command(cmd_ctx,  NULL, "load_image", handle_load_image_command, COMMAND_EXEC, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
1339         register_command(cmd_ctx,  NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image <file> <address> <size>");
1340         register_command(cmd_ctx,  NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image <file> [offset] [type]");
1341         register_command(cmd_ctx,  NULL, "load_binary", handle_load_image_command, COMMAND_EXEC, "[DEPRECATED] load_binary <file> <address>");
1342         register_command(cmd_ctx,  NULL, "dump_binary", handle_dump_image_command, COMMAND_EXEC, "[DEPRECATED] dump_binary <file> <address> <size>");
1343         
1344         target_request_register_commands(cmd_ctx);
1345         trace_register_commands(cmd_ctx);
1346         
1347         return ERROR_OK;
1348 }
1349
1350 int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1351 {
1352         target_t *target = targets;
1353         int count = 0;
1354         
1355         if (argc == 1)
1356         {
1357                 int num = strtoul(args[0], NULL, 0);
1358                 
1359                 while (target)
1360                 {
1361                         count++;
1362                         target = target->next;
1363                 }
1364                 
1365                 if (num < count)
1366                         cmd_ctx->current_target = num;
1367                 else
1368                         command_print(cmd_ctx, "%i is out of bounds, only %i targets are configured", num, count);
1369                         
1370                 return ERROR_OK;
1371         }
1372                 
1373         while (target)
1374         {
1375                 command_print(cmd_ctx, "%i: %s (%s), state: %s", count++, target->type->name, target_endianess_strings[target->endianness], target_state_strings[target->state]);
1376                 target = target->next;
1377         }
1378         
1379         return ERROR_OK;
1380 }
1381
1382 int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1383 {
1384         int i;
1385         int found = 0;
1386         
1387         if (argc < 3)
1388         {
1389                 return ERROR_COMMAND_SYNTAX_ERROR;
1390         }
1391         
1392         /* search for the specified target */
1393         if (args[0] && (args[0][0] != 0))
1394         {
1395                 for (i = 0; target_types[i]; i++)
1396                 {
1397                         if (strcmp(args[0], target_types[i]->name) == 0)
1398                         {
1399                                 target_t **last_target_p = &targets;
1400                                 
1401                                 /* register target specific commands */
1402                                 if (target_types[i]->register_commands(cmd_ctx) != ERROR_OK)
1403                                 {
1404                                         LOG_ERROR("couldn't register '%s' commands", args[0]);
1405                                         exit(-1);
1406                                 }
1407
1408                                 if (*last_target_p)
1409                                 {
1410                                         while ((*last_target_p)->next)
1411                                                 last_target_p = &((*last_target_p)->next);
1412                                         last_target_p = &((*last_target_p)->next);
1413                                 }
1414
1415                                 *last_target_p = malloc(sizeof(target_t));
1416                                 
1417                                 /* allocate memory for each unique target type */
1418                                 (*last_target_p)->type = (target_type_t*)malloc(sizeof(target_type_t));
1419                                 *((*last_target_p)->type) = *target_types[i]; 
1420                                 
1421                                 if (strcmp(args[1], "big") == 0)
1422                                         (*last_target_p)->endianness = TARGET_BIG_ENDIAN;
1423                                 else if (strcmp(args[1], "little") == 0)
1424                                         (*last_target_p)->endianness = TARGET_LITTLE_ENDIAN;
1425                                 else
1426                                 {
1427                                         LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args[1]);
1428                                         return ERROR_COMMAND_SYNTAX_ERROR;
1429                                 }
1430                                 
1431                                 /* what to do on a target reset */
1432                                 (*last_target_p)->reset_mode = RESET_INIT; /* default */
1433                                 if (strcmp(args[2], "reset_halt") == 0)
1434                                         (*last_target_p)->reset_mode = RESET_HALT;
1435                                 else if (strcmp(args[2], "reset_run") == 0)
1436                                         (*last_target_p)->reset_mode = RESET_RUN;
1437                                 else if (strcmp(args[2], "reset_init") == 0)
1438                                         (*last_target_p)->reset_mode = RESET_INIT;
1439                                 else if (strcmp(args[2], "run_and_halt") == 0)
1440                                         (*last_target_p)->reset_mode = RESET_RUN_AND_HALT;
1441                                 else if (strcmp(args[2], "run_and_init") == 0)
1442                                         (*last_target_p)->reset_mode = RESET_RUN_AND_INIT;
1443                                 else
1444                                 {
1445                                         /* Kludge! we want to make this reset arg optional while remaining compatible! */
1446                                         args--;
1447                                         argc++;
1448                                 }
1449                                 (*last_target_p)->run_and_halt_time = 1000; /* default 1s */
1450                                 
1451                                 (*last_target_p)->working_area = 0x0;
1452                                 (*last_target_p)->working_area_size = 0x0;
1453                                 (*last_target_p)->working_areas = NULL;
1454                                 (*last_target_p)->backup_working_area = 0;
1455                                 
1456                                 (*last_target_p)->state = TARGET_UNKNOWN;
1457                                 (*last_target_p)->debug_reason = DBG_REASON_UNDEFINED;
1458                                 (*last_target_p)->reg_cache = NULL;
1459                                 (*last_target_p)->breakpoints = NULL;
1460                                 (*last_target_p)->watchpoints = NULL;
1461                                 (*last_target_p)->next = NULL;
1462                                 (*last_target_p)->arch_info = NULL;
1463                                 
1464                                 /* initialize trace information */
1465                                 (*last_target_p)->trace_info = malloc(sizeof(trace_t));
1466                                 (*last_target_p)->trace_info->num_trace_points = 0;
1467                                 (*last_target_p)->trace_info->trace_points_size = 0;
1468                                 (*last_target_p)->trace_info->trace_points = NULL;
1469                                 (*last_target_p)->trace_info->trace_history_size = 0;
1470                                 (*last_target_p)->trace_info->trace_history = NULL;
1471                                 (*last_target_p)->trace_info->trace_history_pos = 0;
1472                                 (*last_target_p)->trace_info->trace_history_overflowed = 0;
1473                                 
1474                                 (*last_target_p)->dbgmsg = NULL;
1475                                 (*last_target_p)->dbg_msg_enabled = 0;
1476                                                                 
1477                                 (*last_target_p)->type->target_command(cmd_ctx, cmd, args, argc, *last_target_p);
1478                                 
1479                                 found = 1;
1480                                 break;
1481                         }
1482                 }
1483         }
1484         
1485         /* no matching target found */
1486         if (!found)
1487         {
1488                 LOG_ERROR("target '%s' not found", args[0]);
1489                 return ERROR_COMMAND_SYNTAX_ERROR;
1490         }
1491
1492         return ERROR_OK;
1493 }
1494
1495 int target_invoke_script(struct command_context_s *cmd_ctx, target_t *target, char *name)
1496 {
1497         return command_run_linef(cmd_ctx, " if {[catch {info body target_%s_%d} t]==0} {target_%s_%d}", 
1498         name, get_num_by_target(target),
1499         name, get_num_by_target(target));
1500 }
1501
1502 int handle_run_and_halt_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1503 {
1504         target_t *target = NULL;
1505         
1506         if (argc < 2)
1507         {
1508                 return ERROR_COMMAND_SYNTAX_ERROR;
1509         }
1510         
1511         target = get_target_by_num(strtoul(args[0], NULL, 0));
1512         if (!target)
1513         {
1514                 return ERROR_COMMAND_SYNTAX_ERROR;
1515         }
1516         
1517         target->run_and_halt_time = strtoul(args[1], NULL, 0);
1518         
1519         return ERROR_OK;
1520 }
1521
1522 int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1523 {
1524         target_t *target = NULL;
1525         
1526         if ((argc < 4) || (argc > 5))
1527         {
1528                 return ERROR_COMMAND_SYNTAX_ERROR;
1529         }
1530         
1531         target = get_target_by_num(strtoul(args[0], NULL, 0));
1532         if (!target)
1533         {
1534                 return ERROR_COMMAND_SYNTAX_ERROR;
1535         }
1536         target_free_all_working_areas(target);
1537         
1538         target->working_area_phys = target->working_area_virt = strtoul(args[1], NULL, 0);
1539         if (argc == 5)
1540         {
1541                 target->working_area_virt = strtoul(args[4], NULL, 0);
1542         }
1543         target->working_area_size = strtoul(args[2], NULL, 0);
1544         
1545         if (strcmp(args[3], "backup") == 0)
1546         {
1547                 target->backup_working_area = 1;
1548         }
1549         else if (strcmp(args[3], "nobackup") == 0)
1550         {
1551                 target->backup_working_area = 0;
1552         }
1553         else
1554         {
1555                 LOG_ERROR("unrecognized <backup|nobackup> argument (%s)", args[3]);
1556                 return ERROR_COMMAND_SYNTAX_ERROR;
1557         }
1558         
1559         return ERROR_OK;
1560 }
1561
1562
1563 /* process target state changes */
1564 int handle_target(void *priv)
1565 {
1566         target_t *target = targets;
1567         
1568         while (target)
1569         {
1570                 if (target_continous_poll)
1571                 {
1572                         /* polling may fail silently until the target has been examined */
1573                         target_poll(target);
1574                 }
1575         
1576                 target = target->next;
1577         }
1578         
1579         return ERROR_OK;
1580 }
1581
1582 int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1583 {
1584         target_t *target;
1585         reg_t *reg = NULL;
1586         int count = 0;
1587         char *value;
1588         
1589         LOG_DEBUG("-");
1590         
1591         target = get_current_target(cmd_ctx);
1592         
1593         /* list all available registers for the current target */
1594         if (argc == 0)
1595         {
1596                 reg_cache_t *cache = target->reg_cache;
1597                 
1598                 count = 0;
1599                 while(cache)
1600                 {
1601                         int i;
1602                         for (i = 0; i < cache->num_regs; i++)
1603                         {
1604                                 value = buf_to_str(cache->reg_list[i].value, cache->reg_list[i].size, 16);
1605                                 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);
1606                                 free(value);
1607                         }
1608                         cache = cache->next;
1609                 }
1610                 
1611                 return ERROR_OK;
1612         }
1613         
1614         /* access a single register by its ordinal number */
1615         if ((args[0][0] >= '0') && (args[0][0] <= '9'))
1616         {
1617                 int num = strtoul(args[0], NULL, 0);
1618                 reg_cache_t *cache = target->reg_cache;
1619                 
1620                 count = 0;
1621                 while(cache)
1622                 {
1623                         int i;
1624                         for (i = 0; i < cache->num_regs; i++)
1625                         {
1626                                 if (count++ == num)
1627                                 {
1628                                         reg = &cache->reg_list[i];
1629                                         break;
1630                                 }
1631                         }
1632                         if (reg)
1633                                 break;
1634                         cache = cache->next;
1635                 }
1636                 
1637                 if (!reg)
1638                 {
1639                         command_print(cmd_ctx, "%i is out of bounds, the current target has only %i registers (0 - %i)", num, count, count - 1);
1640                         return ERROR_OK;
1641                 }
1642         } else /* access a single register by its name */
1643         {
1644                 reg = register_get_by_name(target->reg_cache, args[0], 1);
1645                 
1646                 if (!reg)
1647                 {
1648                         command_print(cmd_ctx, "register %s not found in current target", args[0]);
1649                         return ERROR_OK;
1650                 }
1651         }
1652
1653         /* display a register */
1654         if ((argc == 1) || ((argc == 2) && !((args[1][0] >= '0') && (args[1][0] <= '9'))))
1655         {
1656                 if ((argc == 2) && (strcmp(args[1], "force") == 0))
1657                         reg->valid = 0;
1658                 
1659                 if (reg->valid == 0)
1660                 {
1661                         reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
1662                         if (arch_type == NULL)
1663                         {
1664                                 LOG_ERROR("BUG: encountered unregistered arch type");
1665                                 return ERROR_OK;
1666                         }
1667                         arch_type->get(reg);
1668                 }
1669                 value = buf_to_str(reg->value, reg->size, 16);
1670                 command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
1671                 free(value);
1672                 return ERROR_OK;
1673         }
1674         
1675         /* set register value */
1676         if (argc == 2)
1677         {
1678                 u8 *buf = malloc(CEIL(reg->size, 8));
1679                 str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0);
1680
1681                 reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
1682                 if (arch_type == NULL)
1683                 {
1684                         LOG_ERROR("BUG: encountered unregistered arch type");
1685                         return ERROR_OK;
1686                 }
1687                 
1688                 arch_type->set(reg, buf);
1689                 
1690                 value = buf_to_str(reg->value, reg->size, 16);
1691                 command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
1692                 free(value);
1693                 
1694                 free(buf);
1695                 
1696                 return ERROR_OK;
1697         }
1698         
1699         command_print(cmd_ctx, "usage: reg <#|name> [value]");
1700         
1701         return ERROR_OK;
1702 }
1703
1704 static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_state state, int ms);
1705
1706 int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1707 {
1708         target_t *target = get_current_target(cmd_ctx);
1709
1710         if (argc == 0)
1711         {
1712                 target_poll(target);
1713                 target_arch_state(target);
1714         }
1715         else
1716         {
1717                 if (strcmp(args[0], "on") == 0)
1718                 {
1719                         target_continous_poll = 1;
1720                 }
1721                 else if (strcmp(args[0], "off") == 0)
1722                 {
1723                         target_continous_poll = 0;
1724                 }
1725                 else
1726                 {
1727                         command_print(cmd_ctx, "arg is \"on\" or \"off\"");
1728                 }
1729         }
1730         
1731         
1732         return ERROR_OK;
1733 }
1734
1735 int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1736 {
1737         int ms = 5000;
1738         
1739         if (argc > 0)
1740         {
1741                 char *end;
1742
1743                 ms = strtoul(args[0], &end, 0) * 1000;
1744                 if (*end)
1745                 {
1746                         command_print(cmd_ctx, "usage: %s [seconds]", cmd);
1747                         return ERROR_OK;
1748                 }
1749         }
1750
1751         return wait_state(cmd_ctx, cmd, TARGET_HALTED, ms); 
1752 }
1753
1754 static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_state state, int ms)
1755 {
1756         int retval;
1757         struct timeval timeout, now;
1758         int once=1;
1759         gettimeofday(&timeout, NULL);
1760         timeval_add_time(&timeout, 0, ms * 1000);
1761         
1762         target_t *target = get_current_target(cmd_ctx);
1763         for (;;)
1764         {
1765                 if ((retval=target_poll(target))!=ERROR_OK)
1766                         return retval;
1767                 target_call_timer_callbacks_now();
1768                 if (target->state == state)
1769                 {
1770                         break;
1771                 }
1772                 if (once)
1773                 {
1774                         once=0;
1775                         command_print(cmd_ctx, "waiting for target %s...", target_state_strings[state]);
1776                 }
1777                 
1778                 gettimeofday(&now, NULL);
1779                 if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
1780                 {
1781                         LOG_ERROR("timed out while waiting for target %s", target_state_strings[state]);
1782                         break;
1783                 }
1784         }
1785         
1786         return ERROR_OK;
1787 }
1788
1789 int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1790 {
1791         int retval;
1792         target_t *target = get_current_target(cmd_ctx);
1793
1794         LOG_DEBUG("-");
1795
1796         if ((retval = target_halt(target)) != ERROR_OK)
1797         {
1798                 return retval;
1799         }
1800         
1801         return handle_wait_halt_command(cmd_ctx, cmd, args, argc);
1802 }
1803
1804 int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1805 {
1806         target_t *target = get_current_target(cmd_ctx);
1807         
1808         LOG_USER("requesting target halt and executing a soft reset");
1809         
1810         target->type->soft_reset_halt(target);
1811         
1812         return ERROR_OK;
1813 }
1814
1815 int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1816 {
1817         target_t *target = get_current_target(cmd_ctx);
1818         enum target_reset_mode reset_mode = target->reset_mode;
1819         enum target_reset_mode save = target->reset_mode;
1820         
1821         LOG_DEBUG("-");
1822         
1823         if (argc >= 1)
1824         {
1825                 if (strcmp("run", args[0]) == 0)
1826                         reset_mode = RESET_RUN;
1827                 else if (strcmp("halt", args[0]) == 0)
1828                         reset_mode = RESET_HALT;
1829                 else if (strcmp("init", args[0]) == 0)
1830                         reset_mode = RESET_INIT;
1831                 else if (strcmp("run_and_halt", args[0]) == 0)
1832                 {
1833                         reset_mode = RESET_RUN_AND_HALT;
1834                         if (argc >= 2)
1835                         {
1836                                 target->run_and_halt_time = strtoul(args[1], NULL, 0);
1837                         }
1838                 }
1839                 else if (strcmp("run_and_init", args[0]) == 0)
1840                 {
1841                         reset_mode = RESET_RUN_AND_INIT;
1842                         if (argc >= 2)
1843                         {
1844                                 target->run_and_halt_time = strtoul(args[1], NULL, 0);
1845                         }
1846                 }
1847                 else
1848                 {
1849                         command_print(cmd_ctx, "usage: reset ['run', 'halt', 'init', 'run_and_halt', 'run_and_init]");
1850                         return ERROR_OK;
1851                 }
1852         }
1853         
1854         /* temporarily modify mode of current reset target */
1855         target->reset_mode = reset_mode;
1856
1857         /* reset *all* targets */
1858         target_process_reset(cmd_ctx);
1859         
1860         /* Restore default reset mode for this target */
1861     target->reset_mode = save;
1862         
1863         return ERROR_OK;
1864 }
1865
1866 int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1867 {
1868         int retval;
1869         target_t *target = get_current_target(cmd_ctx);
1870         
1871         target_invoke_script(cmd_ctx, target, "pre_resume");
1872         
1873         if (argc == 0)
1874                 retval = target_resume(target, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
1875         else if (argc == 1)
1876                 retval = target_resume(target, 0, strtoul(args[0], NULL, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
1877         else
1878         {
1879                 return ERROR_COMMAND_SYNTAX_ERROR;
1880         }
1881         
1882         return retval;
1883 }
1884
1885 int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1886 {
1887         target_t *target = get_current_target(cmd_ctx);
1888         
1889         LOG_DEBUG("-");
1890         
1891         if (argc == 0)
1892                 target->type->step(target, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
1893
1894         if (argc == 1)
1895                 target->type->step(target, 0, strtoul(args[0], NULL, 0), 1); /* addr = args[0], handle breakpoints */
1896         
1897         return ERROR_OK;
1898 }
1899
1900 int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1901 {
1902         const int line_bytecnt = 32;
1903         int count = 1;
1904         int size = 4;
1905         u32 address = 0;
1906         int line_modulo;
1907         int i;
1908
1909         char output[128];
1910         int output_len;
1911
1912         int retval;
1913
1914         u8 *buffer;
1915         target_t *target = get_current_target(cmd_ctx);
1916
1917         if (argc < 1)
1918                 return ERROR_OK;
1919
1920         if (argc == 2)
1921                 count = strtoul(args[1], NULL, 0);
1922
1923         address = strtoul(args[0], NULL, 0);
1924         
1925
1926         switch (cmd[2])
1927         {
1928                 case 'w':
1929                         size = 4; line_modulo = line_bytecnt / 4;
1930                         break;
1931                 case 'h':
1932                         size = 2; line_modulo = line_bytecnt / 2;
1933                         break;
1934                 case 'b':
1935                         size = 1; line_modulo = line_bytecnt / 1;
1936                         break;
1937                 default:
1938                         return ERROR_OK;
1939         }
1940
1941         buffer = calloc(count, size);
1942         retval  = target->type->read_memory(target, address, size, count, buffer);
1943         if (retval == ERROR_OK)
1944         {
1945                 output_len = 0;
1946         
1947                 for (i = 0; i < count; i++)
1948                 {
1949                         if (i%line_modulo == 0)
1950                                 output_len += snprintf(output + output_len, 128 - output_len, "0x%8.8x: ", address + (i*size));
1951                         
1952                         switch (size)
1953                         {
1954                                 case 4:
1955                                         output_len += snprintf(output + output_len, 128 - output_len, "%8.8x ", target_buffer_get_u32(target, &buffer[i*4]));
1956                                         break;
1957                                 case 2:
1958                                         output_len += snprintf(output + output_len, 128 - output_len, "%4.4x ", target_buffer_get_u16(target, &buffer[i*2]));
1959                                         break;
1960                                 case 1:
1961                                         output_len += snprintf(output + output_len, 128 - output_len, "%2.2x ", buffer[i*1]);
1962                                         break;
1963                         }
1964         
1965                         if ((i%line_modulo == line_modulo-1) || (i == count - 1))
1966                         {
1967                                 command_print(cmd_ctx, output);
1968                                 output_len = 0;
1969                         }
1970                 }
1971         }
1972
1973         free(buffer);
1974         
1975         return retval;
1976 }
1977
1978 int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1979 {
1980         u32 address = 0;
1981         u32 value = 0;
1982         int count = 1;
1983         int i;
1984         int wordsize;
1985         target_t *target = get_current_target(cmd_ctx);
1986         u8 value_buf[4];
1987
1988          if ((argc < 2) || (argc > 3))
1989                 return ERROR_COMMAND_SYNTAX_ERROR;
1990
1991         address = strtoul(args[0], NULL, 0);
1992         value = strtoul(args[1], NULL, 0);
1993         if (argc == 3)
1994                 count = strtoul(args[2], NULL, 0);
1995         
1996         switch (cmd[2])
1997         {
1998                 case 'w':
1999                         wordsize = 4;
2000                         target_buffer_set_u32(target, value_buf, value);
2001                         break;
2002                 case 'h':
2003                         wordsize = 2;
2004                         target_buffer_set_u16(target, value_buf, value);
2005                         break;
2006                 case 'b':
2007                         wordsize = 1;
2008                         value_buf[0] = value;
2009                         break;
2010                 default:
2011                         return ERROR_COMMAND_SYNTAX_ERROR;
2012         }
2013         for (i=0; i<count; i++)
2014         {
2015                 int retval;
2016                 switch (wordsize)
2017                 {
2018                         case 4:
2019                                 retval = target->type->write_memory(target, address + i*wordsize, 4, 1, value_buf);
2020                                 break;
2021                         case 2:
2022                                 retval = target->type->write_memory(target, address + i*wordsize, 2, 1, value_buf);
2023                                 break;
2024                         case 1:
2025                                 retval = target->type->write_memory(target, address + i*wordsize, 1, 1, value_buf);
2026                         break;
2027                         default:
2028                         return ERROR_OK;
2029                 }
2030                 if (retval!=ERROR_OK)
2031                 {
2032                         return retval;
2033                 }
2034         }
2035
2036         return ERROR_OK;
2037
2038 }
2039
2040 int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2041 {
2042         u8 *buffer;
2043         u32 buf_cnt;
2044         u32 image_size;
2045         int i;
2046         int retval;
2047
2048         image_t image;  
2049         
2050         duration_t duration;
2051         char *duration_text;
2052         
2053         target_t *target = get_current_target(cmd_ctx);
2054
2055         if (argc < 1)
2056         {
2057                 command_print(cmd_ctx, "usage: load_image <filename> [address] [type]");
2058                 return ERROR_OK;
2059         }
2060         
2061         /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
2062         if (argc >= 2)
2063         {
2064                 image.base_address_set = 1;
2065                 image.base_address = strtoul(args[1], NULL, 0);
2066         }
2067         else
2068         {
2069                 image.base_address_set = 0;
2070         }
2071         
2072         image.start_address_set = 0;
2073
2074         duration_start_measure(&duration);
2075         
2076         if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
2077         {
2078                 return ERROR_OK;
2079         }
2080         
2081         image_size = 0x0;
2082         retval = ERROR_OK;
2083         for (i = 0; i < image.num_sections; i++)
2084         {
2085                 buffer = malloc(image.sections[i].size);
2086                 if (buffer == NULL)
2087                 {
2088                         command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
2089                         break;
2090                 }
2091                 
2092                 if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
2093                 {
2094                         free(buffer);
2095                         break;
2096                 }
2097                 if ((retval = target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer)) != ERROR_OK)
2098                 {
2099                         free(buffer);
2100                         break;
2101                 }
2102                 image_size += buf_cnt;
2103                 command_print(cmd_ctx, "%u byte written at address 0x%8.8x", buf_cnt, image.sections[i].base_address);
2104                 
2105                 free(buffer);
2106         }
2107
2108         duration_stop_measure(&duration, &duration_text);
2109         if (retval==ERROR_OK)
2110         {
2111                 command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text);
2112         }
2113         free(duration_text);
2114         
2115         image_close(&image);
2116
2117         return retval;
2118
2119 }
2120
2121 int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2122 {
2123         fileio_t fileio;
2124         
2125         u32 address;
2126         u32 size;
2127         u8 buffer[560];
2128         int retval=ERROR_OK;
2129         
2130         duration_t duration;
2131         char *duration_text;
2132         
2133         target_t *target = get_current_target(cmd_ctx);
2134
2135         if (argc != 3)
2136         {
2137                 command_print(cmd_ctx, "usage: dump_image <filename> <address> <size>");
2138                 return ERROR_OK;
2139         }
2140
2141         address = strtoul(args[1], NULL, 0);
2142         size = strtoul(args[2], NULL, 0);
2143
2144         if ((address & 3) || (size & 3))
2145         {
2146                 command_print(cmd_ctx, "only 32-bit aligned address and size are supported");
2147                 return ERROR_OK;
2148         }
2149         
2150         if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
2151         {
2152                 return ERROR_OK;
2153         }
2154         
2155         duration_start_measure(&duration);
2156         
2157         while (size > 0)
2158         {
2159                 u32 size_written;
2160                 u32 this_run_size = (size > 560) ? 560 : size;
2161                 
2162                 retval = target->type->read_memory(target, address, 4, this_run_size / 4, buffer);
2163                 if (retval != ERROR_OK)
2164                 {
2165                         break;
2166                 }
2167                 
2168                 retval = fileio_write(&fileio, this_run_size, buffer, &size_written);
2169                 if (retval != ERROR_OK)
2170                 {
2171                         break;
2172                 }
2173                 
2174                 size -= this_run_size;
2175                 address += this_run_size;
2176         }
2177
2178         fileio_close(&fileio);
2179
2180         duration_stop_measure(&duration, &duration_text);
2181         if (retval==ERROR_OK)
2182         {
2183                 command_print(cmd_ctx, "dumped %"PRIi64" byte in %s", fileio.size, duration_text);
2184         }
2185         free(duration_text);
2186         
2187         return ERROR_OK;
2188 }
2189
2190 int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2191 {
2192         u8 *buffer;
2193         u32 buf_cnt;
2194         u32 image_size;
2195         int i;
2196         int retval;
2197         u32 checksum = 0;
2198         u32 mem_checksum = 0;
2199
2200         image_t image;  
2201         
2202         duration_t duration;
2203         char *duration_text;
2204         
2205         target_t *target = get_current_target(cmd_ctx);
2206         
2207         if (argc < 1)
2208         {
2209                 return ERROR_COMMAND_SYNTAX_ERROR;
2210         }
2211         
2212         if (!target)
2213         {
2214                 LOG_ERROR("no target selected");
2215                 return ERROR_FAIL;
2216         }
2217         
2218         duration_start_measure(&duration);
2219         
2220         if (argc >= 2)
2221         {
2222                 image.base_address_set = 1;
2223                 image.base_address = strtoul(args[1], NULL, 0);
2224         }
2225         else
2226         {
2227                 image.base_address_set = 0;
2228                 image.base_address = 0x0;
2229         }
2230
2231         image.start_address_set = 0;
2232
2233         if ((retval=image_open(&image, args[0], (argc == 3) ? args[2] : NULL)) != ERROR_OK)
2234         {
2235                 return retval;
2236         }
2237         
2238         image_size = 0x0;
2239         retval=ERROR_OK;
2240         for (i = 0; i < image.num_sections; i++)
2241         {
2242                 buffer = malloc(image.sections[i].size);
2243                 if (buffer == NULL)
2244                 {
2245                         command_print(cmd_ctx, "error allocating buffer for section (%d bytes)", image.sections[i].size);
2246                         break;
2247                 }
2248                 if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
2249                 {
2250                         free(buffer);
2251                         break;
2252                 }
2253                 
2254                 /* calculate checksum of image */
2255                 image_calculate_checksum( buffer, buf_cnt, &checksum );
2256                 
2257                 retval = target_checksum_memory(target, image.sections[i].base_address, buf_cnt, &mem_checksum);
2258                 if( retval != ERROR_OK )
2259                 {
2260                         free(buffer);
2261                         break;
2262                 }
2263                 
2264                 if( checksum != mem_checksum )
2265                 {
2266                         /* failed crc checksum, fall back to a binary compare */
2267                         u8 *data;
2268                         
2269                         command_print(cmd_ctx, "checksum mismatch - attempting binary compare");
2270                         
2271                         data = (u8*)malloc(buf_cnt);
2272                         
2273                         /* Can we use 32bit word accesses? */
2274                         int size = 1;
2275                         int count = buf_cnt;
2276                         if ((count % 4) == 0)
2277                         {
2278                                 size *= 4;
2279                                 count /= 4;
2280                         }
2281                         retval = target->type->read_memory(target, image.sections[i].base_address, size, count, data);
2282                         if (retval == ERROR_OK)
2283                         {
2284                                 int t;
2285                                 for (t = 0; t < buf_cnt; t++)
2286                                 {
2287                                         if (data[t] != buffer[t])
2288                                         {
2289                                                 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]);
2290                                                 free(data);
2291                                                 free(buffer);
2292                                                 retval=ERROR_FAIL;
2293                                                 goto done;
2294                                         }
2295                                 }
2296                         }
2297                         
2298                         free(data);
2299                 }
2300                 
2301                 free(buffer);
2302                 image_size += buf_cnt;
2303         }
2304 done:   
2305         duration_stop_measure(&duration, &duration_text);
2306         if (retval==ERROR_OK)
2307         {
2308                 command_print(cmd_ctx, "verified %u bytes in %s", image_size, duration_text);
2309         }
2310         free(duration_text);
2311         
2312         image_close(&image);
2313         
2314         return retval;
2315 }
2316
2317 int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2318 {
2319         int retval;
2320         target_t *target = get_current_target(cmd_ctx);
2321
2322         if (argc == 0)
2323         {
2324                 breakpoint_t *breakpoint = target->breakpoints;
2325
2326                 while (breakpoint)
2327                 {
2328                         if (breakpoint->type == BKPT_SOFT)
2329                         {
2330                                 char* buf = buf_to_str(breakpoint->orig_instr, breakpoint->length, 16);
2331                                 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint->address, breakpoint->length, breakpoint->set, buf);
2332                                 free(buf);
2333                         }
2334                         else
2335                         {
2336                                 command_print(cmd_ctx, "0x%8.8x, 0x%x, %i", breakpoint->address, breakpoint->length, breakpoint->set);
2337                         }
2338                         breakpoint = breakpoint->next;
2339                 }
2340         }
2341         else if (argc >= 2)
2342         {
2343                 int hw = BKPT_SOFT;
2344                 u32 length = 0;
2345
2346                 length = strtoul(args[1], NULL, 0);
2347                 
2348                 if (argc >= 3)
2349                         if (strcmp(args[2], "hw") == 0)
2350                                 hw = BKPT_HARD;
2351
2352                 if ((retval = breakpoint_add(target, strtoul(args[0], NULL, 0), length, hw)) != ERROR_OK)
2353                 {
2354                         LOG_ERROR("Failure setting breakpoints");
2355                 }
2356                 else
2357                 {
2358                         command_print(cmd_ctx, "breakpoint added at address 0x%8.8x", strtoul(args[0], NULL, 0));
2359                 }
2360         }
2361         else
2362         {
2363                 command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
2364         }
2365
2366         return ERROR_OK;
2367 }
2368
2369 int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2370 {
2371         target_t *target = get_current_target(cmd_ctx);
2372
2373         if (argc > 0)
2374                 breakpoint_remove(target, strtoul(args[0], NULL, 0));
2375
2376         return ERROR_OK;
2377 }
2378
2379 int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2380 {
2381         target_t *target = get_current_target(cmd_ctx);
2382         int retval;
2383
2384         if (argc == 0)
2385         {
2386                 watchpoint_t *watchpoint = target->watchpoints;
2387
2388                 while (watchpoint)
2389                 {
2390                         command_print(cmd_ctx, "address: 0x%8.8x, len: 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);
2391                         watchpoint = watchpoint->next;
2392                 }
2393         } 
2394         else if (argc >= 2)
2395         {
2396                 enum watchpoint_rw type = WPT_ACCESS;
2397                 u32 data_value = 0x0;
2398                 u32 data_mask = 0xffffffff;
2399                 
2400                 if (argc >= 3)
2401                 {
2402                         switch(args[2][0])
2403                         {
2404                                 case 'r':
2405                                         type = WPT_READ;
2406                                         break;
2407                                 case 'w':
2408                                         type = WPT_WRITE;
2409                                         break;
2410                                 case 'a':
2411                                         type = WPT_ACCESS;
2412                                         break;
2413                                 default:
2414                                         command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2415                                         return ERROR_OK;
2416                         }
2417                 }
2418                 if (argc >= 4)
2419                 {
2420                         data_value = strtoul(args[3], NULL, 0);
2421                 }
2422                 if (argc >= 5)
2423                 {
2424                         data_mask = strtoul(args[4], NULL, 0);
2425                 }
2426                 
2427                 if ((retval = watchpoint_add(target, strtoul(args[0], NULL, 0),
2428                                 strtoul(args[1], NULL, 0), type, data_value, data_mask)) != ERROR_OK)
2429                 {
2430                         LOG_ERROR("Failure setting breakpoints");
2431                 }
2432         }
2433         else
2434         {
2435                 command_print(cmd_ctx, "usage: wp <address> <length> [r/w/a] [value] [mask]");
2436         }
2437                 
2438         return ERROR_OK;
2439 }
2440
2441 int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2442 {
2443         target_t *target = get_current_target(cmd_ctx);
2444
2445         if (argc > 0)
2446                 watchpoint_remove(target, strtoul(args[0], NULL, 0));
2447         
2448         return ERROR_OK;
2449 }
2450
2451 int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc)
2452 {
2453         int retval;
2454         target_t *target = get_current_target(cmd_ctx);
2455         u32 va;
2456         u32 pa;
2457
2458         if (argc != 1)
2459         {
2460                 return ERROR_COMMAND_SYNTAX_ERROR;
2461         }
2462         va = strtoul(args[0], NULL, 0);
2463
2464         retval = target->type->virt2phys(target, va, &pa);
2465         if (retval == ERROR_OK)
2466         {
2467                 command_print(cmd_ctx, "Physical address 0x%08x", pa);
2468         }
2469         else
2470         {
2471                 /* lower levels will have logged a detailed error which is 
2472                  * forwarded to telnet/GDB session.  
2473                  */
2474         }
2475         return retval;
2476 }
2477 static void writeLong(FILE *f, int l)
2478 {
2479         int i;
2480         for (i=0; i<4; i++)
2481         {
2482                 char c=(l>>(i*8))&0xff;
2483                 fwrite(&c, 1, 1, f); 
2484         }
2485         
2486 }
2487 static void writeString(FILE *f, char *s)
2488 {
2489         fwrite(s, 1, strlen(s), f); 
2490 }
2491
2492
2493
2494 // Dump a gmon.out histogram file.
2495 static void writeGmon(u32 *samples, int sampleNum, char *filename)
2496 {
2497         int i;
2498         FILE *f=fopen(filename, "w");
2499         if (f==NULL)
2500                 return;
2501         fwrite("gmon", 1, 4, f);
2502         writeLong(f, 0x00000001); // Version
2503         writeLong(f, 0); // padding
2504         writeLong(f, 0); // padding
2505         writeLong(f, 0); // padding
2506                                 
2507         fwrite("", 1, 1, f);  // GMON_TAG_TIME_HIST 
2508
2509         // figure out bucket size
2510         u32 min=samples[0];
2511         u32 max=samples[0];
2512         for (i=0; i<sampleNum; i++)
2513         {
2514                 if (min>samples[i])
2515                 {
2516                         min=samples[i];
2517                 }
2518                 if (max<samples[i])
2519                 {
2520                         max=samples[i];
2521                 }
2522         }
2523
2524         int addressSpace=(max-min+1);
2525         
2526         static int const maxBuckets=256*1024; // maximum buckets.
2527         int length=addressSpace;
2528         if (length > maxBuckets)
2529         {
2530                 length=maxBuckets; 
2531         }
2532         int *buckets=malloc(sizeof(int)*length);
2533         if (buckets==NULL)
2534         {
2535                 fclose(f);
2536                 return;
2537         }
2538         memset(buckets, 0, sizeof(int)*length);
2539         for (i=0; i<sampleNum;i++)
2540         {
2541                 u32 address=samples[i];
2542                 long long a=address-min;
2543                 long long b=length-1;
2544                 long long c=addressSpace-1;
2545                 int index=(a*b)/c; // danger!!!! int32 overflows 
2546                 buckets[index]++;
2547         }
2548         
2549         //                         append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr))
2550         writeLong(f, min);                                      // low_pc
2551         writeLong(f, max);              // high_pc
2552         writeLong(f, length);           // # of samples
2553         writeLong(f, 64000000);                         // 64MHz
2554         writeString(f, "seconds");
2555         for (i=0; i<(15-strlen("seconds")); i++)
2556         {
2557                 fwrite("", 1, 1, f);  // padding
2558         }
2559         writeString(f, "s");
2560                 
2561 //                         append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size)
2562         
2563         char *data=malloc(2*length);
2564         if (data!=NULL)
2565         {
2566                 for (i=0; i<length;i++)
2567                 {
2568                         int val;
2569                         val=buckets[i];
2570                         if (val>65535)
2571                         {
2572                                 val=65535;
2573                         }
2574                         data[i*2]=val&0xff;
2575                         data[i*2+1]=(val>>8)&0xff;
2576                 }
2577                 free(buckets);
2578                 fwrite(data, 1, length*2, f);
2579                 free(data);
2580         } else
2581         {
2582                 free(buckets);
2583         }
2584
2585         fclose(f);
2586 }
2587
2588 /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
2589 int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
2590 {
2591         target_t *target = get_current_target(cmd_ctx);
2592         struct timeval timeout, now;
2593         
2594         gettimeofday(&timeout, NULL);
2595         if (argc!=2)
2596         {
2597                 return ERROR_COMMAND_SYNTAX_ERROR;
2598         }
2599         char *end;
2600         timeval_add_time(&timeout, strtoul(args[0], &end, 0), 0);
2601         if (*end) 
2602         {
2603                 return ERROR_OK;
2604         }
2605         
2606         command_print(cmd_ctx, "Starting profiling. Halting and resuming the target as often as we can...");
2607
2608         static const int maxSample=10000;
2609         u32 *samples=malloc(sizeof(u32)*maxSample);
2610         if (samples==NULL)
2611                 return ERROR_OK;
2612         
2613         int numSamples=0;
2614         int retval=ERROR_OK;
2615         // hopefully it is safe to cache! We want to stop/restart as quickly as possible.
2616         reg_t *reg = register_get_by_name(target->reg_cache, "pc", 1);
2617         
2618         for (;;)
2619         {
2620                 target_poll(target);
2621                 if (target->state == TARGET_HALTED)
2622                 {
2623                         u32 t=*((u32 *)reg->value);
2624                         samples[numSamples++]=t;
2625                         retval = target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2626                         target_poll(target);
2627                         usleep(10*1000); // sleep 10ms, i.e. <100 samples/second.
2628                 } else if (target->state == TARGET_RUNNING)
2629                 {
2630                         // We want to quickly sample the PC.
2631                         target_halt(target);
2632                 } else
2633                 {
2634                         command_print(cmd_ctx, "Target not halted or running");
2635                         retval=ERROR_OK;
2636                         break;
2637                 }
2638                 if (retval!=ERROR_OK)
2639                 {
2640                         break;
2641                 }
2642                 
2643                 gettimeofday(&now, NULL);
2644                 if ((numSamples>=maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
2645                 {
2646                         command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples);
2647                         target_poll(target);
2648                         if (target->state == TARGET_HALTED)
2649                         {
2650                                 target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
2651                         }
2652                         target_poll(target);
2653                         writeGmon(samples, numSamples, args[1]);
2654                         command_print(cmd_ctx, "Wrote %s", args[1]);
2655                         break;
2656                 }
2657         }
2658         free(samples);
2659         
2660         return ERROR_OK;
2661 }
2662
2663 static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 val)
2664 {
2665         char *namebuf;
2666         Jim_Obj *nameObjPtr, *valObjPtr;
2667         int result;
2668
2669         namebuf = alloc_printf("%s(%d)", varname, idx);
2670         if (!namebuf)
2671                 return JIM_ERR;
2672         
2673         nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
2674         valObjPtr = Jim_NewIntObj(interp, val);
2675         if (!nameObjPtr || !valObjPtr)
2676         {
2677                 free(namebuf);
2678                 return JIM_ERR;
2679         }
2680
2681         Jim_IncrRefCount(nameObjPtr);
2682         Jim_IncrRefCount(valObjPtr);
2683         result = Jim_SetVariable(interp, nameObjPtr, valObjPtr);
2684         Jim_DecrRefCount(interp, nameObjPtr);
2685         Jim_DecrRefCount(interp, valObjPtr);
2686         free(namebuf);
2687         /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
2688         return result;
2689 }
2690
2691 static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
2692 {
2693         target_t *target;
2694         command_context_t *context;
2695         long l;
2696         u32 width;
2697         u32 len;
2698         u32 addr;
2699         u32 count;
2700         u32 v;
2701         const char *varname;
2702         u8 buffer[4096];
2703         int  i, n, e, retval;
2704
2705         /* argv[1] = name of array to receive the data
2706          * argv[2] = desired width
2707          * argv[3] = memory address 
2708          * argv[4] = count of times to read
2709          */
2710         if (argc != 5) {
2711                 Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
2712                 return JIM_ERR;
2713         }
2714         varname = Jim_GetString(argv[1], &len);
2715         /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2716
2717         e = Jim_GetLong(interp, argv[2], &l);
2718         width = l;
2719         if (e != JIM_OK) {
2720                 return e;
2721         }
2722         
2723         e = Jim_GetLong(interp, argv[3], &l);
2724         addr = l;
2725         if (e != JIM_OK) {
2726                 return e;
2727         }
2728         e = Jim_GetLong(interp, argv[4], &l);
2729         len = l;
2730         if (e != JIM_OK) {
2731                 return e;
2732         }
2733         switch (width) {
2734                 case 8:
2735                         width = 1;
2736                         break;
2737                 case 16:
2738                         width = 2;
2739                         break;
2740                 case 32:
2741                         width = 4;
2742                         break;
2743                 default:
2744                         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2745                         Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
2746                         return JIM_ERR;
2747         }
2748         if (len == 0) {
2749                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2750                 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: zero width read?", NULL);
2751                 return JIM_ERR;
2752         }
2753         if ((addr + (len * width)) < addr) {
2754                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2755                 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: addr + len - wraps to zero?", NULL);
2756                 return JIM_ERR;
2757         }
2758         /* absurd transfer size? */
2759         if (len > 65536) {
2760                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2761                 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: absurd > 64K item request", NULL);
2762                 return JIM_ERR;
2763         }               
2764                 
2765         if ((width == 1) ||
2766                 ((width == 2) && ((addr & 1) == 0)) ||
2767                 ((width == 4) && ((addr & 3) == 0))) {
2768                 /* all is well */
2769         } else {
2770                 char buf[100];
2771                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2772                 sprintf(buf, "mem2array address: 0x%08x is not aligned for %d byte reads", addr, width); 
2773                 Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
2774                 return JIM_ERR;
2775         }
2776
2777         context = Jim_GetAssocData(interp, "context");
2778         if (context == NULL)
2779         {
2780                 LOG_ERROR("mem2array: no command context");
2781                 return JIM_ERR;
2782         }
2783         target = get_current_target(context);
2784         if (target == NULL)
2785         {
2786                 LOG_ERROR("mem2array: no current target");
2787                 return JIM_ERR;
2788         }
2789         
2790         /* Transfer loop */
2791
2792         /* index counter */
2793         n = 0;
2794         /* assume ok */
2795         e = JIM_OK;
2796         while (len) {
2797                 /* Slurp... in buffer size chunks */
2798                 
2799                 count = len; /* in objects.. */
2800                 if (count > (sizeof(buffer)/width)) {
2801                         count = (sizeof(buffer)/width);
2802                 }
2803                 
2804                 retval = target->type->read_memory( target, addr, width, count, buffer );
2805                 if (retval != ERROR_OK) {
2806                         /* BOO !*/
2807                         LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
2808                         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2809                         Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
2810                         e = JIM_ERR;
2811                         len = 0;
2812                 } else {
2813                         v = 0; /* shut up gcc */
2814                         for (i = 0 ;i < count ;i++, n++) {
2815                                 switch (width) {
2816                                         case 4:
2817                                                 v = target_buffer_get_u32(target, &buffer[i*width]);
2818                                                 break;
2819                                         case 2:
2820                                                 v = target_buffer_get_u16(target, &buffer[i*width]);
2821                                                 break;
2822                                         case 1:
2823                                                 v = buffer[i] & 0x0ff;
2824                                                 break;
2825                                 }
2826                                 new_int_array_element(interp, varname, n, v);
2827                         }
2828                         len -= count;
2829                 }
2830         }
2831         
2832         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2833
2834         return JIM_OK;
2835 }
2836
2837 static int get_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 *val)
2838 {
2839         char *namebuf;
2840         Jim_Obj *nameObjPtr, *valObjPtr;
2841         int result;
2842         long l;
2843
2844         namebuf = alloc_printf("%s(%d)", varname, idx);
2845         if (!namebuf)
2846                 return JIM_ERR;
2847
2848         nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
2849         if (!nameObjPtr)
2850         {
2851                 free(namebuf);
2852                 return JIM_ERR;
2853         }
2854
2855         Jim_IncrRefCount(nameObjPtr);
2856         valObjPtr = Jim_GetVariable(interp, nameObjPtr, JIM_ERRMSG);
2857         Jim_DecrRefCount(interp, nameObjPtr);
2858         free(namebuf);
2859         if (valObjPtr == NULL)
2860                 return JIM_ERR;
2861
2862         result = Jim_GetLong(interp, valObjPtr, &l);
2863         /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
2864         *val = l;
2865         return result;
2866 }
2867
2868 static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
2869 {
2870         target_t *target;
2871         command_context_t *context;
2872         long l;
2873         u32 width;
2874         u32 len;
2875         u32 addr;
2876         u32 count;
2877         u32 v;
2878         const char *varname;
2879         u8 buffer[4096];
2880         int  i, n, e, retval;
2881
2882         /* argv[1] = name of array to get the data
2883          * argv[2] = desired width
2884          * argv[3] = memory address 
2885          * argv[4] = count to write
2886          */
2887         if (argc != 5) {
2888                 Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
2889                 return JIM_ERR;
2890         }
2891         varname = Jim_GetString(argv[1], &len);
2892         /* given "foo" get space for worse case "foo(%d)" .. add 20 */
2893
2894         e = Jim_GetLong(interp, argv[2], &l);
2895         width = l;
2896         if (e != JIM_OK) {
2897                 return e;
2898         }
2899         
2900         e = Jim_GetLong(interp, argv[3], &l);
2901         addr = l;
2902         if (e != JIM_OK) {
2903                 return e;
2904         }
2905         e = Jim_GetLong(interp, argv[4], &l);
2906         len = l;
2907         if (e != JIM_OK) {
2908                 return e;
2909         }
2910         switch (width) {
2911                 case 8:
2912                         width = 1;
2913                         break;
2914                 case 16:
2915                         width = 2;
2916                         break;
2917                 case 32:
2918                         width = 4;
2919                         break;
2920                 default:
2921                         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2922                         Jim_AppendStrings( interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL );
2923                         return JIM_ERR;
2924         }
2925         if (len == 0) {
2926                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2927                 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: zero width read?", NULL);
2928                 return JIM_ERR;
2929         }
2930         if ((addr + (len * width)) < addr) {
2931                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2932                 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: addr + len - wraps to zero?", NULL);
2933                 return JIM_ERR;
2934         }
2935         /* absurd transfer size? */
2936         if (len > 65536) {
2937                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2938                 Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: absurd > 64K item request", NULL);
2939                 return JIM_ERR;
2940         }               
2941                 
2942         if ((width == 1) ||
2943                 ((width == 2) && ((addr & 1) == 0)) ||
2944                 ((width == 4) && ((addr & 3) == 0))) {
2945                 /* all is well */
2946         } else {
2947                 char buf[100];
2948                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
2949                 sprintf(buf, "array2mem address: 0x%08x is not aligned for %d byte reads", addr, width); 
2950                 Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
2951                 return JIM_ERR;
2952         }
2953
2954         context = Jim_GetAssocData(interp, "context");
2955         if (context == NULL)
2956         {
2957                 LOG_ERROR("array2mem: no command context");
2958                 return JIM_ERR;
2959         }
2960         target = get_current_target(context);
2961         if (target == NULL)
2962         {
2963                 LOG_ERROR("array2mem: no current target");
2964                 return JIM_ERR;
2965         }
2966         
2967         /* Transfer loop */
2968
2969         /* index counter */
2970         n = 0;
2971         /* assume ok */
2972         e = JIM_OK;
2973         while (len) {
2974                 /* Slurp... in buffer size chunks */
2975                 
2976                 count = len; /* in objects.. */
2977                 if (count > (sizeof(buffer)/width)) {
2978                         count = (sizeof(buffer)/width);
2979                 }
2980
2981                 v = 0; /* shut up gcc */
2982                 for (i = 0 ;i < count ;i++, n++) {
2983                         get_int_array_element(interp, varname, n, &v);
2984                         switch (width) {
2985                         case 4:
2986                                 target_buffer_set_u32(target, &buffer[i*width], v);
2987                                 break;
2988                         case 2:
2989                                 target_buffer_set_u16(target, &buffer[i*width], v);
2990                                 break;
2991                         case 1:
2992                                 buffer[i] = v & 0x0ff;
2993                                 break;
2994                         }
2995                 }
2996                 len -= count;
2997
2998                 retval = target->type->write_memory(target, addr, width, count, buffer);
2999                 if (retval != ERROR_OK) {
3000                         /* BOO !*/
3001                         LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed", addr, width, count);
3002                         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3003                         Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
3004                         e = JIM_ERR;
3005                         len = 0;
3006                 }
3007         }
3008         
3009         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3010
3011         return JIM_OK;
3012 }