X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=c2408b27c584436320f2434f1ead3ad220ea5a6e;hb=fd43be07265b5f3cf3146f2bb80c1c2fc0a44fcf;hp=6f458bcebe63d378a3cda378a5c1957a84798a4a;hpb=2eacb8fdfb4ea761acc3a3fbb51d048fefccd9b6;p=openocd.git diff --git a/src/target/target.c b/src/target/target.c index 6f458bcebe..c2408b27c5 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -3310,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 { @@ -3320,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 { @@ -3328,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 { @@ -3511,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) @@ -3529,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); @@ -3595,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); @@ -3690,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);