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