X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Fetm.c;h=6a00c23a8b5600674ec85988272188bcdc5aea8c;hp=e99c24ffbec36f1bdf8e64f1665ae7ac8b6f0c84;hb=a851b91c4c1db76dd1e26a7d1a99124ad456b020;hpb=08d4411b59dd8bd0e7d8009003b71d23acbf6eee diff --git a/src/target/etm.c b/src/target/etm.c index e99c24ffbe..6a00c23a8b 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -13,9 +13,7 @@ * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * + * along with this program. If not, see . * ***************************************************************************/ #ifdef HAVE_CONFIG_H #include "config.h" @@ -67,7 +65,7 @@ struct etm_reg_info { uint8_t size; /* low-N of 32 bits */ uint8_t mode; /* RO, WO, RW */ uint8_t bcd_vers; /* 1.0, 2.0, etc */ - char *name; + const char *name; }; /* @@ -144,6 +142,7 @@ static const struct etm_reg_info etm_addr_comp[] = { ADDR_COMPARATOR(14), ADDR_COMPARATOR(15), ADDR_COMPARATOR(16), + { 0, 0, 0, 0, NULL } #undef ADDR_COMPARATOR }; @@ -162,6 +161,7 @@ static const struct etm_reg_info etm_data_comp[] = { DATA_COMPARATOR(6), DATA_COMPARATOR(7), DATA_COMPARATOR(8), + { 0, 0, 0, 0, NULL } #undef DATA_COMPARATOR }; @@ -179,6 +179,7 @@ static const struct etm_reg_info etm_counters[] = { ETM_COUNTER(2), ETM_COUNTER(3), ETM_COUNTER(4), + { 0, 0, 0, 0, NULL } #undef ETM_COUNTER }; @@ -206,6 +207,7 @@ static const struct etm_reg_info etm_outputs[] = { ETM_OUTPUT(2), ETM_OUTPUT(3), ETM_OUTPUT(4), + { 0, 0, 0, 0, NULL } #undef ETM_OUTPUT }; @@ -265,6 +267,11 @@ static void etm_reg_add(unsigned bcd_vers, struct arm_jtag *jtag_info, * version of the ETM, to the specified cache. */ for (; nreg--; r++) { + /* No more registers to add */ + if (!r->size) { + LOG_ERROR("etm_reg_add is requested to add non-existing registers, ETM config might be bogus"); + return; + } /* this ETM may be too old to have some registers */ if (r->bcd_vers > bcd_vers) @@ -309,7 +316,7 @@ struct reg_cache *etm_build_reg_cache(struct target *target, etm_core, 1); etm_get_reg(reg_list); - etm_ctx->config = buf_get_u32((void *)&arch_info->value, 0, 32); + etm_ctx->config = buf_get_u32(arch_info->value, 0, 32); config = etm_ctx->config; /* figure ETM version then add base registers */ @@ -325,7 +332,7 @@ struct reg_cache *etm_build_reg_cache(struct target *target, etm_core + 1, 1); etm_get_reg(reg_list + 1); etm_ctx->id = buf_get_u32( - (void *)&arch_info[1].value, 0, 32); + arch_info[1].value, 0, 32); LOG_DEBUG("ETM ID: %08x", (unsigned) etm_ctx->id); bcd_vers = 0x10 + (((etm_ctx->id) >> 4) & 0xff); @@ -506,7 +513,7 @@ static int etm_read_reg_w_check(struct reg *reg, 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, + retval = arm_jtag_set_instr(etm_reg->jtag_info->tap, etm_reg->jtag_info->intest_instr, NULL, TAP_IDLE); @@ -593,7 +600,7 @@ static int etm_write_reg(struct reg *reg, uint32_t value) 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, + retval = arm_jtag_set_instr(etm_reg->jtag_info->tap, etm_reg->jtag_info->intest_instr, NULL, TAP_IDLE); @@ -922,7 +929,7 @@ static int etmv1_analyze_trace(struct etm_context *ctx, struct command_context * * and a new branch was encountered in cycle ctx->pipe_index + retval; */ LOG_WARNING( - "abandoned branch encountered, correctnes of analysis uncertain"); + "abandoned branch encountered, correctness of analysis uncertain"); ctx->pipe_index += retval; continue; } @@ -981,12 +988,12 @@ static int etmv1_analyze_trace(struct etm_context *ctx, struct command_context * /* if we got here the branch was a normal PC change * (or a periodic synchronization point, which means the same for that matter) - * if we didn't accquire a complete PC continue with the next cycle + * if we didn't acquire a complete PC continue with the next cycle */ if (!ctx->pc_ok) continue; - /* indirect branch to the exception vector means an exception occured */ + /* indirect branch to the exception vector means an exception occurred */ if ((ctx->last_branch <= 0x20) || ((ctx->last_branch >= 0xffff0000) && (ctx->last_branch <= 0xffff0020))) { @@ -1015,7 +1022,7 @@ static int etmv1_analyze_trace(struct etm_context *ctx, struct command_context * return retval; else if (retval == ERROR_TRACE_INSTRUCTION_UNAVAILABLE) { /* TODO: handle incomplete images - * for now we just quit the analsysis*/ + * for now we just quit the analysis*/ return retval; } } @@ -1186,7 +1193,7 @@ static COMMAND_HELPER(handle_etm_tracemode_command_update, /* IGNORED: * - CPRT tracing (coprocessor register transfers) * - debug request (causes debug entry on trigger) - * - stall on FIFOFULL (preventing tracedata lossage) + * - stall on FIFOFULL (preventing tracedata loss) */ *mode = tracemode; @@ -1338,7 +1345,7 @@ COMMAND_HANDLER(handle_etm_config_command) * check whether our setting "took". * * - The "clock" and "mode" bits are interpreted differently. - * See ARM IHI 0014O table 2-17 for the old behavior, and + * See ARM IHI 0014O table 2-17 for the old behaviour, and * table 2-18 for the new. With ETB it's best to specify * "normal full" ... */ @@ -1692,7 +1699,7 @@ COMMAND_HANDLER(handle_etm_image_command) COMMAND_HANDLER(handle_etm_dump_command) { - struct fileio file; + struct fileio *file; struct target *target; struct arm *arm; struct etm_context *etm_ctx; @@ -1732,24 +1739,24 @@ COMMAND_HANDLER(handle_etm_dump_command) if (fileio_open(&file, CMD_ARGV[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK) return ERROR_FAIL; - fileio_write_u32(&file, etm_ctx->capture_status); - fileio_write_u32(&file, etm_ctx->control); - fileio_write_u32(&file, etm_ctx->trace_depth); + fileio_write_u32(file, etm_ctx->capture_status); + fileio_write_u32(file, etm_ctx->control); + fileio_write_u32(file, etm_ctx->trace_depth); for (i = 0; i < etm_ctx->trace_depth; i++) { - fileio_write_u32(&file, etm_ctx->trace_data[i].pipestat); - fileio_write_u32(&file, etm_ctx->trace_data[i].packet); - fileio_write_u32(&file, etm_ctx->trace_data[i].flags); + fileio_write_u32(file, etm_ctx->trace_data[i].pipestat); + fileio_write_u32(file, etm_ctx->trace_data[i].packet); + fileio_write_u32(file, etm_ctx->trace_data[i].flags); } - fileio_close(&file); + fileio_close(file); return ERROR_OK; } COMMAND_HANDLER(handle_etm_load_command) { - struct fileio file; + struct fileio *file; struct target *target; struct arm *arm; struct etm_context *etm_ctx; @@ -1779,16 +1786,16 @@ COMMAND_HANDLER(handle_etm_load_command) if (fileio_open(&file, CMD_ARGV[0], FILEIO_READ, FILEIO_BINARY) != ERROR_OK) return ERROR_FAIL; - int filesize; - int retval = fileio_size(&file, &filesize); + size_t filesize; + int retval = fileio_size(file, &filesize); if (retval != ERROR_OK) { - fileio_close(&file); + 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); + fileio_close(file); return ERROR_FAIL; } @@ -1799,28 +1806,28 @@ COMMAND_HANDLER(handle_etm_load_command) { uint32_t tmp; - fileio_read_u32(&file, &tmp); etm_ctx->capture_status = tmp; - fileio_read_u32(&file, &tmp); etm_ctx->control = tmp; - fileio_read_u32(&file, &etm_ctx->trace_depth); + fileio_read_u32(file, &tmp); etm_ctx->capture_status = tmp; + fileio_read_u32(file, &tmp); etm_ctx->control = tmp; + fileio_read_u32(file, &etm_ctx->trace_depth); } etm_ctx->trace_data = malloc(sizeof(struct etmv1_trace_data) * etm_ctx->trace_depth); if (etm_ctx->trace_data == NULL) { command_print(CMD_CTX, "not enough memory to perform operation"); - fileio_close(&file); + fileio_close(file); return ERROR_FAIL; } for (i = 0; i < etm_ctx->trace_depth; i++) { uint32_t pipestat, packet, flags; - fileio_read_u32(&file, &pipestat); - fileio_read_u32(&file, &packet); - fileio_read_u32(&file, &flags); + fileio_read_u32(file, &pipestat); + fileio_read_u32(file, &packet); + fileio_read_u32(file, &flags); etm_ctx->trace_data[i].pipestat = pipestat & 0xff; etm_ctx->trace_data[i].packet = packet & 0xffff; etm_ctx->trace_data[i].flags = flags; } - fileio_close(&file); + fileio_close(file); return ERROR_OK; } @@ -2017,7 +2024,7 @@ const struct command_registration etm_command_handlers[] = { { .name = "etm", .mode = COMMAND_ANY, - .help = "Emebdded Trace Macrocell command group", + .help = "Embedded Trace Macrocell command group", .usage = "", .chain = etm_config_command_handlers, },