X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=e46dec9c8fda5b681b7b023f236ebfd21d0c371c;hp=5cf70118d043f06f3870ccdf4a487d06c46700b9;hb=abd7b404086d3c63b163a5ffa786f3538714b7d9;hpb=972924b2ad4bb7da34e331d4854b5f3d3e9e7260 diff --git a/src/target/target.c b/src/target/target.c index 5cf70118d0..e46dec9c8f 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); @@ -114,8 +86,8 @@ target_type_t *target_types[] = }; target_t *all_targets = NULL; -target_event_callback_t *target_event_callbacks = NULL; -target_timer_callback_t *target_timer_callbacks = NULL; +struct target_event_callback *target_event_callbacks = NULL; +struct target_timer_callback *target_timer_callbacks = NULL; const Jim_Nvp nvp_assert[] = { { .name = "assert", NVP_ASSERT }, @@ -488,13 +460,14 @@ int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mo return retval; } -static int default_virt2phys(struct target_s *target, uint32_t virtual, uint32_t *physical) +static int identity_virt2phys(struct target_s *target, + uint32_t virtual, uint32_t *physical) { *physical = virtual; return ERROR_OK; } -static int default_mmu(struct target_s *target, int *enabled) +static int no_mmu(struct target_s *target, int *enabled) { *enabled = 0; return ERROR_OK; @@ -586,7 +559,7 @@ static int target_soft_reset_halt_imp(struct target_s *target) return target->type->soft_reset_halt_imp(target); } -static int target_run_algorithm_imp(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, uint32_t entry_point, uint32_t exit_point, int timeout_ms, void *arch_info) +static int target_run_algorithm_imp(struct target_s *target, int num_mem_params, struct mem_param *mem_params, int num_reg_params, struct reg_param *reg_param, uint32_t entry_point, uint32_t exit_point, int timeout_ms, void *arch_info) { if (!target_was_examined(target)) { @@ -638,12 +611,12 @@ int target_remove_breakpoint(struct target_s *target, } int target_add_watchpoint(struct target_s *target, - struct watchpoint_s *watchpoint) + struct watchpoint *watchpoint) { return target->type->add_watchpoint(target, watchpoint); } int target_remove_watchpoint(struct target_s *target, - struct watchpoint_s *watchpoint) + struct watchpoint *watchpoint) { return target->type->remove_watchpoint(target, watchpoint); } @@ -661,8 +634,8 @@ int target_step(struct target_s *target, int target_run_algorithm(struct target_s *target, - int num_mem_params, mem_param_t *mem_params, - int num_reg_params, reg_param_t *reg_param, + int num_mem_params, struct mem_param *mem_params, + int num_reg_params, struct reg_param *reg_param, uint32_t entry_point, uint32_t exit_point, int timeout_ms, void *arch_info) { @@ -691,13 +664,13 @@ void target_reset_examined(struct target_s *target) static int default_mrc(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value) { - LOG_ERROR("Not implemented"); + LOG_ERROR("Not implemented: %s", __func__); return ERROR_FAIL; } static int default_mcr(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value) { - LOG_ERROR("Not implemented"); + LOG_ERROR("Not implemented: %s", __func__); return ERROR_FAIL; } @@ -716,6 +689,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; } @@ -741,26 +738,30 @@ int target_mcr(struct target_s *target, int cpnum, uint32_t op1, uint32_t op2, u return target->type->mcr(target, cpnum, op1, op2, CRn, CRm, value); } -static int default_read_phys_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) +static int +err_read_phys_memory(struct target_s *target, uint32_t address, + uint32_t size, uint32_t count, uint8_t *buffer) { - LOG_ERROR("Not implemented"); + LOG_ERROR("Not implemented: %s", __func__); 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) +static int +err_write_phys_memory(struct target_s *target, uint32_t address, + uint32_t size, uint32_t count, uint8_t *buffer) { - LOG_ERROR("Not implemented"); + LOG_ERROR("Not implemented: %s", __func__); return ERROR_FAIL; } - int target_init(struct command_context_s *cmd_ctx) { - target_t *target = all_targets; + struct target_s *target; int retval; - while (target) - { + for (target = all_targets; target; target = target->next) { + struct target_type_s *type = target->type; + target_reset_examined(target); if (target->type->examine == NULL) { @@ -773,33 +774,38 @@ int target_init(struct command_context_s *cmd_ctx) return retval; } - /* Set up default functions if none are provided by target */ - if (target->type->virt2phys == NULL) - { - target->type->virt2phys = default_virt2phys; - } - - if (target->type->read_phys_memory == NULL) - { - target->type->read_phys_memory = default_read_phys_memory; - } - - if (target->type->write_phys_memory == NULL) - { - target->type->write_phys_memory = default_write_phys_memory; - } - + /** + * @todo MCR/MRC are ARM-specific; don't require them in + * all targets, or for ARMs without coprocessors. + */ if (target->type->mcr == NULL) { target->type->mcr = default_mcr; + } else + { + /* FIX! multiple targets will generally register global commands + * multiple times. Only register this one if *one* of the + * targets need the command. Hmm... make it a command on the + * Jim Tcl target object? + */ + register_jim(cmd_ctx, "mcr", jim_mcrmrc, "write coprocessor "); } if (target->type->mrc == NULL) { target->type->mrc = default_mrc; + } else + { + register_jim(cmd_ctx, "mrc", jim_mcrmrc, "read coprocessor "); } + /** + * @todo get rid of those *memory_imp() methods, now that all + * callers are using target_*_memory() accessors ... and make + * sure the "physical" paths handle the same issues. + */ + /* a non-invasive way(in terms of patches) to add some code that * runs before the type->write/read_memory implementation */ @@ -812,11 +818,45 @@ int target_init(struct command_context_s *cmd_ctx) target->type->run_algorithm_imp = target->type->run_algorithm; target->type->run_algorithm = target_run_algorithm_imp; - if (target->type->mmu == NULL) - { - target->type->mmu = default_mmu; + /* Sanity-check MMU support ... stub in what we must, to help + * implement it in stages, but warn if we need to do so. + */ + if (type->mmu) { + if (type->write_phys_memory == NULL) { + LOG_ERROR("type '%s' is missing %s", + type->name, + "write_phys_memory"); + type->write_phys_memory = err_write_phys_memory; + } + if (type->read_phys_memory == NULL) { + LOG_ERROR("type '%s' is missing %s", + type->name, + "read_phys_memory"); + type->read_phys_memory = err_read_phys_memory; + } + if (type->virt2phys == NULL) { + LOG_ERROR("type '%s' is missing %s", + type->name, + "virt2phys"); + type->virt2phys = identity_virt2phys; + } + + /* Make sure no-MMU targets all behave the same: make no + * distinction between physical and virtual addresses, and + * ensure that virt2phys() is always an identity mapping. + */ + } else { + if (type->write_phys_memory + || type->read_phys_memory + || type->virt2phys) + LOG_WARNING("type '%s' has broken MMU hooks", + type->name); + + type->mmu = no_mmu; + type->write_phys_memory = type->write_memory; + type->read_phys_memory = type->read_memory; + type->virt2phys = identity_virt2phys; } - target = target->next; } if (all_targets) @@ -832,7 +872,7 @@ int target_init(struct command_context_s *cmd_ctx) int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv) { - target_event_callback_t **callbacks_p = &target_event_callbacks; + struct target_event_callback **callbacks_p = &target_event_callbacks; if (callback == NULL) { @@ -846,7 +886,7 @@ int target_register_event_callback(int (*callback)(struct target_s *target, enum callbacks_p = &((*callbacks_p)->next); } - (*callbacks_p) = malloc(sizeof(target_event_callback_t)); + (*callbacks_p) = malloc(sizeof(struct target_event_callback)); (*callbacks_p)->callback = callback; (*callbacks_p)->priv = priv; (*callbacks_p)->next = NULL; @@ -856,7 +896,7 @@ int target_register_event_callback(int (*callback)(struct target_s *target, enum int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv) { - target_timer_callback_t **callbacks_p = &target_timer_callbacks; + struct target_timer_callback **callbacks_p = &target_timer_callbacks; struct timeval now; if (callback == NULL) @@ -871,7 +911,7 @@ int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int callbacks_p = &((*callbacks_p)->next); } - (*callbacks_p) = malloc(sizeof(target_timer_callback_t)); + (*callbacks_p) = malloc(sizeof(struct target_timer_callback)); (*callbacks_p)->callback = callback; (*callbacks_p)->periodic = periodic; (*callbacks_p)->time_ms = time_ms; @@ -894,8 +934,8 @@ int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int int target_unregister_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv) { - target_event_callback_t **p = &target_event_callbacks; - target_event_callback_t *c = target_event_callbacks; + struct target_event_callback **p = &target_event_callbacks; + struct target_event_callback *c = target_event_callbacks; if (callback == NULL) { @@ -904,7 +944,7 @@ int target_unregister_event_callback(int (*callback)(struct target_s *target, en while (c) { - target_event_callback_t *next = c->next; + struct target_event_callback *next = c->next; if ((c->callback == callback) && (c->priv == priv)) { *p = next; @@ -921,8 +961,8 @@ int target_unregister_event_callback(int (*callback)(struct target_s *target, en int target_unregister_timer_callback(int (*callback)(void *priv), void *priv) { - target_timer_callback_t **p = &target_timer_callbacks; - target_timer_callback_t *c = target_timer_callbacks; + struct target_timer_callback **p = &target_timer_callbacks; + struct target_timer_callback *c = target_timer_callbacks; if (callback == NULL) { @@ -931,7 +971,7 @@ int target_unregister_timer_callback(int (*callback)(void *priv), void *priv) while (c) { - target_timer_callback_t *next = c->next; + struct target_timer_callback *next = c->next; if ((c->callback == callback) && (c->priv == priv)) { *p = next; @@ -948,8 +988,8 @@ int target_unregister_timer_callback(int (*callback)(void *priv), void *priv) int target_call_event_callbacks(target_t *target, enum target_event event) { - target_event_callback_t *callback = target_event_callbacks; - target_event_callback_t *next_callback; + struct target_event_callback *callback = target_event_callbacks; + struct target_event_callback *next_callback; if (event == TARGET_EVENT_HALTED) { @@ -974,7 +1014,7 @@ int target_call_event_callbacks(target_t *target, enum target_event event) } static int target_timer_callback_periodic_restart( - target_timer_callback_t *cb, struct timeval *now) + struct target_timer_callback *cb, struct timeval *now) { int time_ms = cb->time_ms; cb->when.tv_usec = now->tv_usec + (time_ms % 1000) * 1000; @@ -988,7 +1028,7 @@ static int target_timer_callback_periodic_restart( return ERROR_OK; } -static int target_call_timer_callback(target_timer_callback_t *cb, +static int target_call_timer_callback(struct target_timer_callback *cb, struct timeval *now) { cb->callback(cb->priv); @@ -1006,11 +1046,11 @@ static int target_call_timer_callbacks_check_time(int checktime) struct timeval now; gettimeofday(&now, NULL); - target_timer_callback_t *callback = target_timer_callbacks; + struct target_timer_callback *callback = target_timer_callbacks; while (callback) { // cleaning up may unregister and free this callback - target_timer_callback_t *next_callback = callback->next; + struct target_timer_callback *next_callback = callback->next; bool call_it = callback->callback && ((!checktime && callback->periodic) || @@ -1042,42 +1082,43 @@ int target_call_timer_callbacks_now(void) return target_call_timer_callbacks_check_time(0); } -int target_alloc_working_area(struct target_s *target, uint32_t size, working_area_t **area) +int target_alloc_working_area(struct target_s *target, uint32_t size, struct working_area **area) { - working_area_t *c = target->working_areas; - working_area_t *new_wa = NULL; + struct working_area *c = target->working_areas; + struct working_area *new_wa = NULL; /* Reevaluate working area address based on MMU state*/ if (target->working_areas == NULL) { 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; } } @@ -1104,7 +1145,7 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar /* if not, allocate a new one */ if (!new_wa) { - working_area_t **p = &target->working_areas; + struct working_area **p = &target->working_areas; uint32_t first_free = target->working_area; uint32_t free_size = target->working_area_size; @@ -1126,7 +1167,7 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar LOG_DEBUG("allocated new working area at address 0x%08x", (unsigned)first_free); - new_wa = malloc(sizeof(working_area_t)); + new_wa = malloc(sizeof(struct working_area)); new_wa->next = NULL; new_wa->size = size; new_wa->address = first_free; @@ -1161,7 +1202,7 @@ int target_alloc_working_area(struct target_s *target, uint32_t size, working_ar return ERROR_OK; } -int target_free_working_area_restore(struct target_s *target, working_area_t *area, int restore) +int target_free_working_area_restore(struct target_s *target, struct working_area *area, int restore) { if (area->free) return ERROR_OK; @@ -1182,7 +1223,7 @@ int target_free_working_area_restore(struct target_s *target, working_area_t *ar return ERROR_OK; } -int target_free_working_area(struct target_s *target, working_area_t *area) +int target_free_working_area(struct target_s *target, struct working_area *area) { return target_free_working_area_restore(target, area, 1); } @@ -1192,11 +1233,11 @@ int target_free_working_area(struct target_s *target, working_area_t *area) */ void target_free_all_working_areas_restore(struct target_s *target, int restore) { - working_area_t *c = target->working_areas; + struct working_area *c = target->working_areas; while (c) { - working_area_t *next = c->next; + struct working_area *next = c->next; target_free_working_area_restore(target, c, restore); if (c->backup) @@ -1215,19 +1256,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; @@ -1622,72 +1650,7 @@ 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_jim(cmd_ctx, "mrc", jim_mcrmrc, "read coprocessor "); - register_jim(cmd_ctx, "mcr", jim_mcrmrc, "write coprocessor "); - - 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) +COMMAND_HANDLER(handle_targets_command) { target_t *target = all_targets; @@ -1899,7 +1862,7 @@ int handle_target(void *priv) return retval; } -static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_reg_command) { target_t *target; reg_t *reg = NULL; @@ -1913,7 +1876,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char /* list all available registers for the current target */ if (argc == 0) { - reg_cache_t *cache = target->reg_cache; + struct reg_cache *cache = target->reg_cache; count = 0; while (cache) @@ -1954,11 +1917,9 @@ 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; + struct reg_cache *cache = target->reg_cache; count = 0; while (cache) { @@ -2000,7 +1961,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char if (reg->valid == 0) { - reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type); + struct reg_arch_type *arch_type = register_get_arch_type(reg->arch_type); arch_type->get(reg); } value = buf_to_str(reg->value, reg->size, 16); @@ -2015,7 +1976,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char uint8_t *buf = malloc(CEIL(reg->size, 8)); str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0); - reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type); + struct reg_arch_type *arch_type = register_get_arch_type(reg->arch_type); arch_type->set(reg, buf); value = buf_to_str(reg->value, reg->size, 16); @@ -2032,7 +1993,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_OK; } -static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_poll_command) { int retval = ERROR_OK; target_t *target = get_current_target(cmd_ctx); @@ -2074,7 +2035,7 @@ static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, cha return retval; } -static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_wait_halt_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -2085,7 +2046,7 @@ static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd int retval = parse_uint(args[0], &ms); if (ERROR_OK != retval) { - command_print(cmd_ctx, "usage: %s [seconds]", cmd); + command_print(cmd_ctx, "usage: %s [seconds]", CMD_NAME); return ERROR_COMMAND_SYNTAX_ERROR; } // convert seconds (given) to milliseconds (needed) @@ -2141,7 +2102,7 @@ int target_wait_state(target_t *target, enum target_state state, int ms) return ERROR_OK; } -static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_halt_command) { LOG_DEBUG("-"); @@ -2160,10 +2121,10 @@ static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, cha return ERROR_OK; } - return handle_wait_halt_command(cmd_ctx, cmd, args, argc); + return CALL_COMMAND_HANDLER(handle_wait_halt_command); } -static int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_soft_reset_halt_command) { target_t *target = get_current_target(cmd_ctx); @@ -2174,7 +2135,7 @@ static int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, cha return ERROR_OK; } -static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_reset_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -2195,7 +2156,7 @@ static int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, ch } -static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_resume_command) { int current = 1; if (argc > 1) @@ -2210,16 +2171,14 @@ 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; } return target_resume(target, current, addr, 1, 0); } -static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_step_command) { if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; @@ -2233,9 +2192,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; } @@ -2293,13 +2250,13 @@ static void handle_md_output(struct command_context_s *cmd_ctx, } } -static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_md_command) { if (argc < 1) return ERROR_COMMAND_SYNTAX_ERROR; unsigned size = 0; - switch (cmd[2]) { + switch (CMD_NAME[2]) { case 'w': size = 4; break; case 'h': size = 2; break; case 'b': size = 1; break; @@ -2322,23 +2279,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); @@ -2347,7 +2299,7 @@ static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char return retval; } -static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_mw_command) { if (argc < 2) { @@ -2369,27 +2321,19 @@ 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; uint8_t value_buf[4]; - switch (cmd[2]) + switch (CMD_NAME[2]) { case 'w': wordsize = 4; @@ -2408,7 +2352,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; @@ -2419,8 +2363,8 @@ 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 COMMAND_HELPER(parse_load_image_command_args, image_t *image, + uint32_t *min_address, uint32_t *max_address) { if (argc < 1 || argc > 5) return ERROR_COMMAND_SYNTAX_ERROR; @@ -2430,9 +2374,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; } @@ -2443,15 +2385,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; } @@ -2462,7 +2400,7 @@ static int parse_load_image_command_args(char **args, int argc, return ERROR_OK; } -static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_load_image_command) { uint8_t *buffer; uint32_t buf_cnt; @@ -2470,20 +2408,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 = CALL_COMMAND_HANDLER(parse_load_image_command_args, &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) { @@ -2543,35 +2478,26 @@ 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) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - image_close(&image); - return retvaltemp; + command_print(cmd_ctx, "downloaded %" PRIu32 " bytes " + "in %fs (%0.3f kb/s)", image_size, + duration_elapsed(&bench), duration_kbps(&bench, image_size)); } - if (retval == ERROR_OK) - { - command_print(cmd_ctx, "downloaded %u byte in %s", - (unsigned int)image_size, - duration_text); - } - free(duration_text); - image_close(&image); return retval; } -static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_dump_image_command) { - fileio_t fileio; + struct fileio fileio; uint8_t buffer[560]; int retvaltemp; - duration_t duration; - char *duration_text; target_t *target = get_current_target(cmd_ctx); @@ -2582,27 +2508,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) { @@ -2622,34 +2544,28 @@ 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; } -static int handle_verify_image_command_internal(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, int verify) +static COMMAND_HELPER(handle_verify_image_command_internal, int verify) { uint8_t *buffer; 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) @@ -2663,14 +2579,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; } @@ -2772,34 +2687,26 @@ 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) + if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) { - image_close(&image); - return retvaltemp; + command_print(cmd_ctx, "verified %" PRIu32 " bytes " + "in %fs (%0.3f kb/s)", image_size, + duration_elapsed(&bench), duration_kbps(&bench, image_size)); } - if (retval == ERROR_OK) - { - command_print(cmd_ctx, "verified %u bytes in %s", - (unsigned int)image_size, - duration_text); - } - free(duration_text); - image_close(&image); return retval; } -static int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_verify_image_command) { - return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 1); + return CALL_COMMAND_HANDLER(handle_verify_image_command_internal, 1); } -static int handle_test_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_test_image_command) { - return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 0); + return CALL_COMMAND_HANDLER(handle_verify_image_command_internal, 0); } static int handle_bp_command_list(struct command_context_s *cmd_ctx) @@ -2842,8 +2749,7 @@ static int handle_bp_command_set(struct command_context_s *cmd_ctx, return retval; } -static int handle_bp_command(struct command_context_s *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_bp_command) { if (argc == 0) return handle_bp_command_list(cmd_ctx); @@ -2855,14 +2761,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) @@ -2876,15 +2777,13 @@ static int handle_bp_command(struct command_context_s *cmd_ctx, return handle_bp_command_set(cmd_ctx, addr, length, hw); } -static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_rbp_command) { if (argc != 1) 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); @@ -2892,13 +2791,13 @@ static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char return ERROR_OK; } -static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_wp_command) { target_t *target = get_current_target(cmd_ctx); if (argc == 0) { - watchpoint_t *watchpoint = target->watchpoints; + struct watchpoint *watchpoint = target->watchpoints; while (watchpoint) { @@ -2919,19 +2818,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]) @@ -2951,20 +2845,17 @@ 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: - command_print(cmd_ctx, "usage: wp
[r/w/a] [value] [mask]"); + command_print(cmd_ctx, "usage: wp [address length " + "[(r|w|a) [value [mask]]]]"); 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"); @@ -2972,15 +2863,13 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char return retval; } -static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_rwp_command) { if (argc != 1) 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); @@ -2995,20 +2884,17 @@ static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char * The low-level target implementation must have logged a detailed error * which is forwarded to telnet/GDB session. */ -static int handle_virt2phys_command(command_context_t *cmd_ctx, - char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_virt2phys_command) { if (argc != 1) 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); @@ -3039,7 +2925,7 @@ static void writeString(FILE *f, char *s) } /* Dump a gmon.out histogram file. */ -static void writeGmon(uint32_t *samples, uint32_t sampleNum, char *filename) +static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filename) { uint32_t i; FILE *f = fopen(filename, "w"); @@ -3132,7 +3018,7 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, char *filename) } /* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */ -static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_profile_command) { target_t *target = get_current_target(cmd_ctx); struct timeval timeout, now; @@ -3143,9 +3029,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); @@ -3162,6 +3046,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) { @@ -3610,7 +3495,7 @@ void target_all_handle_event(enum target_event e) */ void target_handle_event(target_t *target, enum target_event e) { - target_event_action_t *teap; + struct target_event_action *teap; for (teap = target->event_action; teap != NULL; teap = teap->next) { if (teap->event == e) { @@ -3728,7 +3613,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target) } { - target_event_action_t *teap; + struct target_event_action *teap; teap = target->event_action; /* replace existing? */ @@ -3900,7 +3785,7 @@ static int target_configure(Jim_GetOptInfo *goi, target_t *target) case TCFG_CHAIN_POSITION: if (goi->isconfigure) { Jim_Obj *o; - jtag_tap_t *tap; + struct jtag_tap *tap; target_free_all_working_areas(target); e = Jim_GetOpt_Obj(goi, &o); if (e != JIM_OK) { @@ -4298,7 +4183,7 @@ static int tcl_target_func(Jim_Interp *interp, int argc, Jim_Obj *const *argv) * scripts/programs should use 'name cget -event NAME' */ { - target_event_action_t *teap; + struct target_event_action *teap; teap = target->event_action; command_print(cmd_ctx, "Event actions for target (%d) %s\n", target->target_number, @@ -4651,7 +4536,7 @@ static void free_fastload(void) -static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_fast_load_image_command) { uint8_t *buffer; uint32_t buf_cnt; @@ -4662,15 +4547,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 = CALL_COMMAND_HANDLER(parse_load_image_command_args, &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) { @@ -4743,13 +4626,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); @@ -4761,7 +4647,7 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha return retval; } -static int handle_fast_load_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +COMMAND_HANDLER(handle_fast_load_command) { if (argc > 0) return ERROR_COMMAND_SYNTAX_ERROR; @@ -4838,19 +4724,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; @@ -4876,3 +4762,131 @@ 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"); + + /** @todo don't register virt2phys() unless target supports it */ + 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; +}