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

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)