X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Fetm.c;h=afea12b3b8c898ced9e577eb456b8100b85b8708;hp=0b8a8f5f10856249f043655b241ae298aadcc501;hb=c1ee650a9aead0bd25d7aa37fd65e5a3ed0c6e38;hpb=02f3765351c9e25185b745b84f1a2604fb2149c7 diff --git a/src/target/etm.c b/src/target/etm.c index 0b8a8f5f10..afea12b3b8 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -223,7 +223,6 @@ reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_co etm_reg_t *arch_info = NULL; int num_regs = sizeof(etm_reg_arch_info)/sizeof(int); int i; - u32 etm_ctrl_value; /* register a register arch-type for etm registers only once */ if (etm_reg_arch_type == -1) @@ -256,21 +255,6 @@ reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_co arch_info[i].jtag_info = jtag_info; } - /* initialize some ETM control register settings */ - etm_get_reg(®_list[ETM_CTRL]); - etm_ctrl_value = buf_get_u32(reg_list[ETM_CTRL].value, 0, reg_list[ETM_CTRL].size); - - /* clear the ETM powerdown bit (0) */ - etm_ctrl_value &= ~0x1; - - /* configure port width (6:4), mode (17:16) and clocking (13) */ - etm_ctrl_value = (etm_ctrl_value & - ~ETM_PORT_WIDTH_MASK & ~ETM_PORT_MODE_MASK & ~ETM_PORT_CLOCK_MASK) - | etm_ctx->portmode; - - buf_set_u32(reg_list[ETM_CTRL].value, 0, reg_list[ETM_CTRL].size, etm_ctrl_value); - etm_store_reg(®_list[ETM_CTRL]); - /* the ETM might have an ETB connected */ if (strcmp(etm_ctx->capture_driver->name, "etb") == 0) { @@ -278,7 +262,7 @@ reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_co if (!etb) { - ERROR("etb selected as etm capture driver, but no ETB configured"); + LOG_ERROR("etb selected as etm capture driver, but no ETB configured"); return ERROR_OK; } @@ -287,26 +271,55 @@ reg_cache_t* etm_build_reg_cache(target_t *target, arm_jtag_t *jtag_info, etm_co etb->reg_cache = reg_cache->next; } - if (etm_ctx->capture_driver->init(etm_ctx) != ERROR_OK) - { - ERROR("ETM capture driver initialization failed"); - exit(-1); - } return reg_cache; } +int etm_setup(target_t *target) +{ + int retval; + u32 etm_ctrl_value; + armv4_5_common_t *armv4_5 = target->arch_info; + 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); + + /* clear the ETM powerdown bit (0) */ + etm_ctrl_value &= ~0x1; + + /* configure port width (6:4), mode (17:16) and clocking (13) */ + etm_ctrl_value = (etm_ctrl_value & + ~ETM_PORT_WIDTH_MASK & ~ETM_PORT_MODE_MASK & ~ETM_PORT_CLOCK_MASK) + | etm_ctx->portmode; + + buf_set_u32(etm_ctrl_reg->value, 0, etm_ctrl_reg->size, etm_ctrl_value); + etm_store_reg(etm_ctrl_reg); + + if ((retval=jtag_execute_queue())!=ERROR_OK) + return retval; + + if ((retval=etm_ctx->capture_driver->init(etm_ctx)) != ERROR_OK) + { + LOG_ERROR("ETM capture driver initialization failed"); + return retval; + } + return ERROR_OK; +} + int etm_get_reg(reg_t *reg) { if (etm_read_reg(reg) != ERROR_OK) { - ERROR("BUG: error scheduling etm register read"); + LOG_ERROR("BUG: error scheduling etm register read"); exit(-1); } if (jtag_execute_queue() != ERROR_OK) { - ERROR("register read failed"); + LOG_ERROR("register read failed"); } return ERROR_OK; @@ -318,7 +331,7 @@ int etm_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask) u8 reg_addr = etm_reg->addr & 0x7f; scan_field_t fields[3]; - DEBUG("%i", etm_reg->addr); + LOG_DEBUG("%i", etm_reg->addr); jtag_add_end_state(TAP_RTI); arm_jtag_scann(etm_reg->jtag_info, 0x6); @@ -356,13 +369,12 @@ int etm_read_reg_w_check(reg_t *reg, u8* check_value, u8* check_mask) fields[2].in_handler = NULL; fields[2].in_handler_priv = NULL; - jtag_add_dr_scan(3, fields, -1, NULL); + jtag_add_dr_scan(3, fields, -1); fields[0].in_value = reg->value; - fields[0].in_check_value = check_value; - fields[0].in_check_mask = check_mask; + jtag_set_check_value(fields+0, check_value, check_mask, NULL); - jtag_add_dr_scan(3, fields, -1, NULL); + jtag_add_dr_scan(3, fields, -1); free(fields[1].out_value); free(fields[2].out_value); @@ -379,7 +391,7 @@ int etm_set_reg(reg_t *reg, u32 value) { if (etm_write_reg(reg, value) != ERROR_OK) { - ERROR("BUG: error scheduling etm register write"); + LOG_ERROR("BUG: error scheduling etm register write"); exit(-1); } @@ -396,7 +408,7 @@ int etm_set_reg_w_exec(reg_t *reg, u8 *buf) if (jtag_execute_queue() != ERROR_OK) { - ERROR("register write failed"); + LOG_ERROR("register write failed"); exit(-1); } return ERROR_OK; @@ -408,7 +420,7 @@ int etm_write_reg(reg_t *reg, u32 value) u8 reg_addr = etm_reg->addr & 0x7f; scan_field_t fields[3]; - DEBUG("%i: 0x%8.8x", etm_reg->addr, value); + LOG_DEBUG("%i: 0x%8.8x", etm_reg->addr, value); jtag_add_end_state(TAP_RTI); arm_jtag_scann(etm_reg->jtag_info, 0x6); @@ -447,7 +459,7 @@ int etm_write_reg(reg_t *reg, u32 value) fields[2].in_handler = NULL; fields[2].in_handler_priv = NULL; - jtag_add_dr_scan(3, fields, -1, NULL); + jtag_add_dr_scan(3, fields, -1); free(fields[0].out_value); free(fields[1].out_value); @@ -527,7 +539,7 @@ int etm_read_instruction(etm_context_t *ctx, arm_instruction_t *instruction) ctx->current_pc - ctx->image->sections[section].base_address, 4, buf, &size_read)) != ERROR_OK) { - ERROR("error while reading instruction: %i", retval); + LOG_ERROR("error while reading instruction: %i", retval); return ERROR_TRACE_INSTRUCTION_UNAVAILABLE; } opcode = target_buffer_get_u32(ctx->target, buf); @@ -540,7 +552,7 @@ int etm_read_instruction(etm_context_t *ctx, arm_instruction_t *instruction) ctx->current_pc - ctx->image->sections[section].base_address, 2, buf, &size_read)) != ERROR_OK) { - ERROR("error while reading instruction: %i", retval); + LOG_ERROR("error while reading instruction: %i", retval); return ERROR_TRACE_INSTRUCTION_UNAVAILABLE; } opcode = target_buffer_get_u16(ctx->target, buf); @@ -548,12 +560,12 @@ int etm_read_instruction(etm_context_t *ctx, arm_instruction_t *instruction) } else if (ctx->core_state == ARMV4_5_STATE_JAZELLE) { - ERROR("BUG: tracing of jazelle code not supported"); + LOG_ERROR("BUG: tracing of jazelle code not supported"); exit(-1); } else { - ERROR("BUG: unknown core state encountered"); + LOG_ERROR("BUG: unknown core state encountered"); exit(-1); } @@ -724,13 +736,18 @@ int etmv1_data(etm_context_t *ctx, int size, u32 *data) } if (size == 8) - ERROR("TODO: add support for 64-bit values"); + { + LOG_ERROR("TODO: add support for 64-bit values"); + return -1; + } else if (size == 4) *data = target_buffer_get_u32(ctx->target, buf); else if (size == 2) *data = target_buffer_get_u16(ctx->target, buf); else if (size == 1) *data = buf[0]; + else + return -1; return 0; } @@ -804,7 +821,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) /* a positive return values means the current branch was abandoned, * and a new branch was encountered in cycle ctx->pipe_index + retval; */ - WARNING("abandoned branch encountered, correctnes of analysis uncertain"); + LOG_WARNING("abandoned branch encountered, correctnes of analysis uncertain"); ctx->pipe_index += retval; continue; } @@ -849,7 +866,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) } break; default: /* reserved */ - ERROR("BUG: branch reason code 0x%x is reserved", ctx->last_branch_reason); + LOG_ERROR("BUG: branch reason code 0x%x is reserved", ctx->last_branch_reason); exit(-1); break; } @@ -1219,7 +1236,7 @@ int handle_etm_config_command(struct command_context_s *cmd_ctx, char *cmd, char if (argc != 5) { - ERROR("incomplete 'etm config ' command"); + LOG_ERROR("incomplete 'etm config ' command"); exit(-1); } @@ -1227,7 +1244,7 @@ int handle_etm_config_command(struct command_context_s *cmd_ctx, char *cmd, char if (!target) { - ERROR("target number '%s' not defined", args[0]); + LOG_ERROR("target number '%s' not defined", args[0]); exit(-1); } @@ -1305,7 +1322,7 @@ int handle_etm_config_command(struct command_context_s *cmd_ctx, char *cmd, char { /* no supported capture driver found, don't register an ETM */ free(etm_ctx); - ERROR("trace capture driver '%s' not found", args[4]); + LOG_ERROR("trace capture driver '%s' not found", args[4]); return ERROR_OK; } @@ -1388,6 +1405,9 @@ int handle_etm_info_command(struct command_context_s *cmd_ctx, char *cmd, char * case 2: max_port_size = 16; break; + default: + LOG_ERROR("Illegal max_port_size"); + exit(-1); } command_print(cmd_ctx, "max. port size: %i", max_port_size); @@ -1506,7 +1526,6 @@ int handle_etm_image_command(struct command_context_s *cmd_ctx, char *cmd, char if (image_open(etm_ctx->image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK) { - command_print(cmd_ctx, "image opening error: %s", etm_ctx->image->error_str); free(etm_ctx->image); etm_ctx->image = NULL; return ERROR_OK; @@ -1563,7 +1582,6 @@ int handle_etm_dump_command(struct command_context_s *cmd_ctx, char *cmd, char * if (fileio_open(&file, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK) { - command_print(cmd_ctx, "file open error: %s", file.error_str); return ERROR_OK; } @@ -1621,19 +1639,20 @@ int handle_etm_load_command(struct command_context_s *cmd_ctx, char *cmd, char * if (fileio_open(&file, args[0], FILEIO_READ, FILEIO_BINARY) != ERROR_OK) { - command_print(cmd_ctx, "file open error: %s", file.error_str); return ERROR_OK; } if (file.size % 4) { command_print(cmd_ctx, "size isn't a multiple of 4, no valid trace data"); + fileio_close(&file); return ERROR_OK; } if (etm_ctx->trace_depth > 0) { free(etm_ctx->trace_data); + etm_ctx->trace_data = NULL; } fileio_read_u32(&file, &etm_ctx->capture_status); @@ -1642,6 +1661,12 @@ int handle_etm_load_command(struct command_context_s *cmd_ctx, char *cmd, char * 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) + { + command_print(cmd_ctx, "not enough memory to perform operation"); + fileio_close(&file); + return ERROR_OK; + } for (i = 0; i < etm_ctx->trace_depth; i++) {