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

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)