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