target: Fix strange ordering in target_read_u8
[fw/openocd] / src / target / target.c
1 /***************************************************************************
2  *   Copyright (C) 2005 by Dominic Rath                                    *
3  *   Dominic.Rath@gmx.de                                                   *
4  *                                                                         *
5  *   Copyright (C) 2007-2010 Ã˜yvind Harboe                                 *
6  *   oyvind.harboe@zylin.com                                               *
7  *                                                                         *
8  *   Copyright (C) 2008, Duane Ellis                                       *
9  *   openocd@duaneeellis.com                                               *
10  *                                                                         *
11  *   Copyright (C) 2008 by Spencer Oliver                                  *
12  *   spen@spen-soft.co.uk                                                  *
13  *                                                                         *
14  *   Copyright (C) 2008 by Rick Altherr                                    *
15  *   kc8apf@kc8apf.net>                                                    *
16  *                                                                         *
17  *   Copyright (C) 2011 by Broadcom Corporation                            *
18  *   Evan Hunter - ehunter@broadcom.com                                    *
19  *                                                                         *
20  *   Copyright (C) ST-Ericsson SA 2011                                     *
21  *   michel.jaouen@stericsson.com : smp minimum support                    *
22  *                                                                         *
23  *   Copyright (C) 2011 Andreas Fritiofson                                 *
24  *   andreas.fritiofson@gmail.com                                          *
25  *                                                                         *
26  *   This program is free software; you can redistribute it and/or modify  *
27  *   it under the terms of the GNU General Public License as published by  *
28  *   the Free Software Foundation; either version 2 of the License, or     *
29  *   (at your option) any later version.                                   *
30  *                                                                         *
31  *   This program is distributed in the hope that it will be useful,       *
32  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
33  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
34  *   GNU General Public License for more details.                          *
35  *                                                                         *
36  *   You should have received a copy of the GNU General Public License     *
37  *   along with this program; if not, write to the                         *
38  *   Free Software Foundation, Inc.,                                       *
39  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
40  ***************************************************************************/
41
42 #ifdef HAVE_CONFIG_H
43 #include "config.h"
44 #endif
45
46 #include <helper/time_support.h>
47 #include <jtag/jtag.h>
48 #include <flash/nor/core.h>
49
50 #include "target.h"
51 #include "target_type.h"
52 #include "target_request.h"
53 #include "breakpoints.h"
54 #include "register.h"
55 #include "trace.h"
56 #include "image.h"
57 #include "rtos/rtos.h"
58
59 /* default halt wait timeout (ms) */
60 #define DEFAULT_HALT_TIMEOUT 5000
61
62 static int target_read_buffer_default(struct target *target, uint32_t address,
63                 uint32_t count, uint8_t *buffer);
64 static int target_write_buffer_default(struct target *target, uint32_t address,
65                 uint32_t count, const uint8_t *buffer);
66 static int target_array2mem(Jim_Interp *interp, struct target *target,
67                 int argc, Jim_Obj * const *argv);
68 static int target_mem2array(Jim_Interp *interp, struct target *target,
69                 int argc, Jim_Obj * const *argv);
70 static int target_register_user_commands(struct command_context *cmd_ctx);
71 static int target_get_gdb_fileio_info_default(struct target *target,
72                 struct gdb_fileio_info *fileio_info);
73 static int target_gdb_fileio_end_default(struct target *target, int retcode,
74                 int fileio_errno, bool ctrl_c);
75 static int target_profiling_default(struct target *target, uint32_t *samples,
76                 uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds);
77
78 /* targets */
79 extern struct target_type arm7tdmi_target;
80 extern struct target_type arm720t_target;
81 extern struct target_type arm9tdmi_target;
82 extern struct target_type arm920t_target;
83 extern struct target_type arm966e_target;
84 extern struct target_type arm946e_target;
85 extern struct target_type arm926ejs_target;
86 extern struct target_type fa526_target;
87 extern struct target_type feroceon_target;
88 extern struct target_type dragonite_target;
89 extern struct target_type xscale_target;
90 extern struct target_type cortexm3_target;
91 extern struct target_type cortexa8_target;
92 extern struct target_type cortexr4_target;
93 extern struct target_type arm11_target;
94 extern struct target_type mips_m4k_target;
95 extern struct target_type avr_target;
96 extern struct target_type dsp563xx_target;
97 extern struct target_type dsp5680xx_target;
98 extern struct target_type testee_target;
99 extern struct target_type avr32_ap7k_target;
100 extern struct target_type hla_target;
101 extern struct target_type nds32_v2_target;
102 extern struct target_type nds32_v3_target;
103 extern struct target_type nds32_v3m_target;
104
105 static struct target_type *target_types[] = {
106         &arm7tdmi_target,
107         &arm9tdmi_target,
108         &arm920t_target,
109         &arm720t_target,
110         &arm966e_target,
111         &arm946e_target,
112         &arm926ejs_target,
113         &fa526_target,
114         &feroceon_target,
115         &dragonite_target,
116         &xscale_target,
117         &cortexm3_target,
118         &cortexa8_target,
119         &cortexr4_target,
120         &arm11_target,
121         &mips_m4k_target,
122         &avr_target,
123         &dsp563xx_target,
124         &dsp5680xx_target,
125         &testee_target,
126         &avr32_ap7k_target,
127         &hla_target,
128         &nds32_v2_target,
129         &nds32_v3_target,
130         &nds32_v3m_target,
131         NULL,
132 };
133
134 struct target *all_targets;
135 static struct target_event_callback *target_event_callbacks;
136 static struct target_timer_callback *target_timer_callbacks;
137 static const int polling_interval = 100;
138
139 static const Jim_Nvp nvp_assert[] = {
140         { .name = "assert", NVP_ASSERT },
141         { .name = "deassert", NVP_DEASSERT },
142         { .name = "T", NVP_ASSERT },
143         { .name = "F", NVP_DEASSERT },
144         { .name = "t", NVP_ASSERT },
145         { .name = "f", NVP_DEASSERT },
146         { .name = NULL, .value = -1 }
147 };
148
149 static const Jim_Nvp nvp_error_target[] = {
150         { .value = ERROR_TARGET_INVALID, .name = "err-invalid" },
151         { .value = ERROR_TARGET_INIT_FAILED, .name = "err-init-failed" },
152         { .value = ERROR_TARGET_TIMEOUT, .name = "err-timeout" },
153         { .value = ERROR_TARGET_NOT_HALTED, .name = "err-not-halted" },
154         { .value = ERROR_TARGET_FAILURE, .name = "err-failure" },
155         { .value = ERROR_TARGET_UNALIGNED_ACCESS   , .name = "err-unaligned-access" },
156         { .value = ERROR_TARGET_DATA_ABORT , .name = "err-data-abort" },
157         { .value = ERROR_TARGET_RESOURCE_NOT_AVAILABLE , .name = "err-resource-not-available" },
158         { .value = ERROR_TARGET_TRANSLATION_FAULT  , .name = "err-translation-fault" },
159         { .value = ERROR_TARGET_NOT_RUNNING, .name = "err-not-running" },
160         { .value = ERROR_TARGET_NOT_EXAMINED, .name = "err-not-examined" },
161         { .value = -1, .name = NULL }
162 };
163
164 static const char *target_strerror_safe(int err)
165 {
166         const Jim_Nvp *n;
167
168         n = Jim_Nvp_value2name_simple(nvp_error_target, err);
169         if (n->name == NULL)
170                 return "unknown";
171         else
172                 return n->name;
173 }
174
175 static const Jim_Nvp nvp_target_event[] = {
176
177         { .value = TARGET_EVENT_GDB_HALT, .name = "gdb-halt" },
178         { .value = TARGET_EVENT_HALTED, .name = "halted" },
179         { .value = TARGET_EVENT_RESUMED, .name = "resumed" },
180         { .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
181         { .value = TARGET_EVENT_RESUME_END, .name = "resume-end" },
182
183         { .name = "gdb-start", .value = TARGET_EVENT_GDB_START },
184         { .name = "gdb-end", .value = TARGET_EVENT_GDB_END },
185
186         { .value = TARGET_EVENT_RESET_START,         .name = "reset-start" },
187         { .value = TARGET_EVENT_RESET_ASSERT_PRE,    .name = "reset-assert-pre" },
188         { .value = TARGET_EVENT_RESET_ASSERT,        .name = "reset-assert" },
189         { .value = TARGET_EVENT_RESET_ASSERT_POST,   .name = "reset-assert-post" },
190         { .value = TARGET_EVENT_RESET_DEASSERT_PRE,  .name = "reset-deassert-pre" },
191         { .value = TARGET_EVENT_RESET_DEASSERT_POST, .name = "reset-deassert-post" },
192         { .value = TARGET_EVENT_RESET_HALT_PRE,      .name = "reset-halt-pre" },
193         { .value = TARGET_EVENT_RESET_HALT_POST,     .name = "reset-halt-post" },
194         { .value = TARGET_EVENT_RESET_WAIT_PRE,      .name = "reset-wait-pre" },
195         { .value = TARGET_EVENT_RESET_WAIT_POST,     .name = "reset-wait-post" },
196         { .value = TARGET_EVENT_RESET_INIT,          .name = "reset-init" },
197         { .value = TARGET_EVENT_RESET_END,           .name = "reset-end" },
198
199         { .value = TARGET_EVENT_EXAMINE_START, .name = "examine-start" },
200         { .value = TARGET_EVENT_EXAMINE_END, .name = "examine-end" },
201
202         { .value = TARGET_EVENT_DEBUG_HALTED, .name = "debug-halted" },
203         { .value = TARGET_EVENT_DEBUG_RESUMED, .name = "debug-resumed" },
204
205         { .value = TARGET_EVENT_GDB_ATTACH, .name = "gdb-attach" },
206         { .value = TARGET_EVENT_GDB_DETACH, .name = "gdb-detach" },
207
208         { .value = TARGET_EVENT_GDB_FLASH_WRITE_START, .name = "gdb-flash-write-start" },
209         { .value = TARGET_EVENT_GDB_FLASH_WRITE_END  , .name = "gdb-flash-write-end"   },
210
211         { .value = TARGET_EVENT_GDB_FLASH_ERASE_START, .name = "gdb-flash-erase-start" },
212         { .value = TARGET_EVENT_GDB_FLASH_ERASE_END  , .name = "gdb-flash-erase-end" },
213
214         { .name = NULL, .value = -1 }
215 };
216
217 static const Jim_Nvp nvp_target_state[] = {
218         { .name = "unknown", .value = TARGET_UNKNOWN },
219         { .name = "running", .value = TARGET_RUNNING },
220         { .name = "halted",  .value = TARGET_HALTED },
221         { .name = "reset",   .value = TARGET_RESET },
222         { .name = "debug-running", .value = TARGET_DEBUG_RUNNING },
223         { .name = NULL, .value = -1 },
224 };
225
226 static const Jim_Nvp nvp_target_debug_reason[] = {
227         { .name = "debug-request"            , .value = DBG_REASON_DBGRQ },
228         { .name = "breakpoint"               , .value = DBG_REASON_BREAKPOINT },
229         { .name = "watchpoint"               , .value = DBG_REASON_WATCHPOINT },
230         { .name = "watchpoint-and-breakpoint", .value = DBG_REASON_WPTANDBKPT },
231         { .name = "single-step"              , .value = DBG_REASON_SINGLESTEP },
232         { .name = "target-not-halted"        , .value = DBG_REASON_NOTHALTED  },
233         { .name = "program-exit"             , .value = DBG_REASON_EXIT },
234         { .name = "undefined"                , .value = DBG_REASON_UNDEFINED },
235         { .name = NULL, .value = -1 },
236 };
237
238 static const Jim_Nvp nvp_target_endian[] = {
239         { .name = "big",    .value = TARGET_BIG_ENDIAN },
240         { .name = "little", .value = TARGET_LITTLE_ENDIAN },
241         { .name = "be",     .value = TARGET_BIG_ENDIAN },
242         { .name = "le",     .value = TARGET_LITTLE_ENDIAN },
243         { .name = NULL,     .value = -1 },
244 };
245
246 static const Jim_Nvp nvp_reset_modes[] = {
247         { .name = "unknown", .value = RESET_UNKNOWN },
248         { .name = "run"    , .value = RESET_RUN },
249         { .name = "halt"   , .value = RESET_HALT },
250         { .name = "init"   , .value = RESET_INIT },
251         { .name = NULL     , .value = -1 },
252 };
253
254 const char *debug_reason_name(struct target *t)
255 {
256         const char *cp;
257
258         cp = Jim_Nvp_value2name_simple(nvp_target_debug_reason,
259                         t->debug_reason)->name;
260         if (!cp) {
261                 LOG_ERROR("Invalid debug reason: %d", (int)(t->debug_reason));
262                 cp = "(*BUG*unknown*BUG*)";
263         }
264         return cp;
265 }
266
267 const char *target_state_name(struct target *t)
268 {
269         const char *cp;
270         cp = Jim_Nvp_value2name_simple(nvp_target_state, t->state)->name;
271         if (!cp) {
272                 LOG_ERROR("Invalid target state: %d", (int)(t->state));
273                 cp = "(*BUG*unknown*BUG*)";
274         }
275         return cp;
276 }
277
278 /* determine the number of the new target */
279 static int new_target_number(void)
280 {
281         struct target *t;
282         int x;
283
284         /* number is 0 based */
285         x = -1;
286         t = all_targets;
287         while (t) {
288                 if (x < t->target_number)
289                         x = t->target_number;
290                 t = t->next;
291         }
292         return x + 1;
293 }
294
295 /* read a uint32_t from a buffer in target memory endianness */
296 uint32_t target_buffer_get_u32(struct target *target, const uint8_t *buffer)
297 {
298         if (target->endianness == TARGET_LITTLE_ENDIAN)
299                 return le_to_h_u32(buffer);
300         else
301                 return be_to_h_u32(buffer);
302 }
303
304 /* read a uint24_t from a buffer in target memory endianness */
305 uint32_t target_buffer_get_u24(struct target *target, const uint8_t *buffer)
306 {
307         if (target->endianness == TARGET_LITTLE_ENDIAN)
308                 return le_to_h_u24(buffer);
309         else
310                 return be_to_h_u24(buffer);
311 }
312
313 /* read a uint16_t from a buffer in target memory endianness */
314 uint16_t target_buffer_get_u16(struct target *target, const uint8_t *buffer)
315 {
316         if (target->endianness == TARGET_LITTLE_ENDIAN)
317                 return le_to_h_u16(buffer);
318         else
319                 return be_to_h_u16(buffer);
320 }
321
322 /* read a uint8_t from a buffer in target memory endianness */
323 static uint8_t target_buffer_get_u8(struct target *target, const uint8_t *buffer)
324 {
325         return *buffer & 0x0ff;
326 }
327
328 /* write a uint32_t to a buffer in target memory endianness */
329 void target_buffer_set_u32(struct target *target, uint8_t *buffer, uint32_t value)
330 {
331         if (target->endianness == TARGET_LITTLE_ENDIAN)
332                 h_u32_to_le(buffer, value);
333         else
334                 h_u32_to_be(buffer, value);
335 }
336
337 /* write a uint24_t to a buffer in target memory endianness */
338 void target_buffer_set_u24(struct target *target, uint8_t *buffer, uint32_t value)
339 {
340         if (target->endianness == TARGET_LITTLE_ENDIAN)
341                 h_u24_to_le(buffer, value);
342         else
343                 h_u24_to_be(buffer, value);
344 }
345
346 /* write a uint16_t to a buffer in target memory endianness */
347 void target_buffer_set_u16(struct target *target, uint8_t *buffer, uint16_t value)
348 {
349         if (target->endianness == TARGET_LITTLE_ENDIAN)
350                 h_u16_to_le(buffer, value);
351         else
352                 h_u16_to_be(buffer, value);
353 }
354
355 /* write a uint8_t to a buffer in target memory endianness */
356 static void target_buffer_set_u8(struct target *target, uint8_t *buffer, uint8_t value)
357 {
358         *buffer = value;
359 }
360
361 /* write a uint32_t array to a buffer in target memory endianness */
362 void target_buffer_get_u32_array(struct target *target, const uint8_t *buffer, uint32_t count, uint32_t *dstbuf)
363 {
364         uint32_t i;
365         for (i = 0; i < count; i++)
366                 dstbuf[i] = target_buffer_get_u32(target, &buffer[i * 4]);
367 }
368
369 /* write a uint16_t array to a buffer in target memory endianness */
370 void target_buffer_get_u16_array(struct target *target, const uint8_t *buffer, uint32_t count, uint16_t *dstbuf)
371 {
372         uint32_t i;
373         for (i = 0; i < count; i++)
374                 dstbuf[i] = target_buffer_get_u16(target, &buffer[i * 2]);
375 }
376
377 /* write a uint32_t array to a buffer in target memory endianness */
378 void target_buffer_set_u32_array(struct target *target, uint8_t *buffer, uint32_t count, uint32_t *srcbuf)
379 {
380         uint32_t i;
381         for (i = 0; i < count; i++)
382                 target_buffer_set_u32(target, &buffer[i * 4], srcbuf[i]);
383 }
384
385 /* write a uint16_t array to a buffer in target memory endianness */
386 void target_buffer_set_u16_array(struct target *target, uint8_t *buffer, uint32_t count, uint16_t *srcbuf)
387 {
388         uint32_t i;
389         for (i = 0; i < count; i++)
390                 target_buffer_set_u16(target, &buffer[i * 2], srcbuf[i]);
391 }
392
393 /* return a pointer to a configured target; id is name or number */
394 struct target *get_target(const char *id)
395 {
396         struct target *target;
397
398         /* try as tcltarget name */
399         for (target = all_targets; target; target = target->next) {
400                 if (target_name(target) == NULL)
401                         continue;
402                 if (strcmp(id, target_name(target)) == 0)
403                         return target;
404         }
405
406         /* It's OK to remove this fallback sometime after August 2010 or so */
407
408         /* no match, try as number */
409         unsigned num;
410         if (parse_uint(id, &num) != ERROR_OK)
411                 return NULL;
412
413         for (target = all_targets; target; target = target->next) {
414                 if (target->target_number == (int)num) {
415                         LOG_WARNING("use '%s' as target identifier, not '%u'",
416                                         target_name(target), num);
417                         return target;
418                 }
419         }
420
421         return NULL;
422 }
423
424 /* returns a pointer to the n-th configured target */
425 static struct target *get_target_by_num(int num)
426 {
427         struct target *target = all_targets;
428
429         while (target) {
430                 if (target->target_number == num)
431                         return target;
432                 target = target->next;
433         }
434
435         return NULL;
436 }
437
438 struct target *get_current_target(struct command_context *cmd_ctx)
439 {
440         struct target *target = get_target_by_num(cmd_ctx->current_target);
441
442         if (target == NULL) {
443                 LOG_ERROR("BUG: current_target out of bounds");
444                 exit(-1);
445         }
446
447         return target;
448 }
449
450 int target_poll(struct target *target)
451 {
452         int retval;
453
454         /* We can't poll until after examine */
455         if (!target_was_examined(target)) {
456                 /* Fail silently lest we pollute the log */
457                 return ERROR_FAIL;
458         }
459
460         retval = target->type->poll(target);
461         if (retval != ERROR_OK)
462                 return retval;
463
464         if (target->halt_issued) {
465                 if (target->state == TARGET_HALTED)
466                         target->halt_issued = false;
467                 else {
468                         long long t = timeval_ms() - target->halt_issued_time;
469                         if (t > DEFAULT_HALT_TIMEOUT) {
470                                 target->halt_issued = false;
471                                 LOG_INFO("Halt timed out, wake up GDB.");
472                                 target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
473                         }
474                 }
475         }
476
477         return ERROR_OK;
478 }
479
480 int target_halt(struct target *target)
481 {
482         int retval;
483         /* We can't poll until after examine */
484         if (!target_was_examined(target)) {
485                 LOG_ERROR("Target not examined yet");
486                 return ERROR_FAIL;
487         }
488
489         retval = target->type->halt(target);
490         if (retval != ERROR_OK)
491                 return retval;
492
493         target->halt_issued = true;
494         target->halt_issued_time = timeval_ms();
495
496         return ERROR_OK;
497 }
498
499 /**
500  * Make the target (re)start executing using its saved execution
501  * context (possibly with some modifications).
502  *
503  * @param target Which target should start executing.
504  * @param current True to use the target's saved program counter instead
505  *      of the address parameter
506  * @param address Optionally used as the program counter.
507  * @param handle_breakpoints True iff breakpoints at the resumption PC
508  *      should be skipped.  (For example, maybe execution was stopped by
509  *      such a breakpoint, in which case it would be counterprodutive to
510  *      let it re-trigger.
511  * @param debug_execution False if all working areas allocated by OpenOCD
512  *      should be released and/or restored to their original contents.
513  *      (This would for example be true to run some downloaded "helper"
514  *      algorithm code, which resides in one such working buffer and uses
515  *      another for data storage.)
516  *
517  * @todo Resolve the ambiguity about what the "debug_execution" flag
518  * signifies.  For example, Target implementations don't agree on how
519  * it relates to invalidation of the register cache, or to whether
520  * breakpoints and watchpoints should be enabled.  (It would seem wrong
521  * to enable breakpoints when running downloaded "helper" algorithms
522  * (debug_execution true), since the breakpoints would be set to match
523  * target firmware being debugged, not the helper algorithm.... and
524  * enabling them could cause such helpers to malfunction (for example,
525  * by overwriting data with a breakpoint instruction.  On the other
526  * hand the infrastructure for running such helpers might use this
527  * procedure but rely on hardware breakpoint to detect termination.)
528  */
529 int target_resume(struct target *target, int current, uint32_t address, int handle_breakpoints, int debug_execution)
530 {
531         int retval;
532
533         /* We can't poll until after examine */
534         if (!target_was_examined(target)) {
535                 LOG_ERROR("Target not examined yet");
536                 return ERROR_FAIL;
537         }
538
539         target_call_event_callbacks(target, TARGET_EVENT_RESUME_START);
540
541         /* note that resume *must* be asynchronous. The CPU can halt before
542          * we poll. The CPU can even halt at the current PC as a result of
543          * a software breakpoint being inserted by (a bug?) the application.
544          */
545         retval = target->type->resume(target, current, address, handle_breakpoints, debug_execution);
546         if (retval != ERROR_OK)
547                 return retval;
548
549         target_call_event_callbacks(target, TARGET_EVENT_RESUME_END);
550
551         return retval;
552 }
553
554 static int target_process_reset(struct command_context *cmd_ctx, enum target_reset_mode reset_mode)
555 {
556         char buf[100];
557         int retval;
558         Jim_Nvp *n;
559         n = Jim_Nvp_value2name_simple(nvp_reset_modes, reset_mode);
560         if (n->name == NULL) {
561                 LOG_ERROR("invalid reset mode");
562                 return ERROR_FAIL;
563         }
564
565         /* disable polling during reset to make reset event scripts
566          * more predictable, i.e. dr/irscan & pathmove in events will
567          * not have JTAG operations injected into the middle of a sequence.
568          */
569         bool save_poll = jtag_poll_get_enabled();
570
571         jtag_poll_set_enabled(false);
572
573         sprintf(buf, "ocd_process_reset %s", n->name);
574         retval = Jim_Eval(cmd_ctx->interp, buf);
575
576         jtag_poll_set_enabled(save_poll);
577
578         if (retval != JIM_OK) {
579                 Jim_MakeErrorMessage(cmd_ctx->interp);
580                 command_print(NULL, "%s\n", Jim_GetString(Jim_GetResult(cmd_ctx->interp), NULL));
581                 return ERROR_FAIL;
582         }
583
584         /* We want any events to be processed before the prompt */
585         retval = target_call_timer_callbacks_now();
586
587         struct target *target;
588         for (target = all_targets; target; target = target->next) {
589                 target->type->check_reset(target);
590                 target->running_alg = false;
591         }
592
593         return retval;
594 }
595
596 static int identity_virt2phys(struct target *target,
597                 uint32_t virtual, uint32_t *physical)
598 {
599         *physical = virtual;
600         return ERROR_OK;
601 }
602
603 static int no_mmu(struct target *target, int *enabled)
604 {
605         *enabled = 0;
606         return ERROR_OK;
607 }
608
609 static int default_examine(struct target *target)
610 {
611         target_set_examined(target);
612         return ERROR_OK;
613 }
614
615 /* no check by default */
616 static int default_check_reset(struct target *target)
617 {
618         return ERROR_OK;
619 }
620
621 int target_examine_one(struct target *target)
622 {
623         return target->type->examine(target);
624 }
625
626 static int jtag_enable_callback(enum jtag_event event, void *priv)
627 {
628         struct target *target = priv;
629
630         if (event != JTAG_TAP_EVENT_ENABLE || !target->tap->enabled)
631                 return ERROR_OK;
632
633         jtag_unregister_event_callback(jtag_enable_callback, target);
634
635         target_call_event_callbacks(target, TARGET_EVENT_EXAMINE_START);
636
637         int retval = target_examine_one(target);
638         if (retval != ERROR_OK)
639                 return retval;
640
641         target_call_event_callbacks(target, TARGET_EVENT_EXAMINE_END);
642
643         return retval;
644 }
645
646 /* Targets that correctly implement init + examine, i.e.
647  * no communication with target during init:
648  *
649  * XScale
650  */
651 int target_examine(void)
652 {
653         int retval = ERROR_OK;
654         struct target *target;
655
656         for (target = all_targets; target; target = target->next) {
657                 /* defer examination, but don't skip it */
658                 if (!target->tap->enabled) {
659                         jtag_register_event_callback(jtag_enable_callback,
660                                         target);
661                         continue;
662                 }
663
664                 target_call_event_callbacks(target, TARGET_EVENT_EXAMINE_START);
665
666                 retval = target_examine_one(target);
667                 if (retval != ERROR_OK)
668                         return retval;
669
670                 target_call_event_callbacks(target, TARGET_EVENT_EXAMINE_END);
671         }
672         return retval;
673 }
674
675 const char *target_type_name(struct target *target)
676 {
677         return target->type->name;
678 }
679
680 static int target_soft_reset_halt(struct target *target)
681 {
682         if (!target_was_examined(target)) {
683                 LOG_ERROR("Target not examined yet");
684                 return ERROR_FAIL;
685         }
686         if (!target->type->soft_reset_halt) {
687                 LOG_ERROR("Target %s does not support soft_reset_halt",
688                                 target_name(target));
689                 return ERROR_FAIL;
690         }
691         return target->type->soft_reset_halt(target);
692 }
693
694 /**
695  * Downloads a target-specific native code algorithm to the target,
696  * and executes it.  * Note that some targets may need to set up, enable,
697  * and tear down a breakpoint (hard or * soft) to detect algorithm
698  * termination, while others may support  lower overhead schemes where
699  * soft breakpoints embedded in the algorithm automatically terminate the
700  * algorithm.
701  *
702  * @param target used to run the algorithm
703  * @param arch_info target-specific description of the algorithm.
704  */
705 int target_run_algorithm(struct target *target,
706                 int num_mem_params, struct mem_param *mem_params,
707                 int num_reg_params, struct reg_param *reg_param,
708                 uint32_t entry_point, uint32_t exit_point,
709                 int timeout_ms, void *arch_info)
710 {
711         int retval = ERROR_FAIL;
712
713         if (!target_was_examined(target)) {
714                 LOG_ERROR("Target not examined yet");
715                 goto done;
716         }
717         if (!target->type->run_algorithm) {
718                 LOG_ERROR("Target type '%s' does not support %s",
719                                 target_type_name(target), __func__);
720                 goto done;
721         }
722
723         target->running_alg = true;
724         retval = target->type->run_algorithm(target,
725                         num_mem_params, mem_params,
726                         num_reg_params, reg_param,
727                         entry_point, exit_point, timeout_ms, arch_info);
728         target->running_alg = false;
729
730 done:
731         return retval;
732 }
733
734 /**
735  * Downloads a target-specific native code algorithm to the target,
736  * executes and leaves it running.
737  *
738  * @param target used to run the algorithm
739  * @param arch_info target-specific description of the algorithm.
740  */
741 int target_start_algorithm(struct target *target,
742                 int num_mem_params, struct mem_param *mem_params,
743                 int num_reg_params, struct reg_param *reg_params,
744                 uint32_t entry_point, uint32_t exit_point,
745                 void *arch_info)
746 {
747         int retval = ERROR_FAIL;
748
749         if (!target_was_examined(target)) {
750                 LOG_ERROR("Target not examined yet");
751                 goto done;
752         }
753         if (!target->type->start_algorithm) {
754                 LOG_ERROR("Target type '%s' does not support %s",
755                                 target_type_name(target), __func__);
756                 goto done;
757         }
758         if (target->running_alg) {
759                 LOG_ERROR("Target is already running an algorithm");
760                 goto done;
761         }
762
763         target->running_alg = true;
764         retval = target->type->start_algorithm(target,
765                         num_mem_params, mem_params,
766                         num_reg_params, reg_params,
767                         entry_point, exit_point, arch_info);
768
769 done:
770         return retval;
771 }
772
773 /**
774  * Waits for an algorithm started with target_start_algorithm() to complete.
775  *
776  * @param target used to run the algorithm
777  * @param arch_info target-specific description of the algorithm.
778  */
779 int target_wait_algorithm(struct target *target,
780                 int num_mem_params, struct mem_param *mem_params,
781                 int num_reg_params, struct reg_param *reg_params,
782                 uint32_t exit_point, int timeout_ms,
783                 void *arch_info)
784 {
785         int retval = ERROR_FAIL;
786
787         if (!target->type->wait_algorithm) {
788                 LOG_ERROR("Target type '%s' does not support %s",
789                                 target_type_name(target), __func__);
790                 goto done;
791         }
792         if (!target->running_alg) {
793                 LOG_ERROR("Target is not running an algorithm");
794                 goto done;
795         }
796
797         retval = target->type->wait_algorithm(target,
798                         num_mem_params, mem_params,
799                         num_reg_params, reg_params,
800                         exit_point, timeout_ms, arch_info);
801         if (retval != ERROR_TARGET_TIMEOUT)
802                 target->running_alg = false;
803
804 done:
805         return retval;
806 }
807
808 /**
809  * Executes a target-specific native code algorithm in the target.
810  * It differs from target_run_algorithm in that the algorithm is asynchronous.
811  * Because of this it requires an compliant algorithm:
812  * see contrib/loaders/flash/stm32f1x.S for example.
813  *
814  * @param target used to run the algorithm
815  */
816
817 int target_run_flash_async_algorithm(struct target *target,
818                 uint8_t *buffer, uint32_t count, int block_size,
819                 int num_mem_params, struct mem_param *mem_params,
820                 int num_reg_params, struct reg_param *reg_params,
821                 uint32_t buffer_start, uint32_t buffer_size,
822                 uint32_t entry_point, uint32_t exit_point, void *arch_info)
823 {
824         int retval;
825         int timeout = 0;
826
827         /* Set up working area. First word is write pointer, second word is read pointer,
828          * rest is fifo data area. */
829         uint32_t wp_addr = buffer_start;
830         uint32_t rp_addr = buffer_start + 4;
831         uint32_t fifo_start_addr = buffer_start + 8;
832         uint32_t fifo_end_addr = buffer_start + buffer_size;
833
834         uint32_t wp = fifo_start_addr;
835         uint32_t rp = fifo_start_addr;
836
837         /* validate block_size is 2^n */
838         assert(!block_size || !(block_size & (block_size - 1)));
839
840         retval = target_write_u32(target, wp_addr, wp);
841         if (retval != ERROR_OK)
842                 return retval;
843         retval = target_write_u32(target, rp_addr, rp);
844         if (retval != ERROR_OK)
845                 return retval;
846
847         /* Start up algorithm on target and let it idle while writing the first chunk */
848         retval = target_start_algorithm(target, num_mem_params, mem_params,
849                         num_reg_params, reg_params,
850                         entry_point,
851                         exit_point,
852                         arch_info);
853
854         if (retval != ERROR_OK) {
855                 LOG_ERROR("error starting target flash write algorithm");
856                 return retval;
857         }
858
859         while (count > 0) {
860
861                 retval = target_read_u32(target, rp_addr, &rp);
862                 if (retval != ERROR_OK) {
863                         LOG_ERROR("failed to get read pointer");
864                         break;
865                 }
866
867                 LOG_DEBUG("count 0x%" PRIx32 " wp 0x%" PRIx32 " rp 0x%" PRIx32, count, wp, rp);
868
869                 if (rp == 0) {
870                         LOG_ERROR("flash write algorithm aborted by target");
871                         retval = ERROR_FLASH_OPERATION_FAILED;
872                         break;
873                 }
874
875                 if ((rp & (block_size - 1)) || rp < fifo_start_addr || rp >= fifo_end_addr) {
876                         LOG_ERROR("corrupted fifo read pointer 0x%" PRIx32, rp);
877                         break;
878                 }
879
880                 /* Count the number of bytes available in the fifo without
881                  * crossing the wrap around. Make sure to not fill it completely,
882                  * because that would make wp == rp and that's the empty condition. */
883                 uint32_t thisrun_bytes;
884                 if (rp > wp)
885                         thisrun_bytes = rp - wp - block_size;
886                 else if (rp > fifo_start_addr)
887                         thisrun_bytes = fifo_end_addr - wp;
888                 else
889                         thisrun_bytes = fifo_end_addr - wp - block_size;
890
891                 if (thisrun_bytes == 0) {
892                         /* Throttle polling a bit if transfer is (much) faster than flash
893                          * programming. The exact delay shouldn't matter as long as it's
894                          * less than buffer size / flash speed. This is very unlikely to
895                          * run when using high latency connections such as USB. */
896                         alive_sleep(10);
897
898                         /* to stop an infinite loop on some targets check and increment a timeout
899                          * this issue was observed on a stellaris using the new ICDI interface */
900                         if (timeout++ >= 500) {
901                                 LOG_ERROR("timeout waiting for algorithm, a target reset is recommended");
902                                 return ERROR_FLASH_OPERATION_FAILED;
903                         }
904                         continue;
905                 }
906
907                 /* reset our timeout */
908                 timeout = 0;
909
910                 /* Limit to the amount of data we actually want to write */
911                 if (thisrun_bytes > count * block_size)
912                         thisrun_bytes = count * block_size;
913
914                 /* Write data to fifo */
915                 retval = target_write_buffer(target, wp, thisrun_bytes, buffer);
916                 if (retval != ERROR_OK)
917                         break;
918
919                 /* Update counters and wrap write pointer */
920                 buffer += thisrun_bytes;
921                 count -= thisrun_bytes / block_size;
922                 wp += thisrun_bytes;
923                 if (wp >= fifo_end_addr)
924                         wp = fifo_start_addr;
925
926                 /* Store updated write pointer to target */
927                 retval = target_write_u32(target, wp_addr, wp);
928                 if (retval != ERROR_OK)
929                         break;
930         }
931
932         if (retval != ERROR_OK) {
933                 /* abort flash write algorithm on target */
934                 target_write_u32(target, wp_addr, 0);
935         }
936
937         int retval2 = target_wait_algorithm(target, num_mem_params, mem_params,
938                         num_reg_params, reg_params,
939                         exit_point,
940                         10000,
941                         arch_info);
942
943         if (retval2 != ERROR_OK) {
944                 LOG_ERROR("error waiting for target flash write algorithm");
945                 retval = retval2;
946         }
947
948         return retval;
949 }
950
951 int target_read_memory(struct target *target,
952                 uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
953 {
954         if (!target_was_examined(target)) {
955                 LOG_ERROR("Target not examined yet");
956                 return ERROR_FAIL;
957         }
958         return target->type->read_memory(target, address, size, count, buffer);
959 }
960
961 int target_read_phys_memory(struct target *target,
962                 uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer)
963 {
964         if (!target_was_examined(target)) {
965                 LOG_ERROR("Target not examined yet");
966                 return ERROR_FAIL;
967         }
968         return target->type->read_phys_memory(target, address, size, count, buffer);
969 }
970
971 int target_write_memory(struct target *target,
972                 uint32_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
973 {
974         if (!target_was_examined(target)) {
975                 LOG_ERROR("Target not examined yet");
976                 return ERROR_FAIL;
977         }
978         return target->type->write_memory(target, address, size, count, buffer);
979 }
980
981 int target_write_phys_memory(struct target *target,
982                 uint32_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
983 {
984         if (!target_was_examined(target)) {
985                 LOG_ERROR("Target not examined yet");
986                 return ERROR_FAIL;
987         }
988         return target->type->write_phys_memory(target, address, size, count, buffer);
989 }
990
991 int target_add_breakpoint(struct target *target,
992                 struct breakpoint *breakpoint)
993 {
994         if ((target->state != TARGET_HALTED) && (breakpoint->type != BKPT_HARD)) {
995                 LOG_WARNING("target %s is not halted", target_name(target));
996                 return ERROR_TARGET_NOT_HALTED;
997         }
998         return target->type->add_breakpoint(target, breakpoint);
999 }
1000
1001 int target_add_context_breakpoint(struct target *target,
1002                 struct breakpoint *breakpoint)
1003 {
1004         if (target->state != TARGET_HALTED) {
1005                 LOG_WARNING("target %s is not halted", target_name(target));
1006                 return ERROR_TARGET_NOT_HALTED;
1007         }
1008         return target->type->add_context_breakpoint(target, breakpoint);
1009 }
1010
1011 int target_add_hybrid_breakpoint(struct target *target,
1012                 struct breakpoint *breakpoint)
1013 {
1014         if (target->state != TARGET_HALTED) {
1015                 LOG_WARNING("target %s is not halted", target_name(target));
1016                 return ERROR_TARGET_NOT_HALTED;
1017         }
1018         return target->type->add_hybrid_breakpoint(target, breakpoint);
1019 }
1020
1021 int target_remove_breakpoint(struct target *target,
1022                 struct breakpoint *breakpoint)
1023 {
1024         return target->type->remove_breakpoint(target, breakpoint);
1025 }
1026
1027 int target_add_watchpoint(struct target *target,
1028                 struct watchpoint *watchpoint)
1029 {
1030         if (target->state != TARGET_HALTED) {
1031                 LOG_WARNING("target %s is not halted", target_name(target));
1032                 return ERROR_TARGET_NOT_HALTED;
1033         }
1034         return target->type->add_watchpoint(target, watchpoint);
1035 }
1036 int target_remove_watchpoint(struct target *target,
1037                 struct watchpoint *watchpoint)
1038 {
1039         return target->type->remove_watchpoint(target, watchpoint);
1040 }
1041 int target_hit_watchpoint(struct target *target,
1042                 struct watchpoint **hit_watchpoint)
1043 {
1044         if (target->state != TARGET_HALTED) {
1045                 LOG_WARNING("target %s is not halted", target->cmd_name);
1046                 return ERROR_TARGET_NOT_HALTED;
1047         }
1048
1049         if (target->type->hit_watchpoint == NULL) {
1050                 /* For backward compatible, if hit_watchpoint is not implemented,
1051                  * return ERROR_FAIL such that gdb_server will not take the nonsense
1052                  * information. */
1053                 return ERROR_FAIL;
1054         }
1055
1056         return target->type->hit_watchpoint(target, hit_watchpoint);
1057 }
1058
1059 int target_get_gdb_reg_list(struct target *target,
1060                 struct reg **reg_list[], int *reg_list_size,
1061                 enum target_register_class reg_class)
1062 {
1063         return target->type->get_gdb_reg_list(target, reg_list, reg_list_size, reg_class);
1064 }
1065 int target_step(struct target *target,
1066                 int current, uint32_t address, int handle_breakpoints)
1067 {
1068         return target->type->step(target, current, address, handle_breakpoints);
1069 }
1070
1071 int target_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info)
1072 {
1073         if (target->state != TARGET_HALTED) {
1074                 LOG_WARNING("target %s is not halted", target->cmd_name);
1075                 return ERROR_TARGET_NOT_HALTED;
1076         }
1077         return target->type->get_gdb_fileio_info(target, fileio_info);
1078 }
1079
1080 int target_gdb_fileio_end(struct target *target, int retcode, int fileio_errno, bool ctrl_c)
1081 {
1082         if (target->state != TARGET_HALTED) {
1083                 LOG_WARNING("target %s is not halted", target->cmd_name);
1084                 return ERROR_TARGET_NOT_HALTED;
1085         }
1086         return target->type->gdb_fileio_end(target, retcode, fileio_errno, ctrl_c);
1087 }
1088
1089 int target_profiling(struct target *target, uint32_t *samples,
1090                         uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
1091 {
1092         if (target->state != TARGET_HALTED) {
1093                 LOG_WARNING("target %s is not halted", target->cmd_name);
1094                 return ERROR_TARGET_NOT_HALTED;
1095         }
1096         return target->type->profiling(target, samples, max_num_samples,
1097                         num_samples, seconds);
1098 }
1099
1100 /**
1101  * Reset the @c examined flag for the given target.
1102  * Pure paranoia -- targets are zeroed on allocation.
1103  */
1104 static void target_reset_examined(struct target *target)
1105 {
1106         target->examined = false;
1107 }
1108
1109 static int err_read_phys_memory(struct target *target, uint32_t address,
1110                 uint32_t size, uint32_t count, uint8_t *buffer)
1111 {
1112         LOG_ERROR("Not implemented: %s", __func__);
1113         return ERROR_FAIL;
1114 }
1115
1116 static int err_write_phys_memory(struct target *target, uint32_t address,
1117                 uint32_t size, uint32_t count, const uint8_t *buffer)
1118 {
1119         LOG_ERROR("Not implemented: %s", __func__);
1120         return ERROR_FAIL;
1121 }
1122
1123 static int handle_target(void *priv);
1124
1125 static int target_init_one(struct command_context *cmd_ctx,
1126                 struct target *target)
1127 {
1128         target_reset_examined(target);
1129
1130         struct target_type *type = target->type;
1131         if (type->examine == NULL)
1132                 type->examine = default_examine;
1133
1134         if (type->check_reset == NULL)
1135                 type->check_reset = default_check_reset;
1136
1137         assert(type->init_target != NULL);
1138
1139         int retval = type->init_target(cmd_ctx, target);
1140         if (ERROR_OK != retval) {
1141                 LOG_ERROR("target '%s' init failed", target_name(target));
1142                 return retval;
1143         }
1144
1145         /* Sanity-check MMU support ... stub in what we must, to help
1146          * implement it in stages, but warn if we need to do so.
1147          */
1148         if (type->mmu) {
1149                 if (type->write_phys_memory == NULL) {
1150                         LOG_ERROR("type '%s' is missing write_phys_memory",
1151                                         type->name);
1152                         type->write_phys_memory = err_write_phys_memory;
1153                 }
1154                 if (type->read_phys_memory == NULL) {
1155                         LOG_ERROR("type '%s' is missing read_phys_memory",
1156                                         type->name);
1157                         type->read_phys_memory = err_read_phys_memory;
1158                 }
1159                 if (type->virt2phys == NULL) {
1160                         LOG_ERROR("type '%s' is missing virt2phys", type->name);
1161                         type->virt2phys = identity_virt2phys;
1162                 }
1163         } else {
1164                 /* Make sure no-MMU targets all behave the same:  make no
1165                  * distinction between physical and virtual addresses, and
1166                  * ensure that virt2phys() is always an identity mapping.
1167                  */
1168                 if (type->write_phys_memory || type->read_phys_memory || type->virt2phys)
1169                         LOG_WARNING("type '%s' has bad MMU hooks", type->name);
1170
1171                 type->mmu = no_mmu;
1172                 type->write_phys_memory = type->write_memory;
1173                 type->read_phys_memory = type->read_memory;
1174                 type->virt2phys = identity_virt2phys;
1175         }
1176
1177         if (target->type->read_buffer == NULL)
1178                 target->type->read_buffer = target_read_buffer_default;
1179
1180         if (target->type->write_buffer == NULL)
1181                 target->type->write_buffer = target_write_buffer_default;
1182
1183         if (target->type->get_gdb_fileio_info == NULL)
1184                 target->type->get_gdb_fileio_info = target_get_gdb_fileio_info_default;
1185
1186         if (target->type->gdb_fileio_end == NULL)
1187                 target->type->gdb_fileio_end = target_gdb_fileio_end_default;
1188
1189         if (target->type->profiling == NULL)
1190                 target->type->profiling = target_profiling_default;
1191
1192         return ERROR_OK;
1193 }
1194
1195 static int target_init(struct command_context *cmd_ctx)
1196 {
1197         struct target *target;
1198         int retval;
1199
1200         for (target = all_targets; target; target = target->next) {
1201                 retval = target_init_one(cmd_ctx, target);
1202                 if (ERROR_OK != retval)
1203                         return retval;
1204         }
1205
1206         if (!all_targets)
1207                 return ERROR_OK;
1208
1209         retval = target_register_user_commands(cmd_ctx);
1210         if (ERROR_OK != retval)
1211                 return retval;
1212
1213         retval = target_register_timer_callback(&handle_target,
1214                         polling_interval, 1, cmd_ctx->interp);
1215         if (ERROR_OK != retval)
1216                 return retval;
1217
1218         return ERROR_OK;
1219 }
1220
1221 COMMAND_HANDLER(handle_target_init_command)
1222 {
1223         int retval;
1224
1225         if (CMD_ARGC != 0)
1226                 return ERROR_COMMAND_SYNTAX_ERROR;
1227
1228         static bool target_initialized;
1229         if (target_initialized) {
1230                 LOG_INFO("'target init' has already been called");
1231                 return ERROR_OK;
1232         }
1233         target_initialized = true;
1234
1235         retval = command_run_line(CMD_CTX, "init_targets");
1236         if (ERROR_OK != retval)
1237                 return retval;
1238
1239         retval = command_run_line(CMD_CTX, "init_board");
1240         if (ERROR_OK != retval)
1241                 return retval;
1242
1243         LOG_DEBUG("Initializing targets...");
1244         return target_init(CMD_CTX);
1245 }
1246
1247 int target_register_event_callback(int (*callback)(struct target *target,
1248                 enum target_event event, void *priv), void *priv)
1249 {
1250         struct target_event_callback **callbacks_p = &target_event_callbacks;
1251
1252         if (callback == NULL)
1253                 return ERROR_COMMAND_SYNTAX_ERROR;
1254
1255         if (*callbacks_p) {
1256                 while ((*callbacks_p)->next)
1257                         callbacks_p = &((*callbacks_p)->next);
1258                 callbacks_p = &((*callbacks_p)->next);
1259         }
1260
1261         (*callbacks_p) = malloc(sizeof(struct target_event_callback));
1262         (*callbacks_p)->callback = callback;
1263         (*callbacks_p)->priv = priv;
1264         (*callbacks_p)->next = NULL;
1265
1266         return ERROR_OK;
1267 }
1268
1269 int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv)
1270 {
1271         struct target_timer_callback **callbacks_p = &target_timer_callbacks;
1272         struct timeval now;
1273
1274         if (callback == NULL)
1275                 return ERROR_COMMAND_SYNTAX_ERROR;
1276
1277         if (*callbacks_p) {
1278                 while ((*callbacks_p)->next)
1279                         callbacks_p = &((*callbacks_p)->next);
1280                 callbacks_p = &((*callbacks_p)->next);
1281         }
1282
1283         (*callbacks_p) = malloc(sizeof(struct target_timer_callback));
1284         (*callbacks_p)->callback = callback;
1285         (*callbacks_p)->periodic = periodic;
1286         (*callbacks_p)->time_ms = time_ms;
1287
1288         gettimeofday(&now, NULL);
1289         (*callbacks_p)->when.tv_usec = now.tv_usec + (time_ms % 1000) * 1000;
1290         time_ms -= (time_ms % 1000);
1291         (*callbacks_p)->when.tv_sec = now.tv_sec + (time_ms / 1000);
1292         if ((*callbacks_p)->when.tv_usec > 1000000) {
1293                 (*callbacks_p)->when.tv_usec = (*callbacks_p)->when.tv_usec - 1000000;
1294                 (*callbacks_p)->when.tv_sec += 1;
1295         }
1296
1297         (*callbacks_p)->priv = priv;
1298         (*callbacks_p)->next = NULL;
1299
1300         return ERROR_OK;
1301 }
1302
1303 int target_unregister_event_callback(int (*callback)(struct target *target,
1304                 enum target_event event, void *priv), void *priv)
1305 {
1306         struct target_event_callback **p = &target_event_callbacks;
1307         struct target_event_callback *c = target_event_callbacks;
1308
1309         if (callback == NULL)
1310                 return ERROR_COMMAND_SYNTAX_ERROR;
1311
1312         while (c) {
1313                 struct target_event_callback *next = c->next;
1314                 if ((c->callback == callback) && (c->priv == priv)) {
1315                         *p = next;
1316                         free(c);
1317                         return ERROR_OK;
1318                 } else
1319                         p = &(c->next);
1320                 c = next;
1321         }
1322
1323         return ERROR_OK;
1324 }
1325
1326 static int target_unregister_timer_callback(int (*callback)(void *priv), void *priv)
1327 {
1328         struct target_timer_callback **p = &target_timer_callbacks;
1329         struct target_timer_callback *c = target_timer_callbacks;
1330
1331         if (callback == NULL)
1332                 return ERROR_COMMAND_SYNTAX_ERROR;
1333
1334         while (c) {
1335                 struct target_timer_callback *next = c->next;
1336                 if ((c->callback == callback) && (c->priv == priv)) {
1337                         *p = next;
1338                         free(c);
1339                         return ERROR_OK;
1340                 } else
1341                         p = &(c->next);
1342                 c = next;
1343         }
1344
1345         return ERROR_OK;
1346 }
1347
1348 int target_call_event_callbacks(struct target *target, enum target_event event)
1349 {
1350         struct target_event_callback *callback = target_event_callbacks;
1351         struct target_event_callback *next_callback;
1352
1353         if (event == TARGET_EVENT_HALTED) {
1354                 /* execute early halted first */
1355                 target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
1356         }
1357
1358         LOG_DEBUG("target event %i (%s)", event,
1359                         Jim_Nvp_value2name_simple(nvp_target_event, event)->name);
1360
1361         target_handle_event(target, event);
1362
1363         while (callback) {
1364                 next_callback = callback->next;
1365                 callback->callback(target, event, callback->priv);
1366                 callback = next_callback;
1367         }
1368
1369         return ERROR_OK;
1370 }
1371
1372 static int target_timer_callback_periodic_restart(
1373                 struct target_timer_callback *cb, struct timeval *now)
1374 {
1375         int time_ms = cb->time_ms;
1376         cb->when.tv_usec = now->tv_usec + (time_ms % 1000) * 1000;
1377         time_ms -= (time_ms % 1000);
1378         cb->when.tv_sec = now->tv_sec + time_ms / 1000;
1379         if (cb->when.tv_usec > 1000000) {
1380                 cb->when.tv_usec = cb->when.tv_usec - 1000000;
1381                 cb->when.tv_sec += 1;
1382         }
1383         return ERROR_OK;
1384 }
1385
1386 static int target_call_timer_callback(struct target_timer_callback *cb,
1387                 struct timeval *now)
1388 {
1389         cb->callback(cb->priv);
1390
1391         if (cb->periodic)
1392                 return target_timer_callback_periodic_restart(cb, now);
1393
1394         return target_unregister_timer_callback(cb->callback, cb->priv);
1395 }
1396
1397 static int target_call_timer_callbacks_check_time(int checktime)
1398 {
1399         keep_alive();
1400
1401         struct timeval now;
1402         gettimeofday(&now, NULL);
1403
1404         struct target_timer_callback *callback = target_timer_callbacks;
1405         while (callback) {
1406                 /* cleaning up may unregister and free this callback */
1407                 struct target_timer_callback *next_callback = callback->next;
1408
1409                 bool call_it = callback->callback &&
1410                         ((!checktime && callback->periodic) ||
1411                           now.tv_sec > callback->when.tv_sec ||
1412                          (now.tv_sec == callback->when.tv_sec &&
1413                           now.tv_usec >= callback->when.tv_usec));
1414
1415                 if (call_it) {
1416                         int retval = target_call_timer_callback(callback, &now);
1417                         if (retval != ERROR_OK)
1418                                 return retval;
1419                 }
1420
1421                 callback = next_callback;
1422         }
1423
1424         return ERROR_OK;
1425 }
1426
1427 int target_call_timer_callbacks(void)
1428 {
1429         return target_call_timer_callbacks_check_time(1);
1430 }
1431
1432 /* invoke periodic callbacks immediately */
1433 int target_call_timer_callbacks_now(void)
1434 {
1435         return target_call_timer_callbacks_check_time(0);
1436 }
1437
1438 /* Prints the working area layout for debug purposes */
1439 static void print_wa_layout(struct target *target)
1440 {
1441         struct working_area *c = target->working_areas;
1442
1443         while (c) {
1444                 LOG_DEBUG("%c%c 0x%08"PRIx32"-0x%08"PRIx32" (%"PRIu32" bytes)",
1445                         c->backup ? 'b' : ' ', c->free ? ' ' : '*',
1446                         c->address, c->address + c->size - 1, c->size);
1447                 c = c->next;
1448         }
1449 }
1450
1451 /* Reduce area to size bytes, create a new free area from the remaining bytes, if any. */
1452 static void target_split_working_area(struct working_area *area, uint32_t size)
1453 {
1454         assert(area->free); /* Shouldn't split an allocated area */
1455         assert(size <= area->size); /* Caller should guarantee this */
1456
1457         /* Split only if not already the right size */
1458         if (size < area->size) {
1459                 struct working_area *new_wa = malloc(sizeof(*new_wa));
1460
1461                 if (new_wa == NULL)
1462                         return;
1463
1464                 new_wa->next = area->next;
1465                 new_wa->size = area->size - size;
1466                 new_wa->address = area->address + size;
1467                 new_wa->backup = NULL;
1468                 new_wa->user = NULL;
1469                 new_wa->free = true;
1470
1471                 area->next = new_wa;
1472                 area->size = size;
1473
1474                 /* If backup memory was allocated to this area, it has the wrong size
1475                  * now so free it and it will be reallocated if/when needed */
1476                 if (area->backup) {
1477                         free(area->backup);
1478                         area->backup = NULL;
1479                 }
1480         }
1481 }
1482
1483 /* Merge all adjacent free areas into one */
1484 static void target_merge_working_areas(struct target *target)
1485 {
1486         struct working_area *c = target->working_areas;
1487
1488         while (c && c->next) {
1489                 assert(c->next->address == c->address + c->size); /* This is an invariant */
1490
1491                 /* Find two adjacent free areas */
1492                 if (c->free && c->next->free) {
1493                         /* Merge the last into the first */
1494                         c->size += c->next->size;
1495
1496                         /* Remove the last */
1497                         struct working_area *to_be_freed = c->next;
1498                         c->next = c->next->next;
1499                         if (to_be_freed->backup)
1500                                 free(to_be_freed->backup);
1501                         free(to_be_freed);
1502
1503                         /* If backup memory was allocated to the remaining area, it's has
1504                          * the wrong size now */
1505                         if (c->backup) {
1506                                 free(c->backup);
1507                                 c->backup = NULL;
1508                         }
1509                 } else {
1510                         c = c->next;
1511                 }
1512         }
1513 }
1514
1515 int target_alloc_working_area_try(struct target *target, uint32_t size, struct working_area **area)
1516 {
1517         /* Reevaluate working area address based on MMU state*/
1518         if (target->working_areas == NULL) {
1519                 int retval;
1520                 int enabled;
1521
1522                 retval = target->type->mmu(target, &enabled);
1523                 if (retval != ERROR_OK)
1524                         return retval;
1525
1526                 if (!enabled) {
1527                         if (target->working_area_phys_spec) {
1528                                 LOG_DEBUG("MMU disabled, using physical "
1529                                         "address for working memory 0x%08"PRIx32,
1530                                         target->working_area_phys);
1531                                 target->working_area = target->working_area_phys;
1532                         } else {
1533                                 LOG_ERROR("No working memory available. "
1534                                         "Specify -work-area-phys to target.");
1535                                 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1536                         }
1537                 } else {
1538                         if (target->working_area_virt_spec) {
1539                                 LOG_DEBUG("MMU enabled, using virtual "
1540                                         "address for working memory 0x%08"PRIx32,
1541                                         target->working_area_virt);
1542                                 target->working_area = target->working_area_virt;
1543                         } else {
1544                                 LOG_ERROR("No working memory available. "
1545                                         "Specify -work-area-virt to target.");
1546                                 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1547                         }
1548                 }
1549
1550                 /* Set up initial working area on first call */
1551                 struct working_area *new_wa = malloc(sizeof(*new_wa));
1552                 if (new_wa) {
1553                         new_wa->next = NULL;
1554                         new_wa->size = target->working_area_size & ~3UL; /* 4-byte align */
1555                         new_wa->address = target->working_area;
1556                         new_wa->backup = NULL;
1557                         new_wa->user = NULL;
1558                         new_wa->free = true;
1559                 }
1560
1561                 target->working_areas = new_wa;
1562         }
1563
1564         /* only allocate multiples of 4 byte */
1565         if (size % 4)
1566                 size = (size + 3) & (~3UL);
1567
1568         struct working_area *c = target->working_areas;
1569
1570         /* Find the first large enough working area */
1571         while (c) {
1572                 if (c->free && c->size >= size)
1573                         break;
1574                 c = c->next;
1575         }
1576
1577         if (c == NULL)
1578                 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1579
1580         /* Split the working area into the requested size */
1581         target_split_working_area(c, size);
1582
1583         LOG_DEBUG("allocated new working area of %"PRIu32" bytes at address 0x%08"PRIx32, size, c->address);
1584
1585         if (target->backup_working_area) {
1586                 if (c->backup == NULL) {
1587                         c->backup = malloc(c->size);
1588                         if (c->backup == NULL)
1589                                 return ERROR_FAIL;
1590                 }
1591
1592                 int retval = target_read_memory(target, c->address, 4, c->size / 4, c->backup);
1593                 if (retval != ERROR_OK)
1594                         return retval;
1595         }
1596
1597         /* mark as used, and return the new (reused) area */
1598         c->free = false;
1599         *area = c;
1600
1601         /* user pointer */
1602         c->user = area;
1603
1604         print_wa_layout(target);
1605
1606         return ERROR_OK;
1607 }
1608
1609 int target_alloc_working_area(struct target *target, uint32_t size, struct working_area **area)
1610 {
1611         int retval;
1612
1613         retval = target_alloc_working_area_try(target, size, area);
1614         if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
1615                 LOG_WARNING("not enough working area available(requested %"PRIu32")", size);
1616         return retval;
1617
1618 }
1619
1620 static int target_restore_working_area(struct target *target, struct working_area *area)
1621 {
1622         int retval = ERROR_OK;
1623
1624         if (target->backup_working_area && area->backup != NULL) {
1625                 retval = target_write_memory(target, area->address, 4, area->size / 4, area->backup);
1626                 if (retval != ERROR_OK)
1627                         LOG_ERROR("failed to restore %"PRIu32" bytes of working area at address 0x%08"PRIx32,
1628                                         area->size, area->address);
1629         }
1630
1631         return retval;
1632 }
1633
1634 /* Restore the area's backup memory, if any, and return the area to the allocation pool */
1635 static int target_free_working_area_restore(struct target *target, struct working_area *area, int restore)
1636 {
1637         int retval = ERROR_OK;
1638
1639         if (area->free)
1640                 return retval;
1641
1642         if (restore) {
1643                 retval = target_restore_working_area(target, area);
1644                 /* REVISIT: Perhaps the area should be freed even if restoring fails. */
1645                 if (retval != ERROR_OK)
1646                         return retval;
1647         }
1648
1649         area->free = true;
1650
1651         LOG_DEBUG("freed %"PRIu32" bytes of working area at address 0x%08"PRIx32,
1652                         area->size, area->address);
1653
1654         /* mark user pointer invalid */
1655         /* TODO: Is this really safe? It points to some previous caller's memory.
1656          * How could we know that the area pointer is still in that place and not
1657          * some other vital data? What's the purpose of this, anyway? */
1658         *area->user = NULL;
1659         area->user = NULL;
1660
1661         target_merge_working_areas(target);
1662
1663         print_wa_layout(target);
1664
1665         return retval;
1666 }
1667
1668 int target_free_working_area(struct target *target, struct working_area *area)
1669 {
1670         return target_free_working_area_restore(target, area, 1);
1671 }
1672
1673 /* free resources and restore memory, if restoring memory fails,
1674  * free up resources anyway
1675  */
1676 static void target_free_all_working_areas_restore(struct target *target, int restore)
1677 {
1678         struct working_area *c = target->working_areas;
1679
1680         LOG_DEBUG("freeing all working areas");
1681
1682         /* Loop through all areas, restoring the allocated ones and marking them as free */
1683         while (c) {
1684                 if (!c->free) {
1685                         if (restore)
1686                                 target_restore_working_area(target, c);
1687                         c->free = true;
1688                         *c->user = NULL; /* Same as above */
1689                         c->user = NULL;
1690                 }
1691                 c = c->next;
1692         }
1693
1694         /* Run a merge pass to combine all areas into one */
1695         target_merge_working_areas(target);
1696
1697         print_wa_layout(target);
1698 }
1699
1700 void target_free_all_working_areas(struct target *target)
1701 {
1702         target_free_all_working_areas_restore(target, 1);
1703 }
1704
1705 /* Find the largest number of bytes that can be allocated */
1706 uint32_t target_get_working_area_avail(struct target *target)
1707 {
1708         struct working_area *c = target->working_areas;
1709         uint32_t max_size = 0;
1710
1711         if (c == NULL)
1712                 return target->working_area_size;
1713
1714         while (c) {
1715                 if (c->free && max_size < c->size)
1716                         max_size = c->size;
1717
1718                 c = c->next;
1719         }
1720
1721         return max_size;
1722 }
1723
1724 int target_arch_state(struct target *target)
1725 {
1726         int retval;
1727         if (target == NULL) {
1728                 LOG_USER("No target has been configured");
1729                 return ERROR_OK;
1730         }
1731
1732         LOG_USER("target state: %s", target_state_name(target));
1733
1734         if (target->state != TARGET_HALTED)
1735                 return ERROR_OK;
1736
1737         retval = target->type->arch_state(target);
1738         return retval;
1739 }
1740
1741 static int target_get_gdb_fileio_info_default(struct target *target,
1742                 struct gdb_fileio_info *fileio_info)
1743 {
1744         /* If target does not support semi-hosting function, target
1745            has no need to provide .get_gdb_fileio_info callback.
1746            It just return ERROR_FAIL and gdb_server will return "Txx"
1747            as target halted every time.  */
1748         return ERROR_FAIL;
1749 }
1750
1751 static int target_gdb_fileio_end_default(struct target *target,
1752                 int retcode, int fileio_errno, bool ctrl_c)
1753 {
1754         return ERROR_OK;
1755 }
1756
1757 static int target_profiling_default(struct target *target, uint32_t *samples,
1758                 uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
1759 {
1760         struct timeval timeout, now;
1761
1762         gettimeofday(&timeout, NULL);
1763         timeval_add_time(&timeout, seconds, 0);
1764
1765         LOG_INFO("Starting profiling. Halting and resuming the"
1766                         " target as often as we can...");
1767
1768         uint32_t sample_count = 0;
1769         /* hopefully it is safe to cache! We want to stop/restart as quickly as possible. */
1770         struct reg *reg = register_get_by_name(target->reg_cache, "pc", 1);
1771
1772         int retval = ERROR_OK;
1773         for (;;) {
1774                 target_poll(target);
1775                 if (target->state == TARGET_HALTED) {
1776                         uint32_t t = *((uint32_t *)reg->value);
1777                         samples[sample_count++] = t;
1778                         /* current pc, addr = 0, do not handle breakpoints, not debugging */
1779                         retval = target_resume(target, 1, 0, 0, 0);
1780                         target_poll(target);
1781                         alive_sleep(10); /* sleep 10ms, i.e. <100 samples/second. */
1782                 } else if (target->state == TARGET_RUNNING) {
1783                         /* We want to quickly sample the PC. */
1784                         retval = target_halt(target);
1785                 } else {
1786                         LOG_INFO("Target not halted or running");
1787                         retval = ERROR_OK;
1788                         break;
1789                 }
1790
1791                 if (retval != ERROR_OK)
1792                         break;
1793
1794                 gettimeofday(&now, NULL);
1795                 if ((sample_count >= max_num_samples) ||
1796                         ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec))) {
1797                         LOG_INFO("Profiling completed. %d samples.", sample_count);
1798                         break;
1799                 }
1800         }
1801
1802         *num_samples = sample_count;
1803         return retval;
1804 }
1805
1806 /* Single aligned words are guaranteed to use 16 or 32 bit access
1807  * mode respectively, otherwise data is handled as quickly as
1808  * possible
1809  */
1810 int target_write_buffer(struct target *target, uint32_t address, uint32_t size, const uint8_t *buffer)
1811 {
1812         LOG_DEBUG("writing buffer of %i byte at 0x%8.8x",
1813                         (int)size, (unsigned)address);
1814
1815         if (!target_was_examined(target)) {
1816                 LOG_ERROR("Target not examined yet");
1817                 return ERROR_FAIL;
1818         }
1819
1820         if (size == 0)
1821                 return ERROR_OK;
1822
1823         if ((address + size - 1) < address) {
1824                 /* GDB can request this when e.g. PC is 0xfffffffc*/
1825                 LOG_ERROR("address + size wrapped(0x%08x, 0x%08x)",
1826                                   (unsigned)address,
1827                                   (unsigned)size);
1828                 return ERROR_FAIL;
1829         }
1830
1831         return target->type->write_buffer(target, address, size, buffer);
1832 }
1833
1834 static int target_write_buffer_default(struct target *target, uint32_t address, uint32_t count, const uint8_t *buffer)
1835 {
1836         uint32_t size;
1837
1838         /* Align up to maximum 4 bytes. The loop condition makes sure the next pass
1839          * will have something to do with the size we leave to it. */
1840         for (size = 1; size < 4 && count >= size * 2 + (address & size); size *= 2) {
1841                 if (address & size) {
1842                         int retval = target_write_memory(target, address, size, 1, buffer);
1843                         if (retval != ERROR_OK)
1844                                 return retval;
1845                         address += size;
1846                         count -= size;
1847                         buffer += size;
1848                 }
1849         }
1850
1851         /* Write the data with as large access size as possible. */
1852         for (; size > 0; size /= 2) {
1853                 uint32_t aligned = count - count % size;
1854                 if (aligned > 0) {
1855                         int retval = target_write_memory(target, address, size, aligned / size, buffer);
1856                         if (retval != ERROR_OK)
1857                                 return retval;
1858                         address += aligned;
1859                         count -= aligned;
1860                         buffer += aligned;
1861                 }
1862         }
1863
1864         return ERROR_OK;
1865 }
1866
1867 /* Single aligned words are guaranteed to use 16 or 32 bit access
1868  * mode respectively, otherwise data is handled as quickly as
1869  * possible
1870  */
1871 int target_read_buffer(struct target *target, uint32_t address, uint32_t size, uint8_t *buffer)
1872 {
1873         LOG_DEBUG("reading buffer of %i byte at 0x%8.8x",
1874                           (int)size, (unsigned)address);
1875
1876         if (!target_was_examined(target)) {
1877                 LOG_ERROR("Target not examined yet");
1878                 return ERROR_FAIL;
1879         }
1880
1881         if (size == 0)
1882                 return ERROR_OK;
1883
1884         if ((address + size - 1) < address) {
1885                 /* GDB can request this when e.g. PC is 0xfffffffc*/
1886                 LOG_ERROR("address + size wrapped(0x%08" PRIx32 ", 0x%08" PRIx32 ")",
1887                                   address,
1888                                   size);
1889                 return ERROR_FAIL;
1890         }
1891
1892         return target->type->read_buffer(target, address, size, buffer);
1893 }
1894
1895 static int target_read_buffer_default(struct target *target, uint32_t address, uint32_t count, uint8_t *buffer)
1896 {
1897         uint32_t size;
1898
1899         /* Align up to maximum 4 bytes. The loop condition makes sure the next pass
1900          * will have something to do with the size we leave to it. */
1901         for (size = 1; size < 4 && count >= size * 2 + (address & size); size *= 2) {
1902                 if (address & size) {
1903                         int retval = target_read_memory(target, address, size, 1, buffer);
1904                         if (retval != ERROR_OK)
1905                                 return retval;
1906                         address += size;
1907                         count -= size;
1908                         buffer += size;
1909                 }
1910         }
1911
1912         /* Read the data with as large access size as possible. */
1913         for (; size > 0; size /= 2) {
1914                 uint32_t aligned = count - count % size;
1915                 if (aligned > 0) {
1916                         int retval = target_read_memory(target, address, size, aligned / size, buffer);
1917                         if (retval != ERROR_OK)
1918                                 return retval;
1919                         address += aligned;
1920                         count -= aligned;
1921                         buffer += aligned;
1922                 }
1923         }
1924
1925         return ERROR_OK;
1926 }
1927
1928 int target_checksum_memory(struct target *target, uint32_t address, uint32_t size, uint32_t* crc)
1929 {
1930         uint8_t *buffer;
1931         int retval;
1932         uint32_t i;
1933         uint32_t checksum = 0;
1934         if (!target_was_examined(target)) {
1935                 LOG_ERROR("Target not examined yet");
1936                 return ERROR_FAIL;
1937         }
1938
1939         retval = target->type->checksum_memory(target, address, size, &checksum);
1940         if (retval != ERROR_OK) {
1941                 buffer = malloc(size);
1942                 if (buffer == NULL) {
1943                         LOG_ERROR("error allocating buffer for section (%d bytes)", (int)size);
1944                         return ERROR_COMMAND_SYNTAX_ERROR;
1945                 }
1946                 retval = target_read_buffer(target, address, size, buffer);
1947                 if (retval != ERROR_OK) {
1948                         free(buffer);
1949                         return retval;
1950                 }
1951
1952                 /* convert to target endianness */
1953                 for (i = 0; i < (size/sizeof(uint32_t)); i++) {
1954                         uint32_t target_data;
1955                         target_data = target_buffer_get_u32(target, &buffer[i*sizeof(uint32_t)]);
1956                         target_buffer_set_u32(target, &buffer[i*sizeof(uint32_t)], target_data);
1957                 }
1958
1959                 retval = image_calculate_checksum(buffer, size, &checksum);
1960                 free(buffer);
1961         }
1962
1963         *crc = checksum;
1964
1965         return retval;
1966 }
1967
1968 int target_blank_check_memory(struct target *target, uint32_t address, uint32_t size, uint32_t* blank)
1969 {
1970         int retval;
1971         if (!target_was_examined(target)) {
1972                 LOG_ERROR("Target not examined yet");
1973                 return ERROR_FAIL;
1974         }
1975
1976         if (target->type->blank_check_memory == 0)
1977                 return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
1978
1979         retval = target->type->blank_check_memory(target, address, size, blank);
1980
1981         return retval;
1982 }
1983
1984 int target_read_u32(struct target *target, uint32_t address, uint32_t *value)
1985 {
1986         uint8_t value_buf[4];
1987         if (!target_was_examined(target)) {
1988                 LOG_ERROR("Target not examined yet");
1989                 return ERROR_FAIL;
1990         }
1991
1992         int retval = target_read_memory(target, address, 4, 1, value_buf);
1993
1994         if (retval == ERROR_OK) {
1995                 *value = target_buffer_get_u32(target, value_buf);
1996                 LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8" PRIx32 "",
1997                                   address,
1998                                   *value);
1999         } else {
2000                 *value = 0x0;
2001                 LOG_DEBUG("address: 0x%8.8" PRIx32 " failed",
2002                                   address);
2003         }
2004
2005         return retval;
2006 }
2007
2008 int target_read_u16(struct target *target, uint32_t address, uint16_t *value)
2009 {
2010         uint8_t value_buf[2];
2011         if (!target_was_examined(target)) {
2012                 LOG_ERROR("Target not examined yet");
2013                 return ERROR_FAIL;
2014         }
2015
2016         int retval = target_read_memory(target, address, 2, 1, value_buf);
2017
2018         if (retval == ERROR_OK) {
2019                 *value = target_buffer_get_u16(target, value_buf);
2020                 LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%4.4x",
2021                                   address,
2022                                   *value);
2023         } else {
2024                 *value = 0x0;
2025                 LOG_DEBUG("address: 0x%8.8" PRIx32 " failed",
2026                                   address);
2027         }
2028
2029         return retval;
2030 }
2031
2032 int target_read_u8(struct target *target, uint32_t address, uint8_t *value)
2033 {
2034         if (!target_was_examined(target)) {
2035                 LOG_ERROR("Target not examined yet");
2036                 return ERROR_FAIL;
2037         }
2038
2039         int retval = target_read_memory(target, address, 1, 1, value);
2040
2041         if (retval == ERROR_OK) {
2042                 LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2x",
2043                                   address,
2044                                   *value);
2045         } else {
2046                 *value = 0x0;
2047                 LOG_DEBUG("address: 0x%8.8" PRIx32 " failed",
2048                                   address);
2049         }
2050
2051         return retval;
2052 }
2053
2054 int target_write_u32(struct target *target, uint32_t address, uint32_t value)
2055 {
2056         int retval;
2057         uint8_t value_buf[4];
2058         if (!target_was_examined(target)) {
2059                 LOG_ERROR("Target not examined yet");
2060                 return ERROR_FAIL;
2061         }
2062
2063         LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8" PRIx32 "",
2064                           address,
2065                           value);
2066
2067         target_buffer_set_u32(target, value_buf, value);
2068         retval = target_write_memory(target, address, 4, 1, value_buf);
2069         if (retval != ERROR_OK)
2070                 LOG_DEBUG("failed: %i", retval);
2071
2072         return retval;
2073 }
2074
2075 int target_write_u16(struct target *target, uint32_t address, uint16_t value)
2076 {
2077         int retval;
2078         uint8_t value_buf[2];
2079         if (!target_was_examined(target)) {
2080                 LOG_ERROR("Target not examined yet");
2081                 return ERROR_FAIL;
2082         }
2083
2084         LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8x",
2085                           address,
2086                           value);
2087
2088         target_buffer_set_u16(target, value_buf, value);
2089         retval = target_write_memory(target, address, 2, 1, value_buf);
2090         if (retval != ERROR_OK)
2091                 LOG_DEBUG("failed: %i", retval);
2092
2093         return retval;
2094 }
2095
2096 int target_write_u8(struct target *target, uint32_t address, uint8_t value)
2097 {
2098         int retval;
2099         if (!target_was_examined(target)) {
2100                 LOG_ERROR("Target not examined yet");
2101                 return ERROR_FAIL;
2102         }
2103
2104         LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2x",
2105                           address, value);
2106
2107         retval = target_write_memory(target, address, 1, 1, &value);
2108         if (retval != ERROR_OK)
2109                 LOG_DEBUG("failed: %i", retval);
2110
2111         return retval;
2112 }
2113
2114 static int find_target(struct command_context *cmd_ctx, const char *name)
2115 {
2116         struct target *target = get_target(name);
2117         if (target == NULL) {
2118                 LOG_ERROR("Target: %s is unknown, try one of:\n", name);
2119                 return ERROR_FAIL;
2120         }
2121         if (!target->tap->enabled) {
2122                 LOG_USER("Target: TAP %s is disabled, "
2123                          "can't be the current target\n",
2124                          target->tap->dotted_name);
2125                 return ERROR_FAIL;
2126         }
2127
2128         cmd_ctx->current_target = target->target_number;
2129         return ERROR_OK;
2130 }
2131
2132
2133 COMMAND_HANDLER(handle_targets_command)
2134 {
2135         int retval = ERROR_OK;
2136         if (CMD_ARGC == 1) {
2137                 retval = find_target(CMD_CTX, CMD_ARGV[0]);
2138                 if (retval == ERROR_OK) {
2139                         /* we're done! */
2140                         return retval;
2141                 }
2142         }
2143
2144         struct target *target = all_targets;
2145         command_print(CMD_CTX, "    TargetName         Type       Endian TapName            State       ");
2146         command_print(CMD_CTX, "--  ------------------ ---------- ------ ------------------ ------------");
2147         while (target) {
2148                 const char *state;
2149                 char marker = ' ';
2150
2151                 if (target->tap->enabled)
2152                         state = target_state_name(target);
2153                 else
2154                         state = "tap-disabled";
2155
2156                 if (CMD_CTX->current_target == target->target_number)
2157                         marker = '*';
2158
2159                 /* keep columns lined up to match the headers above */
2160                 command_print(CMD_CTX,
2161                                 "%2d%c %-18s %-10s %-6s %-18s %s",
2162                                 target->target_number,
2163                                 marker,
2164                                 target_name(target),
2165                                 target_type_name(target),
2166                                 Jim_Nvp_value2name_simple(nvp_target_endian,
2167                                         target->endianness)->name,
2168                                 target->tap->dotted_name,
2169                                 state);
2170                 target = target->next;
2171         }
2172
2173         return retval;
2174 }
2175
2176 /* every 300ms we check for reset & powerdropout and issue a "reset halt" if so. */
2177
2178 static int powerDropout;
2179 static int srstAsserted;
2180
2181 static int runPowerRestore;
2182 static int runPowerDropout;
2183 static int runSrstAsserted;
2184 static int runSrstDeasserted;
2185
2186 static int sense_handler(void)
2187 {
2188         static int prevSrstAsserted;
2189         static int prevPowerdropout;
2190
2191         int retval = jtag_power_dropout(&powerDropout);
2192         if (retval != ERROR_OK)
2193                 return retval;
2194
2195         int powerRestored;
2196         powerRestored = prevPowerdropout && !powerDropout;
2197         if (powerRestored)
2198                 runPowerRestore = 1;
2199
2200         long long current = timeval_ms();
2201         static long long lastPower;
2202         int waitMore = lastPower + 2000 > current;
2203         if (powerDropout && !waitMore) {
2204                 runPowerDropout = 1;
2205                 lastPower = current;
2206         }
2207
2208         retval = jtag_srst_asserted(&srstAsserted);
2209         if (retval != ERROR_OK)
2210                 return retval;
2211
2212         int srstDeasserted;
2213         srstDeasserted = prevSrstAsserted && !srstAsserted;
2214
2215         static long long lastSrst;
2216         waitMore = lastSrst + 2000 > current;
2217         if (srstDeasserted && !waitMore) {
2218                 runSrstDeasserted = 1;
2219                 lastSrst = current;
2220         }
2221
2222         if (!prevSrstAsserted && srstAsserted)
2223                 runSrstAsserted = 1;
2224
2225         prevSrstAsserted = srstAsserted;
2226         prevPowerdropout = powerDropout;
2227
2228         if (srstDeasserted || powerRestored) {
2229                 /* Other than logging the event we can't do anything here.
2230                  * Issuing a reset is a particularly bad idea as we might
2231                  * be inside a reset already.
2232                  */
2233         }
2234
2235         return ERROR_OK;
2236 }
2237
2238 /* process target state changes */
2239 static int handle_target(void *priv)
2240 {
2241         Jim_Interp *interp = (Jim_Interp *)priv;
2242         int retval = ERROR_OK;
2243
2244         if (!is_jtag_poll_safe()) {
2245                 /* polling is disabled currently */
2246                 return ERROR_OK;
2247         }
2248
2249         /* we do not want to recurse here... */
2250         static int recursive;
2251         if (!recursive) {
2252                 recursive = 1;
2253                 sense_handler();
2254                 /* danger! running these procedures can trigger srst assertions and power dropouts.
2255                  * We need to avoid an infinite loop/recursion here and we do that by
2256                  * clearing the flags after running these events.
2257                  */
2258                 int did_something = 0;
2259                 if (runSrstAsserted) {
2260                         LOG_INFO("srst asserted detected, running srst_asserted proc.");
2261                         Jim_Eval(interp, "srst_asserted");
2262                         did_something = 1;
2263                 }
2264                 if (runSrstDeasserted) {
2265                         Jim_Eval(interp, "srst_deasserted");
2266                         did_something = 1;
2267                 }
2268                 if (runPowerDropout) {
2269                         LOG_INFO("Power dropout detected, running power_dropout proc.");
2270                         Jim_Eval(interp, "power_dropout");
2271                         did_something = 1;
2272                 }
2273                 if (runPowerRestore) {
2274                         Jim_Eval(interp, "power_restore");
2275                         did_something = 1;
2276                 }
2277
2278                 if (did_something) {
2279                         /* clear detect flags */
2280                         sense_handler();
2281                 }
2282
2283                 /* clear action flags */
2284
2285                 runSrstAsserted = 0;
2286                 runSrstDeasserted = 0;
2287                 runPowerRestore = 0;
2288                 runPowerDropout = 0;
2289
2290                 recursive = 0;
2291         }
2292
2293         /* Poll targets for state changes unless that's globally disabled.
2294          * Skip targets that are currently disabled.
2295          */
2296         for (struct target *target = all_targets;
2297                         is_jtag_poll_safe() && target;
2298                         target = target->next) {
2299                 if (!target->tap->enabled)
2300                         continue;
2301
2302                 if (target->backoff.times > target->backoff.count) {
2303                         /* do not poll this time as we failed previously */
2304                         target->backoff.count++;
2305                         continue;
2306                 }
2307                 target->backoff.count = 0;
2308
2309                 /* only poll target if we've got power and srst isn't asserted */
2310                 if (!powerDropout && !srstAsserted) {
2311                         /* polling may fail silently until the target has been examined */
2312                         retval = target_poll(target);
2313                         if (retval != ERROR_OK) {
2314                                 /* 100ms polling interval. Increase interval between polling up to 5000ms */
2315                                 if (target->backoff.times * polling_interval < 5000) {
2316                                         target->backoff.times *= 2;
2317                                         target->backoff.times++;
2318                                 }
2319                                 LOG_USER("Polling target %s failed, GDB will be halted. Polling again in %dms",
2320                                                 target_name(target),
2321                                                 target->backoff.times * polling_interval);
2322
2323                                 /* Tell GDB to halt the debugger. This allows the user to
2324                                  * run monitor commands to handle the situation.
2325                                  */
2326                                 target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
2327                                 return retval;
2328                         }
2329                         /* Since we succeeded, we reset backoff count */
2330                         if (target->backoff.times > 0)
2331                                 LOG_USER("Polling target %s succeeded again", target_name(target));
2332                         target->backoff.times = 0;
2333                 }
2334         }
2335
2336         return retval;
2337 }
2338
2339 COMMAND_HANDLER(handle_reg_command)
2340 {
2341         struct target *target;
2342         struct reg *reg = NULL;
2343         unsigned count = 0;
2344         char *value;
2345
2346         LOG_DEBUG("-");
2347
2348         target = get_current_target(CMD_CTX);
2349
2350         /* list all available registers for the current target */
2351         if (CMD_ARGC == 0) {
2352                 struct reg_cache *cache = target->reg_cache;
2353
2354                 count = 0;
2355                 while (cache) {
2356                         unsigned i;
2357
2358                         command_print(CMD_CTX, "===== %s", cache->name);
2359
2360                         for (i = 0, reg = cache->reg_list;
2361                                         i < cache->num_regs;
2362                                         i++, reg++, count++) {
2363                                 /* only print cached values if they are valid */
2364                                 if (reg->valid) {
2365                                         value = buf_to_str(reg->value,
2366                                                         reg->size, 16);
2367                                         command_print(CMD_CTX,
2368                                                         "(%i) %s (/%" PRIu32 "): 0x%s%s",
2369                                                         count, reg->name,
2370                                                         reg->size, value,
2371                                                         reg->dirty
2372                                                                 ? " (dirty)"
2373                                                                 : "");
2374                                         free(value);
2375                                 } else {
2376                                         command_print(CMD_CTX, "(%i) %s (/%" PRIu32 ")",
2377                                                           count, reg->name,
2378                                                           reg->size) ;
2379                                 }
2380                         }
2381                         cache = cache->next;
2382                 }
2383
2384                 return ERROR_OK;
2385         }
2386
2387         /* access a single register by its ordinal number */
2388         if ((CMD_ARGV[0][0] >= '0') && (CMD_ARGV[0][0] <= '9')) {
2389                 unsigned num;
2390                 COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], num);
2391
2392                 struct reg_cache *cache = target->reg_cache;
2393                 count = 0;
2394                 while (cache) {
2395                         unsigned i;
2396                         for (i = 0; i < cache->num_regs; i++) {
2397                                 if (count++ == num) {
2398                                         reg = &cache->reg_list[i];
2399                                         break;
2400                                 }
2401                         }
2402                         if (reg)
2403                                 break;
2404                         cache = cache->next;
2405                 }
2406
2407                 if (!reg) {
2408                         command_print(CMD_CTX, "%i is out of bounds, the current target "
2409                                         "has only %i registers (0 - %i)", num, count, count - 1);
2410                         return ERROR_OK;
2411                 }
2412         } else {
2413                 /* access a single register by its name */
2414                 reg = register_get_by_name(target->reg_cache, CMD_ARGV[0], 1);
2415
2416                 if (!reg) {
2417                         command_print(CMD_CTX, "register %s not found in current target", CMD_ARGV[0]);
2418                         return ERROR_OK;
2419                 }
2420         }
2421
2422         assert(reg != NULL); /* give clang a hint that we *know* reg is != NULL here */
2423
2424         /* display a register */
2425         if ((CMD_ARGC == 1) || ((CMD_ARGC == 2) && !((CMD_ARGV[1][0] >= '0')
2426                         && (CMD_ARGV[1][0] <= '9')))) {
2427                 if ((CMD_ARGC == 2) && (strcmp(CMD_ARGV[1], "force") == 0))
2428                         reg->valid = 0;
2429
2430                 if (reg->valid == 0)
2431                         reg->type->get(reg);
2432                 value = buf_to_str(reg->value, reg->size, 16);
2433                 command_print(CMD_CTX, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
2434                 free(value);
2435                 return ERROR_OK;
2436         }
2437
2438         /* set register value */
2439         if (CMD_ARGC == 2) {
2440                 uint8_t *buf = malloc(DIV_ROUND_UP(reg->size, 8));
2441                 if (buf == NULL)
2442                         return ERROR_FAIL;
2443                 str_to_buf(CMD_ARGV[1], strlen(CMD_ARGV[1]), buf, reg->size, 0);
2444
2445                 reg->type->set(reg, buf);
2446
2447                 value = buf_to_str(reg->value, reg->size, 16);
2448                 command_print(CMD_CTX, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
2449                 free(value);
2450
2451                 free(buf);
2452
2453                 return ERROR_OK;
2454         }
2455
2456         return ERROR_COMMAND_SYNTAX_ERROR;
2457 }
2458
2459 COMMAND_HANDLER(handle_poll_command)
2460 {
2461         int retval = ERROR_OK;
2462         struct target *target = get_current_target(CMD_CTX);
2463
2464         if (CMD_ARGC == 0) {
2465                 command_print(CMD_CTX, "background polling: %s",
2466                                 jtag_poll_get_enabled() ? "on" : "off");
2467                 command_print(CMD_CTX, "TAP: %s (%s)",
2468                                 target->tap->dotted_name,
2469                                 target->tap->enabled ? "enabled" : "disabled");
2470                 if (!target->tap->enabled)
2471                         return ERROR_OK;
2472                 retval = target_poll(target);
2473                 if (retval != ERROR_OK)
2474                         return retval;
2475                 retval = target_arch_state(target);
2476                 if (retval != ERROR_OK)
2477                         return retval;
2478         } else if (CMD_ARGC == 1) {
2479                 bool enable;
2480                 COMMAND_PARSE_ON_OFF(CMD_ARGV[0], enable);
2481                 jtag_poll_set_enabled(enable);
2482         } else
2483                 return ERROR_COMMAND_SYNTAX_ERROR;
2484
2485         return retval;
2486 }
2487
2488 COMMAND_HANDLER(handle_wait_halt_command)
2489 {
2490         if (CMD_ARGC > 1)
2491                 return ERROR_COMMAND_SYNTAX_ERROR;
2492
2493         unsigned ms = DEFAULT_HALT_TIMEOUT;
2494         if (1 == CMD_ARGC) {
2495                 int retval = parse_uint(CMD_ARGV[0], &ms);
2496                 if (ERROR_OK != retval)
2497                         return ERROR_COMMAND_SYNTAX_ERROR;
2498         }
2499
2500         struct target *target = get_current_target(CMD_CTX);
2501         return target_wait_state(target, TARGET_HALTED, ms);
2502 }
2503
2504 /* wait for target state to change. The trick here is to have a low
2505  * latency for short waits and not to suck up all the CPU time
2506  * on longer waits.
2507  *
2508  * After 500ms, keep_alive() is invoked
2509  */
2510 int target_wait_state(struct target *target, enum target_state state, int ms)
2511 {
2512         int retval;
2513         long long then = 0, cur;
2514         int once = 1;
2515
2516         for (;;) {
2517                 retval = target_poll(target);
2518                 if (retval != ERROR_OK)
2519                         return retval;
2520                 if (target->state == state)
2521                         break;
2522                 cur = timeval_ms();
2523                 if (once) {
2524                         once = 0;
2525                         then = timeval_ms();
2526                         LOG_DEBUG("waiting for target %s...",
2527                                 Jim_Nvp_value2name_simple(nvp_target_state, state)->name);
2528                 }
2529
2530                 if (cur-then > 500)
2531                         keep_alive();
2532
2533                 if ((cur-then) > ms) {
2534                         LOG_ERROR("timed out while waiting for target %s",
2535                                 Jim_Nvp_value2name_simple(nvp_target_state, state)->name);
2536                         return ERROR_FAIL;
2537                 }
2538         }
2539
2540         return ERROR_OK;
2541 }
2542
2543 COMMAND_HANDLER(handle_halt_command)
2544 {
2545         LOG_DEBUG("-");
2546
2547         struct target *target = get_current_target(CMD_CTX);
2548         int retval = target_halt(target);
2549         if (ERROR_OK != retval)
2550                 return retval;
2551
2552         if (CMD_ARGC == 1) {
2553                 unsigned wait_local;
2554                 retval = parse_uint(CMD_ARGV[0], &wait_local);
2555                 if (ERROR_OK != retval)
2556                         return ERROR_COMMAND_SYNTAX_ERROR;
2557                 if (!wait_local)
2558                         return ERROR_OK;
2559         }
2560
2561         return CALL_COMMAND_HANDLER(handle_wait_halt_command);
2562 }
2563
2564 COMMAND_HANDLER(handle_soft_reset_halt_command)
2565 {
2566         struct target *target = get_current_target(CMD_CTX);
2567
2568         LOG_USER("requesting target halt and executing a soft reset");
2569
2570         target_soft_reset_halt(target);
2571
2572         return ERROR_OK;
2573 }
2574
2575 COMMAND_HANDLER(handle_reset_command)
2576 {
2577         if (CMD_ARGC > 1)
2578                 return ERROR_COMMAND_SYNTAX_ERROR;
2579
2580         enum target_reset_mode reset_mode = RESET_RUN;
2581         if (CMD_ARGC == 1) {
2582                 const Jim_Nvp *n;
2583                 n = Jim_Nvp_name2value_simple(nvp_reset_modes, CMD_ARGV[0]);
2584                 if ((n->name == NULL) || (n->value == RESET_UNKNOWN))
2585                         return ERROR_COMMAND_SYNTAX_ERROR;
2586                 reset_mode = n->value;
2587         }
2588
2589         /* reset *all* targets */
2590         return target_process_reset(CMD_CTX, reset_mode);
2591 }
2592
2593
2594 COMMAND_HANDLER(handle_resume_command)
2595 {
2596         int current = 1;
2597         if (CMD_ARGC > 1)
2598                 return ERROR_COMMAND_SYNTAX_ERROR;
2599
2600         struct target *target = get_current_target(CMD_CTX);
2601
2602         /* with no CMD_ARGV, resume from current pc, addr = 0,
2603          * with one arguments, addr = CMD_ARGV[0],
2604          * handle breakpoints, not debugging */
2605         uint32_t addr = 0;
2606         if (CMD_ARGC == 1) {
2607                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
2608                 current = 0;
2609         }
2610
2611         return target_resume(target, current, addr, 1, 0);
2612 }
2613
2614 COMMAND_HANDLER(handle_step_command)
2615 {
2616         if (CMD_ARGC > 1)
2617                 return ERROR_COMMAND_SYNTAX_ERROR;
2618
2619         LOG_DEBUG("-");
2620
2621         /* with no CMD_ARGV, step from current pc, addr = 0,
2622          * with one argument addr = CMD_ARGV[0],
2623          * handle breakpoints, debugging */
2624         uint32_t addr = 0;
2625         int current_pc = 1;
2626         if (CMD_ARGC == 1) {
2627                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
2628                 current_pc = 0;
2629         }
2630
2631         struct target *target = get_current_target(CMD_CTX);
2632
2633         return target->type->step(target, current_pc, addr, 1);
2634 }
2635
2636 static void handle_md_output(struct command_context *cmd_ctx,
2637                 struct target *target, uint32_t address, unsigned size,
2638                 unsigned count, const uint8_t *buffer)
2639 {
2640         const unsigned line_bytecnt = 32;
2641         unsigned line_modulo = line_bytecnt / size;
2642
2643         char output[line_bytecnt * 4 + 1];
2644         unsigned output_len = 0;
2645
2646         const char *value_fmt;
2647         switch (size) {
2648         case 4:
2649                 value_fmt = "%8.8x ";
2650                 break;
2651         case 2:
2652                 value_fmt = "%4.4x ";
2653                 break;
2654         case 1:
2655                 value_fmt = "%2.2x ";
2656                 break;
2657         default:
2658                 /* "can't happen", caller checked */
2659                 LOG_ERROR("invalid memory read size: %u", size);
2660                 return;
2661         }
2662
2663         for (unsigned i = 0; i < count; i++) {
2664                 if (i % line_modulo == 0) {
2665                         output_len += snprintf(output + output_len,
2666                                         sizeof(output) - output_len,
2667                                         "0x%8.8x: ",
2668                                         (unsigned)(address + (i*size)));
2669                 }
2670
2671                 uint32_t value = 0;
2672                 const uint8_t *value_ptr = buffer + i * size;
2673                 switch (size) {
2674                 case 4:
2675                         value = target_buffer_get_u32(target, value_ptr);
2676                         break;
2677                 case 2:
2678                         value = target_buffer_get_u16(target, value_ptr);
2679                         break;
2680                 case 1:
2681                         value = *value_ptr;
2682                 }
2683                 output_len += snprintf(output + output_len,
2684                                 sizeof(output) - output_len,
2685                                 value_fmt, value);
2686
2687                 if ((i % line_modulo == line_modulo - 1) || (i == count - 1)) {
2688                         command_print(cmd_ctx, "%s", output);
2689                         output_len = 0;
2690                 }
2691         }
2692 }
2693
2694 COMMAND_HANDLER(handle_md_command)
2695 {
2696         if (CMD_ARGC < 1)
2697                 return ERROR_COMMAND_SYNTAX_ERROR;
2698
2699         unsigned size = 0;
2700         switch (CMD_NAME[2]) {
2701         case 'w':
2702                 size = 4;
2703                 break;
2704         case 'h':
2705                 size = 2;
2706                 break;
2707         case 'b':
2708                 size = 1;
2709                 break;
2710         default:
2711                 return ERROR_COMMAND_SYNTAX_ERROR;
2712         }
2713
2714         bool physical = strcmp(CMD_ARGV[0], "phys") == 0;
2715         int (*fn)(struct target *target,
2716                         uint32_t address, uint32_t size_value, uint32_t count, uint8_t *buffer);
2717         if (physical) {
2718                 CMD_ARGC--;
2719                 CMD_ARGV++;
2720                 fn = target_read_phys_memory;
2721         } else
2722                 fn = target_read_memory;
2723         if ((CMD_ARGC < 1) || (CMD_ARGC > 2))
2724                 return ERROR_COMMAND_SYNTAX_ERROR;
2725
2726         uint32_t address;
2727         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], address);
2728
2729         unsigned count = 1;
2730         if (CMD_ARGC == 2)
2731                 COMMAND_PARSE_NUMBER(uint, CMD_ARGV[1], count);
2732
2733         uint8_t *buffer = calloc(count, size);
2734
2735         struct target *target = get_current_target(CMD_CTX);
2736         int retval = fn(target, address, size, count, buffer);
2737         if (ERROR_OK == retval)
2738                 handle_md_output(CMD_CTX, target, address, size, count, buffer);
2739
2740         free(buffer);
2741
2742         return retval;
2743 }
2744
2745 typedef int (*target_write_fn)(struct target *target,
2746                 uint32_t address, uint32_t size, uint32_t count, const uint8_t *buffer);
2747
2748 static int target_fill_mem(struct target *target,
2749                 uint32_t address,
2750                 target_write_fn fn,
2751                 unsigned data_size,
2752                 /* value */
2753                 uint32_t b,
2754                 /* count */
2755                 unsigned c)
2756 {
2757         /* We have to write in reasonably large chunks to be able
2758          * to fill large memory areas with any sane speed */
2759         const unsigned chunk_size = 16384;
2760         uint8_t *target_buf = malloc(chunk_size * data_size);
2761         if (target_buf == NULL) {
2762                 LOG_ERROR("Out of memory");
2763                 return ERROR_FAIL;
2764         }
2765
2766         for (unsigned i = 0; i < chunk_size; i++) {
2767                 switch (data_size) {
2768                 case 4:
2769                         target_buffer_set_u32(target, target_buf + i * data_size, b);
2770                         break;
2771                 case 2:
2772                         target_buffer_set_u16(target, target_buf + i * data_size, b);
2773                         break;
2774                 case 1:
2775                         target_buffer_set_u8(target, target_buf + i * data_size, b);
2776                         break;
2777                 default:
2778                         exit(-1);
2779                 }
2780         }
2781
2782         int retval = ERROR_OK;
2783
2784         for (unsigned x = 0; x < c; x += chunk_size) {
2785                 unsigned current;
2786                 current = c - x;
2787                 if (current > chunk_size)
2788                         current = chunk_size;
2789                 retval = fn(target, address + x * data_size, data_size, current, target_buf);
2790                 if (retval != ERROR_OK)
2791                         break;
2792                 /* avoid GDB timeouts */
2793                 keep_alive();
2794         }
2795         free(target_buf);
2796
2797         return retval;
2798 }
2799
2800
2801 COMMAND_HANDLER(handle_mw_command)
2802 {
2803         if (CMD_ARGC < 2)
2804                 return ERROR_COMMAND_SYNTAX_ERROR;
2805         bool physical = strcmp(CMD_ARGV[0], "phys") == 0;
2806         target_write_fn fn;
2807         if (physical) {
2808                 CMD_ARGC--;
2809                 CMD_ARGV++;
2810                 fn = target_write_phys_memory;
2811         } else
2812                 fn = target_write_memory;
2813         if ((CMD_ARGC < 2) || (CMD_ARGC > 3))
2814                 return ERROR_COMMAND_SYNTAX_ERROR;
2815
2816         uint32_t address;
2817         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], address);
2818
2819         uint32_t value;
2820         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], value);
2821
2822         unsigned count = 1;
2823         if (CMD_ARGC == 3)
2824                 COMMAND_PARSE_NUMBER(uint, CMD_ARGV[2], count);
2825
2826         struct target *target = get_current_target(CMD_CTX);
2827         unsigned wordsize;
2828         switch (CMD_NAME[2]) {
2829                 case 'w':
2830                         wordsize = 4;
2831                         break;
2832                 case 'h':
2833                         wordsize = 2;
2834                         break;
2835                 case 'b':
2836                         wordsize = 1;
2837                         break;
2838                 default:
2839                         return ERROR_COMMAND_SYNTAX_ERROR;
2840         }
2841
2842         return target_fill_mem(target, address, fn, wordsize, value, count);
2843 }
2844
2845 static COMMAND_HELPER(parse_load_image_command_CMD_ARGV, struct image *image,
2846                 uint32_t *min_address, uint32_t *max_address)
2847 {
2848         if (CMD_ARGC < 1 || CMD_ARGC > 5)
2849                 return ERROR_COMMAND_SYNTAX_ERROR;
2850
2851         /* a base address isn't always necessary,
2852          * default to 0x0 (i.e. don't relocate) */
2853         if (CMD_ARGC >= 2) {
2854                 uint32_t addr;
2855                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], addr);
2856                 image->base_address = addr;
2857                 image->base_address_set = 1;
2858         } else
2859                 image->base_address_set = 0;
2860
2861         image->start_address_set = 0;
2862
2863         if (CMD_ARGC >= 4)
2864                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], *min_address);
2865         if (CMD_ARGC == 5) {
2866                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[4], *max_address);
2867                 /* use size (given) to find max (required) */
2868                 *max_address += *min_address;
2869         }
2870
2871         if (*min_address > *max_address)
2872                 return ERROR_COMMAND_SYNTAX_ERROR;
2873
2874         return ERROR_OK;
2875 }
2876
2877 COMMAND_HANDLER(handle_load_image_command)
2878 {
2879         uint8_t *buffer;
2880         size_t buf_cnt;
2881         uint32_t image_size;
2882         uint32_t min_address = 0;
2883         uint32_t max_address = 0xffffffff;
2884         int i;
2885         struct image image;
2886
2887         int retval = CALL_COMMAND_HANDLER(parse_load_image_command_CMD_ARGV,
2888                         &image, &min_address, &max_address);
2889         if (ERROR_OK != retval)
2890                 return retval;
2891
2892         struct target *target = get_current_target(CMD_CTX);
2893
2894         struct duration bench;
2895         duration_start(&bench);
2896
2897         if (image_open(&image, CMD_ARGV[0], (CMD_ARGC >= 3) ? CMD_ARGV[2] : NULL) != ERROR_OK)
2898                 return ERROR_OK;
2899
2900         image_size = 0x0;
2901         retval = ERROR_OK;
2902         for (i = 0; i < image.num_sections; i++) {
2903                 buffer = malloc(image.sections[i].size);
2904                 if (buffer == NULL) {
2905                         command_print(CMD_CTX,
2906                                                   "error allocating buffer for section (%d bytes)",
2907                                                   (int)(image.sections[i].size));
2908                         break;
2909                 }
2910
2911                 retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt);
2912                 if (retval != ERROR_OK) {
2913                         free(buffer);
2914                         break;
2915                 }
2916
2917                 uint32_t offset = 0;
2918                 uint32_t length = buf_cnt;
2919
2920                 /* DANGER!!! beware of unsigned comparision here!!! */
2921
2922                 if ((image.sections[i].base_address + buf_cnt >= min_address) &&
2923                                 (image.sections[i].base_address < max_address)) {
2924
2925                         if (image.sections[i].base_address < min_address) {
2926                                 /* clip addresses below */
2927                                 offset += min_address-image.sections[i].base_address;
2928                                 length -= offset;
2929                         }
2930
2931                         if (image.sections[i].base_address + buf_cnt > max_address)
2932                                 length -= (image.sections[i].base_address + buf_cnt)-max_address;
2933
2934                         retval = target_write_buffer(target,
2935                                         image.sections[i].base_address + offset, length, buffer + offset);
2936                         if (retval != ERROR_OK) {
2937                                 free(buffer);
2938                                 break;
2939                         }
2940                         image_size += length;
2941                         command_print(CMD_CTX, "%u bytes written at address 0x%8.8" PRIx32 "",
2942                                         (unsigned int)length,
2943                                         image.sections[i].base_address + offset);
2944                 }
2945
2946                 free(buffer);
2947         }
2948
2949         if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
2950                 command_print(CMD_CTX, "downloaded %" PRIu32 " bytes "
2951                                 "in %fs (%0.3f KiB/s)", image_size,
2952                                 duration_elapsed(&bench), duration_kbps(&bench, image_size));
2953         }
2954
2955         image_close(&image);
2956
2957         return retval;
2958
2959 }
2960
2961 COMMAND_HANDLER(handle_dump_image_command)
2962 {
2963         struct fileio fileio;
2964         uint8_t *buffer;
2965         int retval, retvaltemp;
2966         uint32_t address, size;
2967         struct duration bench;
2968         struct target *target = get_current_target(CMD_CTX);
2969
2970         if (CMD_ARGC != 3)
2971                 return ERROR_COMMAND_SYNTAX_ERROR;
2972
2973         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], address);
2974         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], size);
2975
2976         uint32_t buf_size = (size > 4096) ? 4096 : size;
2977         buffer = malloc(buf_size);
2978         if (!buffer)
2979                 return ERROR_FAIL;
2980
2981         retval = fileio_open(&fileio, CMD_ARGV[0], FILEIO_WRITE, FILEIO_BINARY);
2982         if (retval != ERROR_OK) {
2983                 free(buffer);
2984                 return retval;
2985         }
2986
2987         duration_start(&bench);
2988
2989         while (size > 0) {
2990                 size_t size_written;
2991                 uint32_t this_run_size = (size > buf_size) ? buf_size : size;
2992                 retval = target_read_buffer(target, address, this_run_size, buffer);
2993                 if (retval != ERROR_OK)
2994                         break;
2995
2996                 retval = fileio_write(&fileio, this_run_size, buffer, &size_written);
2997                 if (retval != ERROR_OK)
2998                         break;
2999
3000                 size -= this_run_size;
3001                 address += this_run_size;
3002         }
3003
3004         free(buffer);
3005
3006         if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
3007                 int filesize;
3008                 retval = fileio_size(&fileio, &filesize);
3009                 if (retval != ERROR_OK)
3010                         return retval;
3011                 command_print(CMD_CTX,
3012                                 "dumped %ld bytes in %fs (%0.3f KiB/s)", (long)filesize,
3013                                 duration_elapsed(&bench), duration_kbps(&bench, filesize));
3014         }
3015
3016         retvaltemp = fileio_close(&fileio);
3017         if (retvaltemp != ERROR_OK)
3018                 return retvaltemp;
3019
3020         return retval;
3021 }
3022
3023 static COMMAND_HELPER(handle_verify_image_command_internal, int verify)
3024 {
3025         uint8_t *buffer;
3026         size_t buf_cnt;
3027         uint32_t image_size;
3028         int i;
3029         int retval;
3030         uint32_t checksum = 0;
3031         uint32_t mem_checksum = 0;
3032
3033         struct image image;
3034
3035         struct target *target = get_current_target(CMD_CTX);
3036
3037         if (CMD_ARGC < 1)
3038                 return ERROR_COMMAND_SYNTAX_ERROR;
3039
3040         if (!target) {
3041                 LOG_ERROR("no target selected");
3042                 return ERROR_FAIL;
3043         }
3044
3045         struct duration bench;
3046         duration_start(&bench);
3047
3048         if (CMD_ARGC >= 2) {
3049                 uint32_t addr;
3050                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], addr);
3051                 image.base_address = addr;
3052                 image.base_address_set = 1;
3053         } else {
3054                 image.base_address_set = 0;
3055                 image.base_address = 0x0;
3056         }
3057
3058         image.start_address_set = 0;
3059
3060         retval = image_open(&image, CMD_ARGV[0], (CMD_ARGC == 3) ? CMD_ARGV[2] : NULL);
3061         if (retval != ERROR_OK)
3062                 return retval;
3063
3064         image_size = 0x0;
3065         int diffs = 0;
3066         retval = ERROR_OK;
3067         for (i = 0; i < image.num_sections; i++) {
3068                 buffer = malloc(image.sections[i].size);
3069                 if (buffer == NULL) {
3070                         command_print(CMD_CTX,
3071                                         "error allocating buffer for section (%d bytes)",
3072                                         (int)(image.sections[i].size));
3073                         break;
3074                 }
3075                 retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt);
3076                 if (retval != ERROR_OK) {
3077                         free(buffer);
3078                         break;
3079                 }
3080
3081                 if (verify) {
3082                         /* calculate checksum of image */
3083                         retval = image_calculate_checksum(buffer, buf_cnt, &checksum);
3084                         if (retval != ERROR_OK) {
3085                                 free(buffer);
3086                                 break;
3087                         }
3088
3089                         retval = target_checksum_memory(target, image.sections[i].base_address, buf_cnt, &mem_checksum);
3090                         if (retval != ERROR_OK) {
3091                                 free(buffer);
3092                                 break;
3093                         }
3094
3095                         if (checksum != mem_checksum) {
3096                                 /* failed crc checksum, fall back to a binary compare */
3097                                 uint8_t *data;
3098
3099                                 if (diffs == 0)
3100                                         LOG_ERROR("checksum mismatch - attempting binary compare");
3101
3102                                 data = (uint8_t *)malloc(buf_cnt);
3103
3104                                 /* Can we use 32bit word accesses? */
3105                                 int size = 1;
3106                                 int count = buf_cnt;
3107                                 if ((count % 4) == 0) {
3108                                         size *= 4;
3109                                         count /= 4;
3110                                 }
3111                                 retval = target_read_memory(target, image.sections[i].base_address, size, count, data);
3112                                 if (retval == ERROR_OK) {
3113                                         uint32_t t;
3114                                         for (t = 0; t < buf_cnt; t++) {
3115                                                 if (data[t] != buffer[t]) {
3116                                                         command_print(CMD_CTX,
3117                                                                                   "diff %d address 0x%08x. Was 0x%02x instead of 0x%02x",
3118                                                                                   diffs,
3119                                                                                   (unsigned)(t + image.sections[i].base_address),
3120                                                                                   data[t],
3121                                                                                   buffer[t]);
3122                                                         if (diffs++ >= 127) {
3123                                                                 command_print(CMD_CTX, "More than 128 errors, the rest are not printed.");
3124                                                                 free(data);
3125                                                                 free(buffer);
3126                                                                 goto done;
3127                                                         }
3128                                                 }
3129                                                 keep_alive();
3130                                         }
3131                                 }
3132                                 free(data);
3133                         }
3134                 } else {
3135                         command_print(CMD_CTX, "address 0x%08" PRIx32 " length 0x%08zx",
3136                                                   image.sections[i].base_address,
3137                                                   buf_cnt);
3138                 }
3139
3140                 free(buffer);
3141                 image_size += buf_cnt;
3142         }
3143         if (diffs > 0)
3144                 command_print(CMD_CTX, "No more differences found.");
3145 done:
3146         if (diffs > 0)
3147                 retval = ERROR_FAIL;
3148         if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
3149                 command_print(CMD_CTX, "verified %" PRIu32 " bytes "
3150                                 "in %fs (%0.3f KiB/s)", image_size,
3151                                 duration_elapsed(&bench), duration_kbps(&bench, image_size));
3152         }
3153
3154         image_close(&image);
3155
3156         return retval;
3157 }
3158
3159 COMMAND_HANDLER(handle_verify_image_command)
3160 {
3161         return CALL_COMMAND_HANDLER(handle_verify_image_command_internal, 1);
3162 }
3163
3164 COMMAND_HANDLER(handle_test_image_command)
3165 {
3166         return CALL_COMMAND_HANDLER(handle_verify_image_command_internal, 0);
3167 }
3168
3169 static int handle_bp_command_list(struct command_context *cmd_ctx)
3170 {
3171         struct target *target = get_current_target(cmd_ctx);
3172         struct breakpoint *breakpoint = target->breakpoints;
3173         while (breakpoint) {
3174                 if (breakpoint->type == BKPT_SOFT) {
3175                         char *buf = buf_to_str(breakpoint->orig_instr,
3176                                         breakpoint->length, 16);
3177                         command_print(cmd_ctx, "IVA breakpoint: 0x%8.8" PRIx32 ", 0x%x, %i, 0x%s",
3178                                         breakpoint->address,
3179                                         breakpoint->length,
3180                                         breakpoint->set, buf);
3181                         free(buf);
3182                 } else {
3183                         if ((breakpoint->address == 0) && (breakpoint->asid != 0))
3184                                 command_print(cmd_ctx, "Context breakpoint: 0x%8.8" PRIx32 ", 0x%x, %i",
3185                                                         breakpoint->asid,
3186                                                         breakpoint->length, breakpoint->set);
3187                         else if ((breakpoint->address != 0) && (breakpoint->asid != 0)) {
3188                                 command_print(cmd_ctx, "Hybrid breakpoint(IVA): 0x%8.8" PRIx32 ", 0x%x, %i",
3189                                                         breakpoint->address,
3190                                                         breakpoint->length, breakpoint->set);
3191                                 command_print(cmd_ctx, "\t|--->linked with ContextID: 0x%8.8" PRIx32,
3192                                                         breakpoint->asid);
3193                         } else
3194                                 command_print(cmd_ctx, "Breakpoint(IVA): 0x%8.8" PRIx32 ", 0x%x, %i",
3195                                                         breakpoint->address,
3196                                                         breakpoint->length, breakpoint->set);
3197                 }
3198
3199                 breakpoint = breakpoint->next;
3200         }
3201         return ERROR_OK;
3202 }
3203
3204 static int handle_bp_command_set(struct command_context *cmd_ctx,
3205                 uint32_t addr, uint32_t asid, uint32_t length, int hw)
3206 {
3207         struct target *target = get_current_target(cmd_ctx);
3208
3209         if (asid == 0) {
3210                 int retval = breakpoint_add(target, addr, length, hw);
3211                 if (ERROR_OK == retval)
3212                         command_print(cmd_ctx, "breakpoint set at 0x%8.8" PRIx32 "", addr);
3213                 else {
3214                         LOG_ERROR("Failure setting breakpoint, the same address(IVA) is already used");
3215                         return retval;
3216                 }
3217         } else if (addr == 0) {
3218                 int retval = context_breakpoint_add(target, asid, length, hw);
3219                 if (ERROR_OK == retval)
3220                         command_print(cmd_ctx, "Context breakpoint set at 0x%8.8" PRIx32 "", asid);
3221                 else {
3222                         LOG_ERROR("Failure setting breakpoint, the same address(CONTEXTID) is already used");
3223                         return retval;
3224                 }
3225         } else {
3226                 int retval = hybrid_breakpoint_add(target, addr, asid, length, hw);
3227                 if (ERROR_OK == retval)
3228                         command_print(cmd_ctx, "Hybrid breakpoint set at 0x%8.8" PRIx32 "", asid);
3229                 else {
3230                         LOG_ERROR("Failure setting breakpoint, the same address is already used");
3231                         return retval;
3232                 }
3233         }
3234         return ERROR_OK;
3235 }
3236
3237 COMMAND_HANDLER(handle_bp_command)
3238 {
3239         uint32_t addr;
3240         uint32_t asid;
3241         uint32_t length;
3242         int hw = BKPT_SOFT;
3243
3244         switch (CMD_ARGC) {
3245                 case 0:
3246                         return handle_bp_command_list(CMD_CTX);
3247
3248                 case 2:
3249                         asid = 0;
3250                         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
3251                         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
3252                         return handle_bp_command_set(CMD_CTX, addr, asid, length, hw);
3253
3254                 case 3:
3255                         if (strcmp(CMD_ARGV[2], "hw") == 0) {
3256                                 hw = BKPT_HARD;
3257                                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
3258
3259                                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
3260
3261                                 asid = 0;
3262                                 return handle_bp_command_set(CMD_CTX, addr, asid, length, hw);
3263                         } else if (strcmp(CMD_ARGV[2], "hw_ctx") == 0) {
3264                                 hw = BKPT_HARD;
3265                                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], asid);
3266                                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
3267                                 addr = 0;
3268                                 return handle_bp_command_set(CMD_CTX, addr, asid, length, hw);
3269                         }
3270
3271                 case 4:
3272                         hw = BKPT_HARD;
3273                         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
3274                         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], asid);
3275                         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[2], length);
3276                         return handle_bp_command_set(CMD_CTX, addr, asid, length, hw);
3277
3278                 default:
3279                         return ERROR_COMMAND_SYNTAX_ERROR;
3280         }
3281 }
3282
3283 COMMAND_HANDLER(handle_rbp_command)
3284 {
3285         if (CMD_ARGC != 1)
3286                 return ERROR_COMMAND_SYNTAX_ERROR;
3287
3288         uint32_t addr;
3289         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
3290
3291         struct target *target = get_current_target(CMD_CTX);
3292         breakpoint_remove(target, addr);
3293
3294         return ERROR_OK;
3295 }
3296
3297 COMMAND_HANDLER(handle_wp_command)
3298 {
3299         struct target *target = get_current_target(CMD_CTX);
3300
3301         if (CMD_ARGC == 0) {
3302                 struct watchpoint *watchpoint = target->watchpoints;
3303
3304                 while (watchpoint) {
3305                         command_print(CMD_CTX, "address: 0x%8.8" PRIx32
3306                                         ", len: 0x%8.8" PRIx32
3307                                         ", r/w/a: %i, value: 0x%8.8" PRIx32
3308                                         ", mask: 0x%8.8" PRIx32,
3309                                         watchpoint->address,
3310                                         watchpoint->length,
3311                                         (int)watchpoint->rw,
3312                                         watchpoint->value,
3313                                         watchpoint->mask);
3314                         watchpoint = watchpoint->next;
3315                 }
3316                 return ERROR_OK;
3317         }
3318
3319         enum watchpoint_rw type = WPT_ACCESS;
3320         uint32_t addr = 0;
3321         uint32_t length = 0;
3322         uint32_t data_value = 0x0;
3323         uint32_t data_mask = 0xffffffff;
3324
3325         switch (CMD_ARGC) {
3326         case 5:
3327                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[4], data_mask);
3328                 /* fall through */
3329         case 4:
3330                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], data_value);
3331                 /* fall through */
3332         case 3:
3333                 switch (CMD_ARGV[2][0]) {
3334                 case 'r':
3335                         type = WPT_READ;
3336                         break;
3337                 case 'w':
3338                         type = WPT_WRITE;
3339                         break;
3340                 case 'a':
3341                         type = WPT_ACCESS;
3342                         break;
3343                 default:
3344                         LOG_ERROR("invalid watchpoint mode ('%c')", CMD_ARGV[2][0]);
3345                         return ERROR_COMMAND_SYNTAX_ERROR;
3346                 }
3347                 /* fall through */
3348         case 2:
3349                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], length);
3350                 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
3351                 break;
3352
3353         default:
3354                 return ERROR_COMMAND_SYNTAX_ERROR;
3355         }
3356
3357         int retval = watchpoint_add(target, addr, length, type,
3358                         data_value, data_mask);
3359         if (ERROR_OK != retval)
3360                 LOG_ERROR("Failure setting watchpoints");
3361
3362         return retval;
3363 }
3364
3365 COMMAND_HANDLER(handle_rwp_command)
3366 {
3367         if (CMD_ARGC != 1)
3368                 return ERROR_COMMAND_SYNTAX_ERROR;
3369
3370         uint32_t addr;
3371         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], addr);
3372
3373         struct target *target = get_current_target(CMD_CTX);
3374         watchpoint_remove(target, addr);
3375
3376         return ERROR_OK;
3377 }
3378
3379 /**
3380  * Translate a virtual address to a physical address.
3381  *
3382  * The low-level target implementation must have logged a detailed error
3383  * which is forwarded to telnet/GDB session.
3384  */
3385 COMMAND_HANDLER(handle_virt2phys_command)
3386 {
3387         if (CMD_ARGC != 1)
3388                 return ERROR_COMMAND_SYNTAX_ERROR;
3389
3390         uint32_t va;
3391         COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], va);
3392         uint32_t pa;
3393
3394         struct target *target = get_current_target(CMD_CTX);
3395         int retval = target->type->virt2phys(target, va, &pa);
3396         if (retval == ERROR_OK)
3397                 command_print(CMD_CTX, "Physical address 0x%08" PRIx32 "", pa);
3398
3399         return retval;
3400 }
3401
3402 static void writeData(FILE *f, const void *data, size_t len)
3403 {
3404         size_t written = fwrite(data, 1, len, f);
3405         if (written != len)
3406                 LOG_ERROR("failed to write %zu bytes: %s", len, strerror(errno));
3407 }
3408
3409 static void writeLong(FILE *f, int l)
3410 {
3411         int i;
3412         for (i = 0; i < 4; i++) {
3413                 char c = (l >> (i*8))&0xff;
3414                 writeData(f, &c, 1);
3415         }
3416
3417 }
3418
3419 static void writeString(FILE *f, char *s)
3420 {
3421         writeData(f, s, strlen(s));
3422 }
3423
3424 typedef unsigned char UNIT[2];  /* unit of profiling */
3425
3426 /* Dump a gmon.out histogram file. */
3427 static void write_gmon(uint32_t *samples, uint32_t sampleNum, const char *filename,
3428                 bool with_range, uint32_t start_address, uint32_t end_address)
3429 {
3430         uint32_t i;
3431         FILE *f = fopen(filename, "w");
3432         if (f == NULL)
3433                 return;
3434         writeString(f, "gmon");
3435         writeLong(f, 0x00000001); /* Version */
3436         writeLong(f, 0); /* padding */
3437         writeLong(f, 0); /* padding */
3438         writeLong(f, 0); /* padding */
3439
3440         uint8_t zero = 0;  /* GMON_TAG_TIME_HIST */
3441         writeData(f, &zero, 1);
3442
3443         /* figure out bucket size */
3444         uint32_t min;
3445         uint32_t max;
3446         if (with_range) {
3447                 min = start_address;
3448                 max = end_address;
3449         } else {
3450                 min = samples[0];
3451                 max = samples[0];
3452                 for (i = 0; i < sampleNum; i++) {
3453                         if (min > samples[i])
3454                                 min = samples[i];
3455                         if (max < samples[i])
3456                                 max = samples[i];
3457                 }
3458
3459                 /* max should be (largest sample + 1)
3460                  * Refer to binutils/gprof/hist.c (find_histogram_for_pc) */
3461                 max++;
3462         }
3463
3464         int addressSpace = max - min;
3465         assert(addressSpace >= 2);
3466
3467         /* FIXME: What is the reasonable number of buckets?
3468          * The profiling result will be more accurate if there are enough buckets. */
3469         static const uint32_t maxBuckets = 128 * 1024; /* maximum buckets. */
3470         uint32_t numBuckets = addressSpace / sizeof(UNIT);
3471         if (numBuckets > maxBuckets)
3472                 numBuckets = maxBuckets;
3473         int *buckets = malloc(sizeof(int) * numBuckets);
3474         if (buckets == NULL) {
3475                 fclose(f);
3476                 return;
3477         }
3478         memset(buckets, 0, sizeof(int) * numBuckets);
3479         for (i = 0; i < sampleNum; i++) {
3480                 uint32_t address = samples[i];
3481
3482                 if ((address < min) || (max <= address))
3483                         continue;
3484
3485                 long long a = address - min;
3486                 long long b = numBuckets;
3487                 long long c = addressSpace;
3488                 int index_t = (a * b) / c; /* danger!!!! int32 overflows */
3489                 buckets[index_t]++;
3490         }
3491
3492         /* append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr)) */
3493         writeLong(f, min);                      /* low_pc */
3494         writeLong(f, max);                      /* high_pc */
3495         writeLong(f, numBuckets);       /* # of buckets */
3496         writeLong(f, 100);                      /* KLUDGE! We lie, ca. 100Hz best case. */
3497         writeString(f, "seconds");
3498         for (i = 0; i < (15-strlen("seconds")); i++)
3499                 writeData(f, &zero, 1);
3500         writeString(f, "s");
3501
3502         /*append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size) */
3503
3504         char *data = malloc(2 * numBuckets);
3505         if (data != NULL) {
3506                 for (i = 0; i < numBuckets; i++) {
3507                         int val;
3508                         val = buckets[i];
3509                         if (val > 65535)
3510                                 val = 65535;
3511                         data[i * 2] = val&0xff;
3512                         data[i * 2 + 1] = (val >> 8) & 0xff;
3513                 }
3514                 free(buckets);
3515                 writeData(f, data, numBuckets * 2);
3516                 free(data);
3517         } else
3518                 free(buckets);
3519
3520         fclose(f);
3521 }
3522
3523 /* profiling samples the CPU PC as quickly as OpenOCD is able,
3524  * which will be used as a random sampling of PC */
3525 COMMAND_HANDLER(handle_profile_command)
3526 {
3527         struct target *target = get_current_target(CMD_CTX);
3528
3529         if ((CMD_ARGC != 2) && (CMD_ARGC != 4))
3530                 return ERROR_COMMAND_SYNTAX_ERROR;
3531
3532         const uint32_t MAX_PROFILE_SAMPLE_NUM = 10000;
3533         uint32_t offset;
3534         uint32_t num_of_sampels;
3535         int retval = ERROR_OK;
3536         uint32_t *samples = malloc(sizeof(uint32_t) * MAX_PROFILE_SAMPLE_NUM);
3537         if (samples == NULL) {
3538                 LOG_ERROR("No memory to store samples.");
3539                 return ERROR_FAIL;
3540         }
3541
3542         COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], offset);
3543
3544         /**
3545          * Some cores let us sample the PC without the
3546          * annoying halt/resume step; for example, ARMv7 PCSR.
3547          * Provide a way to use that more efficient mechanism.
3548          */
3549         retval = target_profiling(target, samples, MAX_PROFILE_SAMPLE_NUM,
3550                                 &num_of_sampels, offset);
3551         if (retval != ERROR_OK) {
3552                 free(samples);
3553                 return retval;
3554         }
3555
3556         assert(num_of_sampels <= MAX_PROFILE_SAMPLE_NUM);
3557
3558         retval = target_poll(target);
3559         if (retval != ERROR_OK) {
3560                 free(samples);
3561                 return retval;
3562         }
3563         if (target->state == TARGET_RUNNING) {
3564                 retval = target_halt(target);
3565                 if (retval != ERROR_OK) {
3566                         free(samples);
3567                         return retval;
3568                 }
3569         }
3570
3571         retval = target_poll(target);
3572         if (retval != ERROR_OK) {
3573                 free(samples);
3574                 return retval;
3575         }
3576
3577         uint32_t start_address = 0;
3578         uint32_t end_address = 0;
3579         bool with_range = false;
3580         if (CMD_ARGC == 4) {
3581                 with_range = true;
3582                 COMMAND_PARSE_NUMBER(uint, CMD_ARGV[2], start_address);
3583                 COMMAND_PARSE_NUMBER(uint, CMD_ARGV[3], end_address);
3584         }
3585
3586         write_gmon(samples, num_of_sampels, CMD_ARGV[1],
3587                         with_range, start_address, end_address);
3588         command_print(CMD_CTX, "Wrote %s", CMD_ARGV[1]);
3589
3590         free(samples);
3591         return retval;
3592 }
3593
3594 static int new_int_array_element(Jim_Interp *interp, const char *varname, int idx, uint32_t val)
3595 {
3596         char *namebuf;
3597         Jim_Obj *nameObjPtr, *valObjPtr;
3598         int result;
3599
3600         namebuf = alloc_printf("%s(%d)", varname, idx);
3601         if (!namebuf)
3602                 return JIM_ERR;
3603
3604         nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
3605         valObjPtr = Jim_NewIntObj(interp, val);
3606         if (!nameObjPtr || !valObjPtr) {
3607                 free(namebuf);
3608                 return JIM_ERR;
3609         }
3610
3611         Jim_IncrRefCount(nameObjPtr);
3612         Jim_IncrRefCount(valObjPtr);
3613         result = Jim_SetVariable(interp, nameObjPtr, valObjPtr);
3614         Jim_DecrRefCount(interp, nameObjPtr);
3615         Jim_DecrRefCount(interp, valObjPtr);
3616         free(namebuf);
3617         /* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
3618         return result;
3619 }
3620
3621 static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
3622 {
3623         struct command_context *context;
3624         struct target *target;
3625
3626         context = current_command_context(interp);
3627         assert(context != NULL);
3628
3629         target = get_current_target(context);
3630         if (target == NULL) {
3631                 LOG_ERROR("mem2array: no current target");
3632                 return JIM_ERR;
3633         }
3634
3635         return target_mem2array(interp, target, argc - 1, argv + 1);
3636 }
3637
3638 static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, Jim_Obj *const *argv)
3639 {
3640         long l;
3641         uint32_t width;
3642         int len;
3643         uint32_t addr;
3644         uint32_t count;
3645         uint32_t v;
3646         const char *varname;
3647         int  n, e, retval;
3648         uint32_t i;
3649
3650         /* argv[1] = name of array to receive the data
3651          * argv[2] = desired width
3652          * argv[3] = memory address
3653          * argv[4] = count of times to read
3654          */
3655         if (argc != 4) {
3656                 Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
3657                 return JIM_ERR;
3658         }
3659         varname = Jim_GetString(argv[0], &len);
3660         /* given "foo" get space for worse case "foo(%d)" .. add 20 */
3661
3662         e = Jim_GetLong(interp, argv[1], &l);
3663         width = l;
3664         if (e != JIM_OK)
3665                 return e;
3666
3667         e = Jim_GetLong(interp, argv[2], &l);
3668         addr = l;
3669         if (e != JIM_OK)
3670                 return e;
3671         e = Jim_GetLong(interp, argv[3], &l);
3672         len = l;
3673         if (e != JIM_OK)
3674                 return e;
3675         switch (width) {
3676                 case 8:
3677                         width = 1;
3678                         break;
3679                 case 16:
3680                         width = 2;
3681                         break;
3682                 case 32:
3683                         width = 4;
3684                         break;
3685                 default:
3686                         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3687                         Jim_AppendStrings(interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL);
3688                         return JIM_ERR;
3689         }
3690         if (len == 0) {
3691                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3692                 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: zero width read?", NULL);
3693                 return JIM_ERR;
3694         }
3695         if ((addr + (len * width)) < addr) {
3696                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3697                 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: addr + len - wraps to zero?", NULL);
3698                 return JIM_ERR;
3699         }
3700         /* absurd transfer size? */
3701         if (len > 65536) {
3702                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3703                 Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: absurd > 64K item request", NULL);
3704                 return JIM_ERR;
3705         }
3706
3707         if ((width == 1) ||
3708                 ((width == 2) && ((addr & 1) == 0)) ||
3709                 ((width == 4) && ((addr & 3) == 0))) {
3710                 /* all is well */
3711         } else {
3712                 char buf[100];
3713                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3714                 sprintf(buf, "mem2array address: 0x%08" PRIx32 " is not aligned for %" PRId32 " byte reads",
3715                                 addr,
3716                                 width);
3717                 Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
3718                 return JIM_ERR;
3719         }
3720
3721         /* Transfer loop */
3722
3723         /* index counter */
3724         n = 0;
3725
3726         size_t buffersize = 4096;
3727         uint8_t *buffer = malloc(buffersize);
3728         if (buffer == NULL)
3729                 return JIM_ERR;
3730
3731         /* assume ok */
3732         e = JIM_OK;
3733         while (len) {
3734                 /* Slurp... in buffer size chunks */
3735
3736                 count = len; /* in objects.. */
3737                 if (count > (buffersize / width))
3738                         count = (buffersize / width);
3739
3740                 retval = target_read_memory(target, addr, width, count, buffer);
3741                 if (retval != ERROR_OK) {
3742                         /* BOO !*/
3743                         LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed",
3744                                           (unsigned int)addr,
3745                                           (int)width,
3746                                           (int)count);
3747                         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3748                         Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
3749                         e = JIM_ERR;
3750                         break;
3751                 } else {
3752                         v = 0; /* shut up gcc */
3753                         for (i = 0; i < count ; i++, n++) {
3754                                 switch (width) {
3755                                         case 4:
3756                                                 v = target_buffer_get_u32(target, &buffer[i*width]);
3757                                                 break;
3758                                         case 2:
3759                                                 v = target_buffer_get_u16(target, &buffer[i*width]);
3760                                                 break;
3761                                         case 1:
3762                                                 v = buffer[i] & 0x0ff;
3763                                                 break;
3764                                 }
3765                                 new_int_array_element(interp, varname, n, v);
3766                         }
3767                         len -= count;
3768                 }
3769         }
3770
3771         free(buffer);
3772
3773         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3774
3775         return e;
3776 }
3777
3778 static int get_int_array_element(Jim_Interp *interp, const char *varname, int idx, uint32_t *val)
3779 {
3780         char *namebuf;
3781         Jim_Obj *nameObjPtr, *valObjPtr;
3782         int result;
3783         long l;
3784
3785         namebuf = alloc_printf("%s(%d)", varname, idx);
3786         if (!namebuf)
3787                 return JIM_ERR;
3788
3789         nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
3790         if (!nameObjPtr) {
3791                 free(namebuf);
3792                 return JIM_ERR;
3793         }
3794
3795         Jim_IncrRefCount(nameObjPtr);
3796         valObjPtr = Jim_GetVariable(interp, nameObjPtr, JIM_ERRMSG);
3797         Jim_DecrRefCount(interp, nameObjPtr);
3798         free(namebuf);
3799         if (valObjPtr == NULL)
3800                 return JIM_ERR;
3801
3802         result = Jim_GetLong(interp, valObjPtr, &l);
3803         /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
3804         *val = l;
3805         return result;
3806 }
3807
3808 static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
3809 {
3810         struct command_context *context;
3811         struct target *target;
3812
3813         context = current_command_context(interp);
3814         assert(context != NULL);
3815
3816         target = get_current_target(context);
3817         if (target == NULL) {
3818                 LOG_ERROR("array2mem: no current target");
3819                 return JIM_ERR;
3820         }
3821
3822         return target_array2mem(interp, target, argc-1, argv + 1);
3823 }
3824
3825 static int target_array2mem(Jim_Interp *interp, struct target *target,
3826                 int argc, Jim_Obj *const *argv)
3827 {
3828         long l;
3829         uint32_t width;
3830         int len;
3831         uint32_t addr;
3832         uint32_t count;
3833         uint32_t v;
3834         const char *varname;
3835         int  n, e, retval;
3836         uint32_t i;
3837
3838         /* argv[1] = name of array to get the data
3839          * argv[2] = desired width
3840          * argv[3] = memory address
3841          * argv[4] = count to write
3842          */
3843         if (argc != 4) {
3844                 Jim_WrongNumArgs(interp, 0, argv, "varname width addr nelems");
3845                 return JIM_ERR;
3846         }
3847         varname = Jim_GetString(argv[0], &len);
3848         /* given "foo" get space for worse case "foo(%d)" .. add 20 */
3849
3850         e = Jim_GetLong(interp, argv[1], &l);
3851         width = l;
3852         if (e != JIM_OK)
3853                 return e;
3854
3855         e = Jim_GetLong(interp, argv[2], &l);
3856         addr = l;
3857         if (e != JIM_OK)
3858                 return e;
3859         e = Jim_GetLong(interp, argv[3], &l);
3860         len = l;
3861         if (e != JIM_OK)
3862                 return e;
3863         switch (width) {
3864                 case 8:
3865                         width = 1;
3866                         break;
3867                 case 16:
3868                         width = 2;
3869                         break;
3870                 case 32:
3871                         width = 4;
3872                         break;
3873                 default:
3874                         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3875                         Jim_AppendStrings(interp, Jim_GetResult(interp),
3876                                         "Invalid width param, must be 8/16/32", NULL);
3877                         return JIM_ERR;
3878         }
3879         if (len == 0) {
3880                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3881                 Jim_AppendStrings(interp, Jim_GetResult(interp),
3882                                 "array2mem: zero width read?", NULL);
3883                 return JIM_ERR;
3884         }
3885         if ((addr + (len * width)) < addr) {
3886                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3887                 Jim_AppendStrings(interp, Jim_GetResult(interp),
3888                                 "array2mem: addr + len - wraps to zero?", NULL);
3889                 return JIM_ERR;
3890         }
3891         /* absurd transfer size? */
3892         if (len > 65536) {
3893                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3894                 Jim_AppendStrings(interp, Jim_GetResult(interp),
3895                                 "array2mem: absurd > 64K item request", NULL);
3896                 return JIM_ERR;
3897         }
3898
3899         if ((width == 1) ||
3900                 ((width == 2) && ((addr & 1) == 0)) ||
3901                 ((width == 4) && ((addr & 3) == 0))) {
3902                 /* all is well */
3903         } else {
3904                 char buf[100];
3905                 Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3906                 sprintf(buf, "array2mem address: 0x%08x is not aligned for %d byte reads",
3907                                 (unsigned int)addr,
3908                                 (int)width);
3909                 Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
3910                 return JIM_ERR;
3911         }
3912
3913         /* Transfer loop */
3914
3915         /* index counter */
3916         n = 0;
3917         /* assume ok */
3918         e = JIM_OK;
3919
3920         size_t buffersize = 4096;
3921         uint8_t *buffer = malloc(buffersize);
3922         if (buffer == NULL)
3923                 return JIM_ERR;
3924
3925         while (len) {
3926                 /* Slurp... in buffer size chunks */
3927
3928                 count = len; /* in objects.. */
3929                 if (count > (buffersize / width))
3930                         count = (buffersize / width);
3931
3932                 v = 0; /* shut up gcc */
3933                 for (i = 0; i < count; i++, n++) {
3934                         get_int_array_element(interp, varname, n, &v);
3935                         switch (width) {
3936                         case 4:
3937                                 target_buffer_set_u32(target, &buffer[i * width], v);
3938                                 break;
3939                         case 2:
3940                                 target_buffer_set_u16(target, &buffer[i * width], v);
3941                                 break;
3942                         case 1:
3943                                 buffer[i] = v & 0x0ff;
3944                                 break;
3945                         }
3946                 }
3947                 len -= count;
3948
3949                 retval = target_write_memory(target, addr, width, count, buffer);
3950                 if (retval != ERROR_OK) {
3951                         /* BOO !*/
3952                         LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed",
3953                                           (unsigned int)addr,
3954                                           (int)width,
3955                                           (int)count);
3956                         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3957                         Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: cannot read memory", NULL);
3958                         e = JIM_ERR;
3959                         break;
3960                 }
3961         }
3962
3963         free(buffer);
3964
3965         Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
3966
3967         return e;
3968 }
3969
3970 /* FIX? should we propagate errors here rather than printing them
3971  * and continuing?
3972  */
3973 void target_handle_event(struct target *target, enum target_event e)
3974 {
3975         struct target_event_action *teap;
3976
3977         for (teap = target->event_action; teap != NULL; teap = teap->next) {
3978                 if (teap->event == e) {
3979                         LOG_DEBUG("target: (%d) %s (%s) event: %d (%s) action: %s",
3980                                            target->target_number,
3981                                            target_name(target),
3982                                            target_type_name(target),
3983                                            e,
3984                                            Jim_Nvp_value2name_simple(nvp_target_event, e)->name,
3985                                            Jim_GetString(teap->body, NULL));
3986                         if (Jim_EvalObj(teap->interp, teap->body) != JIM_OK) {
3987                                 Jim_MakeErrorMessage(teap->interp);
3988                                 command_print(NULL, "%s\n", Jim_GetString(Jim_GetResult(teap->interp), NULL));
3989                         }
3990                 }
3991         }
3992 }
3993
3994 /**
3995  * Returns true only if the target has a handler for the specified event.
3996  */
3997 bool target_has_event_action(struct target *target, enum target_event event)
3998 {
3999         struct target_event_action *teap;
4000
4001         for (teap = target->event_action; teap != NULL; teap = teap->next) {
4002                 if (teap->event == event)
4003                         return true;
4004         }
4005         return false;
4006 }
4007
4008 enum target_cfg_param {
4009         TCFG_TYPE,
4010         TCFG_EVENT,
4011         TCFG_WORK_AREA_VIRT,
4012         TCFG_WORK_AREA_PHYS,
4013         TCFG_WORK_AREA_SIZE,
4014         TCFG_WORK_AREA_BACKUP,
4015         TCFG_ENDIAN,
4016         TCFG_VARIANT,
4017         TCFG_COREID,
4018         TCFG_CHAIN_POSITION,
4019         TCFG_DBGBASE,
4020         TCFG_RTOS,
4021 };
4022
4023 static Jim_Nvp nvp_config_opts[] = {
4024         { .name = "-type",             .value = TCFG_TYPE },
4025         { .name = "-event",            .value = TCFG_EVENT },
4026         { .name = "-work-area-virt",   .value = TCFG_WORK_AREA_VIRT },
4027         { .name = "-work-area-phys",   .value = TCFG_WORK_AREA_PHYS },
4028         { .name = "-work-area-size",   .value = TCFG_WORK_AREA_SIZE },
4029         { .name = "-work-area-backup", .value = TCFG_WORK_AREA_BACKUP },
4030         { .name = "-endian" ,          .value = TCFG_ENDIAN },
4031         { .name = "-variant",          .value = TCFG_VARIANT },
4032         { .name = "-coreid",           .value = TCFG_COREID },
4033         { .name = "-chain-position",   .value = TCFG_CHAIN_POSITION },
4034         { .name = "-dbgbase",          .value = TCFG_DBGBASE },
4035         { .name = "-rtos",             .value = TCFG_RTOS },
4036         { .name = NULL, .value = -1 }
4037 };
4038
4039 static int target_configure(Jim_GetOptInfo *goi, struct target *target)
4040 {
4041         Jim_Nvp *n;
4042         Jim_Obj *o;
4043         jim_wide w;
4044         char *cp;
4045         int e;
4046
4047         /* parse config or cget options ... */
4048         while (goi->argc > 0) {
4049                 Jim_SetEmptyResult(goi->interp);
4050                 /* Jim_GetOpt_Debug(goi); */
4051
4052                 if (target->type->target_jim_configure) {
4053                         /* target defines a configure function */
4054                         /* target gets first dibs on parameters */
4055                         e = (*(target->type->target_jim_configure))(target, goi);
4056                         if (e == JIM_OK) {
4057                                 /* more? */
4058                                 continue;
4059                         }
4060                         if (e == JIM_ERR) {
4061                                 /* An error */
4062                                 return e;
4063                         }
4064                         /* otherwise we 'continue' below */
4065                 }
4066                 e = Jim_GetOpt_Nvp(goi, nvp_config_opts, &n);
4067                 if (e != JIM_OK) {
4068                         Jim_GetOpt_NvpUnknown(goi, nvp_config_opts, 0);
4069                         return e;
4070                 }
4071                 switch (n->value) {
4072                 case TCFG_TYPE:
4073                         /* not setable */
4074                         if (goi->isconfigure) {
4075                                 Jim_SetResultFormatted(goi->interp,
4076                                                 "not settable: %s", n->name);
4077                                 return JIM_ERR;
4078                         } else {
4079 no_params:
4080                                 if (goi->argc != 0) {
4081                                         Jim_WrongNumArgs(goi->interp,
4082                                                         goi->argc, goi->argv,
4083                                                         "NO PARAMS");
4084                                         return JIM_ERR;
4085                                 }
4086                         }
4087                         Jim_SetResultString(goi->interp,
4088                                         target_type_name(target), -1);
4089                         /* loop for more */
4090                         break;
4091                 case TCFG_EVENT:
4092                         if (goi->argc == 0) {
4093                                 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name? ...");
4094                                 return JIM_ERR;
4095                         }
4096
4097                         e = Jim_GetOpt_Nvp(goi, nvp_target_event, &n);
4098                         if (e != JIM_OK) {
4099                                 Jim_GetOpt_NvpUnknown(goi, nvp_target_event, 1);
4100                                 return e;
4101                         }
4102
4103                         if (goi->isconfigure) {
4104                                 if (goi->argc != 1) {
4105                                         Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
4106                                         return JIM_ERR;
4107                                 }
4108                         } else {
4109                                 if (goi->argc != 0) {
4110                                         Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
4111                                         return JIM_ERR;
4112                                 }
4113                         }
4114
4115                         {
4116                                 struct target_event_action *teap;
4117
4118                                 teap = target->event_action;
4119                                 /* replace existing? */
4120                                 while (teap) {
4121                                         if (teap->event == (enum target_event)n->value)
4122                                                 break;
4123                                         teap = teap->next;
4124                                 }
4125
4126                                 if (goi->isconfigure) {
4127                                         bool replace = true;
4128                                         if (teap == NULL) {
4129                                                 /* create new */
4130                                                 teap = calloc(1, sizeof(*teap));
4131                                                 replace = false;
4132                                         }
4133                                         teap->event = n->value;
4134                                         teap->interp = goi->interp;
4135                                         Jim_GetOpt_Obj(goi, &o);
4136                                         if (teap->body)
4137                                                 Jim_DecrRefCount(teap->interp, teap->body);
4138                                         teap->body  = Jim_DuplicateObj(goi->interp, o);
4139                                         /*
4140                                          * FIXME:
4141                                          *     Tcl/TK - "tk events" have a nice feature.
4142                                          *     See the "BIND" command.
4143                                          *    We should support that here.
4144                                          *     You can specify %X and %Y in the event code.
4145                                          *     The idea is: %T - target name.
4146                                          *     The idea is: %N - target number
4147                                          *     The idea is: %E - event name.
4148                                          */
4149                                         Jim_IncrRefCount(teap->body);
4150
4151                                         if (!replace) {
4152                                                 /* add to head of event list */
4153                                                 teap->next = target->event_action;
4154                                                 target->event_action = teap;
4155                                         }
4156                                         Jim_SetEmptyResult(goi->interp);
4157                                 } else {
4158                                         /* get */
4159                                         if (teap == NULL)
4160                                                 Jim_SetEmptyResult(goi->interp);
4161                                         else
4162                                                 Jim_SetResult(goi->interp, Jim_DuplicateObj(goi->interp, teap->body));
4163                                 }
4164                         }
4165                         /* loop for more */
4166                         break;
4167
4168                 case TCFG_WORK_AREA_VIRT:
4169                         if (goi->isconfigure) {
4170                                 target_free_all_working_areas(target);
4171                                 e = Jim_GetOpt_Wide(goi, &w);
4172                                 if (e != JIM_OK)
4173                                         return e;
4174                                 target->working_area_virt = w;
4175                                 target->working_area_virt_spec = true;
4176                         } else {
4177                                 if (goi->argc != 0)
4178                                         goto no_params;
4179                         }
4180                         Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, target->working_area_virt));
4181                         /* loop for more */
4182                         break;
4183
4184                 case TCFG_WORK_AREA_PHYS:
4185                         if (goi->isconfigure) {
4186                                 target_free_all_working_areas(target);
4187                                 e = Jim_GetOpt_Wide(goi, &w);
4188                                 if (e != JIM_OK)
4189                                         return e;
4190                                 target->working_area_phys = w;
4191                                 target->working_area_phys_spec = true;
4192                         } else {
4193                                 if (goi->argc != 0)
4194                                         goto no_params;
4195                         }
4196                         Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, target->working_area_phys));
4197                         /* loop for more */
4198                         break;
4199
4200                 case TCFG_WORK_AREA_SIZE:
4201                         if (goi->isconfigure) {
4202                                 target_free_all_working_areas(target);
4203                                 e = Jim_GetOpt_Wide(goi, &w);
4204                                 if (e != JIM_OK)
4205                                         return e;
4206                                 target->working_area_size = w;
4207                         } else {
4208                                 if (goi->argc != 0)
4209                                         goto no_params;
4210                         }
4211                         Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, target->working_area_size));
4212                         /* loop for more */
4213                         break;
4214
4215                 case TCFG_WORK_AREA_BACKUP:
4216                         if (goi->isconfigure) {
4217                                 target_free_all_working_areas(target);
4218                                 e = Jim_GetOpt_Wide(goi, &w);
4219                                 if (e != JIM_OK)
4220                                         return e;
4221                                 /* make this exactly 1 or 0 */
4222                                 target->backup_working_area = (!!w);
4223                         } else {
4224                                 if (goi->argc != 0)
4225                                         goto no_params;
4226                         }
4227                         Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, target->backup_working_area));
4228                         /* loop for more e*/
4229                         break;
4230
4231
4232                 case TCFG_ENDIAN:
4233                         if (goi->isconfigure) {
4234                                 e = Jim_GetOpt_Nvp(goi, nvp_target_endian, &n);
4235                                 if (e != JIM_OK) {
4236                                         Jim_GetOpt_NvpUnknown(goi, nvp_target_endian, 1);
4237                                         return e;
4238                                 }
4239                                 target->endianness = n->value;
4240                         } else {
4241                                 if (goi->argc != 0)
4242                                         goto no_params;
4243                         }
4244                         n = Jim_Nvp_value2name_simple(nvp_target_endian, target->endianness);
4245                         if (n->name == NULL) {
4246                                 target->endianness = TARGET_LITTLE_ENDIAN;
4247                                 n = Jim_Nvp_value2name_simple(nvp_target_endian, target->endianness);
4248                         }
4249                         Jim_SetResultString(goi->interp, n->name, -1);
4250                         /* loop for more */
4251                         break;
4252
4253                 case TCFG_VARIANT:
4254                         if (goi->isconfigure) {
4255                                 if (goi->argc < 1) {
4256                                         Jim_SetResultFormatted(goi->interp,
4257                                                                                    "%s ?STRING?",
4258                                                                                    n->name);
4259                                         return JIM_ERR;
4260                                 }
4261                                 if (target->variant)
4262                                         free((void *)(target->variant));
4263                                 e = Jim_GetOpt_String(goi, &cp, NULL);
4264                                 if (e != JIM_OK)
4265                                         return e;
4266                                 target->variant = strdup(cp);
4267                         } else {
4268                                 if (goi->argc != 0)
4269                                         goto no_params;
4270                         }
4271                         Jim_SetResultString(goi->interp, target->variant, -1);
4272                         /* loop for more */
4273                         break;
4274
4275                 case TCFG_COREID:
4276                         if (goi->isconfigure) {
4277                                 e = Jim_GetOpt_Wide(goi, &w);
4278                                 if (e != JIM_OK)
4279                                         return e;
4280                                 target->coreid = (int32_t)w;
4281                         } else {
4282                                 if (goi->argc != 0)
4283                                         goto no_params;
4284                         }
4285                         Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, target->working_area_size));
4286                         /* loop for more */
4287                         break;
4288
4289                 case TCFG_CHAIN_POSITION:
4290                         if (goi->isconfigure) {
4291                                 Jim_Obj *o_t;
4292                                 struct jtag_tap *tap;
4293                                 target_free_all_working_areas(target);
4294                                 e = Jim_GetOpt_Obj(goi, &o_t);
4295                                 if (e != JIM_OK)
4296                                         return e;
4297                                 tap = jtag_tap_by_jim_obj(goi->interp, o_t);
4298                                 if (tap == NULL)
4299                                         return JIM_ERR;
4300                                 /* make this exactly 1 or 0 */
4301                                 target->tap = tap;
4302                         } else {
4303                                 if (goi->argc != 0)
4304                                         goto no_params;
4305                         }
4306                         Jim_SetResultString(goi->interp, target->tap->dotted_name, -1);
4307                         /* loop for more e*/
4308                         break;
4309                 case TCFG_DBGBASE:
4310                         if (goi->isconfigure) {
4311                                 e = Jim_GetOpt_Wide(goi, &w);
4312                                 if (e != JIM_OK)
4313                                         return e;
4314                                 target->dbgbase = (uint32_t)w;
4315                                 target->dbgbase_set = true;
4316                         } else {
4317                                 if (goi->argc != 0)
4318                                         goto no_params;
4319                         }
4320                         Jim_SetResult(goi->interp, Jim_NewIntObj(goi->interp, target->dbgbase));
4321                         /* loop for more */
4322                         break;
4323
4324                 case TCFG_RTOS:
4325                         /* RTOS */
4326                         {
4327                                 int result = rtos_create(goi, target);
4328                                 if (result != JIM_OK)
4329                                         return result;
4330                         }
4331                         /* loop for more */
4332                         break;
4333                 }
4334         } /* while (goi->argc) */
4335
4336
4337                 /* done - we return */
4338         return JIM_OK;
4339 }
4340
4341 static int jim_target_configure(Jim_Interp *interp, int argc, Jim_Obj * const *argv)
4342 {
4343         Jim_GetOptInfo goi;
4344
4345         Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
4346         goi.isconfigure = !strcmp(Jim_GetString(argv[0], NULL), "configure");
4347         int need_args = 1 + goi.isconfigure;
4348         if (goi.argc < need_args) {
4349                 Jim_WrongNumArgs(goi.interp, goi.argc, goi.argv,
4350                         goi.isconfigure
4351                                 ? "missing: -option VALUE ..."
4352                                 : "missing: -option ...");
4353                 return JIM_ERR;
4354         }
4355         struct target *target = Jim_CmdPrivData(goi.interp);
4356         return target_configure(&goi, target);
4357 }
4358
4359 static int jim_target_mw(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4360 {
4361         const char *cmd_name = Jim_GetString(argv[0], NULL);
4362
4363         Jim_GetOptInfo goi;
4364         Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
4365
4366         if (goi.argc < 2 || goi.argc > 4) {
4367                 Jim_SetResultFormatted(goi.interp,
4368                                 "usage: %s [phys] <address> <data> [<count>]", cmd_name);
4369                 return JIM_ERR;
4370         }
4371
4372         target_write_fn fn;
4373         fn = target_write_memory;
4374
4375         int e;
4376         if (strcmp(Jim_GetString(argv[1], NULL), "phys") == 0) {
4377                 /* consume it */
4378                 struct Jim_Obj *obj;
4379                 e = Jim_GetOpt_Obj(&goi, &obj);
4380                 if (e != JIM_OK)
4381                         return e;
4382
4383                 fn = target_write_phys_memory;
4384         }
4385
4386         jim_wide a;
4387         e = Jim_GetOpt_Wide(&goi, &a);
4388         if (e != JIM_OK)
4389                 return e;
4390
4391         jim_wide b;
4392         e = Jim_GetOpt_Wide(&goi, &b);
4393         if (e != JIM_OK)
4394                 return e;
4395
4396         jim_wide c = 1;
4397         if (goi.argc == 1) {
4398                 e = Jim_GetOpt_Wide(&goi, &c);
4399                 if (e != JIM_OK)
4400                         return e;
4401         }
4402
4403         /* all args must be consumed */
4404         if (goi.argc != 0)
4405                 return JIM_ERR;
4406
4407         struct target *target = Jim_CmdPrivData(goi.interp);
4408         unsigned data_size;
4409         if (strcasecmp(cmd_name, "mww") == 0)
4410                 data_size = 4;
4411         else if (strcasecmp(cmd_name, "mwh") == 0)
4412                 data_size = 2;
4413         else if (strcasecmp(cmd_name, "mwb") == 0)
4414                 data_size = 1;
4415         else {
4416                 LOG_ERROR("command '%s' unknown: ", cmd_name);
4417                 return JIM_ERR;
4418         }
4419
4420         return (target_fill_mem(target, a, fn, data_size, b, c) == ERROR_OK) ? JIM_OK : JIM_ERR;
4421 }
4422
4423 /**
4424 *  @brief Reads an array of words/halfwords/bytes from target memory starting at specified address.
4425 *
4426 *  Usage: mdw [phys] <address> [<count>] - for 32 bit reads
4427 *         mdh [phys] <address> [<count>] - for 16 bit reads
4428 *         mdb [phys] <address> [<count>] - for  8 bit reads
4429 *
4430 *  Count defaults to 1.
4431 *
4432 *  Calls target_read_memory or target_read_phys_memory depending on
4433 *  the presence of the "phys" argument
4434 *  Reads the target memory in blocks of max. 32 bytes, and returns an array of ints formatted
4435 *  to int representation in base16.
4436 *  Also outputs read data in a human readable form using command_print
4437 *
4438 *  @param phys if present target_read_phys_memory will be used instead of target_read_memory
4439 *  @param address address where to start the read. May be specified in decimal or hex using the standard "0x" prefix
4440 *  @param count optional count parameter to read an array of values. If not specified, defaults to 1.
4441 *  @returns:  JIM_ERR on error or JIM_OK on success and sets the result string to an array of ascii formatted numbers
4442 *  on success, with [<count>] number of elements.
4443 *
4444 *  In case of little endian target:
4445 *      Example1: "mdw 0x00000000"  returns "10123456"
4446 *      Exmaple2: "mdh 0x00000000 1" returns "3456"
4447 *      Example3: "mdb 0x00000000" returns "56"
4448 *      Example4: "mdh 0x00000000 2" returns "3456 1012"
4449 *      Example5: "mdb 0x00000000 3" returns "56 34 12"
4450 **/
4451 static int jim_target_md(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4452 {
4453         const char *cmd_name = Jim_GetString(argv[0], NULL);
4454
4455         Jim_GetOptInfo goi;
4456         Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
4457
4458         if ((goi.argc < 1) || (goi.argc > 3)) {
4459                 Jim_SetResultFormatted(goi.interp,
4460                                 "usage: %s [phys] <address> [<count>]", cmd_name);
4461                 return JIM_ERR;
4462         }
4463
4464         int (*fn)(struct target *target,
4465                         uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer);
4466         fn = target_read_memory;
4467
4468         int e;
4469         if (strcmp(Jim_GetString(argv[1], NULL), "phys") == 0) {
4470                 /* consume it */
4471                 struct Jim_Obj *obj;
4472                 e = Jim_GetOpt_Obj(&goi, &obj);
4473                 if (e != JIM_OK)
4474                         return e;
4475
4476                 fn = target_read_phys_memory;
4477         }
4478
4479         /* Read address parameter */
4480         jim_wide addr;
4481         e = Jim_GetOpt_Wide(&goi, &addr);
4482         if (e != JIM_OK)
4483                 return JIM_ERR;
4484
4485         /* If next parameter exists, read it out as the count parameter, if not, set it to 1 (default) */
4486         jim_wide count;
4487         if (goi.argc == 1) {
4488                 e = Jim_GetOpt_Wide(&goi, &count);
4489                 if (e != JIM_OK)
4490                         return JIM_ERR;
4491         } else
4492                 count = 1;
4493
4494         /* all args must be consumed */
4495         if (goi.argc != 0)
4496                 return JIM_ERR;
4497
4498         jim_wide dwidth = 1; /* shut up gcc */
4499         if (strcasecmp(cmd_name, "mdw") == 0)
4500                 dwidth = 4;
4501         else if (strcasecmp(cmd_name, "mdh") == 0)
4502                 dwidth = 2;
4503         else if (strcasecmp(cmd_name, "mdb") == 0)
4504                 dwidth = 1;
4505         else {
4506                 LOG_ERROR("command '%s' unknown: ", cmd_name);
4507                 return JIM_ERR;
4508         }
4509
4510         /* convert count to "bytes" */
4511         int bytes = count * dwidth;
4512
4513         struct target *target = Jim_CmdPrivData(goi.interp);
4514         uint8_t  target_buf[32];
4515         jim_wide x, y, z;
4516         while (bytes > 0) {
4517                 y = (bytes < 16) ? bytes : 16; /* y = min(bytes, 16); */
4518
4519                 /* Try to read out next block */
4520                 e = fn(target, addr, dwidth, y / dwidth, target_buf);
4521
4522                 if (e != ERROR_OK) {
4523                         Jim_SetResultFormatted(interp, "error reading target @ 0x%08lx", (long)addr);
4524                         return JIM_ERR;
4525                 }
4526
4527                 command_print_sameline(NULL, "0x%08x ", (int)(addr));
4528                 switch (dwidth) {
4529                 case 4:
4530                         for (x = 0; x < 16 && x < y; x += 4) {
4531                                 z = target_buffer_get_u32(target, &(target_buf[x]));
4532                                 command_print_sameline(NULL, "%08x ", (int)(z));
4533                         }
4534                         for (; (x < 16) ; x += 4)
4535                                 command_print_sameline(NULL, "         ");
4536                         break;
4537                 case 2:
4538                         for (x = 0; x < 16 && x < y; x += 2) {
4539                                 z = target_buffer_get_u16(target, &(target_buf[x]));
4540                                 command_print_sameline(NULL, "%04x ", (int)(z));
4541                         }
4542                         for (; (x < 16) ; x += 2)
4543                                 command_print_sameline(NULL, "     ");
4544                         break;
4545                 case 1:
4546                 default:
4547                         for (x = 0 ; (x < 16) && (x < y) ; x += 1) {
4548                                 z = target_buffer_get_u8(target, &(target_buf[x]));
4549                                 command_print_sameline(NULL, "%02x ", (int)(z));
4550                         }
4551                         for (; (x < 16) ; x += 1)
4552                                 command_print_sameline(NULL, "   ");
4553                         break;
4554                 }
4555                 /* ascii-ify the bytes */
4556                 for (x = 0 ; x < y ; x++) {
4557                         if ((target_buf[x] >= 0x20) &&
4558                                 (target_buf[x] <= 0x7e)) {
4559                                 /* good */
4560                         } else {
4561                                 /* smack it */
4562                                 target_buf[x] = '.';
4563                         }
4564                 }
4565                 /* space pad  */
4566                 while (x < 16) {
4567                         target_buf[x] = ' ';
4568                         x++;
4569                 }
4570                 /* terminate */
4571                 target_buf[16] = 0;
4572                 /* print - with a newline */
4573                 command_print_sameline(NULL, "%s\n", target_buf);
4574                 /* NEXT... */
4575                 bytes -= 16;
4576                 addr += 16;
4577         }
4578         return JIM_OK;
4579 }
4580
4581 static int jim_target_mem2array(Jim_Interp *interp,
4582                 int argc, Jim_Obj *const *argv)
4583 {
4584         struct target *target = Jim_CmdPrivData(interp);
4585         return target_mem2array(interp, target, argc - 1, argv + 1);
4586 }
4587
4588 static int jim_target_array2mem(Jim_Interp *interp,
4589                 int argc, Jim_Obj *const *argv)
4590 {
4591         struct target *target = Jim_CmdPrivData(interp);
4592         return target_array2mem(interp, target, argc - 1, argv + 1);
4593 }
4594
4595 static int jim_target_tap_disabled(Jim_Interp *interp)
4596 {
4597         Jim_SetResultFormatted(interp, "[TAP is disabled]");
4598         return JIM_ERR;
4599 }
4600
4601 static int jim_target_examine(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4602 {
4603         if (argc != 1) {
4604                 Jim_WrongNumArgs(interp, 1, argv, "[no parameters]");
4605                 return JIM_ERR;
4606         }
4607         struct target *target = Jim_CmdPrivData(interp);
4608         if (!target->tap->enabled)
4609                 return jim_target_tap_disabled(interp);
4610
4611         int e = target->type->examine(target);
4612         if (e != ERROR_OK)
4613                 return JIM_ERR;
4614         return JIM_OK;
4615 }
4616
4617 static int jim_target_halt_gdb(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4618 {
4619         if (argc != 1) {
4620                 Jim_WrongNumArgs(interp, 1, argv, "[no parameters]");
4621                 return JIM_ERR;
4622         }
4623         struct target *target = Jim_CmdPrivData(interp);
4624
4625         if (target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT) != ERROR_OK)
4626                 return JIM_ERR;
4627
4628         return JIM_OK;
4629 }
4630
4631 static int jim_target_poll(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4632 {
4633         if (argc != 1) {
4634                 Jim_WrongNumArgs(interp, 1, argv, "[no parameters]");
4635                 return JIM_ERR;
4636         }
4637         struct target *target = Jim_CmdPrivData(interp);
4638         if (!target->tap->enabled)
4639                 return jim_target_tap_disabled(interp);
4640
4641         int e;
4642         if (!(target_was_examined(target)))
4643                 e = ERROR_TARGET_NOT_EXAMINED;
4644         else
4645                 e = target->type->poll(target);
4646         if (e != ERROR_OK)
4647                 return JIM_ERR;
4648         return JIM_OK;
4649 }
4650
4651 static int jim_target_reset(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4652 {
4653         Jim_GetOptInfo goi;
4654         Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
4655
4656         if (goi.argc != 2) {
4657                 Jim_WrongNumArgs(interp, 0, argv,
4658                                 "([tT]|[fF]|assert|deassert) BOOL");
4659                 return JIM_ERR;
4660         }
4661
4662         Jim_Nvp *n;
4663         int e = Jim_GetOpt_Nvp(&goi, nvp_assert, &n);
4664         if (e != JIM_OK) {
4665                 Jim_GetOpt_NvpUnknown(&goi, nvp_assert, 1);
4666                 return e;
4667         }
4668         /* the halt or not param */
4669         jim_wide a;
4670         e = Jim_GetOpt_Wide(&goi, &a);
4671         if (e != JIM_OK)
4672                 return e;
4673
4674         struct target *target = Jim_CmdPrivData(goi.interp);
4675         if (!target->tap->enabled)
4676                 return jim_target_tap_disabled(interp);
4677         if (!(target_was_examined(target))) {
4678                 LOG_ERROR("Target not examined yet");
4679                 return ERROR_TARGET_NOT_EXAMINED;
4680         }
4681         if (!target->type->assert_reset || !target->type->deassert_reset) {
4682                 Jim_SetResultFormatted(interp,
4683                                 "No target-specific reset for %s",
4684                                 target_name(target));
4685                 return JIM_ERR;
4686         }
4687         /* determine if we should halt or not. */
4688         target->reset_halt = !!a;
4689         /* When this happens - all workareas are invalid. */
4690         target_free_all_working_areas_restore(target, 0);
4691
4692         /* do the assert */
4693         if (n->value == NVP_ASSERT)
4694                 e = target->type->assert_reset(target);
4695         else
4696                 e = target->type->deassert_reset(target);
4697         return (e == ERROR_OK) ? JIM_OK : JIM_ERR;
4698 }
4699
4700 static int jim_target_halt(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4701 {
4702         if (argc != 1) {
4703                 Jim_WrongNumArgs(interp, 1, argv, "[no parameters]");
4704                 return JIM_ERR;
4705         }
4706         struct target *target = Jim_CmdPrivData(interp);
4707         if (!target->tap->enabled)
4708                 return jim_target_tap_disabled(interp);
4709         int e = target->type->halt(target);
4710         return (e == ERROR_OK) ? JIM_OK : JIM_ERR;
4711 }
4712
4713 static int jim_target_wait_state(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4714 {
4715         Jim_GetOptInfo goi;
4716         Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
4717
4718         /* params:  <name>  statename timeoutmsecs */
4719         if (goi.argc != 2) {
4720                 const char *cmd_name = Jim_GetString(argv[0], NULL);
4721                 Jim_SetResultFormatted(goi.interp,
4722                                 "%s <state_name> <timeout_in_msec>", cmd_name);
4723                 return JIM_ERR;
4724         }
4725
4726         Jim_Nvp *n;
4727         int e = Jim_GetOpt_Nvp(&goi, nvp_target_state, &n);
4728         if (e != JIM_OK) {
4729                 Jim_GetOpt_NvpUnknown(&goi, nvp_target_state, 1);
4730                 return e;
4731         }
4732         jim_wide a;
4733         e = Jim_GetOpt_Wide(&goi, &a);
4734         if (e != JIM_OK)
4735                 return e;
4736         struct target *target = Jim_CmdPrivData(interp);
4737         if (!target->tap->enabled)
4738                 return jim_target_tap_disabled(interp);
4739
4740         e = target_wait_state(target, n->value, a);
4741         if (e != ERROR_OK) {
4742                 Jim_Obj *eObj = Jim_NewIntObj(interp, e);
4743                 Jim_SetResultFormatted(goi.interp,
4744                                 "target: %s wait %s fails (%#s) %s",
4745                                 target_name(target), n->name,
4746                                 eObj, target_strerror_safe(e));
4747                 Jim_FreeNewObj(interp, eObj);
4748                 return JIM_ERR;
4749         }
4750         return JIM_OK;
4751 }
4752 /* List for human, Events defined for this target.
4753  * scripts/programs should use 'name cget -event NAME'
4754  */
4755 static int jim_target_event_list(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4756 {
4757         struct command_context *cmd_ctx = current_command_context(interp);
4758         assert(cmd_ctx != NULL);
4759
4760         struct target *target = Jim_CmdPrivData(interp);
4761         struct target_event_action *teap = target->event_action;
4762         command_print(cmd_ctx, "Event actions for target (%d) %s\n",
4763                                    target->target_number,
4764                                    target_name(target));
4765         command_print(cmd_ctx, "%-25s | Body", "Event");
4766         command_print(cmd_ctx, "------------------------- | "
4767                         "----------------------------------------");
4768         while (teap) {
4769                 Jim_Nvp *opt = Jim_Nvp_value2name_simple(nvp_target_event, teap->event);
4770                 command_print(cmd_ctx, "%-25s | %s",
4771                                 opt->name, Jim_GetString(teap->body, NULL));
4772                 teap = teap->next;
4773         }
4774         command_print(cmd_ctx, "***END***");
4775         return JIM_OK;
4776 }
4777 static int jim_target_current_state(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4778 {
4779         if (argc != 1) {
4780                 Jim_WrongNumArgs(interp, 1, argv, "[no parameters]");
4781                 return JIM_ERR;
4782         }
4783         struct target *target = Jim_CmdPrivData(interp);
4784         Jim_SetResultString(interp, target_state_name(target), -1);
4785         return JIM_OK;
4786 }
4787 static int jim_target_invoke_event(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
4788 {
4789         Jim_GetOptInfo goi;
4790         Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
4791         if (goi.argc != 1) {
4792                 const char *cmd_name = Jim_GetString(argv[0], NULL);
4793                 Jim_SetResultFormatted(goi.interp, "%s <eventname>", cmd_name);
4794                 return JIM_ERR;
4795         }
4796         Jim_Nvp *n;
4797         int e = Jim_GetOpt_Nvp(&goi, nvp_target_event, &n);
4798         if (e != JIM_OK) {
4799                 Jim_GetOpt_NvpUnknown(&goi, nvp_target_event, 1);
4800                 return e;
4801         }
4802         struct target *target = Jim_CmdPrivData(interp);
4803         target_handle_event(target, n->value);
4804         return JIM_OK;
4805 }
4806
4807 static const struct command_registration target_instance_command_handlers[] = {
4808         {
4809                 .name = "configure",
4810                 .mode = COMMAND_CONFIG,
4811                 .jim_handler = jim_target_configure,
4812                 .help  = "configure a new target for use",
4813                 .usage = "[target_attribute ...]",
4814         },
4815         {
4816                 .name = "cget",
4817                 .mode = COMMAND_ANY,
4818                 .jim_handler = jim_target_configure,
4819                 .help  = "returns the specified target attribute",
4820                 .usage = "target_attribute",
4821         },
4822         {
4823                 .name = "mww",
4824                 .mode = COMMAND_EXEC,
4825                 .jim_handler = jim_target_mw,
4826                 .help = "Write 32-bit word(s) to target memory",
4827                 .usage = "address data [count]",
4828         },
4829         {
4830                 .name = "mwh",
4831                 .mode = COMMAND_EXEC,
4832                 .jim_handler = jim_target_mw,
4833                 .help = "Write 16-bit half-word(s) to target memory",
4834                 .usage = "address data [count]",
4835         },
4836         {
4837                 .name = "mwb",
4838                 .mode = COMMAND_EXEC,
4839                 .jim_handler = jim_target_mw,
4840                 .help = "Write byte(s) to target memory",
4841                 .usage = "address data [count]",
4842         },
4843         {
4844                 .name = "mdw",
4845                 .mode = COMMAND_EXEC,
4846                 .jim_handler = jim_target_md,
4847                 .help = "Display target memory as 32-bit words",
4848                 .usage = "address [count]",
4849         },
4850         {
4851                 .name = "mdh",
4852                 .mode = COMMAND_EXEC,
4853                 .jim_handler = jim_target_md,
4854                 .help = "Display target memory as 16-bit half-words",
4855                 .usage = "address [count]",
4856         },
4857         {
4858                 .name = "mdb",
4859                 .mode = COMMAND_EXEC,
4860                 .jim_handler = jim_target_md,
4861                 .help = "Display target memory as 8-bit bytes",
4862                 .usage = "address [count]",
4863         },
4864         {
4865                 .name = "array2mem",
4866                 .mode = COMMAND_EXEC,
4867                 .jim_handler = jim_target_array2mem,
4868                 .help = "Writes Tcl array of 8/16/32 bit numbers "
4869                         "to target memory",
4870                 .usage = "arrayname bitwidth address count",
4871         },
4872         {
4873                 .name = "mem2array",
4874                 .mode = COMMAND_EXEC,
4875                 .jim_handler = jim_target_mem2array,
4876                 .help = "Loads Tcl array of 8/16/32 bit numbers "
4877                         "from target memory",
4878                 .usage = "arrayname bitwidth address count",
4879         },
4880         {
4881                 .name = "eventlist",
4882                 .mode = COMMAND_EXEC,
4883                 .jim_handler = jim_target_event_list,
4884                 .help = "displays a table of events defined for this target",
4885         },
4886         {
4887                 .name = "curstate",
4888                 .mode = COMMAND_EXEC,
4889                 .jim_handler = jim_target_current_state,
4890                 .help = "displays the current state of this target",
4891         },
4892         {
4893                 .name = "arp_examine",
4894                 .mode = COMMAND_EXEC,
4895                 .jim_handler = jim_target_examine,
4896                 .help = "used internally for reset processing",
4897         },
4898         {
4899                 .name = "arp_halt_gdb",
4900                 .mode = COMMAND_EXEC,
4901                 .jim_handler = jim_target_halt_gdb,
4902                 .help = "used internally for reset processing to halt GDB",
4903         },
4904         {
4905                 .name = "arp_poll",
4906                 .mode = COMMAND_EXEC,
4907                 .jim_handler = jim_target_poll,
4908                 .help = "used internally for reset processing",
4909         },
4910         {
4911                 .name = "arp_reset",
4912                 .mode = COMMAND_EXEC,
4913                 .jim_handler = jim_target_reset,
4914                 .help = "used internally for reset processing",
4915         },
4916         {
4917                 .name = "arp_halt",
4918                 .mode = COMMAND_EXEC,
4919                 .jim_handler = jim_target_halt,
4920                 .help = "used internally for reset processing",
4921         },
4922         {
4923                 .name = "arp_waitstate",
4924                 .mode = COMMAND_EXEC,
4925                 .jim_handler = jim_target_wait_state,
4926                 .help = "used internally for reset processing",
4927         },
4928         {
4929                 .name = "invoke-event",
4930                 .mode = COMMAND_EXEC,
4931                 .jim_handler = jim_target_invoke_event,
4932                 .help = "invoke handler for specified event",
4933                 .usage = "event_name",
4934         },
4935         COMMAND_REGISTRATION_DONE
4936 };
4937
4938 static int target_create(Jim_GetOptInfo *goi)
4939 {
4940         Jim_Obj *new_cmd;
4941         Jim_Cmd *cmd;
4942         const char *cp;
4943         char *cp2;
4944         int e;
4945         int x;
4946         struct target *target;
4947         struct command_context *cmd_ctx;
4948
4949         cmd_ctx = current_command_context(goi->interp);
4950         assert(cmd_ctx != NULL);
4951
4952         if (goi->argc < 3) {
4953                 Jim_WrongNumArgs(goi->interp, 1, goi->argv, "?name? ?type? ..options...");
4954                 return JIM_ERR;
4955         }
4956
4957         /* COMMAND */
4958         Jim_GetOpt_Obj(goi, &new_cmd);
4959         /* does this command exist? */
4960         cmd = Jim_GetCommand(goi->interp, new_cmd, JIM_ERRMSG);
4961         if (cmd) {
4962                 cp = Jim_GetString(new_cmd, NULL);
4963                 Jim_SetResultFormatted(goi->interp, "Command/target: %s Exists", cp);
4964                 return JIM_ERR;
4965         }
4966
4967         /* TYPE */
4968         e = Jim_GetOpt_String(goi, &cp2, NULL);
4969         if (e != JIM_OK)
4970                 return e;
4971         cp = cp2;
4972         /* now does target type exist */
4973         for (x = 0 ; target_types[x] ; x++) {
4974                 if (0 == strcmp(cp, target_types[x]->name)) {
4975                         /* found */
4976                         break;
4977                 }
4978
4979                 /* check for deprecated name */
4980                 if (target_types[x]->deprecated_name) {
4981                         if (0 == strcmp(cp, target_types[x]->deprecated_name)) {
4982                                 /* found */
4983                                 LOG_WARNING("target name is deprecated use: \'%s\'", target_types[x]->name);
4984                                 break;
4985                         }
4986                 }
4987         }
4988         if (target_types[x] == NULL) {
4989                 Jim_SetResultFormatted(goi->interp, "Unknown target type %s, try one of ", cp);
4990                 for (x = 0 ; target_types[x] ; x++) {
4991                         if (target_types[x + 1]) {
4992                                 Jim_AppendStrings(goi->interp,
4993                                                                    Jim_GetResult(goi->interp),
4994                                                                    target_types[x]->name,
4995                                                                    ", ", NULL);
4996                         } else {
4997                                 Jim_AppendStrings(goi->interp,
4998                                                                    Jim_GetResult(goi->interp),
4999                                                                    " or ",
5000                                                                    target_types[x]->name, NULL);
5001                         }
5002                 }
5003                 return JIM_ERR;
5004         }
5005
5006         /* Create it */
5007         target = calloc(1, sizeof(struct target));
5008         /* set target number */
5009         target->target_number = new_target_number();
5010
5011         /* allocate memory for each unique target type */
5012         target->type = (struct target_type *)calloc(1, sizeof(struct target_type));
5013
5014         memcpy(target->type, target_types[x], sizeof(struct target_type));
5015
5016         /* will be set by "-endian" */
5017         target->endianness = TARGET_ENDIAN_UNKNOWN;
5018
5019         /* default to first core, override with -coreid */
5020         target->coreid = 0;
5021
5022         target->working_area        = 0x0;
5023         target->working_area_size   = 0x0;
5024         target->working_areas       = NULL;
5025         target->backup_working_area = 0;
5026
5027         target->state               = TARGET_UNKNOWN;
5028         target->debug_reason        = DBG_REASON_UNDEFINED;
5029         target->reg_cache           = NULL;
5030         target->breakpoints         = NULL;
5031         target->watchpoints         = NULL;
5032         target->next                = NULL;
5033         target->arch_info           = NULL;
5034
5035         target->display             = 1;
5036
5037         target->halt_issued                     = false;
5038
5039         /* initialize trace information */
5040         target->trace_info = malloc(sizeof(struct trace));
5041         target->trace_info->num_trace_points         = 0;
5042         target->trace_info->trace_points_size        = 0;
5043         target->trace_info->trace_points             = NULL;
5044         target->trace_info->trace_history_size       = 0;
5045         target->trace_info->trace_history            = NULL;
5046         target->trace_info->trace_history_pos        = 0;
5047         target->trace_info->trace_history_overflowed = 0;
5048
5049         target->dbgmsg          = NULL;
5050         target->dbg_msg_enabled = 0;
5051
5052         target->endianness = TARGET_ENDIAN_UNKNOWN;
5053
5054         target->rtos = NULL;
5055         target->rtos_auto_detect = false;
5056
5057         /* Do the rest as "configure" options */
5058         goi->isconfigure = 1;
5059         e = target_configure(goi, target);
5060
5061         if (target->tap == NULL) {
5062                 Jim_SetResultString(goi->interp, "-chain-position required when creating target", -1);
5063                 e = JIM_ERR;
5064         }
5065
5066         if (e != JIM_OK) {
5067                 free(target->type);
5068                 free(target);
5069                 return e;
5070         }
5071
5072         if (target->endianness == TARGET_ENDIAN_UNKNOWN) {
5073                 /* default endian to little if not specified */
5074                 target->endianness = TARGET_LITTLE_ENDIAN;
5075         }
5076
5077         /* incase variant is not set */
5078         if (!target->variant)
5079                 target->variant = strdup("");
5080
5081         cp = Jim_GetString(new_cmd, NULL);
5082         target->cmd_name = strdup(cp);
5083
5084         /* create the target specific commands */
5085         if (target->type->commands) {
5086                 e = register_commands(cmd_ctx, NULL, target->type->commands);
5087                 if (ERROR_OK != e)
5088                         LOG_ERROR("unable to register '%s' commands", cp);
5089         }
5090         if (target->type->target_create)
5091                 (*(target->type->target_create))(target, goi->interp);
5092
5093         /* append to end of list */
5094         {
5095                 struct target **tpp;
5096                 tpp = &(all_targets);
5097                 while (*tpp)
5098                         tpp = &((*tpp)->next);
5099                 *tpp = target;
5100         }
5101
5102         /* now - create the new target name command */
5103         const struct command_registration target_subcommands[] = {
5104                 {
5105                         .chain = target_instance_command_handlers,
5106                 },
5107                 {
5108                         .chain = target->type->commands,
5109                 },
5110                 COMMAND_REGISTRATION_DONE
5111         };
5112         const struct command_registration target_commands[] = {
5113                 {
5114                         .name = cp,
5115                         .mode = COMMAND_ANY,
5116                         .help = "target command group",
5117                         .usage = "",
5118                         .chain = target_subcommands,
5119                 },
5120                 COMMAND_REGISTRATION_DONE
5121         };
5122         e = register_commands(cmd_ctx, NULL, target_commands);
5123         if (ERROR_OK != e)
5124                 return JIM_ERR;
5125
5126         struct command *c = command_find_in_context(cmd_ctx, cp);
5127         assert(c);
5128         command_set_handler_data(c, target);
5129
5130         return (ERROR_OK == e) ? JIM_OK : JIM_ERR;
5131 }
5132
5133 static int jim_target_current(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
5134 {
5135         if (argc != 1) {
5136                 Jim_WrongNumArgs(interp, 1, argv, "Too many parameters");
5137                 return JIM_ERR;
5138         }
5139         struct command_context *cmd_ctx = current_command_context(interp);
5140         assert(cmd_ctx != NULL);
5141
5142         Jim_SetResultString(interp, target_name(get_current_target(cmd_ctx)), -1);
5143         return JIM_OK;
5144 }
5145
5146 static int jim_target_types(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
5147 {
5148         if (argc != 1) {
5149                 Jim_WrongNumArgs(interp, 1, argv, "Too many parameters");
5150                 return JIM_ERR;
5151         }
5152         Jim_SetResult(interp, Jim_NewListObj(interp, NULL, 0));
5153         for (unsigned x = 0; NULL != target_types[x]; x++) {
5154                 Jim_ListAppendElement(interp, Jim_GetResult(interp),
5155                         Jim_NewStringObj(interp, target_types[x]->name, -1));
5156         }
5157         return JIM_OK;
5158 }
5159
5160 static int jim_target_names(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
5161 {
5162         if (argc != 1) {
5163                 Jim_WrongNumArgs(interp, 1, argv, "Too many parameters");
5164                 return JIM_ERR;
5165         }
5166         Jim_SetResult(interp, Jim_NewListObj(interp, NULL, 0));
5167         struct target *target = all_targets;
5168         while (target) {
5169                 Jim_ListAppendElement(interp, Jim_GetResult(interp),
5170                         Jim_NewStringObj(interp, target_name(target), -1));
5171                 target = target->next;
5172         }
5173         return JIM_OK;
5174 }
5175
5176 static int jim_target_smp(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
5177 {
5178         int i;
5179         const char *targetname;
5180         int retval, len;
5181         struct target *target = (struct target *) NULL;
5182         struct target_list *head, *curr, *new;
5183         curr = (struct target_list *) NULL;
5184         head = (struct target_list *) NULL;
5185
5186         retval = 0;
5187         LOG_DEBUG("%d", argc);
5188         /* argv[1] = target to associate in smp
5189          * argv[2] = target to assoicate in smp
5190          * argv[3] ...
5191          */
5192
5193         for (i = 1; i < argc; i++) {
5194
5195                 targetname = Jim_GetString(argv[i], &len);
5196                 target = get_target(targetname);
5197                 LOG_DEBUG("%s ", targetname);
5198                 if (target) {
5199                         new = malloc(sizeof(struct target_list));
5200                         new->target = target;
5201                         new->next = (struct target_list *)NULL;
5202                         if (head == (struct target_list *)NULL) {
5203                                 head = new;
5204                                 curr = head;
5205                         } else {
5206                                 curr->next = new;
5207                                 curr = new;
5208                         }
5209                 }
5210         }
5211         /*  now parse the list of cpu and put the target in smp mode*/
5212         curr = head;
5213
5214         while (curr != (struct target_list *)NULL) {
5215                 target = curr->target;
5216                 target->smp = 1;
5217                 target->head = head;
5218                 curr = curr->next;
5219         }
5220
5221         if (target && target->rtos)
5222                 retval = rtos_smp_init(head->target);
5223
5224         return retval;
5225 }
5226
5227
5228 static int jim_target_create(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
5229 {
5230         Jim_GetOptInfo goi;
5231         Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
5232         if (goi.argc < 3) {
5233                 Jim_WrongNumArgs(goi.interp, goi.argc, goi.argv,
5234                         "<name> <target_type> [<target_options> ...]");
5235                 return JIM_ERR;
5236         }
5237         return target_create(&goi);
5238 }
5239
5240 static int jim_target_number(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
5241 {
5242         Jim_GetOptInfo goi;
5243         Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
5244
5245         /* It's OK to remove this mechanism sometime after August 2010 or so */
5246         LOG_WARNING("don't use numbers as target identifiers; use names");
5247         if (goi.argc != 1) {
5248                 Jim_SetResultFormatted(goi.interp, "usage: target number <number>");
5249                 return JIM_ERR;
5250         }
5251         jim_wide w;
5252         int e = Jim_GetOpt_Wide(&goi, &w);
5253         if (e != JIM_OK)
5254                 return JIM_ERR;
5255
5256         struct target *target;
5257         for (target = all_targets; NULL != target; target = target->next) {
5258                 if (target->target_number != w)
5259                         continue;
5260
5261                 Jim_SetResultString(goi.interp, target_name(target), -1);
5262                 return JIM_OK;
5263         }
5264         {
5265                 Jim_Obj *wObj = Jim_NewIntObj(goi.interp, w);
5266                 Jim_SetResultFormatted(goi.interp,
5267                         "Target: number %#s does not exist", wObj);
5268                 Jim_FreeNewObj(interp, wObj);
5269         }
5270         return JIM_ERR;
5271 }
5272
5273 static int jim_target_count(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
5274 {
5275         if (argc != 1) {
5276                 Jim_WrongNumArgs(interp, 1, argv, "<no parameters>");
5277                 return JIM_ERR;
5278         }
5279         unsigned count = 0;
5280         struct target *target = all_targets;
5281         while (NULL != target) {
5282                 target = target->next;
5283                 count++;
5284         }
5285         Jim_SetResult(interp, Jim_NewIntObj(interp, count));
5286         return JIM_OK;
5287 }
5288
5289 static const struct command_registration target_subcommand_handlers[] = {
5290         {
5291                 .name = "init",
5292                 .mode = COMMAND_CONFIG,
5293                 .handler = handle_target_init_command,
5294                 .help = "initialize targets",
5295         },
5296         {
5297                 .name = "create",
5298                 /* REVISIT this should be COMMAND_CONFIG ... */
5299                 .mode = COMMAND_ANY,
5300                 .jim_handler = jim_target_create,
5301                 .usage = "name type '-chain-position' name [options ...]",
5302                 .help = "Creates and selects a new target",
5303         },
5304         {
5305                 .name = "current",
5306                 .mode = COMMAND_ANY,
5307                 .jim_handler = jim_target_current,
5308                 .help = "Returns the currently selected target",
5309         },
5310         {
5311                 .name = "types",
5312                 .mode = COMMAND_ANY,
5313                 .jim_handler = jim_target_types,
5314                 .help = "Returns the available target types as "
5315                                 "a list of strings",
5316         },
5317         {
5318                 .name = "names",
5319                 .mode = COMMAND_ANY,
5320                 .jim_handler = jim_target_names,
5321                 .help = "Returns the names of all targets as a list of strings",
5322         },
5323         {
5324                 .name = "number",
5325                 .mode = COMMAND_ANY,
5326                 .jim_handler = jim_target_number,
5327                 .usage = "number",
5328                 .help = "Returns the name of the numbered target "
5329                         "(DEPRECATED)",
5330         },
5331         {
5332                 .name = "count",
5333                 .mode = COMMAND_ANY,
5334                 .jim_handler = jim_target_count,
5335                 .help = "Returns the number of targets as an integer "
5336                         "(DEPRECATED)",
5337         },
5338         {
5339                 .name = "smp",
5340                 .mode = COMMAND_ANY,
5341                 .jim_handler = jim_target_smp,
5342                 .usage = "targetname1 targetname2 ...",
5343                 .help = "gather several target in a smp list"
5344         },
5345
5346         COMMAND_REGISTRATION_DONE
5347 };
5348
5349 struct FastLoad {
5350         uint32_t address;
5351         uint8_t *data;
5352         int length;
5353
5354 };
5355
5356 static int fastload_num;
5357 static struct FastLoad *fastload;
5358
5359 static void free_fastload(void)
5360 {
5361         if (fastload != NULL) {
5362                 int i;
5363                 for (i = 0; i < fastload_num; i++) {
5364                         if (fastload[i].data)
5365                                 free(fastload[i].data);
5366                 }
5367                 free(fastload);
5368                 fastload = NULL;
5369         }
5370 }
5371
5372 COMMAND_HANDLER(handle_fast_load_image_command)
5373 {
5374         uint8_t *buffer;
5375         size_t buf_cnt;
5376         uint32_t image_size;
5377         uint32_t min_address = 0;
5378         uint32_t max_address = 0xffffffff;
5379         int i;
5380
5381         struct image image;
5382
5383         int retval = CALL_COMMAND_HANDLER(parse_load_image_command_CMD_ARGV,
5384                         &image, &min_address, &max_address);
5385         if (ERROR_OK != retval)
5386                 return retval;
5387
5388         struct duration bench;
5389         duration_start(&bench);
5390
5391         retval = image_open(&image, CMD_ARGV[0], (CMD_ARGC >= 3) ? CMD_ARGV[2] : NULL);
5392         if (retval != ERROR_OK)
5393                 return retval;
5394
5395         image_size = 0x0;
5396         retval = ERROR_OK;
5397         fastload_num = image.num_sections;
5398         fastload = (struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections);
5399         if (fastload == NULL) {
5400                 command_print(CMD_CTX, "out of memory");
5401                 image_close(&image);
5402                 return ERROR_FAIL;
5403         }
5404         memset(fastload, 0, sizeof(struct FastLoad)*image.num_sections);
5405         for (i = 0; i < image.num_sections; i++) {
5406                 buffer = malloc(image.sections[i].size);
5407                 if (buffer == NULL) {
5408                         command_print(CMD_CTX, "error allocating buffer for section (%d bytes)",
5409                                                   (int)(image.sections[i].size));
5410                         retval = ERROR_FAIL;
5411                         break;
5412                 }
5413
5414                 retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt);
5415                 if (retval != ERROR_OK) {
5416                         free(buffer);
5417                         break;
5418                 }
5419
5420                 uint32_t offset = 0;
5421                 uint32_t length = buf_cnt;
5422
5423                 /* DANGER!!! beware of unsigned comparision here!!! */
5424
5425                 if ((image.sections[i].base_address + buf_cnt >= min_address) &&
5426                                 (image.sections[i].base_address < max_address)) {
5427                         if (image.sections[i].base_address < min_address) {
5428                                 /* clip addresses below */
5429                                 offset += min_address-image.sections[i].base_address;
5430                                 length -= offset;
5431                         }
5432
5433                         if (image.sections[i].base_address + buf_cnt > max_address)
5434                                 length -= (image.sections[i].base_address + buf_cnt)-max_address;
5435
5436                         fastload[i].address = image.sections[i].base_address + offset;
5437                         fastload[i].data = malloc(length);
5438                         if (fastload[i].data == NULL) {
5439                                 free(buffer);
5440                                 command_print(CMD_CTX, "error allocating buffer for section (%d bytes)",
5441                                                           length);
5442                                 retval = ERROR_FAIL;
5443                                 break;
5444                         }
5445                         memcpy(fastload[i].data, buffer + offset, length);
5446                         fastload[i].length = length;
5447
5448                         image_size += length;
5449                         command_print(CMD_CTX, "%u bytes written at address 0x%8.8x",
5450                                                   (unsigned int)length,
5451                                                   ((unsigned int)(image.sections[i].base_address + offset)));
5452                 }
5453
5454                 free(buffer);
5455         }
5456
5457         if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
5458                 command_print(CMD_CTX, "Loaded %" PRIu32 " bytes "
5459                                 "in %fs (%0.3f KiB/s)", image_size,
5460                                 duration_elapsed(&bench), duration_kbps(&bench, image_size));
5461
5462                 command_print(CMD_CTX,
5463                                 "WARNING: image has not been loaded to target!"
5464                                 "You can issue a 'fast_load' to finish loading.");
5465         }
5466
5467         image_close(&image);
5468
5469         if (retval != ERROR_OK)
5470                 free_fastload();
5471
5472         return retval;
5473 }
5474
5475 COMMAND_HANDLER(handle_fast_load_command)
5476 {
5477         if (CMD_ARGC > 0)
5478                 return ERROR_COMMAND_SYNTAX_ERROR;
5479         if (fastload == NULL) {
5480                 LOG_ERROR("No image in memory");
5481                 return ERROR_FAIL;
5482         }
5483         int i;
5484         int ms = timeval_ms();
5485         int size = 0;
5486         int retval = ERROR_OK;
5487         for (i = 0; i < fastload_num; i++) {
5488                 struct target *target = get_current_target(CMD_CTX);
5489                 command_print(CMD_CTX, "Write to 0x%08x, length 0x%08x",
5490                                           (unsigned int)(fastload[i].address),
5491                                           (unsigned int)(fastload[i].length));
5492                 retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data);
5493                 if (retval != ERROR_OK)
5494                         break;
5495                 size += fastload[i].length;
5496         }
5497         if (retval == ERROR_OK) {
5498                 int after = timeval_ms();
5499                 command_print(CMD_CTX, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
5500         }
5501         return retval;
5502 }
5503
5504 static const struct command_registration target_command_handlers[] = {
5505         {
5506                 .name = "targets",
5507                 .handler = handle_targets_command,
5508                 .mode = COMMAND_ANY,
5509                 .help = "change current default target (one parameter) "
5510                         "or prints table of all targets (no parameters)",
5511                 .usage = "[target]",
5512         },
5513         {
5514                 .name = "target",
5515                 .mode = COMMAND_CONFIG,
5516                 .help = "configure target",
5517
5518                 .chain = target_subcommand_handlers,
5519         },
5520         COMMAND_REGISTRATION_DONE
5521 };
5522
5523 int target_register_commands(struct command_context *cmd_ctx)
5524 {
5525         return register_commands(cmd_ctx, NULL, target_command_handlers);
5526 }
5527
5528 static bool target_reset_nag = true;
5529
5530 bool get_target_reset_nag(void)
5531 {
5532         return target_reset_nag;
5533 }
5534
5535 COMMAND_HANDLER(handle_target_reset_nag)
5536 {
5537         return CALL_COMMAND_HANDLER(handle_command_parse_bool,
5538                         &target_reset_nag, "Nag after each reset about options to improve "
5539                         "performance");
5540 }
5541
5542 COMMAND_HANDLER(handle_ps_command)
5543 {
5544         struct target *target = get_current_target(CMD_CTX);
5545         char *display;
5546         if (target->state != TARGET_HALTED) {
5547                 LOG_INFO("target not halted !!");
5548                 return ERROR_OK;
5549         }
5550
5551         if ((target->rtos) && (target->rtos->type)
5552                         && (target->rtos->type->ps_command)) {
5553                 display = target->rtos->type->ps_command(target);
5554                 command_print(CMD_CTX, "%s", display);
5555                 free(display);
5556                 return ERROR_OK;
5557         } else {
5558                 LOG_INFO("failed");
5559                 return ERROR_TARGET_FAILURE;
5560         }
5561 }
5562
5563 static const struct command_registration target_exec_command_handlers[] = {
5564         {
5565                 .name = "fast_load_image",
5566                 .handler = handle_fast_load_image_command,
5567                 .mode = COMMAND_ANY,
5568                 .help = "Load image into server memory for later use by "
5569                         "fast_load; primarily for profiling",
5570                 .usage = "filename address ['bin'|'ihex'|'elf'|'s19'] "
5571                         "[min_address [max_length]]",
5572         },
5573         {
5574                 .name = "fast_load",
5575                 .handler = handle_fast_load_command,
5576                 .mode = COMMAND_EXEC,
5577                 .help = "loads active fast load image to current target "
5578                         "- mainly for profiling purposes",
5579                 .usage = "",
5580         },
5581         {
5582                 .name = "profile",
5583                 .handler = handle_profile_command,
5584                 .mode = COMMAND_EXEC,
5585                 .usage = "seconds filename [start end]",
5586                 .help = "profiling samples the CPU PC",
5587         },
5588         /** @todo don't register virt2phys() unless target supports it */
5589         {
5590                 .name = "virt2phys",
5591                 .handler = handle_virt2phys_command,
5592                 .mode = COMMAND_ANY,
5593                 .help = "translate a virtual address into a physical address",
5594                 .usage = "virtual_address",
5595         },
5596         {
5597                 .name = "reg",
5598                 .handler = handle_reg_command,
5599                 .mode = COMMAND_EXEC,
5600                 .help = "display or set a register; with no arguments, "
5601                         "displays all registers and their values",
5602                 .usage = "[(register_name|register_number) [value]]",
5603         },
5604         {
5605                 .name = "poll",
5606                 .handler = handle_poll_command,
5607                 .mode = COMMAND_EXEC,
5608                 .help = "poll target state; or reconfigure background polling",
5609                 .usage = "['on'|'off']",
5610         },
5611         {
5612                 .name = "wait_halt",
5613                 .handler = handle_wait_halt_command,
5614                 .mode = COMMAND_EXEC,
5615                 .help = "wait up to the specified number of milliseconds "
5616                         "(default 5000) for a previously requested halt",
5617                 .usage = "[milliseconds]",
5618         },
5619         {
5620                 .name = "halt",
5621                 .handler = handle_halt_command,
5622                 .mode = COMMAND_EXEC,
5623                 .help = "request target to halt, then wait up to the specified"
5624                         "number of milliseconds (default 5000) for it to complete",
5625                 .usage = "[milliseconds]",
5626         },
5627         {
5628                 .name = "resume",
5629                 .handler = handle_resume_command,
5630                 .mode = COMMAND_EXEC,
5631                 .help = "resume target execution from current PC or address",
5632                 .usage = "[address]",
5633         },
5634         {
5635                 .name = "reset",
5636                 .handler = handle_reset_command,
5637                 .mode = COMMAND_EXEC,
5638                 .usage = "[run|halt|init]",
5639                 .help = "Reset all targets into the specified mode."
5640                         "Default reset mode is run, if not given.",
5641         },
5642         {
5643                 .name = "soft_reset_halt",
5644                 .handler = handle_soft_reset_halt_command,
5645                 .mode = COMMAND_EXEC,
5646                 .usage = "",
5647                 .help = "halt the target and do a soft reset",
5648         },
5649         {
5650                 .name = "step",
5651                 .handler = handle_step_command,
5652                 .mode = COMMAND_EXEC,
5653                 .help = "step one instruction from current PC or address",
5654                 .usage = "[address]",
5655         },
5656         {
5657                 .name = "mdw",
5658                 .handler = handle_md_command,
5659                 .mode = COMMAND_EXEC,
5660                 .help = "display memory words",
5661                 .usage = "['phys'] address [count]",
5662         },
5663         {
5664                 .name = "mdh",
5665                 .handler = handle_md_command,
5666                 .mode = COMMAND_EXEC,
5667                 .help = "display memory half-words",
5668                 .usage = "['phys'] address [count]",
5669         },
5670         {
5671                 .name = "mdb",
5672                 .handler = handle_md_command,
5673                 .mode = COMMAND_EXEC,
5674                 .help = "display memory bytes",
5675                 .usage = "['phys'] address [count]",
5676         },
5677         {
5678                 .name = "mww",
5679                 .handler = handle_mw_command,
5680                 .mode = COMMAND_EXEC,
5681                 .help = "write memory word",
5682                 .usage = "['phys'] address value [count]",
5683         },
5684         {
5685                 .name = "mwh",
5686                 .handler = handle_mw_command,
5687                 .mode = COMMAND_EXEC,
5688                 .help = "write memory half-word",
5689                 .usage = "['phys'] address value [count]",
5690         },
5691         {
5692                 .name = "mwb",
5693                 .handler = handle_mw_command,
5694                 .mode = COMMAND_EXEC,
5695                 .help = "write memory byte",
5696                 .usage = "['phys'] address value [count]",
5697         },
5698         {
5699                 .name = "bp",
5700                 .handler = handle_bp_command,
5701                 .mode = COMMAND_EXEC,
5702                 .help = "list or set hardware or software breakpoint",
5703                 .usage = "<address> [<asid>]<length> ['hw'|'hw_ctx']",
5704         },
5705         {
5706                 .name = "rbp",
5707                 .handler = handle_rbp_command,
5708                 .mode = COMMAND_EXEC,
5709                 .help = "remove breakpoint",
5710                 .usage = "address",
5711         },
5712         {
5713                 .name = "wp",
5714                 .handler = handle_wp_command,
5715                 .mode = COMMAND_EXEC,
5716                 .help = "list (no params) or create watchpoints",
5717                 .usage = "[address length [('r'|'w'|'a') value [mask]]]",
5718         },
5719         {
5720                 .name = "rwp",
5721                 .handler = handle_rwp_command,
5722                 .mode = COMMAND_EXEC,
5723                 .help = "remove watchpoint",
5724                 .usage = "address",
5725         },
5726         {
5727                 .name = "load_image",
5728                 .handler = handle_load_image_command,
5729                 .mode = COMMAND_EXEC,
5730                 .usage = "filename address ['bin'|'ihex'|'elf'|'s19'] "
5731                         "[min_address] [max_length]",
5732         },
5733         {
5734                 .name = "dump_image",
5735                 .handler = handle_dump_image_command,
5736                 .mode = COMMAND_EXEC,
5737                 .usage = "filename address size",
5738         },
5739         {
5740                 .name = "verify_image",
5741                 .handler = handle_verify_image_command,
5742                 .mode = COMMAND_EXEC,
5743                 .usage = "filename [offset [type]]",
5744         },
5745         {
5746                 .name = "test_image",
5747                 .handler = handle_test_image_command,
5748                 .mode = COMMAND_EXEC,
5749                 .usage = "filename [offset [type]]",
5750         },
5751         {
5752                 .name = "mem2array",
5753                 .mode = COMMAND_EXEC,
5754                 .jim_handler = jim_mem2array,
5755                 .help = "read 8/16/32 bit memory and return as a TCL array "
5756                         "for script processing",
5757                 .usage = "arrayname bitwidth address count",
5758         },
5759         {
5760                 .name = "array2mem",
5761                 .mode = COMMAND_EXEC,
5762                 .jim_handler = jim_array2mem,
5763                 .help = "convert a TCL array to memory locations "
5764                         "and write the 8/16/32 bit values",
5765                 .usage = "arrayname bitwidth address count",
5766         },
5767         {
5768                 .name = "reset_nag",
5769                 .handler = handle_target_reset_nag,
5770                 .mode = COMMAND_ANY,
5771                 .help = "Nag after each reset about options that could have been "
5772                                 "enabled to improve performance. ",
5773                 .usage = "['enable'|'disable']",
5774         },
5775         {
5776                 .name = "ps",
5777                 .handler = handle_ps_command,
5778                 .mode = COMMAND_EXEC,
5779                 .help = "list all tasks ",
5780                 .usage = " ",
5781         },
5782
5783         COMMAND_REGISTRATION_DONE
5784 };
5785 static int target_register_user_commands(struct command_context *cmd_ctx)
5786 {
5787         int retval = ERROR_OK;
5788         retval = target_request_register_commands(cmd_ctx);
5789         if (retval != ERROR_OK)
5790                 return retval;
5791
5792         retval = trace_register_commands(cmd_ctx);
5793         if (retval != ERROR_OK)
5794                 return retval;
5795
5796
5797         return register_commands(cmd_ctx, NULL, target_exec_command_handlers);
5798 }