X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=65142a9aa4b7ad7f1c6ddfbc9f1c1ab25edbe4e7;hp=6b8f3a0cad0dffc8e4b46e0b31fc23173bee4ab0;hb=9eb3181cc8bb0b82d6c9e580c2042274e5490b77;hpb=1b2c1c6ff0442bf954f39c39a4be3d00fc90987a diff --git a/src/target/target.c b/src/target/target.c index 6b8f3a0cad..65142a9aa4 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -82,6 +82,7 @@ extern target_type_t arm9tdmi_target; extern target_type_t arm920t_target; extern target_type_t arm966e_target; extern target_type_t arm926ejs_target; +extern target_type_t fa526_target; extern target_type_t feroceon_target; extern target_type_t xscale_target; extern target_type_t cortexm3_target; @@ -98,6 +99,7 @@ target_type_t *target_types[] = &arm720t_target, &arm966e_target, &arm926ejs_target, + &fa526_target, &feroceon_target, &xscale_target, &cortexm3_target, @@ -269,10 +271,10 @@ static int new_target_number(void) return x+1; } -static int target_continous_poll = 1; +static int target_continuous_poll = 1; -/* read a u32 from a buffer in target memory endianness */ -u32 target_buffer_get_u32(target_t *target, const u8 *buffer) +/* read a uint32_t from a buffer in target memory endianness */ +uint32_t target_buffer_get_u32(target_t *target, const uint8_t *buffer) { if (target->endianness == TARGET_LITTLE_ENDIAN) return le_to_h_u32(buffer); @@ -280,8 +282,8 @@ u32 target_buffer_get_u32(target_t *target, const u8 *buffer) return be_to_h_u32(buffer); } -/* read a u16 from a buffer in target memory endianness */ -u16 target_buffer_get_u16(target_t *target, const u8 *buffer) +/* read a uint16_t from a buffer in target memory endianness */ +uint16_t target_buffer_get_u16(target_t *target, const uint8_t *buffer) { if (target->endianness == TARGET_LITTLE_ENDIAN) return le_to_h_u16(buffer); @@ -289,14 +291,14 @@ u16 target_buffer_get_u16(target_t *target, const u8 *buffer) return be_to_h_u16(buffer); } -/* read a u8 from a buffer in target memory endianness */ -u8 target_buffer_get_u8(target_t *target, const u8 *buffer) +/* read a uint8_t from a buffer in target memory endianness */ +uint8_t target_buffer_get_u8(target_t *target, const uint8_t *buffer) { return *buffer & 0x0ff; } -/* write a u32 to a buffer in target memory endianness */ -void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value) +/* write a uint32_t to a buffer in target memory endianness */ +void target_buffer_set_u32(target_t *target, uint8_t *buffer, uint32_t value) { if (target->endianness == TARGET_LITTLE_ENDIAN) h_u32_to_le(buffer, value); @@ -304,8 +306,8 @@ void target_buffer_set_u32(target_t *target, u8 *buffer, u32 value) h_u32_to_be(buffer, value); } -/* write a u16 to a buffer in target memory endianness */ -void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value) +/* write a uint16_t to a buffer in target memory endianness */ +void target_buffer_set_u16(target_t *target, uint8_t *buffer, uint16_t value) { if (target->endianness == TARGET_LITTLE_ENDIAN) h_u16_to_le(buffer, value); @@ -313,8 +315,8 @@ void target_buffer_set_u16(target_t *target, u8 *buffer, u16 value) h_u16_to_be(buffer, value); } -/* write a u8 to a buffer in target memory endianness */ -void target_buffer_set_u8(target_t *target, u8 *buffer, u8 value) +/* write a uint8_t to a buffer in target memory endianness */ +void target_buffer_set_u8(target_t *target, uint8_t *buffer, uint8_t value) { *buffer = value; } @@ -323,8 +325,6 @@ void target_buffer_set_u8(target_t *target, u8 *buffer, u8 value) target_t *get_target(const char *id) { target_t *target; - char *endptr; - int num; /* try as tcltarget name */ for (target = all_targets; target; target = target->next) { @@ -335,12 +335,12 @@ target_t *get_target(const char *id) } /* no match, try as number */ - num = strtoul(id, &endptr, 0); - if (*endptr != 0) + unsigned num; + if (parse_uint(id, &num) != ERROR_OK) return NULL; for (target = all_targets; target; target = target->next) { - if (target->target_number == num) + if (target->target_number == (int)num) return target; } @@ -402,7 +402,7 @@ int target_halt(struct target_s *target) return target->type->halt(target); } -int target_resume(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution) +int target_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution) { int retval; @@ -438,13 +438,13 @@ int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mo * more predictable, i.e. dr/irscan & pathmove in events will * not have JTAG operations injected into the middle of a sequence. */ - int save_poll = target_continous_poll; - target_continous_poll = 0; + int save_poll = target_continuous_poll; + target_continuous_poll = 0; sprintf( buf, "ocd_process_reset %s", n->name ); retval = Jim_Eval( interp, buf ); - target_continous_poll = save_poll; + target_continuous_poll = save_poll; if(retval != JIM_OK) { Jim_PrintErrorMessage(interp); @@ -457,7 +457,7 @@ int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mo return retval; } -static int default_virt2phys(struct target_s *target, u32 virtual, u32 *physical) +static int default_virt2phys(struct target_s *target, uint32_t virtual, uint32_t *physical) { *physical = virtual; return ERROR_OK; @@ -480,6 +480,18 @@ int target_examine_one(struct target_s *target) return target->type->examine(target); } +static int jtag_enable_callback(enum jtag_event event, void *priv) +{ + target_t *target = priv; + + if (event != JTAG_TAP_EVENT_ENABLE || !target->tap->enabled) + return ERROR_OK; + + jtag_unregister_event_callback(jtag_enable_callback, target); + return target_examine_one(target); +} + + /* Targets that correctly implement init+examine, i.e. * no communication with target during init: * @@ -492,8 +504,12 @@ int target_examine(void) for (target = all_targets; target; target = target->next) { - if (!target->tap->enabled) + /* defer examination, but don't skip it */ + if (!target->tap->enabled) { + jtag_register_event_callback(jtag_enable_callback, + target); continue; + } if ((retval = target_examine_one(target)) != ERROR_OK) return retval; } @@ -504,7 +520,7 @@ const char *target_get_name(struct target_s *target) return target->type->name; } -static int target_write_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer) +static int target_write_memory_imp(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) { if (!target_was_examined(target)) { @@ -514,7 +530,7 @@ static int target_write_memory_imp(struct target_s *target, u32 address, u32 siz return target->type->write_memory_imp(target, address, size, count, buffer); } -static int target_read_memory_imp(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer) +static int target_read_memory_imp(struct target_s *target, uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) { if (!target_was_examined(target)) { @@ -534,7 +550,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, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info) +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) { if (!target_was_examined(target)) { @@ -545,18 +561,18 @@ static int target_run_algorithm_imp(struct target_s *target, int num_mem_params, } int target_read_memory(struct target_s *target, - u32 address, u32 size, u32 count, u8 *buffer) + uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) { return target->type->read_memory(target, address, size, count, buffer); } int target_write_memory(struct target_s *target, - u32 address, u32 size, u32 count, u8 *buffer) + uint32_t address, uint32_t size, uint32_t count, uint8_t *buffer) { return target->type->write_memory(target, address, size, count, buffer); } int target_bulk_write_memory(struct target_s *target, - u32 address, u32 count, u8 *buffer) + uint32_t address, uint32_t count, uint8_t *buffer) { return target->type->bulk_write_memory(target, address, count, buffer); } @@ -589,7 +605,7 @@ int target_get_gdb_reg_list(struct target_s *target, return target->type->get_gdb_reg_list(target, reg_list, reg_list_size); } int target_step(struct target_s *target, - int current, u32 address, int handle_breakpoints) + int current, uint32_t address, int handle_breakpoints) { return target->type->step(target, current, address, handle_breakpoints); } @@ -598,7 +614,7 @@ 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, - u32 entry_point, u32 exit_point, + uint32_t entry_point, uint32_t exit_point, int timeout_ms, void *arch_info) { return target->type->run_algorithm(target, @@ -890,7 +906,7 @@ int target_call_timer_callbacks_now(void) return target_call_timer_callbacks_check_time(0); } -int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area) +int target_alloc_working_area(struct target_s *target, uint32_t size, working_area_t **area) { working_area_t *c = target->working_areas; working_area_t *new_wa = NULL; @@ -937,8 +953,8 @@ int target_alloc_working_area(struct target_s *target, u32 size, working_area_t if (!new_wa) { working_area_t **p = &target->working_areas; - u32 first_free = target->working_area; - u32 free_size = target->working_area_size; + uint32_t first_free = target->working_area; + uint32_t free_size = target->working_area_size; LOG_DEBUG("allocating new working area"); @@ -1082,7 +1098,7 @@ int target_arch_state(struct target_s *target) * mode respectively, otherwise data is handled as quickly as * possible */ -int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer) +int target_write_buffer(struct target_s *target, uint32_t address, uint32_t size, uint8_t *buffer) { int retval; LOG_DEBUG("writing buffer of %i byte at 0x%8.8x", size, address); @@ -1112,7 +1128,7 @@ int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buff /* handle unaligned head bytes */ if (address % 4) { - u32 unaligned = 4 - (address % 4); + uint32_t unaligned = 4 - (address % 4); if (unaligned > size) unaligned = size; @@ -1161,7 +1177,7 @@ int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buff * mode respectively, otherwise data is handled as quickly as * possible */ -int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer) +int target_read_buffer(struct target_s *target, uint32_t address, uint32_t size, uint8_t *buffer) { int retval; LOG_DEBUG("reading buffer of %i byte at 0x%8.8x", size, address); @@ -1191,7 +1207,7 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe /* handle unaligned head bytes */ if (address % 4) { - u32 unaligned = 4 - (address % 4); + uint32_t unaligned = 4 - (address % 4); if (unaligned > size) unaligned = size; @@ -1227,12 +1243,12 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe return ERROR_OK; } -int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc) +int target_checksum_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t* crc) { - u8 *buffer; + uint8_t *buffer; int retval; - u32 i; - u32 checksum = 0; + uint32_t i; + uint32_t checksum = 0; if (!target_was_examined(target)) { LOG_ERROR("Target not examined yet"); @@ -1256,11 +1272,11 @@ int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* } /* convert to target endianess */ - for (i = 0; i < (size/sizeof(u32)); i++) + for (i = 0; i < (size/sizeof(uint32_t)); i++) { - u32 target_data; - target_data = target_buffer_get_u32(target, &buffer[i*sizeof(u32)]); - target_buffer_set_u32(target, &buffer[i*sizeof(u32)], target_data); + uint32_t target_data; + target_data = target_buffer_get_u32(target, &buffer[i*sizeof(uint32_t)]); + target_buffer_set_u32(target, &buffer[i*sizeof(uint32_t)], target_data); } retval = image_calculate_checksum( buffer, size, &checksum ); @@ -1272,7 +1288,7 @@ int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* return retval; } -int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank) +int target_blank_check_memory(struct target_s *target, uint32_t address, uint32_t size, uint32_t* blank) { int retval; if (!target_was_examined(target)) @@ -1289,9 +1305,9 @@ int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u3 return retval; } -int target_read_u32(struct target_s *target, u32 address, u32 *value) +int target_read_u32(struct target_s *target, uint32_t address, uint32_t *value) { - u8 value_buf[4]; + uint8_t value_buf[4]; if (!target_was_examined(target)) { LOG_ERROR("Target not examined yet"); @@ -1314,9 +1330,9 @@ int target_read_u32(struct target_s *target, u32 address, u32 *value) return retval; } -int target_read_u16(struct target_s *target, u32 address, u16 *value) +int target_read_u16(struct target_s *target, uint32_t address, uint16_t *value) { - u8 value_buf[2]; + uint8_t value_buf[2]; if (!target_was_examined(target)) { LOG_ERROR("Target not examined yet"); @@ -1339,7 +1355,7 @@ int target_read_u16(struct target_s *target, u32 address, u16 *value) return retval; } -int target_read_u8(struct target_s *target, u32 address, u8 *value) +int target_read_u8(struct target_s *target, uint32_t address, uint8_t *value) { int retval = target_read_memory(target, address, 1, 1, value); if (!target_was_examined(target)) @@ -1361,10 +1377,10 @@ int target_read_u8(struct target_s *target, u32 address, u8 *value) return retval; } -int target_write_u32(struct target_s *target, u32 address, u32 value) +int target_write_u32(struct target_s *target, uint32_t address, uint32_t value) { int retval; - u8 value_buf[4]; + uint8_t value_buf[4]; if (!target_was_examined(target)) { LOG_ERROR("Target not examined yet"); @@ -1382,10 +1398,10 @@ int target_write_u32(struct target_s *target, u32 address, u32 value) return retval; } -int target_write_u16(struct target_s *target, u32 address, u16 value) +int target_write_u16(struct target_s *target, uint32_t address, uint16_t value) { int retval; - u8 value_buf[2]; + uint8_t value_buf[2]; if (!target_was_examined(target)) { LOG_ERROR("Target not examined yet"); @@ -1403,7 +1419,7 @@ int target_write_u16(struct target_s *target, u32 address, u16 value) return retval; } -int target_write_u8(struct target_s *target, u32 address, u8 value) +int target_write_u8(struct target_s *target, uint32_t address, uint8_t value) { int retval; if (!target_was_examined(target)) @@ -1652,20 +1668,23 @@ int handle_target(void *priv) recursive = 0; } - target_t *target = all_targets; - - while (target) + /* Poll targets for state changes unless that's globally disabled. + * Skip targets that are currently disabled. + */ + for (target_t *target = all_targets; + target_continuous_poll && target; + target = target->next) { + if (!target->tap->enabled) + continue; /* only poll target if we've got power and srst isn't asserted */ - if (target_continous_poll&&!powerDropout&&!srstAsserted) + if (!powerDropout && !srstAsserted) { /* polling may fail silently until the target has been examined */ if((retval = target_poll(target)) != ERROR_OK) return retval; } - - target = target->next; } return retval; @@ -1706,16 +1725,19 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char /* access a single register by its ordinal number */ if ((args[0][0] >= '0') && (args[0][0] <= '9')) { - int num = strtoul(args[0], NULL, 0); - reg_cache_t *cache = target->reg_cache; + unsigned num; + int retval = parse_uint(args[0], &num); + if (ERROR_OK != retval) + return ERROR_COMMAND_SYNTAX_ERROR; + reg_cache_t *cache = target->reg_cache; count = 0; while(cache) { int i; for (i = 0; i < cache->num_regs; i++) { - if (count++ == num) + if (count++ == (int)num) { reg = &cache->reg_list[i]; break; @@ -1762,7 +1784,7 @@ static int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char /* set register value */ if (argc == 2) { - u8 *buf = malloc(CEIL(reg->size, 8)); + 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); @@ -1790,7 +1812,12 @@ static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, cha if (argc == 0) { command_print(cmd_ctx, "background polling: %s", - target_continous_poll ? "on" : "off"); + target_continuous_poll ? "on" : "off"); + command_print(cmd_ctx, "TAP: %s (%s)", + target->tap->dotted_name, + target->tap->enabled ? "enabled" : "disabled"); + if (!target->tap->enabled) + return ERROR_OK; if ((retval = target_poll(target)) != ERROR_OK) return retval; if ((retval = target_arch_state(target)) != ERROR_OK) @@ -1801,11 +1828,11 @@ static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, cha { if (strcmp(args[0], "on") == 0) { - target_continous_poll = 1; + target_continuous_poll = 1; } else if (strcmp(args[0], "off") == 0) { - target_continous_poll = 0; + target_continuous_poll = 0; } else { @@ -1821,21 +1848,23 @@ static int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, cha static int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - int ms = 5000; + if (argc > 1) + return ERROR_COMMAND_SYNTAX_ERROR; - if (argc > 0) + unsigned ms = 5000; + if (1 == argc) { - char *end; - - ms = strtoul(args[0], &end, 0) * 1000; - if (*end) + int retval = parse_uint(args[0], &ms); + if (ERROR_OK != retval) { command_print(cmd_ctx, "usage: %s [seconds]", cmd); - return ERROR_OK; + return ERROR_COMMAND_SYNTAX_ERROR; } + // convert seconds (given) to milliseconds (needed) + ms *= 1000; } - target_t *target = get_current_target(cmd_ctx); + target_t *target = get_current_target(cmd_ctx); return target_wait_state(target, TARGET_HALTED, ms); } @@ -1886,23 +1915,20 @@ int target_wait_state(target_t *target, enum target_state state, int ms) static int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - int retval; - target_t *target = get_current_target(cmd_ctx); - LOG_DEBUG("-"); - if ((retval = target_halt(target)) != ERROR_OK) - { + target_t *target = get_current_target(cmd_ctx); + int retval = target_halt(target); + if (ERROR_OK != retval) return retval; - } if (argc == 1) { - int wait; - char *end; - - wait = strtoul(args[0], &end, 0); - if (!*end && !wait) + unsigned wait; + retval = parse_uint(args[0], &wait); + if (ERROR_OK != retval) + return ERROR_COMMAND_SYNTAX_ERROR; + if (!wait) return ERROR_OK; } @@ -1952,9 +1978,13 @@ static int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, c /* with no args, resume from current pc, addr = 0, * with one arguments, addr = args[0], * handle breakpoints, not debugging */ - u32 addr = 0; + uint32_t addr = 0; if (argc == 1) - addr = strtoul(args[0], NULL, 0); + { + int retval = parse_u32(args[0], &addr); + if (ERROR_OK != retval) + return retval; + } return target_resume(target, 0, addr, 1, 0); } @@ -1969,17 +1999,21 @@ static int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, cha /* with no args, step from current pc, addr = 0, * with one argument addr = args[0], * handle breakpoints, debugging */ - u32 addr = 0; + uint32_t addr = 0; if (argc == 1) - addr = strtoul(args[0], NULL, 0); + { + int retval = parse_u32(args[0], &addr); + if (ERROR_OK != retval) + return retval; + } target_t *target = get_current_target(cmd_ctx); return target->type->step(target, 0, addr, 1); } static void handle_md_output(struct command_context_s *cmd_ctx, - struct target_s *target, u32 address, unsigned size, - unsigned count, const u8 *buffer) + struct target_s *target, uint32_t address, unsigned size, + unsigned count, const uint8_t *buffer) { const unsigned line_bytecnt = 32; unsigned line_modulo = line_bytecnt / size; @@ -2006,8 +2040,8 @@ static void handle_md_output(struct command_context_s *cmd_ctx, "0x%8.8x: ", address + (i*size)); } - u32 value=0; - const u8 *value_ptr = buffer + i * size; + uint32_t value=0; + const uint8_t *value_ptr = buffer + i * size; switch (size) { case 4: value = target_buffer_get_u32(target, value_ptr); break; case 2: value = target_buffer_get_u16(target, value_ptr); break; @@ -2038,16 +2072,23 @@ static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char default: return ERROR_COMMAND_SYNTAX_ERROR; } - u32 address = strtoul(args[0], NULL, 0); + uint32_t address; + int retval = parse_u32(args[0], &address); + if (ERROR_OK != retval) + return retval; unsigned count = 1; if (argc == 2) - count = strtoul(args[1], NULL, 0); + { + retval = parse_uint(args[1], &count); + if (ERROR_OK != retval) + return retval; + } - u8 *buffer = calloc(count, size); + uint8_t *buffer = calloc(count, size); target_t *target = get_current_target(cmd_ctx); - int retval = target_read_memory(target, + retval = target_read_memory(target, address, size, count, buffer); if (ERROR_OK == retval) handle_md_output(cmd_ctx, target, address, size, count, buffer); @@ -2059,22 +2100,30 @@ static int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - u32 address = 0; - u32 value = 0; - int count = 1; - int i; - int wordsize; - target_t *target = get_current_target(cmd_ctx); - u8 value_buf[4]; - if ((argc < 2) || (argc > 3)) return ERROR_COMMAND_SYNTAX_ERROR; - address = strtoul(args[0], NULL, 0); - value = strtoul(args[1], NULL, 0); + uint32_t address; + int retval = parse_u32(args[0], &address); + if (ERROR_OK != retval) + return retval; + + uint32_t value; + retval = parse_u32(args[1], &value); + if (ERROR_OK != retval) + return retval; + + unsigned count = 1; if (argc == 3) - count = strtoul(args[2], NULL, 0); + { + retval = parse_uint(args[2], &count); + if (ERROR_OK != retval) + return retval; + } + target_t *target = get_current_target(cmd_ctx); + unsigned wordsize; + uint8_t value_buf[4]; switch (cmd[2]) { case 'w': @@ -2092,9 +2141,9 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char default: return ERROR_COMMAND_SYNTAX_ERROR; } - for (i=0; i 5)) - { + if (argc < 1 || argc > 5) return ERROR_COMMAND_SYNTAX_ERROR; - } - /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */ + /* a base address isn't always necessary, + * default to 0x0 (i.e. don't relocate) */ if (argc >= 2) { - image.base_address_set = 1; - image.base_address = strtoul(args[1], NULL, 0); + uint32_t addr; + int retval = parse_u32(args[1], &addr); + if (ERROR_OK != retval) + return ERROR_COMMAND_SYNTAX_ERROR; + image->base_address = addr; + image->base_address_set = 1; } else - { - image.base_address_set = 0; - } - + image->base_address_set = 0; - image.start_address_set = 0; + image->start_address_set = 0; - if (argc>=4) + if (argc >= 4) { - min_address=strtoul(args[3], NULL, 0); + int retval = parse_u32(args[3], min_address); + if (ERROR_OK != retval) + return ERROR_COMMAND_SYNTAX_ERROR; } - if (argc>=5) + if (argc == 5) { - max_address=strtoul(args[4], NULL, 0)+min_address; + int retval = parse_u32(args[4], max_address); + if (ERROR_OK != retval) + return ERROR_COMMAND_SYNTAX_ERROR; + // use size (given) to find max (required) + *max_address += *min_address; } - if (min_address>max_address) - { + if (*min_address > *max_address) return ERROR_COMMAND_SYNTAX_ERROR; - } + return ERROR_OK; +} + +static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + uint8_t *buffer; + uint32_t buf_cnt; + uint32_t image_size; + 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, + &image, &min_address, &max_address); + if (ERROR_OK != retval) + return retval; + + target_t *target = get_current_target(cmd_ctx); duration_start_measure(&duration); if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK) @@ -2179,8 +2242,8 @@ static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cm break; } - u32 offset=0; - u32 length=buf_cnt; + uint32_t offset=0; + uint32_t length=buf_cnt; /* DANGER!!! beware of unsigned comparision here!!! */ @@ -2233,10 +2296,8 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm { fileio_t fileio; - u32 address; - u32 size; - u8 buffer[560]; - int retval=ERROR_OK, retvaltemp; + uint8_t buffer[560]; + int retvaltemp; duration_t duration; char *duration_text; @@ -2249,8 +2310,15 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm return ERROR_OK; } - address = strtoul(args[1], NULL, 0); - size = strtoul(args[2], NULL, 0); + uint32_t address; + int retval = parse_u32(args[1], &address); + if (ERROR_OK != retval) + return retval; + + uint32_t size; + retval = parse_u32(args[2], &size); + if (ERROR_OK != retval) + return retval; if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK) { @@ -2261,8 +2329,8 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm while (size > 0) { - u32 size_written; - u32 this_run_size = (size > 560) ? 560 : size; + 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) @@ -2298,13 +2366,13 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm static int handle_verify_image_command_internal(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, int verify) { - u8 *buffer; - u32 buf_cnt; - u32 image_size; + uint8_t *buffer; + uint32_t buf_cnt; + uint32_t image_size; int i; int retval, retvaltemp; - u32 checksum = 0; - u32 mem_checksum = 0; + uint32_t checksum = 0; + uint32_t mem_checksum = 0; image_t image; @@ -2328,8 +2396,12 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct if (argc >= 2) { + uint32_t addr; + retval = parse_u32(args[1], &addr); + if (ERROR_OK != retval) + return ERROR_COMMAND_SYNTAX_ERROR; + image.base_address = addr; image.base_address_set = 1; - image.base_address = strtoul(args[1], NULL, 0); } else { @@ -2375,11 +2447,11 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct if( checksum != mem_checksum ) { /* failed crc checksum, fall back to a binary compare */ - u8 *data; + uint8_t *data; command_print(cmd_ctx, "checksum mismatch - attempting binary compare"); - data = (u8*)malloc(buf_cnt); + data = (uint8_t*)malloc(buf_cnt); /* Can we use 32bit word accesses? */ int size = 1; @@ -2392,7 +2464,7 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct retval = target_read_memory(target, image.sections[i].base_address, size, count, data); if (retval == ERROR_OK) { - u32 t; + uint32_t t; for (t = 0; t < buf_cnt; t++) { if (data[t] != buffer[t]) @@ -2476,7 +2548,7 @@ static int handle_bp_command_list(struct command_context_s *cmd_ctx) } static int handle_bp_command_set(struct command_context_s *cmd_ctx, - u32 addr, u32 length, int hw) + uint32_t addr, uint32_t length, int hw) { target_t *target = get_current_target(cmd_ctx); int retval = breakpoint_add(target, addr, length, hw); @@ -2499,8 +2571,15 @@ static int handle_bp_command(struct command_context_s *cmd_ctx, return ERROR_COMMAND_SYNTAX_ERROR; } - u32 addr = strtoul(args[0], NULL, 0); - u32 length = strtoul(args[1], NULL, 0); + uint32_t addr; + int retval = parse_u32(args[0], &addr); + if (ERROR_OK != retval) + return retval; + + uint32_t length; + retval = parse_u32(args[1], &length); + if (ERROR_OK != retval) + return retval; int hw = BKPT_SOFT; if (argc == 3) @@ -2516,10 +2595,16 @@ static int handle_bp_command(struct command_context_s *cmd_ctx, static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - target_t *target = get_current_target(cmd_ctx); + if (argc != 1) + return ERROR_COMMAND_SYNTAX_ERROR; - if (argc > 0) - breakpoint_remove(target, strtoul(args[0], NULL, 0)); + uint32_t addr; + int retval = parse_u32(args[0], &addr); + if (ERROR_OK != retval) + return retval; + + target_t *target = get_current_target(cmd_ctx); + breakpoint_remove(target, addr); return ERROR_OK; } @@ -2527,7 +2612,6 @@ static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { target_t *target = get_current_target(cmd_ctx); - int retval; if (argc == 0) { @@ -2538,52 +2622,65 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char command_print(cmd_ctx, "address: 0x%8.8x, len: 0x%8.8x, r/w/a: %i, value: 0x%8.8x, mask: 0x%8.8x", watchpoint->address, watchpoint->length, watchpoint->rw, watchpoint->value, watchpoint->mask); watchpoint = watchpoint->next; } + return ERROR_OK; } - else if (argc >= 2) - { - enum watchpoint_rw type = WPT_ACCESS; - u32 data_value = 0x0; - u32 data_mask = 0xffffffff; - if (argc >= 3) - { - switch(args[2][0]) - { - case 'r': - type = WPT_READ; - break; - case 'w': - type = WPT_WRITE; - break; - case 'a': - type = WPT_ACCESS; - break; - default: - command_print(cmd_ctx, "usage: wp
[r/w/a] [value] [mask]"); - return ERROR_OK; - } - } - if (argc >= 4) - { - data_value = strtoul(args[3], NULL, 0); - } - if (argc >= 5) - { - data_mask = strtoul(args[4], NULL, 0); - } + enum watchpoint_rw type = WPT_ACCESS; + uint32_t addr = 0; + uint32_t length = 0; + uint32_t data_value = 0x0; + uint32_t data_mask = 0xffffffff; + int retval; - if ((retval = watchpoint_add(target, strtoul(args[0], NULL, 0), - strtoul(args[1], NULL, 0), type, data_value, data_mask)) != ERROR_OK) + switch (argc) + { + case 5: + retval = parse_u32(args[4], &data_mask); + if (ERROR_OK != retval) + return retval; + // fall through + case 4: + retval = parse_u32(args[3], &data_value); + if (ERROR_OK != retval) + return retval; + // fall through + case 3: + switch(args[2][0]) { - LOG_ERROR("Failure setting breakpoints"); + case 'r': + type = WPT_READ; + break; + case 'w': + type = WPT_WRITE; + break; + case 'a': + type = WPT_ACCESS; + break; + default: + LOG_ERROR("invalid watchpoint mode ('%c')", args[2][0]); + return ERROR_COMMAND_SYNTAX_ERROR; } - } - else - { + // 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; + break; + + default: command_print(cmd_ctx, "usage: wp
[r/w/a] [value] [mask]"); + return ERROR_COMMAND_SYNTAX_ERROR; } - return ERROR_OK; + retval = watchpoint_add(target, addr, length, type, + data_value, data_mask); + if (ERROR_OK != retval) + LOG_ERROR("Failure setting watchpoints"); + + return retval; } static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) @@ -2591,8 +2688,13 @@ static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char if (argc != 1) return ERROR_COMMAND_SYNTAX_ERROR; + uint32_t addr; + int retval = parse_u32(args[0], &addr); + if (ERROR_OK != retval) + return retval; + target_t *target = get_current_target(cmd_ctx); - watchpoint_remove(target, strtoul(args[0], NULL, 0)); + watchpoint_remove(target, addr); return ERROR_OK; } @@ -2610,11 +2712,14 @@ static int handle_virt2phys_command(command_context_t *cmd_ctx, if (argc != 1) return ERROR_COMMAND_SYNTAX_ERROR; - target_t *target = get_current_target(cmd_ctx); - u32 va = strtoul(args[0], NULL, 0); - u32 pa; + uint32_t va; + int retval = parse_u32(args[0], &va); + if (ERROR_OK != retval) + return retval; + uint32_t pa; - int retval = target->type->virt2phys(target, va, &pa); + target_t *target = get_current_target(cmd_ctx); + retval = target->type->virt2phys(target, va, &pa); if (retval == ERROR_OK) command_print(cmd_ctx, "Physical address 0x%08x", pa); @@ -2645,9 +2750,9 @@ static void writeString(FILE *f, char *s) } /* Dump a gmon.out histogram file. */ -static void writeGmon(u32 *samples, u32 sampleNum, char *filename) +static void writeGmon(uint32_t *samples, uint32_t sampleNum, char *filename) { - u32 i; + uint32_t i; FILE *f=fopen(filename, "w"); if (f==NULL) return; @@ -2657,12 +2762,12 @@ static void writeGmon(u32 *samples, u32 sampleNum, char *filename) writeLong(f, 0); /* padding */ writeLong(f, 0); /* padding */ - u8 zero = 0; /* GMON_TAG_TIME_HIST */ + uint8_t zero = 0; /* GMON_TAG_TIME_HIST */ writeData(f, &zero, 1); /* figure out bucket size */ - u32 min=samples[0]; - u32 max=samples[0]; + uint32_t min=samples[0]; + uint32_t max=samples[0]; for (i=0; isamples[i]) @@ -2677,8 +2782,8 @@ static void writeGmon(u32 *samples, u32 sampleNum, char *filename) int addressSpace=(max-min+1); - static const u32 maxBuckets = 256 * 1024; /* maximum buckets. */ - u32 length = addressSpace; + static const uint32_t maxBuckets = 256 * 1024; /* maximum buckets. */ + uint32_t length = addressSpace; if (length > maxBuckets) { length=maxBuckets; @@ -2692,7 +2797,7 @@ static void writeGmon(u32 *samples, u32 sampleNum, char *filename) memset(buckets, 0, sizeof(int)*length); for (i=0; ireg_cache, "pc", 1); @@ -2772,7 +2876,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, target_poll(target); if (target->state == TARGET_HALTED) { - u32 t=*((u32 *)reg->value); + uint32_t t=*((uint32_t *)reg->value); samples[numSamples++]=t; retval = target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */ target_poll(target); @@ -2824,7 +2928,7 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, return ERROR_OK; } -static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 val) +static int new_int_array_element(Jim_Interp * interp, const char *varname, int idx, uint32_t val) { char *namebuf; Jim_Obj *nameObjPtr, *valObjPtr; @@ -2876,15 +2980,15 @@ static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv) static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv) { long l; - u32 width; + uint32_t width; int len; - u32 addr; - u32 count; - u32 v; + uint32_t addr; + uint32_t count; + uint32_t v; const char *varname; - u8 buffer[4096]; + uint8_t buffer[4096]; int n, e, retval; - u32 i; + uint32_t i; /* argv[1] = name of array to receive the data * argv[2] = desired width @@ -3005,7 +3109,7 @@ static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_ return JIM_OK; } -static int get_int_array_element(Jim_Interp * interp, const char *varname, int idx, u32 *val) +static int get_int_array_element(Jim_Interp * interp, const char *varname, int idx, uint32_t *val) { char *namebuf; Jim_Obj *nameObjPtr, *valObjPtr; @@ -3058,15 +3162,15 @@ static int jim_array2mem(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) { long l; - u32 width; + uint32_t width; int len; - u32 addr; - u32 count; - u32 v; + uint32_t addr; + uint32_t count; + uint32_t v; const char *varname; - u8 buffer[4096]; + uint8_t buffer[4096]; int n, e, retval; - u32 i; + uint32_t i; /* argv[1] = name of array to get the data * argv[2] = desired width @@ -3532,7 +3636,7 @@ static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv ) Jim_GetOptInfo goi; jim_wide a,b,c; int x,y,z; - u8 target_buf[32]; + uint8_t target_buf[32]; Jim_Nvp *n; target_t *target; struct command_context_s *cmd_ctx; @@ -3621,7 +3725,7 @@ static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv ) * argv[3] = optional count. */ - if( (goi.argc == 3) || (goi.argc == 4) ){ + if( (goi.argc == 2) || (goi.argc == 3) ){ /* all is well */ } else { mwx_error: @@ -3638,7 +3742,7 @@ static int tcl_target_func( Jim_Interp *interp, int argc, Jim_Obj *const *argv ) if( e != JIM_OK ){ goto mwx_error; } - if( goi.argc ){ + if (goi.argc == 3) { e = Jim_GetOpt_Wide( &goi, &c ); if( e != JIM_OK ){ goto mwx_error; @@ -4207,8 +4311,8 @@ static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv ) struct FastLoad { - u32 address; - u8 *data; + uint32_t address; + uint8_t *data; int length; }; @@ -4236,51 +4340,22 @@ static void free_fastload(void) static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - u8 *buffer; - u32 buf_cnt; - u32 image_size; - u32 min_address=0; - u32 max_address=0xffffffff; + uint8_t *buffer; + uint32_t buf_cnt; + uint32_t image_size; + uint32_t min_address=0; + uint32_t max_address=0xffffffff; int i; - int retval; image_t image; duration_t duration; char *duration_text; - if ((argc < 1)||(argc > 5)) - { - return ERROR_COMMAND_SYNTAX_ERROR; - } - - /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */ - if (argc >= 2) - { - image.base_address_set = 1; - image.base_address = strtoul(args[1], NULL, 0); - } - else - { - image.base_address_set = 0; - } - - - image.start_address_set = 0; - - if (argc>=4) - { - min_address=strtoul(args[3], NULL, 0); - } - if (argc>=5) - { - max_address=strtoul(args[4], NULL, 0)+min_address; - } - - if (min_address>max_address) - { - return ERROR_COMMAND_SYNTAX_ERROR; - } + int retval = parse_load_image_command_args(args, argc, + &image, &min_address, &max_address); + if (ERROR_OK != retval) + return retval; duration_start_measure(&duration); @@ -4314,8 +4389,8 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha break; } - u32 offset=0; - u32 length=buf_cnt; + uint32_t offset=0; + uint32_t length=buf_cnt; /* DANGER!!! beware of unsigned comparision here!!! */