X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Fetm.c;h=ef21511d9cd9cdd12cefe75265edad3e17ad5d65;hp=4acc041f396769348dbd236e582d517c43938043;hb=56504fdd7353732525e34f1e3fbd44346588f979;hpb=e86dee32004d750e8654fe449bfcdffaed7339fa diff --git a/src/target/etm.c b/src/target/etm.c index 4acc041f39..ef21511d9c 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -21,26 +21,12 @@ #include "config.h" #endif -#include - #include "etm.h" #include "etb.h" - -#include "armv4_5.h" +#include "image.h" #include "arm7_9_common.h" #include "arm_disassembler.h" -#include "arm_simulator.h" - -#include "log.h" -#include "arm_jtag.h" -#include "types.h" -#include "binarybuffer.h" -#include "target.h" -#include "register.h" -#include "jtag.h" -#include "fileio.h" -#include /* ETM register access functionality * @@ -280,6 +266,7 @@ int etm_setup(target_t *target) arm7_9_common_t *arm7_9 = armv4_5->arch_info; etm_context_t *etm_ctx = arm7_9->etm_ctx; reg_t *etm_ctrl_reg = &arm7_9->etm_ctx->reg_cache->reg_list[ETM_CTRL]; + /* initialize some ETM control register settings */ etm_get_reg(etm_ctrl_reg); etm_ctrl_value = buf_get_u32(etm_ctrl_reg->value, 0, etm_ctrl_reg->size); @@ -309,6 +296,7 @@ int etm_setup(target_t *target) int etm_get_reg(reg_t *reg) { int retval; + if ((retval = etm_read_reg(reg)) != ERROR_OK) { LOG_ERROR("BUG: error scheduling etm register read"); @@ -339,42 +327,28 @@ int etm_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask) fields[0].tap = etm_reg->jtag_info->tap; fields[0].num_bits = 32; fields[0].out_value = reg->value; - fields[0].in_value = NULL; - - - fields[0].in_handler = NULL; - fields[1].tap = etm_reg->jtag_info->tap; fields[1].num_bits = 7; fields[1].out_value = malloc(1); buf_set_u32(fields[1].out_value, 0, 7, reg_addr); - fields[1].in_value = NULL; - - - fields[1].in_handler = NULL; - fields[2].tap = etm_reg->jtag_info->tap; fields[2].num_bits = 1; fields[2].out_value = malloc(1); buf_set_u32(fields[2].out_value, 0, 1, 0); - fields[2].in_value = NULL; - - - fields[2].in_handler = NULL; - jtag_add_dr_scan(3, fields, TAP_INVALID); fields[0].in_value = reg->value; - jtag_set_check_value(fields+0, check_value, check_mask, NULL); jtag_add_dr_scan(3, fields, TAP_INVALID); + jtag_check_value_mask(fields+0, check_value, check_mask); + free(fields[1].out_value); free(fields[2].out_value); @@ -389,6 +363,7 @@ int etm_read_reg(reg_t *reg) int etm_set_reg(reg_t *reg, u32 value) { int retval; + if ((retval = etm_write_reg(reg, value)) != ERROR_OK) { LOG_ERROR("BUG: error scheduling etm register write"); @@ -405,6 +380,7 @@ int etm_set_reg(reg_t *reg, u32 value) int etm_set_reg_w_exec(reg_t *reg, u8 *buf) { int retval; + etm_set_reg(reg, buf_get_u32(buf, 0, reg->size)); if ((retval = jtag_execute_queue()) != ERROR_OK) @@ -431,34 +407,22 @@ int etm_write_reg(reg_t *reg, u32 value) fields[0].num_bits = 32; fields[0].out_value = malloc(4); buf_set_u32(fields[0].out_value, 0, 32, value); - + fields[0].in_value = NULL; - - - fields[0].in_handler = NULL; - fields[1].tap = etm_reg->jtag_info->tap; fields[1].num_bits = 7; fields[1].out_value = malloc(1); buf_set_u32(fields[1].out_value, 0, 7, reg_addr); - + fields[1].in_value = NULL; - - - fields[1].in_handler = NULL; - fields[2].tap = etm_reg->jtag_info->tap; fields[2].num_bits = 1; fields[2].out_value = malloc(1); buf_set_u32(fields[2].out_value, 0, 1, 1); - + fields[2].in_value = NULL; - - - fields[2].in_handler = NULL; - jtag_add_dr_scan(3, fields, TAP_INVALID); @@ -993,7 +957,7 @@ static int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd { if (((instruction.type == ARM_B) || (instruction.type == ARM_BL) || - (instruction.type == ARM_BLX)) && + (instruction.type == ARM_BLX)) && (instruction.info.b_bl_bx_blx.target_address != 0xffffffff)) { next_pc = instruction.info.b_bl_bx_blx.target_address; @@ -1659,7 +1623,7 @@ static int handle_etm_load_command(struct command_context_s *cmd_ctx, char *cmd, fileio_read_u32(&file, &etm_ctx->trace_depth); etm_ctx->trace_data = malloc(sizeof(etmv1_trace_data_t) * etm_ctx->trace_depth); - if(etm_ctx->trace_data == NULL) + if (etm_ctx->trace_data == NULL) { command_print(cmd_ctx, "not enough memory to perform operation"); fileio_close(&file); @@ -1827,7 +1791,7 @@ static int handle_etm_analyze_command(struct command_context_s *cmd_ctx, char *c if ((retval = etmv1_analyze_trace(etm_ctx, cmd_ctx)) != ERROR_OK) { - switch(retval) + switch (retval) { case ERROR_ETM_ANALYSIS_FAILED: command_print(cmd_ctx, "further analysis failed (corrupted trace data or just end of data");