X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=e2e0530f7e37aee4e6ad2e2d2db6ae54c2830107;hp=e88fb196729b2dc7b5cb660af8e6269667c466a4;hb=81e8e44cf016ace2a9f0c1f20282ed54ff2d45fc;hpb=fbf5bec7f3ea9f4a9584099a12e71681cb55ce35 diff --git a/src/target/target.c b/src/target/target.c index e88fb19672..e2e0530f7e 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -76,6 +76,7 @@ extern target_type_t arm720t_target; extern target_type_t arm9tdmi_target; extern target_type_t arm920t_target; extern target_type_t arm966e_target; +extern target_type_t arm926ejs_target; target_type_t *target_types[] = { @@ -84,6 +85,7 @@ target_type_t *target_types[] = &arm920t_target, &arm720t_target, &arm966e_target, + &arm926ejs_target, NULL, }; @@ -209,6 +211,8 @@ int target_init_handler(struct target_s *target, enum target_event event, void * if ((event == TARGET_EVENT_HALTED) && (target->reset_script)) { + target_unregister_event_callback(target_init_handler, priv); + script = fopen(target->reset_script, "r"); if (!script) { @@ -221,8 +225,6 @@ int target_init_handler(struct target_s *target, enum target_event event, void * fclose(script); jtag_execute_queue(); - - target_unregister_event_callback(target_init_handler, priv); } return ERROR_OK; @@ -723,6 +725,50 @@ int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffe return ERROR_OK; } +void target_read_u32(struct target_s *target, u32 address, u32 *value) +{ + u8 value_buf[4]; + + target->type->read_memory(target, address, 4, 1, value_buf); + + *value = target_buffer_get_u32(target, value_buf); +} + +void target_read_u16(struct target_s *target, u32 address, u16 *value) +{ + u8 value_buf[2]; + + target->type->read_memory(target, address, 2, 1, value_buf); + + *value = target_buffer_get_u16(target, value_buf); +} + +void target_read_u8(struct target_s *target, u32 address, u8 *value) +{ + target->type->read_memory(target, address, 1, 1, value); +} + +void target_write_u32(struct target_s *target, u32 address, u32 value) +{ + u8 value_buf[4]; + + target_buffer_set_u32(target, value_buf, value); + target->type->write_memory(target, address, 4, 1, value_buf); +} + +void target_write_u16(struct target_s *target, u32 address, u16 value) +{ + u8 value_buf[2]; + + target_buffer_set_u16(target, value_buf, value); + target->type->write_memory(target, address, 2, 1, value_buf); +} + +void target_write_u8(struct target_s *target, u32 address, u8 value) +{ + target->type->read_memory(target, address, 1, 1, &value); +} + int target_register_user_commands(struct command_context_s *cmd_ctx) { register_command(cmd_ctx, NULL, "reg", handle_reg_command, COMMAND_EXEC, NULL); @@ -860,7 +906,6 @@ int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **a (*last_target_p)->working_areas = NULL; (*last_target_p)->backup_working_area = 0; - (*last_target_p)->endianness = TARGET_LITTLE_ENDIAN; (*last_target_p)->state = TARGET_UNKNOWN; (*last_target_p)->reg_cache = NULL; (*last_target_p)->breakpoints = NULL; @@ -1041,7 +1086,7 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args int i; for (i = 0; i < cache->num_regs; i++) { - value = buf_to_char(cache->reg_list[i].value, cache->reg_list[i].size); + value = buf_to_str(cache->reg_list[i].value, cache->reg_list[i].size, 16); command_print(cmd_ctx, "(%i) %s (/%i): 0x%s (dirty: %i, valid: %i)", count++, cache->reg_list[i].name, cache->reg_list[i].size, value, cache->reg_list[i].dirty, cache->reg_list[i].valid); free(value); } @@ -1106,7 +1151,7 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args } arch_type->get(reg); } - value = buf_to_char(reg->value, reg->size); + value = buf_to_str(reg->value, reg->size, 16); command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value); free(value); return ERROR_OK; @@ -1115,7 +1160,9 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args /* set register value */ if (argc == 2) { - u32 new_value = strtoul(args[1], NULL, 0); + u8 *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); if (arch_type == NULL) { @@ -1123,11 +1170,14 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args return ERROR_OK; } - arch_type->set(reg, new_value); - value = buf_to_char(reg->value, reg->size); + arch_type->set(reg, buf); + + value = buf_to_str(reg->value, reg->size, 16); command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value); free(value); + free(buf); + return ERROR_OK; } @@ -1421,6 +1471,7 @@ int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, command_print(cmd_ctx, "error: unknown error"); break; } + return ERROR_OK; } output_len = 0; @@ -1433,13 +1484,13 @@ int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, switch (size) { case 4: - output_len += snprintf(output + output_len, 128 - output_len, "%8.8x ", ((u32*)buffer)[i]); + output_len += snprintf(output + output_len, 128 - output_len, "%8.8x ", target_buffer_get_u32(target, &buffer[i*4])); break; case 2: - output_len += snprintf(output + output_len, 128 - output_len, "%4.4x ", ((u16*)buffer)[i]); + output_len += snprintf(output + output_len, 128 - output_len, "%4.4x ", target_buffer_get_u16(target, &buffer[i*2])); break; case 1: - output_len += snprintf(output + output_len, 128 - output_len, "%2.2x ", ((u8*)buffer)[i]); + output_len += snprintf(output + output_len, 128 - output_len, "%2.2x ", buffer[i*1]); break; } @@ -1461,6 +1512,7 @@ int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, u32 value = 0; int retval; target_t *target = get_current_target(cmd_ctx); + u8 value_buf[4]; if (argc < 2) return ERROR_OK; @@ -1471,13 +1523,16 @@ int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, switch (cmd[2]) { case 'w': - retval = target->type->write_memory(target, address, 4, 1, (u8*)&value); + target_buffer_set_u32(target, value_buf, value); + retval = target->type->write_memory(target, address, 4, 1, value_buf); break; case 'h': - retval = target->type->write_memory(target, address, 2, 1, (u8*)&value); + target_buffer_set_u16(target, value_buf, value); + retval = target->type->write_memory(target, address, 2, 1, value_buf); break; case 'b': - retval = target->type->write_memory(target, address, 1, 1, (u8*)&value); + value_buf[0] = value; + retval = target->type->write_memory(target, address, 1, 1, value_buf); break; default: return ERROR_OK; @@ -1574,6 +1629,8 @@ int handle_dump_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha u32 size; u8 buffer[560]; + struct timeval start, end, duration; + target_t *target = get_current_target(cmd_ctx); if (argc != 3) @@ -1598,6 +1655,8 @@ int handle_dump_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha return ERROR_OK; } + gettimeofday(&start, NULL); + while (size > 0) { u32 this_run_size = (size > 560) ? 560 : size; @@ -1609,6 +1668,11 @@ int handle_dump_binary_command(struct command_context_s *cmd_ctx, char *cmd, cha fclose(binary); + gettimeofday(&end, NULL); + + timeval_subtract(&duration, &end, &start); + command_print(cmd_ctx, "dumped %i byte in %is %ius", strtoul(args[2], NULL, 0), duration.tv_sec, duration.tv_usec); + return ERROR_OK; } @@ -1626,7 +1690,7 @@ int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, { if (breakpoint->type == BKPT_SOFT) { - char* buf = buf_to_char(breakpoint->orig_instr, breakpoint->length); + char* buf = buf_to_str(breakpoint->orig_instr, breakpoint->length, 16); command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint->address, breakpoint->length, breakpoint->set, buf); free(buf); } @@ -1663,6 +1727,14 @@ int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, break; } } + else + { + command_print(cmd_ctx, "breakpoint added at address 0x%8.8x", strtoul(args[0], NULL, 0)); + } + } + else + { + command_print(cmd_ctx, "usage: bp
['hw']"); } return ERROR_OK;