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

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)