X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=66e869992fbda45f8dea68eb0a121f2f95c58dfd;hb=8d6dcb9d39f0f948ef44beff991337b830fc4567;hp=d4662f71176b09b8368a23b970a48ff8496a40f8;hpb=b64503e37f1080b8d78cc9303363179ae8e38269;p=openocd.git diff --git a/src/target/target.c b/src/target/target.c index d4662f7117..66e869992f 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -43,35 +43,7 @@ #include "jtag.h" -static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); - -static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_test_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args, int argc); -static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); -static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); - -static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv); static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv); -static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv); -static int jim_target(Jim_Interp *interp, int argc, Jim_Obj *const *argv); static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv); static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv); @@ -496,13 +468,7 @@ static int default_virt2phys(struct target_s *target, uint32_t virtual, uint32_t static int default_mmu(struct target_s *target, int *enabled) { - LOG_ERROR("Not implemented."); - return ERROR_FAIL; -} - -static int default_has_mmu(struct target_s *target, bool *has_mmu) -{ - *has_mmu = true; + *enabled = 0; return ERROR_OK; } @@ -722,6 +688,30 @@ static int arm_cp_check(struct target_s *target, int cpnum, uint32_t op1, uint32 return ERROR_FAIL; } + if (op1 > 7) + { + LOG_ERROR("Illegal op1"); + return ERROR_FAIL; + } + + if (op2 > 7) + { + LOG_ERROR("Illegal op2"); + return ERROR_FAIL; + } + + if (CRn > 15) + { + LOG_ERROR("Illegal CRn"); + return ERROR_FAIL; + } + + if (CRm > 15) + { + LOG_ERROR("Illegal CRm"); + return ERROR_FAIL; + } + return ERROR_OK; } @@ -749,32 +739,14 @@ int target_mcr(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, u static int default_read_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) { - int retval; - bool mmu; - retval = target->type->has_mmu(target, &mmu); - if (retval != ERROR_OK) - return retval; - if (mmu) - { - LOG_ERROR("Not implemented"); - return ERROR_FAIL; - } - return target_read_memory(target, address, size, count, buffer); + LOG_ERROR("Not implemented"); + return ERROR_FAIL; } static int default_write_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) { - int retval; - bool mmu; - retval = target->type->has_mmu(target, &mmu); - if (retval != ERROR_OK) - return retval; - if (mmu) - { - LOG_ERROR("Not implemented"); - return ERROR_FAIL; - } - return target_write_memory(target, address, size, count, buffer); + LOG_ERROR("Not implemented"); + return ERROR_FAIL; } @@ -851,10 +823,6 @@ int target_init(struct command_context_s *cmd_ctx) { target->type->mmu = default_mmu; } - if (target->type->has_mmu == NULL) - { - target->type->has_mmu = default_has_mmu; - } target = target->next; } @@ -1091,32 +1059,33 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar { int retval; int enabled; + retval = target->type->mmu(target, &enabled); if (retval != ERROR_OK) { return retval; } - if (enabled) - { - if (target->working_area_phys_spec) - { - LOG_DEBUG("MMU disabled, using physical address for working memory 0x%08x", (unsigned)target->working_area_phys); + if (!enabled) { + if (target->working_area_phys_spec) { + LOG_DEBUG("MMU disabled, using physical " + "address for working memory 0x%08x", + (unsigned)target->working_area_phys); target->working_area = target->working_area_phys; - } else - { - LOG_ERROR("No working memory available. Specify -work-area-phys to target."); + } else { + LOG_ERROR("No working memory available. " + "Specify -work-area-phys to target."); return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; } - } else - { - if (target->working_area_virt_spec) - { - LOG_DEBUG("MMU enabled, using virtual address for working memory 0x%08x", (unsigned)target->working_area_virt); + } else { + if (target->working_area_virt_spec) { + LOG_DEBUG("MMU enabled, using virtual " + "address for working memory 0x%08x", + (unsigned)target->working_area_virt); target->working_area = target->working_area_virt; - } else - { - LOG_ERROR("No working memory available. Specify -work-area-virt to target."); + } else { + LOG_ERROR("No working memory available. " + "Specify -work-area-virt to target."); return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; } } @@ -1254,19 +1223,6 @@ void target_free_all_working_areas(struct target_s *target) target_free_all_working_areas_restore(target, 1); } -int target_register_commands(struct command_context_s *cmd_ctx) -{ - - register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, "change the current command line target (one parameter) or lists targets (with no parameter)"); - - - - - register_jim(cmd_ctx, "target", jim_target, "configure target"); - - return ERROR_OK; -} - int target_arch_state(struct target_s *target) { int retval; @@ -1661,68 +1617,6 @@ int target_write_u8(struct target_s *target, uint32_t address, uint8_t value) return retval; } -int target_register_user_commands(struct command_context_s *cmd_ctx) -{ - int retval = ERROR_OK; - - - /* script procedures */ - register_command(cmd_ctx, NULL, "profile", handle_profile_command, COMMAND_EXEC, "profiling samples the CPU PC"); - register_jim(cmd_ctx, "ocd_mem2array", jim_mem2array, "read memory and return as a TCL array for script processing
"); - register_jim(cmd_ctx, "ocd_array2mem", jim_array2mem, "convert a TCL array to memory locations and write the values
"); - - register_command(cmd_ctx, NULL, "fast_load_image", handle_fast_load_image_command, COMMAND_ANY, - "same args as load_image, image stored in memory - mainly for profiling purposes"); - - register_command(cmd_ctx, NULL, "fast_load", handle_fast_load_command, COMMAND_ANY, - "loads active fast load image to current target - mainly for profiling purposes"); - - - register_command(cmd_ctx, NULL, "virt2phys", handle_virt2phys_command, COMMAND_ANY, "translate a virtual address into a physical address"); - register_command(cmd_ctx, NULL, "reg", handle_reg_command, COMMAND_EXEC, "display or set a register"); - register_command(cmd_ctx, NULL, "poll", handle_poll_command, COMMAND_EXEC, "poll target state"); - register_command(cmd_ctx, NULL, "wait_halt", handle_wait_halt_command, COMMAND_EXEC, "wait for target halt [time (s)]"); - register_command(cmd_ctx, NULL, "halt", handle_halt_command, COMMAND_EXEC, "halt target"); - register_command(cmd_ctx, NULL, "resume", handle_resume_command, COMMAND_EXEC, "resume target [addr]"); - register_command(cmd_ctx, NULL, "step", handle_step_command, COMMAND_EXEC, "step one instruction from current PC or [addr]"); - register_command(cmd_ctx, NULL, "reset", handle_reset_command, COMMAND_EXEC, "reset target [run | halt | init] - default is run"); - register_command(cmd_ctx, NULL, "soft_reset_halt", handle_soft_reset_halt_command, COMMAND_EXEC, "halt the target and do a soft reset"); - - register_command(cmd_ctx, NULL, "mdw", handle_md_command, COMMAND_EXEC, "display memory words [phys] [count]"); - register_command(cmd_ctx, NULL, "mdh", handle_md_command, COMMAND_EXEC, "display memory half-words [phys] [count]"); - register_command(cmd_ctx, NULL, "mdb", handle_md_command, COMMAND_EXEC, "display memory bytes [phys] [count]"); - - register_command(cmd_ctx, NULL, "mww", handle_mw_command, COMMAND_EXEC, "write memory word [phys] [count]"); - register_command(cmd_ctx, NULL, "mwh", handle_mw_command, COMMAND_EXEC, "write memory half-word [phys] [count]"); - register_command(cmd_ctx, NULL, "mwb", handle_mw_command, COMMAND_EXEC, "write memory byte [phys] [count]"); - - register_command(cmd_ctx, NULL, "bp", - handle_bp_command, COMMAND_EXEC, - "list or set breakpoint [
[hw]]"); - register_command(cmd_ctx, NULL, "rbp", - handle_rbp_command, COMMAND_EXEC, - "remove breakpoint
"); - register_command(cmd_ctx, NULL, "wp", - handle_wp_command, COMMAND_EXEC, - "list or set watchpoint " - "[
[value] [mask]]"); - register_command(cmd_ctx, NULL, "rwp", - handle_rwp_command, COMMAND_EXEC, - "remove watchpoint
"); - - register_command(cmd_ctx, NULL, "load_image", handle_load_image_command, COMMAND_EXEC, "load_image
['bin'|'ihex'|'elf'|'s19'] [min_address] [max_length]"); - register_command(cmd_ctx, NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image
"); - register_command(cmd_ctx, NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image [offset] [type]"); - register_command(cmd_ctx, NULL, "test_image", handle_test_image_command, COMMAND_EXEC, "test_image [offset] [type]"); - - if ((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK) - return retval; - if ((retval = trace_register_commands(cmd_ctx)) != ERROR_OK) - return retval; - - return retval; -} - static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { target_t *target = all_targets; @@ -1990,9 +1884,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char if ((args[0][0] >= '0') && (args[0][0] <= '9')) { unsigned num; - int retval = parse_uint(args[0], &num); - if (ERROR_OK != retval) - return ERROR_COMMAND_SYNTAX_ERROR; + COMMAND_PARSE_NUMBER(uint, args[0], num); reg_cache_t *cache = target->reg_cache; count = 0; @@ -2246,9 +2138,7 @@ static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, c uint32_t addr = 0; if (argc == 1) { - int retval = parse_u32(args[0], &addr); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[0], addr); current = 0; } @@ -2269,9 +2159,7 @@ static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, cha int current_pc = 1; if (argc == 1) { - int retval = parse_u32(args[0], &addr); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[0], addr); current_pc = 0; } @@ -2358,23 +2246,18 @@ static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char { return ERROR_COMMAND_SYNTAX_ERROR; } + uint32_t address; - int retval = parse_u32(args[0], &address); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[0], address); unsigned count = 1; if (argc == 2) - { - retval = parse_uint(args[1], &count); - if (ERROR_OK != retval) - return retval; - } + COMMAND_PARSE_NUMBER(uint, args[1], count); uint8_t *buffer = calloc(count, size); target_t *target = get_current_target(cmd_ctx); - retval = fn(target, address, size, count, buffer); + int retval = fn(target, address, size, count, buffer); if (ERROR_OK == retval) handle_md_output(cmd_ctx, target, address, size, count, buffer); @@ -2405,22 +2288,14 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_COMMAND_SYNTAX_ERROR; uint32_t address; - int retval = parse_u32(args[0], &address); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[0], address); uint32_t value; - retval = parse_u32(args[1], &value); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[1], value); unsigned count = 1; if (argc == 3) - { - retval = parse_uint(args[2], &count); - if (ERROR_OK != retval) - return retval; - } + COMMAND_PARSE_NUMBER(uint, args[2], count); target_t *target = get_current_target(cmd_ctx); unsigned wordsize; @@ -2444,7 +2319,7 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char } for (unsigned i = 0; i < count; i++) { - retval = fn(target, + int retval = fn(target, address + i * wordsize, wordsize, 1, value_buf); if (ERROR_OK != retval) return retval; @@ -2455,8 +2330,9 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char } -static int parse_load_image_command_args(char **args, int argc, - image_t *image, uint32_t *min_address, uint32_t *max_address) +static int parse_load_image_command_args(struct command_context_s *cmd_ctx, + char **args, int argc, image_t *image, + uint32_t *min_address, uint32_t *max_address) { if (argc < 1 || argc > 5) return ERROR_COMMAND_SYNTAX_ERROR; @@ -2466,9 +2342,7 @@ static int parse_load_image_command_args(char **args, int argc, if (argc >= 2) { uint32_t addr; - int retval = parse_u32(args[1], &addr); - if (ERROR_OK != retval) - return ERROR_COMMAND_SYNTAX_ERROR; + COMMAND_PARSE_NUMBER(u32, args[1], addr); image->base_address = addr; image->base_address_set = 1; } @@ -2479,15 +2353,11 @@ static int parse_load_image_command_args(char **args, int argc, if (argc >= 4) { - int retval = parse_u32(args[3], min_address); - if (ERROR_OK != retval) - return ERROR_COMMAND_SYNTAX_ERROR; + COMMAND_PARSE_NUMBER(u32, args[3], *min_address); } if (argc == 5) { - int retval = parse_u32(args[4], max_address); - if (ERROR_OK != retval) - return ERROR_COMMAND_SYNTAX_ERROR; + COMMAND_PARSE_NUMBER(u32, args[4], *max_address); // use size (given) to find max (required) *max_address += *min_address; } @@ -2506,20 +2376,17 @@ static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cm uint32_t min_address = 0; uint32_t max_address = 0xffffffff; int i; - int retvaltemp; - image_t image; - duration_t duration; - char *duration_text; - - int retval = parse_load_image_command_args(args, argc, + int retval = parse_load_image_command_args(cmd_ctx, args, argc, &image, &min_address, &max_address); if (ERROR_OK != retval) return retval; target_t *target = get_current_target(cmd_ctx); - duration_start_measure(&duration); + + struct duration bench; + duration_start(&bench); if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK) { @@ -2579,19 +2446,12 @@ static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cm free(buffer); } - if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) - { - image_close(&image); - return retvaltemp; - } - - if (retval == ERROR_OK) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - command_print(cmd_ctx, "downloaded %u byte in %s", - (unsigned int)image_size, - duration_text); + command_print(cmd_ctx, "downloaded %" PRIu32 " bytes " + "in %fs (%0.3f kb/s)", image_size, + duration_elapsed(&bench), duration_kbps(&bench, image_size)); } - free(duration_text); image_close(&image); @@ -2606,8 +2466,6 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm uint8_t buffer[560]; int retvaltemp; - duration_t duration; - char *duration_text; target_t *target = get_current_target(cmd_ctx); @@ -2618,27 +2476,23 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm } uint32_t address; - int retval = parse_u32(args[1], &address); - if (ERROR_OK != retval) - return retval; - + COMMAND_PARSE_NUMBER(u32, args[1], address); uint32_t size; - retval = parse_u32(args[2], &size); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[2], size); if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK) { return ERROR_OK; } - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); + int retval = ERROR_OK; while (size > 0) { uint32_t size_written; uint32_t this_run_size = (size > 560) ? 560 : size; - retval = target_read_buffer(target, address, this_run_size, buffer); if (retval != ERROR_OK) { @@ -2658,14 +2512,11 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm if ((retvaltemp = fileio_close(&fileio)) != ERROR_OK) return retvaltemp; - if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) - return retvaltemp; - - if (retval == ERROR_OK) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - command_print(cmd_ctx, "dumped %lld byte in %s", - fileio.size, duration_text); - free(duration_text); + command_print(cmd_ctx, + "dumped %lld bytes in %fs (%0.3f kb/s)", fileio.size, + duration_elapsed(&bench), duration_kbps(&bench, fileio.size)); } return retval; @@ -2677,15 +2528,12 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct uint32_t buf_cnt; uint32_t image_size; int i; - int retval, retvaltemp; + int retval; uint32_t checksum = 0; uint32_t mem_checksum = 0; image_t image; - duration_t duration; - char *duration_text; - target_t *target = get_current_target(cmd_ctx); if (argc < 1) @@ -2699,14 +2547,13 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct return ERROR_FAIL; } - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); if (argc >= 2) { uint32_t addr; - retval = parse_u32(args[1], &addr); - if (ERROR_OK != retval) - return ERROR_COMMAND_SYNTAX_ERROR; + COMMAND_PARSE_NUMBER(u32, args[1], addr); image.base_address = addr; image.base_address_set = 1; } @@ -2808,20 +2655,12 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct image_size += buf_cnt; } done: - - if ((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) - { - image_close(&image); - return retvaltemp; - } - - if (retval == ERROR_OK) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - command_print(cmd_ctx, "verified %u bytes in %s", - (unsigned int)image_size, - duration_text); + command_print(cmd_ctx, "verified %" PRIu32 " bytes " + "in %fs (%0.3f kb/s)", image_size, + duration_elapsed(&bench), duration_kbps(&bench, image_size)); } - free(duration_text); image_close(&image); @@ -2891,14 +2730,9 @@ static int handle_bp_command(struct command_context_s *cmd_ctx, } uint32_t addr; - int retval = parse_u32(args[0], &addr); - if (ERROR_OK != retval) - return retval; - + COMMAND_PARSE_NUMBER(u32, args[0], addr); uint32_t length; - retval = parse_u32(args[1], &length); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[1], length); int hw = BKPT_SOFT; if (argc == 3) @@ -2918,9 +2752,7 @@ static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_COMMAND_SYNTAX_ERROR; uint32_t addr; - int retval = parse_u32(args[0], &addr); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[0], addr); target_t *target = get_current_target(cmd_ctx); breakpoint_remove(target, addr); @@ -2955,19 +2787,14 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char uint32_t length = 0; uint32_t data_value = 0x0; uint32_t data_mask = 0xffffffff; - int retval; switch (argc) { case 5: - retval = parse_u32(args[4], &data_mask); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[4], data_mask); // fall through case 4: - retval = parse_u32(args[3], &data_value); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[3], data_value); // fall through case 3: switch (args[2][0]) @@ -2987,12 +2814,8 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char } // fall through case 2: - retval = parse_u32(args[1], &length); - if (ERROR_OK != retval) - return retval; - retval = parse_u32(args[0], &addr); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[1], length); + COMMAND_PARSE_NUMBER(u32, args[0], addr); break; default: @@ -3001,7 +2824,7 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_COMMAND_SYNTAX_ERROR; } - retval = watchpoint_add(target, addr, length, type, + int retval = watchpoint_add(target, addr, length, type, data_value, data_mask); if (ERROR_OK != retval) LOG_ERROR("Failure setting watchpoints"); @@ -3015,9 +2838,7 @@ static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_COMMAND_SYNTAX_ERROR; uint32_t addr; - int retval = parse_u32(args[0], &addr); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[0], addr); target_t *target = get_current_target(cmd_ctx); watchpoint_remove(target, addr); @@ -3039,13 +2860,11 @@ static int handle_virt2phys_command(command_context_t *cmd_ctx, return ERROR_COMMAND_SYNTAX_ERROR; uint32_t va; - int retval = parse_u32(args[0], &va); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(u32, args[0], va); uint32_t pa; target_t *target = get_current_target(cmd_ctx); - retval = target->type->virt2phys(target, va, &pa); + int retval = target->type->virt2phys(target, va, &pa); if (retval == ERROR_OK) command_print(cmd_ctx, "Physical address 0x%08" PRIx32 "", pa); @@ -3180,9 +2999,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, return ERROR_COMMAND_SYNTAX_ERROR; } unsigned offset; - int retval = parse_uint(args[0], &offset); - if (ERROR_OK != retval) - return retval; + COMMAND_PARSE_NUMBER(uint, args[0], offset); timeval_add_time(&timeout, offset, 0); @@ -3199,6 +3016,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, for (;;) { + int retval; target_poll(target); if (target->state == TARGET_HALTED) { @@ -4699,15 +4517,13 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha image_t image; - duration_t duration; - char *duration_text; - - int retval = parse_load_image_command_args(args, argc, + int retval = parse_load_image_command_args(cmd_ctx, args, argc, &image, &min_address, &max_address); if (ERROR_OK != retval) return retval; - duration_start_measure(&duration); + struct duration bench; + duration_start(&bench); if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK) { @@ -4780,13 +4596,16 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha free(buffer); } - duration_stop_measure(&duration, &duration_text); - if (retval == ERROR_OK) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - command_print(cmd_ctx, "Loaded %u bytes in %s", (unsigned int)image_size, duration_text); - command_print(cmd_ctx, "NB!!! image has not been loaded to target, issue a subsequent 'fast_load' to do so."); + command_print(cmd_ctx, "Loaded %" PRIu32 " bytes " + "in %fs (%0.3f kb/s)", image_size, + duration_elapsed(&bench), duration_kbps(&bench, image_size)); + + command_print(cmd_ctx, + "WARNING: image has not been loaded to target!" + "You can issue a 'fast_load' to finish loading."); } - free(duration_text); image_close(&image); @@ -4875,19 +4694,19 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv) if (e != JIM_OK) { return e; } - op2 = l; + CRn = l; e = Jim_GetLong(interp, argv[4], &l); if (e != JIM_OK) { return e; } - CRn = l; + CRm = l; e = Jim_GetLong(interp, argv[5], &l); if (e != JIM_OK) { return e; } - CRm = l; + op2 = l; value = 0; @@ -4913,3 +4732,130 @@ static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv) return JIM_OK; } + +int target_register_commands(struct command_context_s *cmd_ctx) +{ + + register_command(cmd_ctx, NULL, "targets", + handle_targets_command, COMMAND_EXEC, + "change current command line target (one parameter) " + "or list targets (no parameters)"); + + register_jim(cmd_ctx, "target", jim_target, "configure target"); + + return ERROR_OK; +} + +int target_register_user_commands(struct command_context_s *cmd_ctx) +{ + int retval = ERROR_OK; + if ((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK) + return retval; + + if ((retval = trace_register_commands(cmd_ctx)) != ERROR_OK) + return retval; + + register_command(cmd_ctx, NULL, "profile", + handle_profile_command, COMMAND_EXEC, + "profiling samples the CPU PC"); + + register_jim(cmd_ctx, "ocd_mem2array", jim_mem2array, + "read memory and return as a TCL array for script processing " + "
"); + + register_jim(cmd_ctx, "ocd_array2mem", jim_array2mem, + "convert a TCL array to memory locations and write the values " + "
"); + + register_command(cmd_ctx, NULL, "fast_load_image", + handle_fast_load_image_command, COMMAND_ANY, + "same args as load_image, image stored in memory " + "- mainly for profiling purposes"); + + register_command(cmd_ctx, NULL, "fast_load", + handle_fast_load_command, COMMAND_ANY, + "loads active fast load image to current target " + "- mainly for profiling purposes"); + + + register_command(cmd_ctx, NULL, "virt2phys", + handle_virt2phys_command, COMMAND_ANY, + "translate a virtual address into a physical address"); + register_command(cmd_ctx, NULL, "reg", + handle_reg_command, COMMAND_EXEC, + "display or set a register"); + + register_command(cmd_ctx, NULL, "poll", + handle_poll_command, COMMAND_EXEC, + "poll target state"); + register_command(cmd_ctx, NULL, "wait_halt", + handle_wait_halt_command, COMMAND_EXEC, + "wait for target halt [time (s)]"); + register_command(cmd_ctx, NULL, "halt", + handle_halt_command, COMMAND_EXEC, + "halt target"); + register_command(cmd_ctx, NULL, "resume", + handle_resume_command, COMMAND_EXEC, + "resume target [addr]"); + register_command(cmd_ctx, NULL, "reset", + handle_reset_command, COMMAND_EXEC, + "reset target [run | halt | init] - default is run"); + register_command(cmd_ctx, NULL, "soft_reset_halt", + handle_soft_reset_halt_command, COMMAND_EXEC, + "halt the target and do a soft reset"); + + register_command(cmd_ctx, NULL, "step", + handle_step_command, COMMAND_EXEC, + "step one instruction from current PC or [addr]"); + + register_command(cmd_ctx, NULL, "mdw", + handle_md_command, COMMAND_EXEC, + "display memory words [phys] [count]"); + register_command(cmd_ctx, NULL, "mdh", + handle_md_command, COMMAND_EXEC, + "display memory half-words [phys] [count]"); + register_command(cmd_ctx, NULL, "mdb", + handle_md_command, COMMAND_EXEC, + "display memory bytes [phys] [count]"); + + register_command(cmd_ctx, NULL, "mww", + handle_mw_command, COMMAND_EXEC, + "write memory word [phys] [count]"); + register_command(cmd_ctx, NULL, "mwh", + handle_mw_command, COMMAND_EXEC, + "write memory half-word [phys] [count]"); + register_command(cmd_ctx, NULL, "mwb", + handle_mw_command, COMMAND_EXEC, + "write memory byte [phys] [count]"); + + register_command(cmd_ctx, NULL, "bp", + handle_bp_command, COMMAND_EXEC, + "list or set breakpoint [
[hw]]"); + register_command(cmd_ctx, NULL, "rbp", + handle_rbp_command, COMMAND_EXEC, + "remove breakpoint
"); + + register_command(cmd_ctx, NULL, "wp", + handle_wp_command, COMMAND_EXEC, + "list or set watchpoint " + "[
[value] [mask]]"); + register_command(cmd_ctx, NULL, "rwp", + handle_rwp_command, COMMAND_EXEC, + "remove watchpoint
"); + + register_command(cmd_ctx, NULL, "load_image", + handle_load_image_command, COMMAND_EXEC, + "load_image
" + "['bin'|'ihex'|'elf'|'s19'] [min_address] [max_length]"); + register_command(cmd_ctx, NULL, "dump_image", + handle_dump_image_command, COMMAND_EXEC, + "dump_image
"); + register_command(cmd_ctx, NULL, "verify_image", + handle_verify_image_command, COMMAND_EXEC, + "verify_image [offset] [type]"); + register_command(cmd_ctx, NULL, "test_image", + handle_test_image_command, COMMAND_EXEC, + "test_image [offset] [type]"); + + return ERROR_OK; +}