X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=531d632e698384ddec9dd321be8e12c84a0afe1d;hp=e88fb196729b2dc7b5cb660af8e6269667c466a4;hb=a582e9a8d183c56d1aa8ae18afc1c11e2cbd6d2d;hpb=fbf5bec7f3ea9f4a9584099a12e71681cb55ce35 diff --git a/src/target/target.c b/src/target/target.c index e88fb19672..531d632e69 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -723,6 +723,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); @@ -1041,7 +1085,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 +1150,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 +1159,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 +1169,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 +1470,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 +1483,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 +1511,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 +1522,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 +1628,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 +1654,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 +1667,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 +1689,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 +1726,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;