X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Fetm.c;h=cd50e44d511d09bdebdf03a1849086e9f16f1309;hb=4668bd264cfe64c3e3ddd0f75cb5bf2e5e85f717;hp=4f4bf9a43066c2523dd90996a93d5d66d1afd599;hpb=5dcad2d34fc40659018da2cf75ceeacd3abea860;p=openocd.git diff --git a/src/target/etm.c b/src/target/etm.c index 4f4bf9a430..cd50e44d51 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -314,7 +314,6 @@ struct reg_cache *etm_build_reg_cache(struct target *target, /* figure ETM version then add base registers */ if (config & (1 << 31)) { - bcd_vers = 0x20; LOG_WARNING("ETMv2+ support is incomplete"); /* REVISIT more registers may exist; they may now be @@ -496,16 +495,21 @@ static int etm_read_reg_w_check(struct reg *reg, const struct etm_reg_info *r = etm_reg->reg_info; uint8_t reg_addr = r->addr & 0x7f; struct scan_field fields[3]; + int retval; if (etm_reg->reg_info->mode == WO) { LOG_ERROR("BUG: can't read write-only register %s", r->name); - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } LOG_DEBUG("%s (%u)", r->name, reg_addr); - arm_jtag_scann(etm_reg->jtag_info, 0x6, TAP_IDLE); - arm_jtag_set_instr(etm_reg->jtag_info, etm_reg->jtag_info->intest_instr, NULL, TAP_IDLE); + retval = arm_jtag_scann(etm_reg->jtag_info, 0x6, TAP_IDLE); + if (retval != ERROR_OK) + return retval; + retval = arm_jtag_set_instr(etm_reg->jtag_info, etm_reg->jtag_info->intest_instr, NULL, TAP_IDLE); + if (retval != ERROR_OK) + return retval; fields[0].num_bits = 32; fields[0].out_value = reg->value; @@ -577,16 +581,21 @@ static int etm_write_reg(struct reg *reg, uint32_t value) const struct etm_reg_info *r = etm_reg->reg_info; uint8_t reg_addr = r->addr & 0x7f; struct scan_field fields[3]; + int retval; if (etm_reg->reg_info->mode == RO) { LOG_ERROR("BUG: can't write read--only register %s", r->name); - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } LOG_DEBUG("%s (%u): 0x%8.8" PRIx32 "", r->name, reg_addr, value); - arm_jtag_scann(etm_reg->jtag_info, 0x6, TAP_IDLE); - arm_jtag_set_instr(etm_reg->jtag_info, etm_reg->jtag_info->intest_instr, NULL, TAP_IDLE); + retval = arm_jtag_scann(etm_reg->jtag_info, 0x6, TAP_IDLE); + if (retval != ERROR_OK) + return retval; + retval = arm_jtag_set_instr(etm_reg->jtag_info, etm_reg->jtag_info->intest_instr, NULL, TAP_IDLE); + if (retval != ERROR_OK) + return retval; fields[0].num_bits = 32; uint8_t tmp1[4]; @@ -659,7 +668,7 @@ static int etm_read_instruction(struct etm_context *ctx, struct arm_instruction ctx->current_pc - ctx->image->sections[section].base_address, 4, buf, &size_read)) != ERROR_OK) { - LOG_ERROR("error while reading instruction: %i", retval); + LOG_ERROR("error while reading instruction"); return ERROR_TRACE_INSTRUCTION_UNAVAILABLE; } opcode = target_buffer_get_u32(ctx->target, buf); @@ -672,7 +681,7 @@ static int etm_read_instruction(struct etm_context *ctx, struct arm_instruction ctx->current_pc - ctx->image->sections[section].base_address, 2, buf, &size_read)) != ERROR_OK) { - LOG_ERROR("error while reading instruction: %i", retval); + LOG_ERROR("error while reading instruction"); return ERROR_TRACE_INSTRUCTION_UNAVAILABLE; } opcode = target_buffer_get_u16(ctx->target, buf); @@ -882,6 +891,11 @@ static int etmv1_analyze_trace(struct etm_context *ctx, struct command_context * if (ctx->trace_depth == 0) ctx->capture_driver->read_trace(ctx); + if (ctx->trace_depth == 0) { + command_print(cmd_ctx, "Trace is empty."); + return ERROR_OK; + } + /* start at the beginning of the captured trace */ ctx->pipe_index = 0; ctx->data_index = 0; @@ -1182,7 +1196,7 @@ static COMMAND_HELPER(handle_etm_tracemode_command_update, else { command_print(CMD_CTX, "invalid option '%s'", CMD_ARGV[0]); - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } uint8_t context_id; @@ -1203,7 +1217,7 @@ static COMMAND_HELPER(handle_etm_tracemode_command_update, break; default: command_print(CMD_CTX, "invalid option '%s'", CMD_ARGV[1]); - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } bool etmv1_cycle_accurate; @@ -1882,7 +1896,15 @@ COMMAND_HANDLER(handle_etm_load_command) return ERROR_FAIL; } - if (file.size % 4) + int filesize; + int retval = fileio_size(&file, &filesize); + if (retval != ERROR_OK) + { + fileio_close(&file); + return retval; + } + + if (filesize % 4) { command_print(CMD_CTX, "size isn't a multiple of 4, no valid trace data"); fileio_close(&file); @@ -2086,6 +2108,7 @@ COMMAND_HANDLER(handle_etm_analyze_command) if ((retval = etmv1_analyze_trace(etm_ctx, CMD_CTX)) != ERROR_OK) { + /* FIX! error should be reported inside etmv1_analyze_trace() */ switch (retval) { case ERROR_ETM_ANALYSIS_FAILED: @@ -2098,7 +2121,7 @@ COMMAND_HANDLER(handle_etm_analyze_command) command_print(CMD_CTX, "no image available for trace analysis"); break; default: - command_print(CMD_CTX, "unknown error: %i", retval); + command_print(CMD_CTX, "unknown error"); } }