56 #define DEFAULT_HALT_TIMEOUT 5000
73 int fileio_errno,
bool ctrl_c);
138 { .name =
NULL, .value = -1 }
153 { .value = -1, .name =
NULL }
216 { .name =
NULL, .value = -1 }
226 { .name =
NULL, .value = -1 },
239 { .name =
NULL, .value = -1 },
247 { .name =
NULL, .value = -1 },
255 { .name =
NULL, .value = -1 },
266 cp =
"(*BUG*unknown*BUG*)";
277 cp =
"(*BUG*unknown*BUG*)";
281 cp =
"examine deferred";
291 LOG_ERROR(
"Invalid target event: %d", (
int)(event));
292 cp =
"(*BUG*unknown*BUG*)";
302 LOG_ERROR(
"Invalid target reset mode: %d", (
int)(reset_mode));
303 cp =
"(*BUG*unknown*BUG*)";
399 for (i = 0; i <
count; i++)
407 for (i = 0; i <
count; i++)
415 for (i = 0; i <
count; i++)
423 for (i = 0; i <
count; i++)
431 for (i = 0; i <
count; i++)
439 for (i = 0; i <
count; i++)
457 unsigned int index, counter;
458 if (parse_uint(
id, &index) !=
ERROR_OK)
474 LOG_ERROR(
"BUG: current_target out of bounds");
509 LOG_INFO(
"Halt timed out, wake up GDB.");
568 bool handle_breakpoints,
bool debug_execution)
625 sprintf(buf,
"ocd_process_reset %s", n->
name);
626 retval = Jim_Eval(
cmd->ctx->interp, buf);
630 if (retval != JIM_OK) {
631 Jim_MakeErrorMessage(
cmd->ctx->interp);
762 LOG_ERROR(
"Target %s does not support soft_reset_halt",
788 int num_mem_params,
struct mem_param *mem_params,
791 unsigned int timeout_ms,
void *
arch_info)
801 LOG_ERROR(
"Target type '%s' does not support %s",
808 num_mem_params, mem_params,
810 entry_point, exit_point, timeout_ms,
arch_info);
830 int num_mem_params,
struct mem_param *mem_params,
831 int num_reg_params,
struct reg_param *reg_params,
843 LOG_ERROR(
"Target type '%s' does not support %s",
848 LOG_ERROR(
"Target is already running an algorithm");
854 num_mem_params, mem_params,
855 num_reg_params, reg_params,
875 int num_mem_params,
struct mem_param *mem_params,
876 int num_reg_params,
struct reg_param *reg_params,
883 LOG_ERROR(
"Target type '%s' does not support %s",
888 LOG_ERROR(
"Target is not running an algorithm");
893 num_mem_params, mem_params,
894 num_reg_params, reg_params,
947 const uint8_t *
buffer, uint32_t
count,
int block_size,
948 int num_mem_params,
struct mem_param *mem_params,
949 int num_reg_params,
struct reg_param *reg_params,
951 uint32_t entry_point, uint32_t exit_point,
void *
arch_info)
956 const uint8_t *buffer_orig =
buffer;
960 uint32_t wp_addr = buffer_start;
961 uint32_t rp_addr = buffer_start + 4;
962 uint32_t fifo_start_addr = buffer_start + 8;
963 uint32_t fifo_end_addr = buffer_start +
buffer_size;
965 uint32_t wp = fifo_start_addr;
966 uint32_t rp = fifo_start_addr;
980 num_reg_params, reg_params,
986 LOG_ERROR(
"error starting target flash write algorithm");
998 LOG_DEBUG(
"offs 0x%zx count 0x%" PRIx32
" wp 0x%" PRIx32
" rp 0x%" PRIx32,
1002 LOG_ERROR(
"flash write algorithm aborted by target");
1007 if (!
IS_ALIGNED(rp - fifo_start_addr, block_size) || rp < fifo_start_addr || rp >= fifo_end_addr) {
1008 LOG_ERROR(
"corrupted fifo read pointer 0x%" PRIx32, rp);
1015 uint32_t thisrun_bytes;
1017 thisrun_bytes = rp - wp - block_size;
1018 else if (rp > fifo_start_addr)
1019 thisrun_bytes = fifo_end_addr - wp;
1021 thisrun_bytes = fifo_end_addr - wp - block_size;
1023 if (thisrun_bytes == 0) {
1033 LOG_ERROR(
"timeout waiting for algorithm, a target reset is recommended");
1043 if (thisrun_bytes >
count * block_size)
1044 thisrun_bytes =
count * block_size;
1047 if (thisrun_bytes >= 16)
1048 thisrun_bytes -= (rp + thisrun_bytes) & 0x03;
1057 count -= thisrun_bytes / block_size;
1058 wp += thisrun_bytes;
1059 if (wp >= fifo_end_addr)
1060 wp = fifo_start_addr;
1077 num_reg_params, reg_params,
1083 LOG_ERROR(
"error waiting for target flash write algorithm");
1090 if (retval ==
ERROR_OK && rp == 0) {
1091 LOG_ERROR(
"flash write algorithm aborted by target");
1101 int num_mem_params,
struct mem_param *mem_params,
1102 int num_reg_params,
struct reg_param *reg_params,
1104 uint32_t entry_point, uint32_t exit_point,
void *
arch_info)
1109 const uint8_t *buffer_orig =
buffer;
1113 uint32_t wp_addr = buffer_start;
1114 uint32_t rp_addr = buffer_start + 4;
1115 uint32_t fifo_start_addr = buffer_start + 8;
1116 uint32_t fifo_end_addr = buffer_start +
buffer_size;
1118 uint32_t wp = fifo_start_addr;
1119 uint32_t rp = fifo_start_addr;
1133 num_reg_params, reg_params,
1139 LOG_ERROR(
"error starting target flash read algorithm");
1146 LOG_ERROR(
"failed to get write pointer");
1150 LOG_DEBUG(
"offs 0x%zx count 0x%" PRIx32
" wp 0x%" PRIx32
" rp 0x%" PRIx32,
1154 LOG_ERROR(
"flash read algorithm aborted by target");
1159 if (!
IS_ALIGNED(wp - fifo_start_addr, block_size) || wp < fifo_start_addr || wp >= fifo_end_addr) {
1160 LOG_ERROR(
"corrupted fifo write pointer 0x%" PRIx32, wp);
1166 uint32_t thisrun_bytes;
1168 thisrun_bytes = wp - rp;
1170 thisrun_bytes = fifo_end_addr - rp;
1172 if (thisrun_bytes == 0) {
1182 LOG_ERROR(
"timeout waiting for algorithm, a target reset is recommended");
1192 if (thisrun_bytes >
count * block_size)
1193 thisrun_bytes =
count * block_size;
1196 if (thisrun_bytes >= 16)
1197 thisrun_bytes -= (rp + thisrun_bytes) & 0x03;
1206 count -= thisrun_bytes / block_size;
1207 rp += thisrun_bytes;
1208 if (rp >= fifo_end_addr)
1209 rp = fifo_start_addr;
1231 num_reg_params, reg_params,
1237 LOG_ERROR(
"error waiting for target flash write algorithm");
1244 if (retval ==
ERROR_OK && wp == 0) {
1245 LOG_ERROR(
"flash read algorithm aborted by target");
1393 struct reg **reg_list[],
int *reg_list_size,
1405 reg_list_size, reg_class);
1416 struct reg **reg_list[],
int *reg_list_size,
1421 reg_list_size, reg_class) ==
ERROR_OK)
1498 uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
1501 num_samples, seconds);
1516 if (!
type->check_reset)
1519 assert(
type->init_target);
1521 int retval =
type->init_target(cmd_ctx,
target);
1531 if (!
type->virt2phys) {
1540 if (
type->write_phys_memory ||
type->read_phys_memory ||
type->virt2phys)
1544 type->write_phys_memory =
type->write_memory;
1545 type->read_phys_memory =
type->read_memory;
1600 static bool target_initialized;
1601 if (target_initialized) {
1602 LOG_INFO(
"'target init' has already been called");
1605 target_initialized =
true;
1632 while ((*callbacks_p)->next)
1633 callbacks_p = &((*callbacks_p)->next);
1634 callbacks_p = &((*callbacks_p)->next);
1638 (*callbacks_p)->callback =
callback;
1639 (*callbacks_p)->priv =
priv;
1640 (*callbacks_p)->next =
NULL;
1655 LOG_ERROR(
"error allocating buffer for reset callback entry");
1668 size_t len, uint8_t *data,
void *
priv),
void *
priv)
1677 LOG_ERROR(
"error allocating buffer for trace callback entry");
1710 while ((*callbacks_p)->next)
1711 callbacks_p = &((*callbacks_p)->next);
1712 callbacks_p = &((*callbacks_p)->next);
1716 (*callbacks_p)->callback =
callback;
1717 (*callbacks_p)->type =
type;
1718 (*callbacks_p)->removed =
false;
1720 (*callbacks_p)->priv =
priv;
1721 (*callbacks_p)->next =
NULL;
1769 size_t len, uint8_t *data,
void *
priv),
void *
priv)
1826 LOG_DEBUG(
"target event %i (%s) for core %s", event,
1845 LOG_DEBUG(
"target reset %i (%s)", reset_mode,
1884 static bool callback_processing;
1887 if (callback_processing)
1890 callback_processing =
true;
1906 if ((*callback)->removed) {
1913 bool call_it = (*callback)->callback &&
1915 now >= (*callback)->when);
1926 callback_processing =
false;
1963 assert(size <= area->
size);
1966 if (size < area->
size) {
1977 new_wa->
free =
true;
1979 area->
next = new_wa;
1994 while (c && c->
next) {
2031 LOG_DEBUG(
"MMU disabled, using physical "
2036 LOG_ERROR(
"No working memory available. "
2037 "Specify -work-area-phys to target.");
2047 LOG_ERROR(
"No working memory available. "
2048 "Specify -work-area-virt to target.");
2061 new_wa->
free =
true;
2124 LOG_WARNING(
"not enough working area available(requested %"PRIu32
")",
size);
2148 if (!area || area->
free)
2223 uint32_t max_size = 0;
2240 assert(smp_targets);
2241 if (smp_targets == &empty_smp_targets)
2343 int retcode,
int fileio_errno,
bool ctrl_c)
2349 uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
2351 int64_t then =
timeval_ms() + seconds * 1000LL;
2353 LOG_INFO(
"Starting profiling. Halting and resuming the"
2354 " target as often as we can...");
2356 uint32_t sample_count = 0;
2365 samples[sample_count++] = t;
2374 LOG_INFO(
"Target not halted or running");
2382 if (sample_count >= max_num_samples ||
timeval_ms() >= then) {
2383 LOG_INFO(
"Profiling completed. %" PRIu32
" samples.", sample_count);
2388 *num_samples = sample_count;
2393 const char **insn_set)
2398 command_print(
cmd,
"Instruction-set detection not implemented on target %s",
2400 command_print(
cmd,
"Change target or specify one of the instruction set:");
2553 LOG_ERROR(
"error allocating buffer for section (%" PRIu32
" bytes)",
size);
2568 uint8_t erased_value,
unsigned int *checked)
2579 erased_value, checked);
2584 uint8_t value_buf[8];
2604 uint8_t value_buf[4];
2624 uint8_t value_buf[2];
2662 uint8_t value_buf[8];
2679 uint8_t value_buf[4];
2696 uint8_t value_buf[2];
2727 uint8_t value_buf[8];
2744 uint8_t value_buf[4];
2761 uint8_t value_buf[2];
2798 "can't be the current target\n",
2804 if (
cmd->ctx->current_target_override)
2805 cmd->ctx->current_target_override =
target;
2822 unsigned int index = 0;
2824 command_print(
CMD,
"-- ------------------ ---------- ------ ------------------ ------------");
2832 state =
"tap-disabled";
2839 "%2d%c %-18s %-10s %-6s %-18s %s",
2864 static int prev_srst_asserted;
2865 static int prev_power_dropout;
2877 static int64_t last_power;
2878 bool wait_more = last_power + 2000 > current;
2881 last_power = current;
2888 int srst_deasserted;
2891 static int64_t last_srst;
2892 wait_more = last_srst + 2000 > current;
2893 if (srst_deasserted && !wait_more) {
2895 last_srst = current;
2904 if (srst_deasserted || power_restored) {
2931 Jim_Interp *interp = (Jim_Interp *)
priv;
2939 static int recursive;
2947 int did_something = 0;
2949 LOG_INFO(
"srst asserted detected, running srst_asserted proc.");
2950 Jim_Eval(interp,
"srst_asserted");
2954 Jim_Eval(interp,
"srst_deasserted");
2958 LOG_INFO(
"Power dropout detected, running power_dropout proc.");
2959 Jim_Eval(interp,
"power_dropout");
2963 Jim_Eval(interp,
"power_restore");
2967 if (did_something) {
3032 unsigned int count = 0;
3048 "(%i) %s (/%" PRIu32
"): 0x%s%s",
3061 cache = cache->
next;
3073 unsigned int count = 0;
3076 for (i = 0; i < cache->
num_regs; i++) {
3077 if (
count++ == num) {
3084 cache = cache->
next;
3089 "has only %i registers (0 - %i)", num,
count,
count - 1);
3198 retval = parse_uint(
CMD_ARGV[0], &ms);
3225 int retval = parse_uint(
CMD_ARGV[0], &ms);
3241 int64_t then = 0, cur;
3262 if ((cur-then) > ms) {
3263 LOG_ERROR(
"timed out while waiting for target %s",
3285 unsigned int wait_local;
3286 retval = parse_uint(
CMD_ARGV[0], &wait_local);
3314 const struct nvp *n;
3318 reset_mode = n->
value;
3328 bool current =
true;
3370 unsigned int count,
const uint8_t *
buffer,
bool include_address)
3372 const unsigned int line_bytecnt = 32;
3373 unsigned int line_modulo = line_bytecnt /
size;
3375 char output[line_bytecnt * 4 + 1];
3376 unsigned int output_len = 0;
3378 const char *value_fmt;
3381 value_fmt =
"%16.16"PRIx64
" ";
3384 value_fmt =
"%8.8"PRIx64
" ";
3387 value_fmt =
"%4.4"PRIx64
" ";
3390 value_fmt =
"%2.2"PRIx64
" ";
3398 for (
unsigned int i = 0; i <
count; i++) {
3399 if (include_address && i % line_modulo == 0) {
3400 output_len += snprintf(
output + output_len,
3401 sizeof(
output) - output_len,
3407 const uint8_t *value_ptr =
buffer + i *
size;
3421 output_len += snprintf(
output + output_len,
3422 sizeof(
output) - output_len,
3425 if ((i % line_modulo == line_modulo - 1) || (i ==
count - 1)) {
3437 unsigned int size = 0;
3455 bool physical = strcmp(
CMD_ARGV[0],
"phys") == 0;
3470 unsigned int count = 1;
3476 LOG_ERROR(
"Failed to allocate md read buffer");
3496 unsigned int data_size,
3504 const unsigned int chunk_size = 16384;
3505 uint8_t *target_buf = malloc(chunk_size * data_size);
3513 for (
unsigned int i = 0; i < chunk_size; i++) {
3514 switch (data_size) {
3528 LOG_ERROR(
"Unsupported data size %u", data_size);
3534 for (
unsigned int x = 0; x < c; x += chunk_size) {
3535 unsigned int current;
3537 if (current > chunk_size)
3538 current = chunk_size;
3539 retval = fn(
target,
address + x * data_size, data_size, current, target_buf);
3561 bool physical = strcmp(
CMD_ARGV[0],
"phys") == 0;
3578 unsigned int count = 1;
3583 unsigned int wordsize;
3607 if (CMD_ARGC < 1 || CMD_ARGC > 5)
3627 *max_address += *min_address;
3630 if (*min_address > *max_address)
3640 uint32_t image_size;
3646 &
image, &min_address, &max_address);
3664 "error allocating buffer for section (%d bytes)",
3677 uint32_t
length = buf_cnt;
3710 "in %fs (%0.3f KiB/s)", image_size,
3724 int retval, retvaltemp;
3735 uint32_t buf_size = (
size > 4096) ? 4096 :
size;
3736 buffer = malloc(buf_size);
3749 size_t size_written;
3750 uint32_t this_run_size = (
size > buf_size) ? buf_size :
size;
3759 size -= this_run_size;
3771 "dumped %zu bytes in %fs (%0.3f KiB/s)", filesize,
3792 uint32_t image_size;
3794 uint32_t checksum = 0;
3795 uint32_t mem_checksum = 0;
3835 "error allocating buffer for section (%" PRIu32
" bytes)",
3864 if (checksum != mem_checksum) {
3869 LOG_ERROR(
"checksum mismatch - attempting binary compare");
3871 data = malloc(buf_cnt);
3876 for (t = 0; t < buf_cnt; t++) {
3877 if (data[t] !=
buffer[t]) {
3879 "diff %d address " TARGET_ADDR_FMT ". Was 0x%02" PRIx8
" instead of 0x%02" PRIx8,
3884 if (diffs++ >= 127) {
3909 image_size += buf_cnt;
3918 "in %fs (%0.3f KiB/s)", image_size,
3957 command_print(
cmd,
"Context breakpoint: asid=0x%8.8" PRIx32
", len=0x%x, num=%u",
3989 }
else if (
addr == 0) {
4030 if (strcmp(
CMD_ARGV[2],
"hw") == 0) {
4036 }
else if (strcmp(
CMD_ARGV[2],
"hw_ctx") == 0) {
4069 command_print(
CMD,
"Error encountered during removal of all breakpoints.");
4096 ", r/w/a: %c, value: 0x%8.8" PRIx64
4097 ", mask: 0x%8.8" PRIx64,
4111 uint64_t data_value = 0x0;
4113 bool mask_specified =
false;
4118 mask_specified =
true;
4123 if (!mask_specified)
4152 data_value, data_mask);
4171 command_print(
CMD,
"Error encountered during removal of all watchpoints.");
4212 size_t written = fwrite(data, 1, len, f);
4214 LOG_ERROR(
"failed to write %zu bytes: %s", len, strerror(errno));
4235 uint32_t min = samples[0];
4236 uint32_t max = samples[sample_num - 1];
4246 if ((max - min) % 2)
4248 uint32_t address_space = max - min;
4259 for (
size_t i = strlen(
"seconds"); i < 15; i++)
4264 bool saturated_once =
false;
4265 for (uint32_t i = 0, bidx = 0; bidx < address_space; bidx +=
sizeof(
UNIT)) {
4267 uint32_t bmax = min + bidx +
sizeof(
UNIT);
4268 while (i < sample_num && samples[i] < bmax)
4272 if (val > UINT16_MAX) {
4274 if (!saturated_once)
4275 LOG_WARNING(
"profiler bucket saturated, will read as 65535");
4276 saturated_once =
true;
4286 static void write_gmon(
const uint32_t *samples, uint32_t sample_num,
const char *filename,
4289 float sample_rate = sample_num / (duration_ms / 1000.0);
4290 FILE *f = fopen(filename,
"wb");
4299 while (sample_num) {
4301 const uint32_t MAX_GAP = 32;
4304 uint32_t max = samples[0];
4305 uint32_t this_pass = 1;
4306 while (this_pass < sample_num && samples[this_pass] - max < MAX_GAP)
4307 max = samples[this_pass++];
4311 samples += this_pass;
4312 sample_num -= this_pass;
4321 uint32_t lhs = *(
const uint32_t *)p1;
4322 uint32_t rhs = *(
const uint32_t *)p2;
4323 return (lhs > rhs) - (lhs < rhs);
4335 const uint32_t MAX_PROFILE_SAMPLE_NUM = 1000000;
4337 uint32_t num_of_samples;
4343 uint32_t start_address = 0;
4344 uint32_t end_address = 0;
4345 bool with_range =
false;
4350 if (start_address > end_address || (end_address - start_address) < 2) {
4356 uint32_t *samples = malloc(
sizeof(uint32_t) * MAX_PROFILE_SAMPLE_NUM);
4358 LOG_ERROR(
"No memory to store samples.");
4369 &num_of_samples,
offset);
4374 uint64_t duration_ms =
timeval_ms() - timestart_ms;
4376 assert(num_of_samples <= MAX_PROFILE_SAMPLE_NUM);
4408 if (!num_of_samples) {
4415 uint32_t num_filtered_samples = 0;
4416 for (uint32_t in = 0; in < num_of_samples; ++in) {
4417 uint32_t sample = samples[in];
4418 if (sample >= start_address && sample < end_address)
4419 samples[num_filtered_samples++] = sample;
4421 duration_ms = (duration_ms * num_filtered_samples + num_of_samples / 2) / num_of_samples;
4422 if (duration_ms < 1)
4424 num_of_samples = num_filtered_samples;
4426 if (!num_of_samples) {
4433 qsort(samples, num_of_samples,
sizeof(samples[0]),
compare_pc32);
4451 if (CMD_ARGC < 3 || CMD_ARGC > 4)
4459 unsigned int width_bits;
4467 bool is_phys =
false;
4477 switch (width_bits) {
4488 if (
count > 65536) {
4493 const unsigned int width = width_bits / 8;
4504 const size_t buffersize = 4096;
4505 uint8_t *
buffer = malloc(buffersize);
4512 char *separator =
"";
4514 const unsigned int max_chunk_len = buffersize /
width;
4515 const size_t chunk_len =
MIN(
count, max_chunk_len);
4526 addr, width_bits, chunk_len);
4536 for (
size_t i = 0; i < chunk_len ; i++) {
4576 if (CMD_ARGC < 3 || CMD_ARGC > 4)
4584 unsigned int width_bits;
4591 bool is_phys =
false;
4602 switch (width_bits) {
4613 if (
count > 65536) {
4614 command_print(
CMD,
"too large memory write request, exceeds 64K elements");
4618 const unsigned int width = width_bits / 8;
4629 const size_t buffersize = 4096;
4630 uint8_t *
buffer = malloc(buffersize);
4640 const unsigned int max_chunk_len = buffersize /
width;
4641 const size_t chunk_len =
MIN(
count, max_chunk_len);
4643 for (
size_t i = 0; i < chunk_len; i++, j++) {
4645 jim_wide element_wide;
4646 int jimretval = Jim_GetWide(
CMD_CTX->interp, tmp, &element_wide);
4647 if (jimretval != JIM_OK) {
4653 const uint64_t v = element_wide;
4682 addr, width_bits, chunk_len);
4705 if (teap->
event == e) {
4713 LOG_DEBUG(
"target: %s (%s) event: %d (%s) action: %s",
4732 Jim_IncrRefCount(teap->
body);
4733 retval = Jim_EvalObj(teap->
interp, teap->
body);
4741 if (retval == JIM_RETURN)
4742 retval = teap->
interp->returnCode;
4744 if (retval != JIM_OK) {
4745 Jim_MakeErrorMessage(teap->
interp);
4748 Jim_GetString(Jim_GetResult(teap->
interp),
NULL));
4750 Jim_Eval(teap->
interp,
"error \"\" \"\"");
4758 if (CMD_ARGC < 1 || CMD_ARGC > 2)
4765 if (strcmp(
CMD_ARGV[0],
"-force")) {
4774 const int length = Jim_ListLength(
CMD_CTX->interp, next_argv);
4782 for (
int i = 0; i <
length; i++) {
4783 Jim_Obj *elem = Jim_ListGetIndex(
CMD_CTX->interp, next_argv, i);
4785 const char *reg_name = Jim_String(elem);
4824 #if JIM_VERSION >= 80
4837 const unsigned int length = tmp;
4847 for (
unsigned int i = 0; i <
length; i += 2) {
4848 const char *reg_name = Jim_String(dict[i]);
4849 const char *reg_value = Jim_String(dict[i + 1]);
4874 reg_value, reg_name);
4924 { .name =
"-tap", .value =
TCFG_TAP },
4926 { .name =
"-rtos", .value =
TCFG_RTOS },
4930 { .name =
NULL, .value = -1 }
4935 const struct nvp *n;
4950 const char *result = Jim_GetString(Jim_GetResult(
CMD_CTX->interp), &reslen);
5020 LOG_INFO(
"DEPRECATED target event %s; use TPIU events {pre,post}-{enable,disable}", n->
name);
5023 if (strlen(
CMD_ARGV[index]) == 0) {
5034 bool replace =
true;
5037 teap = calloc(1,
sizeof(*teap));
5057 Jim_IncrRefCount(teap->
body);
5300 command_print(
CMD,
"-gdb-max-connections must be configured before 'init'");
5326 bool is_configure = !strcmp(
CMD_NAME,
"configure");
5335 bool allow_defer =
false;
5341 if (strcmp(
CMD_ARGV[0],
"allow-defer"))
5354 LOG_INFO(
"Use arp_examine command to examine it manually!");
5501 "target: %s wait %s fails (%d) %s",
5520 "----------------------------------------");
5585 if (CMD_ARGC < 1 || CMD_ARGC > 3)
5594 unsigned int count = 1;
5598 const char *insn_set;
5613 .
name =
"configure",
5615 .handler = handle_target_configure,
5616 .help =
"configure a new target for use",
5617 .usage =
"[target_attribute ...]",
5622 .handler = handle_target_configure,
5623 .help =
"returns the specified target attribute",
5624 .usage =
"target_attribute",
5628 .handler = handle_mw_command,
5630 .help =
"Write 64-bit word(s) to target memory",
5631 .usage =
"address data [count]",
5635 .handler = handle_mw_command,
5637 .help =
"Write 32-bit word(s) to target memory",
5638 .usage =
"address data [count]",
5642 .handler = handle_mw_command,
5644 .help =
"Write 16-bit half-word(s) to target memory",
5645 .usage =
"address data [count]",
5649 .handler = handle_mw_command,
5651 .help =
"Write byte(s) to target memory",
5652 .usage =
"address data [count]",
5656 .handler = handle_md_command,
5658 .help =
"Display target memory as 64-bit words",
5659 .usage =
"address [count]",
5663 .handler = handle_md_command,
5665 .help =
"Display target memory as 32-bit words",
5666 .usage =
"address [count]",
5670 .handler = handle_md_command,
5672 .help =
"Display target memory as 16-bit half-words",
5673 .usage =
"address [count]",
5677 .handler = handle_md_command,
5679 .help =
"Display target memory as 8-bit bytes",
5680 .usage =
"address [count]",
5685 .handler = handle_target_get_reg,
5686 .help =
"Get register values from the target",
5687 .usage =
"[-force] list",
5692 .handler = handle_set_reg_command,
5693 .help =
"Set target register values",
5697 .name =
"read_memory",
5699 .handler = handle_target_read_memory,
5700 .help =
"Read Tcl list of 8/16/32/64 bit numbers from target memory",
5701 .usage =
"address width count ['phys']",
5704 .name =
"write_memory",
5706 .handler = handle_target_write_memory,
5707 .help =
"Write Tcl list of 8/16/32/64 bit numbers to target memory",
5708 .usage =
"address width data ['phys']",
5711 .name =
"eventlist",
5712 .handler = handle_target_event_list,
5714 .help =
"displays a table of events defined for this target",
5720 .handler = handle_target_current_state,
5721 .help =
"displays the current state of this target",
5725 .name =
"debug_reason",
5727 .handler = handle_target_debug_reason,
5728 .help =
"displays the debug reason of this target",
5732 .name =
"arp_examine",
5734 .handler = handle_target_examine,
5735 .help =
"used internally for reset processing",
5736 .usage =
"['allow-defer']",
5739 .name =
"was_examined",
5741 .handler = handle_target_was_examined,
5742 .help =
"used internally for reset processing",
5746 .name =
"examine_deferred",
5748 .handler = handle_target_examine_deferred,
5749 .help =
"used internally for reset processing",
5753 .name =
"arp_halt_gdb",
5755 .handler = handle_target_halt_gdb,
5756 .help =
"used internally for reset processing to halt GDB",
5762 .handler = handle_target_poll,
5763 .help =
"used internally for reset processing",
5767 .name =
"arp_reset",
5769 .handler = handle_target_reset,
5770 .help =
"used internally for reset processing",
5771 .usage =
"'assert'|'deassert' halt",
5776 .handler = handle_target_halt,
5777 .help =
"used internally for reset processing",
5781 .name =
"arp_waitstate",
5783 .handler = handle_target_wait_state,
5784 .help =
"used internally for reset processing",
5785 .usage =
"statename timeoutmsecs",
5788 .name =
"invoke-event",
5790 .handler = handle_target_invoke_event,
5791 .help =
"invoke handler for specified event",
5792 .usage =
"event_name",
5795 .name =
"disassemble",
5797 .handler = handle_target_disassemble,
5798 .help =
"disassemble instructions",
5799 .usage =
"list | address [count [instruction_set]]",
5827 LOG_INFO(
"The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD");
5928 bool is_configure =
true;
5998 .help =
"target command group",
6000 .chain = target_subcommands,
6063 create_target_list_node(
const char *targetname)
6101 static unsigned int smp_group = 1;
6120 for (
unsigned int i = 0; i <
CMD_ARGC; i++) {
6138 struct target *rtos_target;
6140 if (retval ==
ERROR_OK && rtos_target)
6153 .handler = handle_target_init_command,
6154 .help =
"initialize targets",
6160 .handler = handle_target_create,
6161 .usage =
"name type [options ...]",
6162 .help =
"Creates and selects a new target",
6167 .handler = handle_target_current,
6168 .help =
"Returns the currently selected target",
6174 .handler = handle_target_types,
6175 .help =
"Returns the available target types as "
6176 "a list of strings",
6182 .handler = handle_target_names,
6183 .help =
"Returns the names of all targets as a list of strings",
6189 .handler = handle_target_smp,
6190 .usage =
"targetname1 targetname2 ...",
6191 .help =
"gather several target in a smp list"
6221 uint32_t image_size;
6228 &
image, &min_address, &max_address);
6265 uint32_t
length = buf_cnt;
6284 command_print(
CMD,
"error allocating buffer for section (%" PRIu32
" bytes)",
6303 "in %fs (%0.3f KiB/s)", image_size,
6307 "WARNING: image has not been loaded to target!"
6308 "You can issue a 'fast_load' to finish loading.");
6343 command_print(
CMD,
"Loaded image %f kBytes/s", (
float)(
size/1024.0)/((
float)(after-ms)/1000.0));
6351 .handler = handle_targets_command,
6353 .help =
"change current default target (one parameter) "
6354 "or prints table of all targets (no parameters)",
6355 .usage =
"[target]",
6360 .help =
"configure target",
6365 .name =
"poll_interval",
6366 .handler = handle_poll_interval_command,
6368 .help =
"print or set the target state polling interval",
6369 .usage =
"[milliseconds]",
6418 for (
int i = 0; i <
size; i++)
6440 size_t num_bytes = test_size + 4;
6449 uint8_t *test_pattern = malloc(num_bytes);
6451 for (
size_t i = 0; i < num_bytes; i++)
6452 test_pattern[i] = rand();
6460 for (
int host_offset = 0; host_offset <= 1; host_offset++) {
6464 size_t host_bufsiz = (
count + 2) *
size + host_offset;
6465 uint8_t *read_ref = malloc(host_bufsiz);
6466 uint8_t *read_buf = malloc(host_bufsiz);
6468 for (
size_t i = 0; i < host_bufsiz; i++) {
6469 read_ref[i] = rand();
6470 read_buf[i] = read_ref[i];
6473 "Test read %" PRIu32
" x %d @ %d to %saligned buffer: ",
count,
6480 read_buf +
size + host_offset);
6496 int result = memcmp(read_ref, read_buf, host_bufsiz);
6519 num_bytes = test_size + 4 + 4 + 4;
6527 test_pattern = malloc(num_bytes);
6529 for (
size_t i = 0; i < num_bytes; i++)
6530 test_pattern[i] = rand();
6532 for (
int host_offset = 0; host_offset <= 1; host_offset++) {
6536 size_t host_bufsiz =
count *
size + host_offset;
6537 uint8_t *read_ref = malloc(num_bytes);
6538 uint8_t *read_buf = malloc(num_bytes);
6539 uint8_t *write_buf = malloc(host_bufsiz);
6541 for (
size_t i = 0; i < host_bufsiz; i++)
6542 write_buf[i] = rand();
6544 "Test write %" PRIu32
" x %d @ %d from %saligned buffer: ",
count,
6554 memcpy(read_ref, test_pattern, num_bytes);
6561 write_buf + host_offset);
6581 int result = memcmp(read_ref, read_buf, num_bytes);
6606 .
name =
"fast_load_image",
6607 .handler = handle_fast_load_image_command,
6609 .help =
"Load image into server memory for later use by "
6610 "fast_load; primarily for profiling",
6611 .usage =
"filename [address ['bin'|'ihex'|'elf'|'s19' "
6612 "[min_address [max_length]]]]",
6615 .name =
"fast_load",
6616 .handler = handle_fast_load_command,
6618 .help =
"loads active fast load image to current target "
6619 "- mainly for profiling purposes",
6624 .handler = handle_profile_command,
6626 .usage =
"seconds filename [start end]",
6627 .help =
"profiling samples the CPU PC",
6631 .name =
"virt2phys",
6632 .handler = handle_virt2phys_command,
6634 .help =
"translate a virtual address into a physical address",
6635 .usage =
"virtual_address",
6639 .handler = handle_reg_command,
6641 .help =
"display (reread from target with \"force\") or set a register; "
6642 "with no arguments, displays all registers and their values",
6643 .usage =
"[(register_number|register_name) [(value|'force')]]",
6647 .handler = handle_poll_command,
6649 .help =
"poll target state; or reconfigure background polling",
6650 .usage =
"['on'|'off']",
6653 .name =
"wait_halt",
6654 .handler = handle_wait_halt_command,
6656 .help =
"wait up to the specified number of milliseconds "
6657 "(default 5000) for a previously requested halt",
6658 .usage =
"[milliseconds]",
6662 .handler = handle_halt_command,
6664 .help =
"request target to halt, then wait up to the specified "
6665 "number of milliseconds (default 5000) for it to complete",
6666 .usage =
"[milliseconds]",
6670 .handler = handle_resume_command,
6672 .help =
"resume target execution from current PC or address",
6673 .usage =
"[address]",
6677 .handler = handle_reset_command,
6679 .usage =
"[run|halt|init]",
6680 .help =
"Reset all targets into the specified mode. "
6681 "Default reset mode is run, if not given.",
6684 .name =
"soft_reset_halt",
6685 .handler = handle_soft_reset_halt_command,
6688 .help =
"halt the target and do a soft reset",
6692 .handler = handle_step_command,
6694 .help =
"step one instruction from current PC or address",
6695 .usage =
"[address]",
6699 .handler = handle_md_command,
6701 .help =
"display memory double-words",
6702 .usage =
"['phys'] address [count]",
6706 .handler = handle_md_command,
6708 .help =
"display memory words",
6709 .usage =
"['phys'] address [count]",
6713 .handler = handle_md_command,
6715 .help =
"display memory half-words",
6716 .usage =
"['phys'] address [count]",
6720 .handler = handle_md_command,
6722 .help =
"display memory bytes",
6723 .usage =
"['phys'] address [count]",
6727 .handler = handle_mw_command,
6729 .help =
"write memory double-word",
6730 .usage =
"['phys'] address value [count]",
6734 .handler = handle_mw_command,
6736 .help =
"write memory word",
6737 .usage =
"['phys'] address value [count]",
6741 .handler = handle_mw_command,
6743 .help =
"write memory half-word",
6744 .usage =
"['phys'] address value [count]",
6748 .handler = handle_mw_command,
6750 .help =
"write memory byte",
6751 .usage =
"['phys'] address value [count]",
6755 .handler = handle_bp_command,
6757 .help =
"list or set hardware or software breakpoint",
6758 .usage =
"[<address> [<asid>] <length> ['hw'|'hw_ctx']]",
6762 .handler = handle_rbp_command,
6764 .help =
"remove breakpoint",
6765 .usage =
"'all' | address",
6769 .handler = handle_wp_command,
6771 .help =
"list (no params) or create watchpoints",
6772 .usage =
"[address length [('r'|'w'|'a') [value [mask]]]]",
6776 .handler = handle_rwp_command,
6778 .help =
"remove watchpoint",
6779 .usage =
"'all' | address",
6782 .name =
"load_image",
6783 .handler = handle_load_image_command,
6785 .usage =
"filename [address ['bin'|'ihex'|'elf'|'s19' "
6786 "[min_address [max_length]]]]",
6789 .name =
"dump_image",
6790 .handler = handle_dump_image_command,
6792 .usage =
"filename address size",
6795 .name =
"verify_image_checksum",
6796 .handler = handle_verify_image_checksum_command,
6798 .usage =
"filename [offset [type]]",
6801 .name =
"verify_image",
6802 .handler = handle_verify_image_command,
6804 .usage =
"filename [offset [type]]",
6807 .name =
"test_image",
6808 .handler = handle_test_image_command,
6810 .usage =
"filename [offset [type]]",
6815 .handler = handle_target_get_reg,
6816 .help =
"Get register values from the target",
6817 .usage =
"[-force] list",
6822 .handler = handle_set_reg_command,
6823 .help =
"Set target register values",
6827 .name =
"read_memory",
6829 .handler = handle_target_read_memory,
6830 .help =
"Read Tcl list of 8/16/32/64 bit numbers from target memory",
6831 .usage =
"address width count ['phys']",
6834 .name =
"write_memory",
6836 .handler = handle_target_write_memory,
6837 .help =
"Write Tcl list of 8/16/32/64 bit numbers to target memory",
6838 .usage =
"address width data ['phys']",
6841 .name =
"debug_reason",
6843 .handler = handle_target_debug_reason,
6844 .help =
"displays the debug reason of this target",
6848 .name =
"reset_nag",
6849 .handler = handle_target_reset_nag,
6851 .help =
"Nag after each reset about options that could have been "
6852 "enabled to improve performance.",
6853 .usage =
"['enable'|'disable']",
6857 .handler = handle_ps_command,
6859 .help =
"list all tasks",
6863 .name =
"test_mem_access",
6864 .handler = handle_test_mem_access_command,
6866 .help =
"Test the target's memory access functions",
6870 .name =
"disassemble",
6872 .handler = handle_target_disassemble,
6873 .help =
"disassemble instructions",
6874 .usage =
"list | address [count [instruction_set]]",
6900 return "BREAKPOINT";
6902 return "WATCHPOINT";
6904 return "WPTANDBKPT";
6906 return "SINGLESTEP";
struct target_type aarch64_target
struct target_type armv8r_target
struct target_type arcv2_target
struct target_type arm11_target
Holds methods for ARM11xx targets.
struct target_type arm720t_target
Holds methods for ARM720 targets.
struct target_type arm7tdmi_target
Holds methods for ARM7TDMI targets.
struct target_type arm920t_target
Holds methods for ARM920 targets.
struct target_type arm926ejs_target
Holds methods for ARM926 targets.
struct target_type arm946e_target
Holds methods for ARM946 targets.
struct target_type arm966e_target
Holds methods for ARM966 targets.
struct target_type arm9tdmi_target
Holds methods for ARM9TDMI targets.
struct target_type avr32_ap7k_target
struct target_type avr_target
char * buf_to_hex_str(const void *_buf, unsigned int buf_len)
static uint32_t buf_get_u32(const uint8_t *_buffer, unsigned int first, unsigned int num)
Retrieves num bits from _buffer, starting at the first bit, returning the bits in a 32-bit word.
int watchpoint_add(struct target *target, target_addr_t address, unsigned int length, enum watchpoint_rw rw, uint64_t value, uint64_t mask)
int breakpoint_remove(struct target *target, target_addr_t address)
int watchpoint_remove(struct target *target, target_addr_t address)
int breakpoint_add(struct target *target, target_addr_t address, unsigned int length, enum breakpoint_type type)
int context_breakpoint_add(struct target *target, uint32_t asid, unsigned int length, enum breakpoint_type type)
int watchpoint_remove_all(struct target *target)
int breakpoint_remove_all(struct target *target)
int hybrid_breakpoint_add(struct target *target, target_addr_t address, uint32_t asid, unsigned int length, enum breakpoint_type type)
#define WATCHPOINT_IGNORE_DATA_VALUE_MASK
struct command_context * current_command_context(Jim_Interp *interp)
int command_parse_bool_arg(const char *in, bool *out)
void command_print_sameline(struct command_invocation *cmd, const char *format,...)
void command_print(struct command_invocation *cmd, const char *format,...)
int command_run_line(struct command_context *context, char *line)
#define CMD
Use this macro to access the command being handled, rather than accessing the variable directly.
#define CALL_COMMAND_HANDLER(name, extra ...)
Use this to macro to call a command helper (or a nested handler).
#define CMD_NAME
Use this macro to access the name of the command being handled, rather than accessing the variable di...
#define CMD_ARGV
Use this macro to access the arguments for the command being handled, rather than accessing the varia...
#define COMMAND_PARSE_ADDRESS(in, out)
#define COMMAND_PARSE_ON_OFF(in, out)
parses an on/off command argument
#define ERROR_COMMAND_SYNTAX_ERROR
static int register_commands_override_target(struct command_context *cmd_ctx, const char *cmd_prefix, const struct command_registration *cmds, struct target *target)
Register one or more commands, as register_commands(), plus specify that command should override the ...
#define ERROR_COMMAND_CLOSE_CONNECTION
#define CMD_ARGC
Use this macro to access the number of arguments for the command being handled, rather than accessing...
#define CMD_JIMTCL_ARGV
Use this macro to access the jimtcl arguments for the command being handled, rather than accessing th...
#define COMMAND_PARSE_NUMBER(type, in, out)
parses the string in into out as a type, or prints a command error and passes the error code to the c...
#define CMD_CTX
Use this macro to access the context of the command being handled, rather than accessing the variable...
#define COMMAND_REGISTRATION_DONE
Use this as the last entry in an array of command_registration records.
#define ERROR_COMMAND_ARGUMENT_INVALID
static int register_commands(struct command_context *cmd_ctx, const char *cmd_prefix, const struct command_registration *cmds)
Register one or more commands in the specified context, as children of parent (or top-level commends,...
struct target_type cortexr4_target
struct target_type cortexa_target
struct target_type cortexm_target
struct target_type dsp563xx_target
Holds methods for DSP563XX targets.
struct target_type dsp5680xx_target
Holds methods for dsp5680xx targets.
uint64_t buffer
Pointer to data buffer to send over SPI.
uint32_t size
Size of dw_spi_transaction::buffer.
uint32_t buffer_size
Size of dw_spi_program::buffer.
uint32_t address
Starting address. Sector aligned.
struct target_type esirisc_target
struct target_type esp32_target
Holds methods for Xtensa targets.
struct target_type esp32s2_target
struct target_type esp32s3_target
Holds methods for Xtensa targets.
static struct esp_usb_jtag * priv
struct target_type fa526_target
Holds methods for FA526 targets.
struct target_type dragonite_target
struct target_type feroceon_target
#define ERROR_FLASH_OPERATION_FAILED
int fileio_write(struct fileio *fileio, size_t size, const void *buffer, size_t *size_written)
int fileio_close(struct fileio *fileio)
int fileio_size(struct fileio *fileio, size_t *size)
FIX!!!!
int fileio_open(struct fileio **fileio, const char *url, enum fileio_access access_type, enum fileio_type type)
struct target_type hla_target
void image_close(struct image *image)
int image_read_section(struct image *image, int section, target_addr_t offset, uint32_t size, uint8_t *buffer, size_t *size_read)
int image_calculate_checksum(const uint8_t *buffer, uint32_t nbytes, uint32_t *checksum)
int image_open(struct image *image, const char *url, const char *type_string)
int jim_getopt_setup(struct jim_getopt_info *p, Jim_Interp *interp, int argc, Jim_Obj *const *argv)
GetOpt - how to.
int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv)
void jtag_poll_unmask(bool saved)
Restore saved mask for polling.
struct jtag_tap * jtag_tap_by_string(const char *s)
void jtag_poll_set_enabled(bool value)
Assign flag reporting whether JTAG polling is disallowed.
int jtag_srst_asserted(int *srst_asserted)
bool is_jtag_poll_safe(void)
Return true if it's safe for a background polling task to access the JTAG scan chain.
int jtag_power_dropout(int *dropout)
int jtag_register_event_callback(jtag_event_handler_t callback, void *priv)
bool jtag_poll_get_enabled(void)
Return flag reporting whether JTAG polling is disallowed.
bool jtag_poll_mask(void)
Mask (disable) polling and return the current mask status that should be feed to jtag_poll_unmask() t...
The JTAG interface can be implemented with a software or hardware fifo.
static void list_add(struct list_head *new, struct list_head *head)
static void list_add_tail(struct list_head *new, struct list_head *head)
#define list_for_each_entry_safe(p, n, h, field)
#define list_for_each_entry(p, h, field)
static void list_del(struct list_head *entry)
static void INIT_LIST_HEAD(struct list_head *list)
void alive_sleep(uint64_t ms)
char * alloc_printf(const char *format,...)
#define LOG_TARGET_INFO(target, fmt_str,...)
#define LOG_TARGET_WARNING(target, fmt_str,...)
#define ERROR_NOT_IMPLEMENTED
#define LOG_WARNING(expr ...)
#define LOG_TARGET_ERROR(target, fmt_str,...)
#define LOG_TARGET_DEBUG(target, fmt_str,...)
#define LOG_TARGET_DEBUG_IO(target, fmt_str,...)
#define LOG_ERROR(expr ...)
#define LOG_INFO(expr ...)
#define LOG_DEBUG(expr ...)
struct target_type ls1_sap_target
struct target_type mem_ap_target
struct target_type mips_m4k_target
struct target_type mips_mips64_target
Upper level NOR flash interfaces.
void nvp_unknown_command_print(struct command_invocation *cmd, const struct nvp *nvp, const char *param_name, const char *param_value)
const struct nvp * nvp_name2value(const struct nvp *p, const char *name)
const struct nvp * nvp_value2name(const struct nvp *p, int value)
int oocd_cs_disassemble(struct command_invocation *cmd, struct target *target, uint64_t address, unsigned int count, const char *insn_set)
int oocd_cs_list_insn_types(struct command_invocation *cmd)
static uint32_t lh(unsigned int rd, unsigned int base, int16_t offset) __attribute__((unused))
struct target_type or1k_target
uint8_t bits[QN908X_FLASH_MAX_BLOCKS *QN908X_FLASH_PAGES_PER_BLOCK/8]
struct target_type quark_d20xx_target
struct target_type quark_x10xx_target
struct reg * register_get_by_name(struct reg_cache *first, const char *name, bool search_all)
struct target_type riscv_target
int rtos_create(struct command_invocation *cmd, struct target *target, const char *rtos_name)
void rtos_destroy(struct target *target)
int rtos_smp_init(struct target *target)
target_addr_t addr
Start address to search for the control block.
bool openocd_is_shutdown_pending(void)
#define CONNECTION_LIMIT_UNLIMITED
#define ERROR_SERVER_INTERRUPTED
#define foreach_smp_target(pos, head)
struct target_type stm8_target
enum breakpoint_type type
struct target * current_target_override
struct target * current_target
When run_command is called, a new instance will be created on the stack, filled with the proper value...
const struct command_registration * chain
If non-NULL, the commands in chain will be registered in the same context and scope of this registrat...
const char * usage
a string listing the options and arguments, required or optional
unsigned int num_sections
struct imagesection * sections
target_addr_t base_address
A TCL -ish GetOpt like code.
bool enabled
Is this TAP currently enabled?
Name Value Pairs, aka: NVP.
int(* get)(struct reg *reg)
int(* set)(struct reg *reg, uint8_t *buf)
const struct reg_arch_type * type
char *(* ps_command)(struct target *target)
const struct rtos_type * type
char * basedir
Base directory for semihosting I/O operations.
int(* callback)(struct target *target, enum target_event event, void *priv)
struct target_event_callback * next
int(* callback)(struct target *target, enum target_reset_mode reset_mode, void *priv)
int(* callback)(void *priv)
struct target_timer_callback * next
enum target_timer_type type
int(* callback)(struct target *target, size_t len, uint8_t *data, void *priv)
This holds methods shared between all instances of a given target type.
int(* add_context_breakpoint)(struct target *target, struct breakpoint *breakpoint)
int(* add_breakpoint)(struct target *target, struct breakpoint *breakpoint)
int(* write_memory)(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Target memory write callback.
int(* hit_watchpoint)(struct target *target, struct watchpoint **hit_watchpoint)
const char * name
Name of this type of target.
int(* deassert_reset)(struct target *target)
The implementation is responsible for polling the target such that target->state reflects the state c...
int(* get_gdb_reg_list)(struct target *target, struct reg **reg_list[], int *reg_list_size, enum target_register_class reg_class)
Target register access for GDB.
int(* insn_set)(struct command_invocation *cmd, struct target *target, const char **insn_set)
int(* resume)(struct target *target, bool current, target_addr_t address, bool handle_breakpoints, bool debug_execution)
int(* blank_check_memory)(struct target *target, struct target_memory_check_block *blocks, unsigned int num_blocks, uint8_t erased_value, unsigned int *checked)
void(* deinit_target)(struct target *target)
Free all the resources allocated by the target.
int(* halt)(struct target *target)
int(* check_reset)(struct target *target)
int(* gdb_fileio_end)(struct target *target, int retcode, int fileio_errno, bool ctrl_c)
int(* assert_reset)(struct target *target)
int(* run_algorithm)(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_param, target_addr_t entry_point, target_addr_t exit_point, unsigned int timeout_ms, void *arch_info)
Target algorithm support.
int(* wait_algorithm)(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_param, target_addr_t exit_point, unsigned int timeout_ms, void *arch_info)
const struct command_registration * commands
int(* profiling)(struct target *target, uint32_t *samples, uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
int(* soft_reset_halt)(struct target *target)
const char *(* get_gdb_arch)(const struct target *target)
Target architecture for GDB.
int(* arch_state)(struct target *target)
unsigned int(* address_bits)(struct target *target)
int(* read_memory)(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Target memory read callback.
int(* get_gdb_fileio_info)(struct target *target, struct gdb_fileio_info *fileio_info)
unsigned int(* data_bits)(struct target *target)
int(* target_jim_configure)(struct target *target, struct jim_getopt_info *goi)
int(* step)(struct target *target, bool current, target_addr_t address, bool handle_breakpoints)
int(* read_phys_memory)(struct target *target, target_addr_t phys_address, uint32_t size, uint32_t count, uint8_t *buffer)
int(* get_gdb_reg_list_noread)(struct target *target, struct reg **reg_list[], int *reg_list_size, enum target_register_class reg_class)
Same as get_gdb_reg_list, but doesn't read the register values.
int(* start_algorithm)(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_param, target_addr_t entry_point, target_addr_t exit_point, void *arch_info)
int(* read_buffer)(struct target *target, target_addr_t address, uint32_t size, uint8_t *buffer)
int(* add_watchpoint)(struct target *target, struct watchpoint *watchpoint)
int(* target_create)(struct target *target)
bool(* memory_ready)(struct target *target)
Returns true if target memory is read to read/write.
int(* write_buffer)(struct target *target, target_addr_t address, uint32_t size, const uint8_t *buffer)
int(* poll)(struct target *target)
int(* mmu)(struct target *target, bool *enabled)
int(* add_hybrid_breakpoint)(struct target *target, struct breakpoint *breakpoint)
int(* examine)(struct target *target)
This method is used to perform target setup that requires JTAG access.
int(* write_phys_memory)(struct target *target, target_addr_t phys_address, uint32_t size, uint32_t count, const uint8_t *buffer)
int(* remove_breakpoint)(struct target *target, struct breakpoint *breakpoint)
int(* virt2phys)(struct target *target, target_addr_t address, target_addr_t *physical)
int(* checksum_memory)(struct target *target, target_addr_t address, uint32_t count, uint32_t *checksum)
int(* remove_watchpoint)(struct target *target, struct watchpoint *watchpoint)
struct semihosting * semihosting
target_addr_t working_area
target_addr_t working_area_virt
uint32_t working_area_size
struct trace * trace_info
enum target_debug_reason debug_reason
bool active_polled
The flag is set after a successful examine call.
enum target_endianness endianness
struct reg_cache * reg_cache
struct list_head * smp_targets
struct breakpoint * breakpoints
struct working_area * working_areas
struct gdb_fileio_info * fileio_info
struct debug_msg_receiver * dbgmsg
struct list_head events_action
struct target_type * type
struct backoff_timer backoff
target_addr_t working_area_phys
struct watchpoint * watchpoints
bool working_area_phys_spec
bool running_alg
true if the target is currently running a downloaded "algorithm" instead of arbitrary user code.
bool working_area_virt_spec
bool examined
Indicates whether this target has been examined, remembers the last result of examine call.
bool defer_examine
Should we defer examine to later.
Wrapper for transport lifecycle operations.
int(* override_target)(const char **targetname)
Optional.
struct working_area * next
struct working_area ** user
COMMAND_HANDLER(handle_target_init_command)
static bool target_reset_nag
void target_buffer_get_u16_array(struct target *target, const uint8_t *buffer, uint32_t count, uint16_t *dstbuf)
void target_buffer_set_u24(struct target *target, uint8_t *buffer, uint32_t value)
int target_get_gdb_fileio_info(struct target *target, struct gdb_fileio_info *fileio_info)
Obtain file-I/O information from target for GDB to do syscall.
static int run_srst_deasserted
int target_add_watchpoint(struct target *target, struct watchpoint *watchpoint)
Add the watchpoint for target.
static int target_call_timer_callback(struct target_timer_callback *cb, int64_t *now)
static int no_mmu(struct target *target, bool *enabled)
struct target * all_targets
static int target_get_gdb_fileio_info_default(struct target *target, struct gdb_fileio_info *fileio_info)
int target_run_read_async_algorithm(struct target *target, uint8_t *buffer, uint32_t count, int block_size, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, uint32_t buffer_start, uint32_t buffer_size, uint32_t entry_point, uint32_t exit_point, void *arch_info)
This routine is a wrapper for asynchronous algorithms.
int target_write_phys_u32(struct target *target, target_addr_t address, uint32_t value)
static int compare_pc32(const void *p1, const void *p2)
static int sensed_power_dropout
uint64_t target_buffer_get_u64(struct target *target, const uint8_t *buffer)
int target_call_event_callbacks(struct target *target, enum target_event event)
struct target * get_target(const char *id)
void target_free_all_working_areas(struct target *target)
int target_unregister_reset_callback(int(*callback)(struct target *target, enum target_reset_mode reset_mode, void *priv), void *priv)
int target_write_phys_u64(struct target *target, target_addr_t address, uint64_t value)
static const struct nvp nvp_target_event[]
static OOCD_LIST_HEAD(target_reset_callback_list)
static int target_write_buffer_default(struct target *target, target_addr_t address, uint32_t count, const uint8_t *buffer)
int target_unregister_event_callback(int(*callback)(struct target *target, enum target_event event, void *priv), void *priv)
static void write_long(FILE *f, int l, struct target *target)
int target_read_phys_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
static void target_free_all_working_areas_restore(struct target *target, bool restore)
static void binprint(struct command_invocation *cmd, const char *text, const uint8_t *buf, int size)
int target_register_event_callback(int(*callback)(struct target *target, enum target_event event, void *priv), void *priv)
static const struct command_registration target_command_handlers[]
int target_write_phys_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
static int run_power_restore
int target_halt(struct target *target)
static struct target_timer_callback * target_timer_callbacks
int target_get_gdb_reg_list_noread(struct target *target, struct reg **reg_list[], int *reg_list_size, enum target_register_class reg_class)
Obtain the registers for GDB, but don't read register values from the target.
static int target_timer_callback_set_period(struct target_timer_callback *cb, unsigned int time_ms)
bool target_supports_gdb_connection(const struct target *target)
Check if target allows GDB connections.
int target_arch_state(struct target *target)
void target_buffer_set_u16(struct target *target, uint8_t *buffer, uint16_t value)
int target_call_timer_callbacks_now(void)
Invoke this to ensure that e.g.
int target_remove_breakpoint(struct target *target, struct breakpoint *breakpoint)
Remove the breakpoint for target.
static int target_profiling(struct target *target, uint32_t *samples, uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
void target_buffer_set_u32(struct target *target, uint8_t *buffer, uint32_t value)
int target_register_commands(struct command_context *cmd_ctx)
static const struct nvp nvp_target_debug_reason[]
static int target_read_buffer_default(struct target *target, target_addr_t address, uint32_t count, uint8_t *buffer)
int target_checksum_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t *crc)
static void target_merge_working_areas(struct target *target)
static const struct nvp nvp_target_state[]
static unsigned int polling_interval
static int handle_bp_command_list(struct command_invocation *cmd)
int target_write_buffer(struct target *target, target_addr_t address, uint32_t size, const uint8_t *buffer)
static int get_target_with_common_rtos_type(struct command_invocation *cmd, struct list_head *lh, struct target **result)
int target_add_hybrid_breakpoint(struct target *target, struct breakpoint *breakpoint)
Add the ContextID & IVA breakpoint for target.
static int default_examine(struct target *target)
int target_write_u8(struct target *target, target_addr_t address, uint8_t value)
int target_add_breakpoint(struct target *target, struct breakpoint *breakpoint)
Add the breakpoint for target.
target_addr_t target_address_max(struct target *target)
Return the highest accessible address for this target.
int target_write_u16(struct target *target, target_addr_t address, uint16_t value)
static void free_smp_target_list(struct list_head *smp_targets)
int target_unregister_timer_callback(int(*callback)(void *priv), void *priv)
int target_gdb_fileio_end(struct target *target, int retcode, int fileio_errno, bool ctrl_c)
Pass GDB file-I/O response to target after finishing host syscall.
int target_read_buffer(struct target *target, target_addr_t address, uint32_t size, uint8_t *buffer)
int target_unregister_trace_callback(int(*callback)(struct target *target, size_t len, uint8_t *data, void *priv), void *priv)
int target_read_u8(struct target *target, target_addr_t address, uint8_t *value)
static void write_string(FILE *f, char *s)
int target_run_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_param, target_addr_t entry_point, target_addr_t exit_point, unsigned int timeout_ms, void *arch_info)
Downloads a target-specific native code algorithm to the target, and executes it.
static void target_buffer_set_u8(struct target *target, uint8_t *buffer, uint8_t value)
unsigned int target_address_bits(struct target *target)
Return the number of address bits this target supports.
static struct target_list * __attribute__((warn_unused_result))
int target_profiling_default(struct target *target, uint32_t *samples, uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
static const struct command_registration target_subcommand_handlers[]
int target_write_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
Write count items of size bytes to the memory of target at the address given.
static struct target_timer_callback * target_find_timer_callback(int(*callback)(void *priv), void *priv)
static int jtag_enable_callback(enum jtag_event event, void *priv)
int target_get_gdb_reg_list(struct target *target, struct reg **reg_list[], int *reg_list_size, enum target_register_class reg_class)
Obtain the registers for GDB.
static int target_insn_set(struct command_invocation *cmd, struct target *target, const char **insn_set)
static const struct nvp nvp_error_target[]
int target_call_timer_callbacks(void)
int target_write_u64(struct target *target, target_addr_t address, uint64_t value)
static struct target_event_callback * target_event_callbacks
static COMMAND_HELPER(parse_load_image_command, struct image *image, target_addr_t *min_address, target_addr_t *max_address)
struct target * get_current_target_or_null(struct command_context *cmd_ctx)
static void target_split_working_area(struct working_area *area, uint32_t size)
const char * target_debug_reason_str(enum target_debug_reason reason)
static int target_init(struct command_context *cmd_ctx)
int target_hit_watchpoint(struct target *target, struct watchpoint **hit_watchpoint)
Find out the just hit watchpoint for target.
int target_call_reset_callbacks(struct target *target, enum target_reset_mode reset_mode)
uint32_t target_get_working_area_avail(struct target *target)
@ TCFG_GDB_MAX_CONNECTIONS
int target_alloc_working_area(struct target *target, uint32_t size, struct working_area **area)
static void write_gmon_hist(FILE *f, const uint32_t *samples, uint32_t sample_num, float sample_rate, struct target *target)
static const struct command_registration target_instance_command_handlers[]
bool get_target_reset_nag(void)
unsigned int target_data_bits(struct target *target)
Return the number of data bits this target supports.
static int find_target(struct command_invocation *cmd, const char *name)
int target_remove_watchpoint(struct target *target, struct watchpoint *watchpoint)
Remove the watchpoint for target.
const char * target_event_name(enum target_event event)
Return the name of a target event enumeration value.
int target_write_u32(struct target *target, target_addr_t address, uint32_t value)
int target_examine_one(struct target *target)
Examine the specified target, letting it perform any Initialisation that requires JTAG access.
bool target_memory_ready(struct target *target)
Returns true if target memory is ready to read/write.
const char * target_state_name(const struct target *t)
Return the name of this targets current state.
int(* target_write_fn)(struct target *target, target_addr_t address, uint32_t size, uint32_t count, const uint8_t *buffer)
static void print_wa_layout(struct target *target)
#define DEFAULT_HALT_TIMEOUT
static int handle_one_target(struct target *target)
int target_poll(struct target *target)
static int target_call_timer_callbacks_check_time(int checktime)
static int sense_handler(void)
static int target_timer_callback_periodic_restart(struct target_timer_callback *cb, int64_t *now)
int target_free_working_area(struct target *target, struct working_area *area)
Free a working area.
static const struct nvp nvp_target_endian[]
int target_alloc_working_area_try(struct target *target, uint32_t size, struct working_area **area)
static int sensed_srst_asserted
int target_register_timer_callback(int(*callback)(void *priv), unsigned int time_ms, enum target_timer_type type, void *priv)
The period is very approximate, the callback can happen much more often or much more rarely than spec...
static struct nvp nvp_config_opts[]
int target_read_u16(struct target *target, target_addr_t address, uint16_t *value)
int target_run_flash_async_algorithm(struct target *target, const uint8_t *buffer, uint32_t count, int block_size, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, uint32_t buffer_start, uint32_t buffer_size, uint32_t entry_point, uint32_t exit_point, void *arch_info)
Streams data to a circular buffer on target intended for consumption by code running asynchronously o...
void target_buffer_set_u64(struct target *target, uint8_t *buffer, uint64_t value)
void target_buffer_set_u64_array(struct target *target, uint8_t *buffer, uint32_t count, const uint64_t *srcbuf)
static void target_reset_examined(struct target *target)
Reset the examined flag for the given target.
int target_add_context_breakpoint(struct target *target, struct breakpoint *breakpoint)
Add the ContextID breakpoint for target.
static int target_init_one(struct command_context *cmd_ctx, struct target *target)
static int run_power_dropout
int target_resume(struct target *target, bool current, target_addr_t address, bool handle_breakpoints, bool debug_execution)
Make the target (re)start executing using its saved execution context (possibly with some modificatio...
int target_blank_check_memory(struct target *target, struct target_memory_check_block *blocks, unsigned int num_blocks, uint8_t erased_value, unsigned int *checked)
int target_read_u32(struct target *target, target_addr_t address, uint32_t *value)
uint16_t target_buffer_get_u16(struct target *target, const uint8_t *buffer)
int target_read_memory(struct target *target, target_addr_t address, uint32_t size, uint32_t count, uint8_t *buffer)
Read count items of size bytes from the memory of target at the address given.
bool target_has_event_action(const struct target *target, enum target_event event)
Returns true only if the target has a handler for the specified event.
static const struct command_registration target_exec_command_handlers[]
void target_buffer_get_u64_array(struct target *target, const uint8_t *buffer, uint32_t count, uint64_t *dstbuf)
static const struct nvp nvp_reset_modes[]
const char * debug_reason_name(const struct target *t)
static int default_check_reset(struct target *target)
void target_buffer_set_u16_array(struct target *target, uint8_t *buffer, uint32_t count, const uint16_t *srcbuf)
static struct fast_load * fastload
int target_register_reset_callback(int(*callback)(struct target *target, enum target_reset_mode reset_mode, void *priv), void *priv)
uint32_t target_buffer_get_u24(struct target *target, const uint8_t *buffer)
static int run_srst_asserted
void target_buffer_get_u32_array(struct target *target, const uint8_t *buffer, uint32_t count, uint32_t *dstbuf)
int64_t target_timer_next_event(void)
Returns when the next registered event will take place.
int target_write_phys_u16(struct target *target, target_addr_t address, uint16_t value)
static void free_fastload(void)
static void write_gmon(const uint32_t *samples, uint32_t sample_num, const char *filename, struct target *target, uint32_t duration_ms)
static int handle_target(void *priv)
const char * target_get_gdb_arch(const struct target *target)
Obtain the architecture for GDB.
static int target_restore_working_area(struct target *target, struct working_area *area)
static int target_gdb_fileio_end_default(struct target *target, int retcode, int fileio_errno, bool ctrl_c)
int target_wait_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, target_addr_t exit_point, unsigned int timeout_ms, void *arch_info)
Waits for an algorithm started with target_start_algorithm() to complete.
static int target_fill_mem(struct target *target, target_addr_t address, target_write_fn fn, unsigned int data_size, uint64_t b, unsigned int c)
static void target_destroy(struct target *target)
static void target_reset_active_polled(struct target *target)
int target_wait_state(struct target *target, enum target_state state, unsigned int ms)
int target_step(struct target *target, bool current, target_addr_t address, bool handle_breakpoints)
Step the target.
int target_register_trace_callback(int(*callback)(struct target *target, size_t len, uint8_t *data, void *priv), void *priv)
struct target * get_current_target(struct command_context *cmd_ctx)
void target_buffer_set_u32_array(struct target *target, uint8_t *buffer, uint32_t count, const uint32_t *srcbuf)
static int target_free_working_area_restore(struct target *target, struct working_area *area, bool restore)
static int handle_bp_command_set(struct command_invocation *cmd, target_addr_t addr, uint32_t asid, unsigned int length, int hw)
static int identity_virt2phys(struct target *target, target_addr_t virtual, target_addr_t *physical)
static int target_register_user_commands(struct command_context *cmd_ctx)
static void append_to_list_all_targets(struct target *target)
void target_handle_event(struct target *target, enum target_event e)
uint32_t target_buffer_get_u32(struct target *target, const uint8_t *buffer)
static int target_soft_reset_halt(struct target *target)
const char * target_type_name(const struct target *target)
Get the target type name.
int target_call_trace_callbacks(struct target *target, size_t len, uint8_t *data)
static int target_process_reset(struct command_invocation *cmd, enum target_reset_mode reset_mode)
static const char * target_strerror_safe(int err)
static int64_t target_timer_next_event_value
int target_start_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_params, target_addr_t entry_point, target_addr_t exit_point, void *arch_info)
Executes a target-specific native code algorithm and leaves it running.
static void write_data(FILE *f, const void *data, size_t len)
void target_quit(void)
Free all the resources allocated by targets and the target layer.
int target_write_phys_u8(struct target *target, target_addr_t address, uint8_t value)
static struct target_type * target_types[]
void target_handle_md_output(struct command_invocation *cmd, struct target *target, target_addr_t address, unsigned int size, unsigned int count, const uint8_t *buffer, bool include_address)
int target_read_u64(struct target *target, target_addr_t address, uint64_t *value)
const char * target_reset_mode_name(enum target_reset_mode reset_mode)
Return the name of a target reset reason enumeration value.
#define ERROR_TARGET_NOT_HALTED
#define ERROR_TARGET_INIT_FAILED
static bool target_was_examined(const struct target *target)
static bool target_active_polled(const struct target *target)
#define ERROR_TARGET_UNALIGNED_ACCESS
#define ERROR_TARGET_INVALID
@ TARGET_TIMER_TYPE_PERIODIC
@ TARGET_EVENT_DEBUG_RESUMED
@ TARGET_EVENT_EXAMINE_START
@ TARGET_EVENT_RESET_START
@ TARGET_EVENT_SEMIHOSTING_USER_CMD_0X106
@ TARGET_EVENT_GDB_FLASH_WRITE_END
@ TARGET_EVENT_RESET_ASSERT_POST
@ TARGET_EVENT_RESET_DEASSERT_POST
@ TARGET_EVENT_SEMIHOSTING_USER_CMD_0X102
@ TARGET_EVENT_SEMIHOSTING_USER_CMD_0X107
@ TARGET_EVENT_SEMIHOSTING_USER_CMD_0X105
@ TARGET_EVENT_EXAMINE_FAIL
@ TARGET_EVENT_EXAMINE_END
@ TARGET_EVENT_SEMIHOSTING_USER_CMD_0X104
@ TARGET_EVENT_RESET_INIT
@ TARGET_EVENT_RESET_DEASSERT_PRE
@ TARGET_EVENT_GDB_FLASH_ERASE_START
@ TARGET_EVENT_SEMIHOSTING_USER_CMD_0X103
@ TARGET_EVENT_DEBUG_HALTED
@ TARGET_EVENT_RESET_ASSERT_PRE
@ TARGET_EVENT_RESET_ASSERT
@ TARGET_EVENT_GDB_FLASH_WRITE_START
@ TARGET_EVENT_RESUME_START
@ TARGET_EVENT_STEP_START
@ TARGET_EVENT_GDB_ATTACH
@ TARGET_EVENT_SEMIHOSTING_USER_CMD_0X100
@ TARGET_EVENT_SEMIHOSTING_USER_CMD_0X101
@ TARGET_EVENT_RESUME_END
@ TARGET_EVENT_GDB_FLASH_ERASE_END
@ TARGET_EVENT_GDB_DETACH
@ TARGET_EVENT_TRACE_CONFIG
static const char * target_name(const struct target *target)
Returns the instance-specific name of the specified target.
#define ERROR_TARGET_NOT_EXAMINED
#define TARGET_DEFAULT_POLLING_INTERVAL
#define ERROR_TARGET_TIMEOUT
#define TARGET_MAX_POLLING_INTERVAL_MS
#define ERROR_TARGET_RESOURCE_NOT_AVAILABLE
static void target_set_examined(struct target *target)
Sets the examined and active_polled flags for the given target.
#define ERROR_TARGET_NOT_RUNNING
#define ERROR_TARGET_DATA_ABORT
#define ERROR_TARGET_FAILURE
#define ERROR_TARGET_TRANSLATION_FAULT
int target_request_register_commands(struct command_context *cmd_ctx)
struct target_type testee_target
struct target_type xtensa_chip_target
Methods for generic example of Xtensa-based chip-level targets.
struct target_type xscale_target
float duration_elapsed(const struct duration *duration)
int duration_measure(struct duration *duration)
Update the duration->elapsed field to finish the duration measurement.
int duration_start(struct duration *duration)
Update the duration->start field to start the duration measurement.
float duration_kbps(const struct duration *duration, size_t count)
int trace_register_commands(struct command_context *cmd_ctx)
struct transport * get_current_transport(void)
Returns the transport currently being used by this debug or programming session.
static void h_u32_to_be(uint8_t *buf, uint32_t val)
static uint64_t le_to_h_u64(const uint8_t *buf)
static uint32_t be_to_h_u24(const uint8_t *buf)
static void h_u16_to_be(uint8_t *buf, uint16_t val)
static uint64_t be_to_h_u64(const uint8_t *buf)
static uint16_t le_to_h_u16(const uint8_t *buf)
static uint32_t le_to_h_u24(const uint8_t *buf)
static void h_u32_to_le(uint8_t *buf, uint32_t val)
#define ARRAY_SIZE(x)
Compute the number of elements of a variable length array.
#define DIV_ROUND_UP(m, n)
Rounds m up to the nearest multiple of n using division.
static uint32_t be_to_h_u32(const uint8_t *buf)
static void h_u24_to_le(uint8_t *buf, unsigned int val)
static void h_u24_to_be(uint8_t *buf, unsigned int val)
static uint16_t be_to_h_u16(const uint8_t *buf)
static void h_u16_to_le(uint8_t *buf, uint16_t val)
static uint32_t le_to_h_u32(const uint8_t *buf)
static void h_u64_to_be(uint8_t *buf, uint64_t val)
static void h_u64_to_le(uint8_t *buf, uint64_t val)