assert(type->init_target != NULL);
int retval = type->init_target(cmd_ctx, target);
- if (ERROR_OK != retval) {
+ if (retval != ERROR_OK) {
LOG_ERROR("target '%s' init failed", target_name(target));
return retval;
}
for (target = all_targets; target; target = target->next) {
retval = target_init_one(cmd_ctx, target);
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
}
return ERROR_OK;
retval = target_register_user_commands(cmd_ctx);
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
retval = target_register_timer_callback(&handle_target,
polling_interval, TARGET_TIMER_TYPE_PERIODIC, cmd_ctx->interp);
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
return ERROR_OK;
target_initialized = true;
retval = command_run_line(CMD_CTX, "init_targets");
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
retval = command_run_line(CMD_CTX, "init_target_events");
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
retval = command_run_line(CMD_CTX, "init_board");
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
LOG_DEBUG("Initializing targets...");
/* every 300ms we check for reset & powerdropout and issue a "reset halt" if so. */
-static int powerDropout;
-static int srstAsserted;
+static int power_dropout;
+static int srst_asserted;
-static int runPowerRestore;
-static int runPowerDropout;
-static int runSrstAsserted;
-static int runSrstDeasserted;
+static int run_power_restore;
+static int run_power_dropout;
+static int run_srst_asserted;
+static int run_srst_deasserted;
static int sense_handler(void)
{
- static int prevSrstAsserted;
- static int prevPowerdropout;
+ static int prev_srst_asserted;
+ static int prev_power_dropout;
- int retval = jtag_power_dropout(&powerDropout);
+ int retval = jtag_power_dropout(&power_dropout);
if (retval != ERROR_OK)
return retval;
- int powerRestored;
- powerRestored = prevPowerdropout && !powerDropout;
- if (powerRestored)
- runPowerRestore = 1;
+ int power_restored;
+ power_restored = prev_power_dropout && !power_dropout;
+ if (power_restored)
+ run_power_restore = 1;
int64_t current = timeval_ms();
- static int64_t lastPower;
- bool waitMore = lastPower + 2000 > current;
- if (powerDropout && !waitMore) {
- runPowerDropout = 1;
- lastPower = current;
+ static int64_t last_power;
+ bool wait_more = last_power + 2000 > current;
+ if (power_dropout && !wait_more) {
+ run_power_dropout = 1;
+ last_power = current;
}
- retval = jtag_srst_asserted(&srstAsserted);
+ retval = jtag_srst_asserted(&srst_asserted);
if (retval != ERROR_OK)
return retval;
- int srstDeasserted;
- srstDeasserted = prevSrstAsserted && !srstAsserted;
+ int srst_deasserted;
+ srst_deasserted = prev_srst_asserted && !srst_asserted;
- static int64_t lastSrst;
- waitMore = lastSrst + 2000 > current;
- if (srstDeasserted && !waitMore) {
- runSrstDeasserted = 1;
- lastSrst = current;
+ static int64_t last_srst;
+ wait_more = last_srst + 2000 > current;
+ if (srst_deasserted && !wait_more) {
+ run_srst_deasserted = 1;
+ last_srst = current;
}
- if (!prevSrstAsserted && srstAsserted)
- runSrstAsserted = 1;
+ if (!prev_srst_asserted && srst_asserted)
+ run_srst_asserted = 1;
- prevSrstAsserted = srstAsserted;
- prevPowerdropout = powerDropout;
+ prev_srst_asserted = srst_asserted;
+ prev_power_dropout = power_dropout;
- if (srstDeasserted || powerRestored) {
+ if (srst_deasserted || power_restored) {
/* Other than logging the event we can't do anything here.
* Issuing a reset is a particularly bad idea as we might
* be inside a reset already.
* clearing the flags after running these events.
*/
int did_something = 0;
- if (runSrstAsserted) {
+ if (run_srst_asserted) {
LOG_INFO("srst asserted detected, running srst_asserted proc.");
Jim_Eval(interp, "srst_asserted");
did_something = 1;
}
- if (runSrstDeasserted) {
+ if (run_srst_deasserted) {
Jim_Eval(interp, "srst_deasserted");
did_something = 1;
}
- if (runPowerDropout) {
+ if (run_power_dropout) {
LOG_INFO("Power dropout detected, running power_dropout proc.");
Jim_Eval(interp, "power_dropout");
did_something = 1;
}
- if (runPowerRestore) {
+ if (run_power_restore) {
Jim_Eval(interp, "power_restore");
did_something = 1;
}
/* clear action flags */
- runSrstAsserted = 0;
- runSrstDeasserted = 0;
- runPowerRestore = 0;
- runPowerDropout = 0;
+ run_srst_asserted = 0;
+ run_srst_deasserted = 0;
+ run_power_restore = 0;
+ run_power_dropout = 0;
recursive = 0;
}
target->backoff.count = 0;
/* only poll target if we've got power and srst isn't asserted */
- if (!powerDropout && !srstAsserted) {
+ if (!power_dropout && !srst_asserted) {
/* polling may fail silently until the target has been examined */
retval = target_poll(target);
if (retval != ERROR_OK) {
COMMAND_HANDLER(handle_reg_command)
{
- struct target *target;
- struct reg *reg = NULL;
- unsigned count = 0;
- char *value;
-
LOG_DEBUG("-");
- target = get_current_target(CMD_CTX);
+ struct target *target = get_current_target(CMD_CTX);
+ struct reg *reg = NULL;
/* list all available registers for the current target */
if (CMD_ARGC == 0) {
struct reg_cache *cache = target->reg_cache;
- count = 0;
+ unsigned int count = 0;
while (cache) {
unsigned i;
continue;
/* only print cached values if they are valid */
if (reg->valid) {
- value = buf_to_hex_str(reg->value,
+ char *value = buf_to_hex_str(reg->value,
reg->size);
command_print(CMD,
"(%i) %s (/%" PRIu32 "): 0x%s%s",
COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], num);
struct reg_cache *cache = target->reg_cache;
- count = 0;
+ unsigned int count = 0;
while (cache) {
unsigned i;
for (i = 0; i < cache->num_regs; i++) {
if ((CMD_ARGC == 2) && (strcmp(CMD_ARGV[1], "force") == 0))
reg->valid = 0;
- if (reg->valid == 0)
- reg->type->get(reg);
- value = buf_to_hex_str(reg->value, reg->size);
+ if (reg->valid == 0) {
+ int retval = reg->type->get(reg);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("Could not read register '%s'", reg->name);
+ return retval;
+ }
+ }
+ char *value = buf_to_hex_str(reg->value, reg->size);
command_print(CMD, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
free(value);
return ERROR_OK;
return ERROR_FAIL;
str_to_buf(CMD_ARGV[1], strlen(CMD_ARGV[1]), buf, reg->size, 0);
- reg->type->set(reg, buf);
-
- value = buf_to_hex_str(reg->value, reg->size);
- command_print(CMD, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
- free(value);
+ int retval = reg->type->set(reg, buf);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("Could not write to register '%s'", reg->name);
+ } else {
+ char *value = buf_to_hex_str(reg->value, reg->size);
+ command_print(CMD, "%s (/%i): 0x%s", reg->name, (int)(reg->size), value);
+ free(value);
+ }
free(buf);
- return ERROR_OK;
+ return retval;
}
return ERROR_COMMAND_SYNTAX_ERROR;
unsigned ms = DEFAULT_HALT_TIMEOUT;
if (1 == CMD_ARGC) {
int retval = parse_uint(CMD_ARGV[0], &ms);
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return ERROR_COMMAND_SYNTAX_ERROR;
}
target->verbose_halt_msg = true;
int retval = target_halt(target);
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
if (CMD_ARGC == 1) {
unsigned wait_local;
retval = parse_uint(CMD_ARGV[0], &wait_local);
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return ERROR_COMMAND_SYNTAX_ERROR;
if (!wait_local)
return ERROR_OK;
struct target *target = get_current_target(CMD_CTX);
int retval = fn(target, address, size, count, buffer);
- if (ERROR_OK == retval)
+ if (retval == ERROR_OK)
target_handle_md_output(CMD, target, address, size, count, buffer);
free(buffer);
return target_fill_mem(target, address, fn, wordsize, value, count);
}
-static COMMAND_HELPER(parse_load_image_command_CMD_ARGV, struct image *image,
+static COMMAND_HELPER(parse_load_image_command, struct image *image,
target_addr_t *min_address, target_addr_t *max_address)
{
if (CMD_ARGC < 1 || CMD_ARGC > 5)
target_addr_t max_address = -1;
struct image image;
- int retval = CALL_COMMAND_HANDLER(parse_load_image_command_CMD_ARGV,
+ int retval = CALL_COMMAND_HANDLER(parse_load_image_command,
&image, &min_address, &max_address);
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
struct target *target = get_current_target(CMD_CTX);
free(buffer);
}
- if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
+ if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
command_print(CMD, "downloaded %" PRIu32 " bytes "
"in %fs (%0.3f KiB/s)", image_size,
duration_elapsed(&bench), duration_kbps(&bench, image_size));
free(buffer);
- if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
+ if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
size_t filesize;
retval = fileio_size(fileio, &filesize);
if (retval != ERROR_OK)
done:
if (diffs > 0)
retval = ERROR_FAIL;
- if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
+ if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
command_print(CMD, "verified %" PRIu32 " bytes "
"in %fs (%0.3f KiB/s)", image_size,
duration_elapsed(&bench), duration_kbps(&bench, image_size));
if (asid == 0) {
retval = breakpoint_add(target, addr, length, hw);
/* error is always logged in breakpoint_add(), do not print it again */
- if (ERROR_OK == retval)
+ if (retval == ERROR_OK)
command_print(cmd, "breakpoint set at " TARGET_ADDR_FMT "", addr);
} else if (addr == 0) {
}
retval = context_breakpoint_add(target, asid, length, hw);
/* error is always logged in context_breakpoint_add(), do not print it again */
- if (ERROR_OK == retval)
+ if (retval == ERROR_OK)
command_print(cmd, "Context breakpoint set at 0x%8.8" PRIx32 "", asid);
} else {
}
retval = hybrid_breakpoint_add(target, addr, asid, length, hw);
/* error is always logged in hybrid_breakpoint_add(), do not print it again */
- if (ERROR_OK == retval)
+ if (retval == ERROR_OK)
command_print(cmd, "Hybrid breakpoint set at 0x%8.8" PRIx32 "", asid);
}
return retval;
int retval = watchpoint_add(target, addr, length, type,
data_value, data_mask);
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
LOG_ERROR("Failure setting watchpoints");
return retval;
return retval;
}
-static void writeData(FILE *f, const void *data, size_t len)
+static void write_data(FILE *f, const void *data, size_t len)
{
size_t written = fwrite(data, 1, len, f);
if (written != len)
LOG_ERROR("failed to write %zu bytes: %s", len, strerror(errno));
}
-static void writeLong(FILE *f, int l, struct target *target)
+static void write_long(FILE *f, int l, struct target *target)
{
uint8_t val[4];
target_buffer_set_u32(target, val, l);
- writeData(f, val, 4);
+ write_data(f, val, 4);
}
-static void writeString(FILE *f, char *s)
+static void write_string(FILE *f, char *s)
{
- writeData(f, s, strlen(s));
+ write_data(f, s, strlen(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,
+static void write_gmon(uint32_t *samples, uint32_t sample_num, const char *filename, bool with_range,
uint32_t start_address, uint32_t end_address, struct target *target, uint32_t duration_ms)
{
uint32_t i;
FILE *f = fopen(filename, "w");
if (f == NULL)
return;
- writeString(f, "gmon");
- writeLong(f, 0x00000001, target); /* Version */
- writeLong(f, 0, target); /* padding */
- writeLong(f, 0, target); /* padding */
- writeLong(f, 0, target); /* padding */
+ write_string(f, "gmon");
+ write_long(f, 0x00000001, target); /* Version */
+ write_long(f, 0, target); /* padding */
+ write_long(f, 0, target); /* padding */
+ write_long(f, 0, target); /* padding */
uint8_t zero = 0; /* GMON_TAG_TIME_HIST */
- writeData(f, &zero, 1);
+ write_data(f, &zero, 1);
/* figure out bucket size */
uint32_t min;
} else {
min = samples[0];
max = samples[0];
- for (i = 0; i < sampleNum; i++) {
+ for (i = 0; i < sample_num; i++) {
if (min > samples[i])
min = samples[i];
if (max < samples[i])
max++;
}
- int addressSpace = max - min;
- assert(addressSpace >= 2);
+ int address_space = max - min;
+ assert(address_space >= 2);
/* FIXME: What is the reasonable number of buckets?
* The profiling result will be more accurate if there are enough buckets. */
- static const uint32_t maxBuckets = 128 * 1024; /* maximum buckets. */
- uint32_t numBuckets = addressSpace / sizeof(UNIT);
- if (numBuckets > maxBuckets)
- numBuckets = maxBuckets;
- int *buckets = malloc(sizeof(int) * numBuckets);
+ static const uint32_t max_buckets = 128 * 1024; /* maximum buckets. */
+ uint32_t num_buckets = address_space / sizeof(UNIT);
+ if (num_buckets > max_buckets)
+ num_buckets = max_buckets;
+ int *buckets = malloc(sizeof(int) * num_buckets);
if (buckets == NULL) {
fclose(f);
return;
}
- memset(buckets, 0, sizeof(int) * numBuckets);
- for (i = 0; i < sampleNum; i++) {
+ memset(buckets, 0, sizeof(int) * num_buckets);
+ for (i = 0; i < sample_num; i++) {
uint32_t address = samples[i];
if ((address < min) || (max <= address))
continue;
long long a = address - min;
- long long b = numBuckets;
- long long c = addressSpace;
+ long long b = num_buckets;
+ long long c = address_space;
int index_t = (a * b) / c; /* danger!!!! int32 overflows */
buckets[index_t]++;
}
/* append binary memory gmon.out &profile_hist_hdr ((char*)&profile_hist_hdr + sizeof(struct gmon_hist_hdr)) */
- writeLong(f, min, target); /* low_pc */
- writeLong(f, max, target); /* high_pc */
- writeLong(f, numBuckets, target); /* # of buckets */
- float sample_rate = sampleNum / (duration_ms / 1000.0);
- writeLong(f, sample_rate, target);
- writeString(f, "seconds");
+ write_long(f, min, target); /* low_pc */
+ write_long(f, max, target); /* high_pc */
+ write_long(f, num_buckets, target); /* # of buckets */
+ float sample_rate = sample_num / (duration_ms / 1000.0);
+ write_long(f, sample_rate, target);
+ write_string(f, "seconds");
for (i = 0; i < (15-strlen("seconds")); i++)
- writeData(f, &zero, 1);
- writeString(f, "s");
+ write_data(f, &zero, 1);
+ write_string(f, "s");
/*append binary memory gmon.out profile_hist_data (profile_hist_data + profile_hist_hdr.hist_size) */
- char *data = malloc(2 * numBuckets);
+ char *data = malloc(2 * num_buckets);
if (data != NULL) {
- for (i = 0; i < numBuckets; i++) {
+ for (i = 0; i < num_buckets; i++) {
int val;
val = buckets[i];
if (val > 65535)
data[i * 2 + 1] = (val >> 8) & 0xff;
}
free(buckets);
- writeData(f, data, numBuckets * 2);
+ write_data(f, data, num_buckets * 2);
free(data);
} else
free(buckets);
return retval;
}
-static int new_int_array_element(Jim_Interp *interp, const char *varname, int idx, uint32_t val)
+static int new_u64_array_element(Jim_Interp *interp, const char *varname, int idx, uint64_t val)
{
char *namebuf;
- Jim_Obj *nameObjPtr, *valObjPtr;
+ Jim_Obj *obj_name, *obj_val;
int result;
namebuf = alloc_printf("%s(%d)", varname, idx);
if (!namebuf)
return JIM_ERR;
- nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
- valObjPtr = Jim_NewIntObj(interp, val);
- if (!nameObjPtr || !valObjPtr) {
+ obj_name = Jim_NewStringObj(interp, namebuf, -1);
+ jim_wide wide_val = val;
+ obj_val = Jim_NewWideObj(interp, wide_val);
+ if (!obj_name || !obj_val) {
free(namebuf);
return JIM_ERR;
}
- Jim_IncrRefCount(nameObjPtr);
- Jim_IncrRefCount(valObjPtr);
- result = Jim_SetVariable(interp, nameObjPtr, valObjPtr);
- Jim_DecrRefCount(interp, nameObjPtr);
- Jim_DecrRefCount(interp, valObjPtr);
+ Jim_IncrRefCount(obj_name);
+ Jim_IncrRefCount(obj_val);
+ result = Jim_SetVariable(interp, obj_name, obj_val);
+ Jim_DecrRefCount(interp, obj_name);
+ Jim_DecrRefCount(interp, obj_val);
free(namebuf);
/* printf("%s(%d) <= 0%08x\n", varname, idx, val); */
return result;
static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, Jim_Obj *const *argv)
{
- long l;
- uint32_t width;
- int len;
- uint32_t addr;
- uint32_t count;
- uint32_t v;
- const char *varname;
- const char *phys;
- bool is_phys;
- int n, e, retval;
- uint32_t i;
+ int e;
- /* argv[1] = name of array to receive the data
- * argv[2] = desired width
- * argv[3] = memory address
- * argv[4] = count of times to read
+ /* argv[0] = name of array to receive the data
+ * argv[1] = desired element width in bits
+ * argv[2] = memory address
+ * argv[3] = count of times to read
+ * argv[4] = optional "phys"
*/
-
if (argc < 4 || argc > 5) {
Jim_WrongNumArgs(interp, 0, argv, "varname width addr nelems [phys]");
return JIM_ERR;
}
- varname = Jim_GetString(argv[0], &len);
- /* given "foo" get space for worse case "foo(%d)" .. add 20 */
+ /* Arg 0: Name of the array variable */
+ const char *varname = Jim_GetString(argv[0], NULL);
+
+ /* Arg 1: Bit width of one element */
+ long l;
e = Jim_GetLong(interp, argv[1], &l);
- width = l;
if (e != JIM_OK)
return e;
+ const unsigned int width_bits = l;
- e = Jim_GetLong(interp, argv[2], &l);
- addr = l;
+ if (width_bits != 8 &&
+ width_bits != 16 &&
+ width_bits != 32 &&
+ width_bits != 64) {
+ Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings(interp, Jim_GetResult(interp),
+ "Invalid width param. Must be one of: 8, 16, 32 or 64.", NULL);
+ return JIM_ERR;
+ }
+ const unsigned int width = width_bits / 8;
+
+ /* Arg 2: Memory address */
+ jim_wide wide_addr;
+ e = Jim_GetWide(interp, argv[2], &wide_addr);
if (e != JIM_OK)
return e;
+ target_addr_t addr = (target_addr_t)wide_addr;
+
+ /* Arg 3: Number of elements to read */
e = Jim_GetLong(interp, argv[3], &l);
- len = l;
if (e != JIM_OK)
return e;
- is_phys = false;
+ size_t len = l;
+
+ /* Arg 4: phys */
+ bool is_phys = false;
if (argc > 4) {
- phys = Jim_GetString(argv[4], &n);
- if (!strncmp(phys, "phys", n))
+ int str_len = 0;
+ const char *phys = Jim_GetString(argv[4], &str_len);
+ if (!strncmp(phys, "phys", str_len))
is_phys = true;
else
return JIM_ERR;
}
- switch (width) {
- case 8:
- width = 1;
- break;
- case 16:
- width = 2;
- break;
- case 32:
- width = 4;
- break;
- default:
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "Invalid width param, must be 8/16/32", NULL);
- return JIM_ERR;
- }
+
+ /* Argument checks */
if (len == 0) {
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: zero width read?", NULL);
Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: addr + len - wraps to zero?", NULL);
return JIM_ERR;
}
- /* absurd transfer size? */
if (len > 65536) {
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: absurd > 64K item request", NULL);
+ Jim_AppendStrings(interp, Jim_GetResult(interp),
+ "mem2array: too large read request, exceeds 64K items", NULL);
return JIM_ERR;
}
if ((width == 1) ||
((width == 2) && ((addr & 1) == 0)) ||
- ((width == 4) && ((addr & 3) == 0))) {
- /* all is well */
+ ((width == 4) && ((addr & 3) == 0)) ||
+ ((width == 8) && ((addr & 7) == 0))) {
+ /* alignment correct */
} else {
char buf[100];
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- sprintf(buf, "mem2array address: 0x%08" PRIx32 " is not aligned for %" PRIu32 " byte reads",
+ sprintf(buf, "mem2array address: " TARGET_ADDR_FMT " is not aligned for %" PRIu32 " byte reads",
addr,
width);
Jim_AppendStrings(interp, Jim_GetResult(interp), buf, NULL);
/* Transfer loop */
/* index counter */
- n = 0;
+ size_t idx = 0;
- size_t buffersize = 4096;
+ const size_t buffersize = 4096;
uint8_t *buffer = malloc(buffersize);
if (buffer == NULL)
return JIM_ERR;
e = JIM_OK;
while (len) {
/* Slurp... in buffer size chunks */
+ const unsigned int max_chunk_len = buffersize / width;
+ const size_t chunk_len = MIN(len, max_chunk_len); /* in elements.. */
- count = len; /* in objects.. */
- if (count > (buffersize / width))
- count = (buffersize / width);
-
+ int retval;
if (is_phys)
- retval = target_read_phys_memory(target, addr, width, count, buffer);
+ retval = target_read_phys_memory(target, addr, width, chunk_len, buffer);
else
- retval = target_read_memory(target, addr, width, count, buffer);
+ retval = target_read_memory(target, addr, width, chunk_len, buffer);
if (retval != ERROR_OK) {
/* BOO !*/
- LOG_ERROR("mem2array: Read @ 0x%08" PRIx32 ", w=%" PRIu32 ", cnt=%" PRIu32 ", failed",
+ LOG_ERROR("mem2array: Read @ " TARGET_ADDR_FMT ", w=%u, cnt=%zu, failed",
addr,
width,
- count);
+ chunk_len);
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
e = JIM_ERR;
break;
} else {
- v = 0; /* shut up gcc */
- for (i = 0; i < count ; i++, n++) {
+ for (size_t i = 0; i < chunk_len ; i++, idx++) {
+ uint64_t v = 0;
switch (width) {
+ case 8:
+ v = target_buffer_get_u64(target, &buffer[i*width]);
+ break;
case 4:
v = target_buffer_get_u32(target, &buffer[i*width]);
break;
v = buffer[i] & 0x0ff;
break;
}
- new_int_array_element(interp, varname, n, v);
+ new_u64_array_element(interp, varname, idx, v);
}
- len -= count;
- addr += count * width;
+ len -= chunk_len;
+ addr += chunk_len * width;
}
}
return e;
}
-static int get_int_array_element(Jim_Interp *interp, const char *varname, int idx, uint32_t *val)
+static int get_u64_array_element(Jim_Interp *interp, const char *varname, size_t idx, uint64_t *val)
{
- char *namebuf;
- Jim_Obj *nameObjPtr, *valObjPtr;
- int result;
- long l;
-
- namebuf = alloc_printf("%s(%d)", varname, idx);
+ char *namebuf = alloc_printf("%s(%zu)", varname, idx);
if (!namebuf)
return JIM_ERR;
- nameObjPtr = Jim_NewStringObj(interp, namebuf, -1);
- if (!nameObjPtr) {
+ Jim_Obj *obj_name = Jim_NewStringObj(interp, namebuf, -1);
+ if (!obj_name) {
free(namebuf);
return JIM_ERR;
}
- Jim_IncrRefCount(nameObjPtr);
- valObjPtr = Jim_GetVariable(interp, nameObjPtr, JIM_ERRMSG);
- Jim_DecrRefCount(interp, nameObjPtr);
+ Jim_IncrRefCount(obj_name);
+ Jim_Obj *obj_val = Jim_GetVariable(interp, obj_name, JIM_ERRMSG);
+ Jim_DecrRefCount(interp, obj_name);
free(namebuf);
- if (valObjPtr == NULL)
+ if (obj_val == NULL)
return JIM_ERR;
- result = Jim_GetLong(interp, valObjPtr, &l);
- /* printf("%s(%d) => 0%08x\n", varname, idx, val); */
- *val = l;
+ jim_wide wide_val;
+ int result = Jim_GetWide(interp, obj_val, &wide_val);
+ *val = wide_val;
return result;
}
static int target_array2mem(Jim_Interp *interp, struct target *target,
int argc, Jim_Obj *const *argv)
{
- long l;
- uint32_t width;
- int len;
- uint32_t addr;
- uint32_t count;
- uint32_t v;
- const char *varname;
- const char *phys;
- bool is_phys;
- int n, e, retval;
- uint32_t i;
+ int e;
- /* argv[1] = name of array to get the data
- * argv[2] = desired width
- * argv[3] = memory address
- * argv[4] = count to write
+ /* argv[0] = name of array from which to read the data
+ * argv[1] = desired element width in bits
+ * argv[2] = memory address
+ * argv[3] = number of elements to write
+ * argv[4] = optional "phys"
*/
if (argc < 4 || argc > 5) {
Jim_WrongNumArgs(interp, 0, argv, "varname width addr nelems [phys]");
return JIM_ERR;
}
- varname = Jim_GetString(argv[0], &len);
- /* given "foo" get space for worse case "foo(%d)" .. add 20 */
+ /* Arg 0: Name of the array variable */
+ const char *varname = Jim_GetString(argv[0], NULL);
+
+ /* Arg 1: Bit width of one element */
+ long l;
e = Jim_GetLong(interp, argv[1], &l);
- width = l;
if (e != JIM_OK)
return e;
+ const unsigned int width_bits = l;
+
+ if (width_bits != 8 &&
+ width_bits != 16 &&
+ width_bits != 32 &&
+ width_bits != 64) {
+ Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
+ Jim_AppendStrings(interp, Jim_GetResult(interp),
+ "Invalid width param. Must be one of: 8, 16, 32 or 64.", NULL);
+ return JIM_ERR;
+ }
+ const unsigned int width = width_bits / 8;
- e = Jim_GetLong(interp, argv[2], &l);
- addr = l;
+ /* Arg 2: Memory address */
+ jim_wide wide_addr;
+ e = Jim_GetWide(interp, argv[2], &wide_addr);
if (e != JIM_OK)
return e;
+ target_addr_t addr = (target_addr_t)wide_addr;
+
+ /* Arg 3: Number of elements to write */
e = Jim_GetLong(interp, argv[3], &l);
- len = l;
if (e != JIM_OK)
return e;
- is_phys = false;
+ size_t len = l;
+
+ /* Arg 4: Phys */
+ bool is_phys = false;
if (argc > 4) {
- phys = Jim_GetString(argv[4], &n);
- if (!strncmp(phys, "phys", n))
+ int str_len = 0;
+ const char *phys = Jim_GetString(argv[4], &str_len);
+ if (!strncmp(phys, "phys", str_len))
is_phys = true;
else
return JIM_ERR;
}
- switch (width) {
- case 8:
- width = 1;
- break;
- case 16:
- width = 2;
- break;
- case 32:
- width = 4;
- break;
- default:
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "Invalid width param, must be 8/16/32", NULL);
- return JIM_ERR;
- }
+
+ /* Argument checks */
if (len == 0) {
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
Jim_AppendStrings(interp, Jim_GetResult(interp),
"array2mem: zero width read?", NULL);
return JIM_ERR;
}
+
if ((addr + (len * width)) < addr) {
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
Jim_AppendStrings(interp, Jim_GetResult(interp),
"array2mem: addr + len - wraps to zero?", NULL);
return JIM_ERR;
}
- /* absurd transfer size? */
+
if (len > 65536) {
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
Jim_AppendStrings(interp, Jim_GetResult(interp),
- "array2mem: absurd > 64K item request", NULL);
+ "array2mem: too large memory write request, exceeds 64K items", NULL);
return JIM_ERR;
}
if ((width == 1) ||
((width == 2) && ((addr & 1) == 0)) ||
- ((width == 4) && ((addr & 3) == 0))) {
- /* all is well */
+ ((width == 4) && ((addr & 3) == 0)) ||
+ ((width == 8) && ((addr & 7) == 0))) {
+ /* alignment correct */
} else {
char buf[100];
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- sprintf(buf, "array2mem address: 0x%08" PRIx32 " is not aligned for %" PRIu32 " byte reads",
+ sprintf(buf, "array2mem address: " TARGET_ADDR_FMT " is not aligned for %" PRIu32 " byte reads",
addr,
width);
Jim_AppendStrings(interp, Jim_GetResult(interp), buf, NULL);
/* Transfer loop */
- /* index counter */
- n = 0;
/* assume ok */
e = JIM_OK;
- size_t buffersize = 4096;
+ const size_t buffersize = 4096;
uint8_t *buffer = malloc(buffersize);
if (buffer == NULL)
return JIM_ERR;
+ /* index counter */
+ size_t idx = 0;
+
while (len) {
/* Slurp... in buffer size chunks */
+ const unsigned int max_chunk_len = buffersize / width;
- count = len; /* in objects.. */
- if (count > (buffersize / width))
- count = (buffersize / width);
+ const size_t chunk_len = MIN(len, max_chunk_len); /* in elements.. */
- v = 0; /* shut up gcc */
- for (i = 0; i < count; i++, n++) {
- get_int_array_element(interp, varname, n, &v);
+ /* Fill the buffer */
+ for (size_t i = 0; i < chunk_len; i++, idx++) {
+ uint64_t v = 0;
+ if (get_u64_array_element(interp, varname, idx, &v) != JIM_OK) {
+ free(buffer);
+ return JIM_ERR;
+ }
switch (width) {
+ case 8:
+ target_buffer_set_u64(target, &buffer[i * width], v);
+ break;
case 4:
target_buffer_set_u32(target, &buffer[i * width], v);
break;
break;
}
}
- len -= count;
+ len -= chunk_len;
+ /* Write the buffer to memory */
+ int retval;
if (is_phys)
- retval = target_write_phys_memory(target, addr, width, count, buffer);
+ retval = target_write_phys_memory(target, addr, width, chunk_len, buffer);
else
- retval = target_write_memory(target, addr, width, count, buffer);
+ retval = target_write_memory(target, addr, width, chunk_len, buffer);
if (retval != ERROR_OK) {
/* BOO !*/
- LOG_ERROR("array2mem: Write @ 0x%08" PRIx32 ", w=%" PRIu32 ", cnt=%" PRIu32 ", failed",
+ LOG_ERROR("array2mem: Write @ " TARGET_ADDR_FMT ", w=%u, cnt=%zu, failed",
addr,
width,
- count);
+ chunk_len);
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: cannot read memory", NULL);
e = JIM_ERR;
break;
}
- addr += count * width;
+ addr += chunk_len * width;
}
free(buffer);
e = target_wait_state(target, n->value, a);
if (e != ERROR_OK) {
- Jim_Obj *eObj = Jim_NewIntObj(interp, e);
+ Jim_Obj *obj = Jim_NewIntObj(interp, e);
Jim_SetResultFormatted(goi.interp,
"target: %s wait %s fails (%#s) %s",
target_name(target), n->name,
- eObj, target_strerror_safe(e));
+ obj, target_strerror_safe(e));
return JIM_ERR;
}
return JIM_OK;
/* create the target specific commands */
if (target->type->commands) {
e = register_commands(cmd_ctx, NULL, target->type->commands);
- if (ERROR_OK != e)
+ if (e != ERROR_OK)
LOG_ERROR("unable to register '%s' commands", cp);
}
COMMAND_REGISTRATION_DONE
};
-struct FastLoad {
+struct fast_load {
target_addr_t address;
uint8_t *data;
int length;
};
static int fastload_num;
-static struct FastLoad *fastload;
+static struct fast_load *fastload;
static void free_fastload(void)
{
struct image image;
- int retval = CALL_COMMAND_HANDLER(parse_load_image_command_CMD_ARGV,
+ int retval = CALL_COMMAND_HANDLER(parse_load_image_command,
&image, &min_address, &max_address);
- if (ERROR_OK != retval)
+ if (retval != ERROR_OK)
return retval;
struct duration bench;
image_size = 0x0;
retval = ERROR_OK;
fastload_num = image.num_sections;
- fastload = malloc(sizeof(struct FastLoad)*image.num_sections);
+ fastload = malloc(sizeof(struct fast_load)*image.num_sections);
if (fastload == NULL) {
command_print(CMD, "out of memory");
image_close(&image);
return ERROR_FAIL;
}
- memset(fastload, 0, sizeof(struct FastLoad)*image.num_sections);
+ memset(fastload, 0, sizeof(struct fast_load)*image.num_sections);
for (unsigned int i = 0; i < image.num_sections; i++) {
buffer = malloc(image.sections[i].size);
if (buffer == NULL) {
free(buffer);
}
- if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
+ if ((retval == ERROR_OK) && (duration_measure(&bench) == ERROR_OK)) {
command_print(CMD, "Loaded %" PRIu32 " bytes "
"in %fs (%0.3f KiB/s)", image_size,
duration_elapsed(&bench), duration_kbps(&bench, image_size));