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

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)