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

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)