X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=9f12704a5c2c767c2b8afe179458cc2eba289e5a;hb=25e7a69e266b7c848af3c88f5743c88120d28d0f;hp=92411c8c2399cf77681c5013022aff04dae4a554;hpb=c7384117c66e8f18896ca09ab8095d6da16bb1e5;p=openocd.git diff --git a/src/target/target.c b/src/target/target.c index 92411c8c23..9f12704a5c 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -863,6 +863,8 @@ int target_run_flash_async_algorithm(struct target *target, int retval; int timeout = 0; + const uint8_t *buffer_orig = buffer; + /* Set up working area. First word is write pointer, second word is read pointer, * rest is fifo data area. */ uint32_t wp_addr = buffer_start; @@ -903,7 +905,8 @@ int target_run_flash_async_algorithm(struct target *target, break; } - LOG_DEBUG("count 0x%" PRIx32 " wp 0x%" PRIx32 " rp 0x%" PRIx32, count, wp, rp); + LOG_DEBUG("offs 0x%zx count 0x%" PRIx32 " wp 0x%" PRIx32 " rp 0x%" PRIx32, + (size_t) (buffer - buffer_orig), count, wp, rp); if (rp == 0) { LOG_ERROR("flash write algorithm aborted by target"); @@ -1816,7 +1819,7 @@ static int target_profiling_default(struct target *target, uint32_t *samples, for (;;) { target_poll(target); if (target->state == TARGET_HALTED) { - uint32_t t = *((uint32_t *)reg->value); + uint32_t t = buf_get_u32(reg->value, 0, 32); samples[sample_count++] = t; /* current pc, addr = 0, do not handle breakpoints, not debugging */ retval = target_resume(target, 1, 0, 0, 0); @@ -2422,7 +2425,13 @@ static int handle_target(void *priv) if (target->backoff.times > 0) { LOG_USER("Polling target %s succeeded again, trying to reexamine", target_name(target)); target_reset_examined(target); - target_examine_one(target); + retval = target_examine_one(target); + /* Target examination could have failed due to unstable connection, + * but we set the examined flag anyway to repoll it later */ + if (retval != ERROR_OK) { + target->examined = true; + return retval; + } } target->backoff.times = 0; @@ -3301,9 +3310,10 @@ static int handle_bp_command_set(struct command_context *cmd_ctx, uint32_t addr, uint32_t asid, uint32_t length, int hw) { struct target *target = get_current_target(cmd_ctx); + int retval; if (asid == 0) { - int retval = breakpoint_add(target, addr, length, hw); + retval = breakpoint_add(target, addr, length, hw); if (ERROR_OK == retval) command_print(cmd_ctx, "breakpoint set at 0x%8.8" PRIx32 "", addr); else { @@ -3311,7 +3321,11 @@ static int handle_bp_command_set(struct command_context *cmd_ctx, return retval; } } else if (addr == 0) { - int retval = context_breakpoint_add(target, asid, length, hw); + if (target->type->add_context_breakpoint == NULL) { + LOG_WARNING("Context breakpoint not available"); + return ERROR_OK; + } + retval = context_breakpoint_add(target, asid, length, hw); if (ERROR_OK == retval) command_print(cmd_ctx, "Context breakpoint set at 0x%8.8" PRIx32 "", asid); else { @@ -3319,7 +3333,11 @@ static int handle_bp_command_set(struct command_context *cmd_ctx, return retval; } } else { - int retval = hybrid_breakpoint_add(target, addr, asid, length, hw); + if (target->type->add_hybrid_breakpoint == NULL) { + LOG_WARNING("Hybrid breakpoint not available"); + return ERROR_OK; + } + retval = hybrid_breakpoint_add(target, addr, asid, length, hw); if (ERROR_OK == retval) command_print(cmd_ctx, "Hybrid breakpoint set at 0x%8.8" PRIx32 "", asid); else { @@ -3502,14 +3520,12 @@ static void writeData(FILE *f, const void *data, size_t len) LOG_ERROR("failed to write %zu bytes: %s", len, strerror(errno)); } -static void writeLong(FILE *f, int l) +static void writeLong(FILE *f, int l, struct target *target) { - int i; - for (i = 0; i < 4; i++) { - char c = (l >> (i*8))&0xff; - writeData(f, &c, 1); - } + uint8_t val[4]; + target_buffer_set_u32(target, val, l); + writeData(f, val, 4); } static void writeString(FILE *f, char *s) @@ -3520,18 +3536,18 @@ static void writeString(FILE *f, char *s) typedef unsigned char UNIT[2]; /* unit of profiling */ /* Dump a gmon.out histogram file. */ -static void write_gmon(uint32_t *samples, uint32_t sampleNum, const char *filename, - bool with_range, uint32_t start_address, uint32_t end_address) +static void write_gmon(uint32_t *samples, uint32_t sampleNum, const char *filename, bool with_range, + uint32_t start_address, uint32_t end_address, struct target *target) { uint32_t i; FILE *f = fopen(filename, "w"); if (f == NULL) return; writeString(f, "gmon"); - writeLong(f, 0x00000001); /* Version */ - writeLong(f, 0); /* padding */ - writeLong(f, 0); /* padding */ - writeLong(f, 0); /* padding */ + writeLong(f, 0x00000001, target); /* Version */ + writeLong(f, 0, target); /* padding */ + writeLong(f, 0, target); /* padding */ + writeLong(f, 0, target); /* padding */ uint8_t zero = 0; /* GMON_TAG_TIME_HIST */ writeData(f, &zero, 1); @@ -3586,10 +3602,10 @@ static void write_gmon(uint32_t *samples, uint32_t sampleNum, const char *filena } /* append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr)) */ - writeLong(f, min); /* low_pc */ - writeLong(f, max); /* high_pc */ - writeLong(f, numBuckets); /* # of buckets */ - writeLong(f, 100); /* KLUDGE! We lie, ca. 100Hz best case. */ + writeLong(f, min, target); /* low_pc */ + writeLong(f, max, target); /* high_pc */ + writeLong(f, numBuckets, target); /* # of buckets */ + writeLong(f, 100, target); /* KLUDGE! We lie, ca. 100Hz best case. */ writeString(f, "seconds"); for (i = 0; i < (15-strlen("seconds")); i++) writeData(f, &zero, 1); @@ -3681,7 +3697,7 @@ COMMAND_HANDLER(handle_profile_command) } write_gmon(samples, num_of_samples, CMD_ARGV[1], - with_range, start_address, end_address); + with_range, start_address, end_address, target); command_print(CMD_CTX, "Wrote %s", CMD_ARGV[1]); free(samples); @@ -4112,7 +4128,6 @@ enum target_cfg_param { TCFG_WORK_AREA_SIZE, TCFG_WORK_AREA_BACKUP, TCFG_ENDIAN, - TCFG_VARIANT, TCFG_COREID, TCFG_CHAIN_POSITION, TCFG_DBGBASE, @@ -4127,7 +4142,6 @@ static Jim_Nvp nvp_config_opts[] = { { .name = "-work-area-size", .value = TCFG_WORK_AREA_SIZE }, { .name = "-work-area-backup", .value = TCFG_WORK_AREA_BACKUP }, { .name = "-endian" , .value = TCFG_ENDIAN }, - { .name = "-variant", .value = TCFG_VARIANT }, { .name = "-coreid", .value = TCFG_COREID }, { .name = "-chain-position", .value = TCFG_CHAIN_POSITION }, { .name = "-dbgbase", .value = TCFG_DBGBASE }, @@ -4140,7 +4154,6 @@ static int target_configure(Jim_GetOptInfo *goi, struct target *target) Jim_Nvp *n; Jim_Obj *o; jim_wide w; - char *cp; int e; /* parse config or cget options ... */ @@ -4349,27 +4362,6 @@ no_params: /* loop for more */ break; - case TCFG_VARIANT: - if (goi->isconfigure) { - if (goi->argc < 1) { - Jim_SetResultFormatted(goi->interp, - "%s ?STRING?", - n->name); - return JIM_ERR; - } - e = Jim_GetOpt_String(goi, &cp, NULL); - if (e != JIM_OK) - return e; - free(target->variant); - target->variant = strdup(cp); - } else { - if (goi->argc != 0) - goto no_params; - } - Jim_SetResultString(goi->interp, target->variant, -1); - /* loop for more */ - break; - case TCFG_COREID: if (goi->isconfigure) { e = Jim_GetOpt_Wide(goi, &w); @@ -5182,10 +5174,6 @@ static int target_create(Jim_GetOptInfo *goi) target->endianness = TARGET_LITTLE_ENDIAN; } - /* incase variant is not set */ - if (!target->variant) - target->variant = strdup(""); - cp = Jim_GetString(new_cmd, NULL); target->cmd_name = strdup(cp);