#include <string.h>
#include <stdlib.h>
+#include <inttypes.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time_support.h>
+#include <fileio.h>
+#include <image.h>
+
int cli_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv);
int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-int handle_load_binary_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-int handle_dump_binary_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
extern target_type_t arm9tdmi_target;
extern target_type_t arm920t_target;
extern target_type_t arm966e_target;
+extern target_type_t arm926ejs_target;
+extern target_type_t xscale_target;
+extern target_type_t cortexm3_target;
target_type_t *target_types[] =
{
&arm920t_target,
&arm720t_target,
&arm966e_target,
+ &arm926ejs_target,
+ &xscale_target,
+ &cortexm3_target,
NULL,
};
if ((event == TARGET_EVENT_HALTED) && (target->reset_script))
{
+ target_unregister_event_callback(target_init_handler, priv);
+
script = fopen(target->reset_script, "r");
if (!script)
{
fclose(script);
jtag_execute_queue();
-
- target_unregister_event_callback(target_init_handler, priv);
}
return ERROR_OK;
{
int retval = ERROR_OK;
target_t *target;
-
+
+ /* prepare reset_halt where necessary */
+ target = targets;
+ while (target)
+ {
+ switch (target->reset_mode)
+ {
+ case RESET_HALT:
+ case RESET_INIT:
+ target->type->prepare_reset_halt(target);
+ break;
+ default:
+ break;
+ }
+ target = target->next;
+ }
+
target = targets;
while (target)
{
{
if ((retval = target->type->write_memory(target, address, 1, size, buffer)) != ERROR_OK)
return retval;
+ return ERROR_OK;
}
/* handle unaligned head bytes */
{
if ((retval = target->type->read_memory(target, address, 1, size, buffer)) != ERROR_OK)
return retval;
+ return ERROR_OK;
}
/* handle unaligned head bytes */
return ERROR_OK;
}
-void target_read_u32(struct target_s *target, u32 address, u32 *value)
+int target_read_u32(struct target_s *target, u32 address, u32 *value)
{
u8 value_buf[4];
+
+ int retval = target->type->read_memory(target, address, 4, 1, value_buf);
- target->type->read_memory(target, address, 4, 1, value_buf);
+ if (retval == ERROR_OK)
+ {
+ *value = target_buffer_get_u32(target, value_buf);
+ DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, *value);
+ }
+ else
+ {
+ *value = 0x0;
+ DEBUG("address: 0x%8.8x failed", address);
+ }
- *value = target_buffer_get_u32(target, value_buf);
+ return retval;
}
-void target_read_u16(struct target_s *target, u32 address, u16 *value)
+int target_read_u16(struct target_s *target, u32 address, u16 *value)
{
u8 value_buf[2];
- target->type->read_memory(target, address, 2, 1, value_buf);
+ int retval = target->type->read_memory(target, address, 2, 1, value_buf);
- *value = target_buffer_get_u16(target, value_buf);
+ if (retval == ERROR_OK)
+ {
+ *value = target_buffer_get_u16(target, value_buf);
+ DEBUG("address: 0x%8.8x, value: 0x%4.4x", address, *value);
+ }
+ else
+ {
+ *value = 0x0;
+ DEBUG("address: 0x%8.8x failed", address);
+ }
+
+ return retval;
}
-void target_read_u8(struct target_s *target, u32 address, u8 *value)
+int target_read_u8(struct target_s *target, u32 address, u8 *value)
{
- target->type->read_memory(target, address, 1, 1, value);
+ int retval = target->type->read_memory(target, address, 1, 1, value);
+
+ if (retval == ERROR_OK)
+ {
+ DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, *value);
+ }
+ else
+ {
+ *value = 0x0;
+ DEBUG("address: 0x%8.8x failed", address);
+ }
+
+ return retval;
}
-void target_write_u32(struct target_s *target, u32 address, u32 value)
+int target_write_u32(struct target_s *target, u32 address, u32 value)
{
+ int retval;
u8 value_buf[4];
+ DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
+
target_buffer_set_u32(target, value_buf, value);
- target->type->write_memory(target, address, 4, 1, value_buf);
+ if ((retval = target->type->write_memory(target, address, 4, 1, value_buf)) != ERROR_OK)
+ {
+ DEBUG("failed: %i", retval);
+ }
+
+ return retval;
}
-void target_write_u16(struct target_s *target, u32 address, u16 value)
+int target_write_u16(struct target_s *target, u32 address, u16 value)
{
+ int retval;
u8 value_buf[2];
+ DEBUG("address: 0x%8.8x, value: 0x%8.8x", address, value);
+
target_buffer_set_u16(target, value_buf, value);
- target->type->write_memory(target, address, 2, 1, value_buf);
+ if ((retval = target->type->write_memory(target, address, 2, 1, value_buf)) != ERROR_OK)
+ {
+ DEBUG("failed: %i", retval);
+ }
+
+ return retval;
}
-void target_write_u8(struct target_s *target, u32 address, u8 value)
+int target_write_u8(struct target_s *target, u32 address, u8 value)
{
- target->type->read_memory(target, address, 1, 1, &value);
+ int retval;
+
+ DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, value);
+
+ if ((retval = target->type->read_memory(target, address, 1, 1, &value)) != ERROR_OK)
+ {
+ DEBUG("failed: %i", retval);
+ }
+
+ return retval;
}
int target_register_user_commands(struct command_context_s *cmd_ctx)
{
register_command(cmd_ctx, NULL, "reg", handle_reg_command, COMMAND_EXEC, NULL);
register_command(cmd_ctx, NULL, "poll", handle_poll_command, COMMAND_EXEC, "poll target state");
- register_command(cmd_ctx, NULL, "wait_halt", handle_wait_halt_command, COMMAND_EXEC, "wait for target halt");
+ register_command(cmd_ctx, NULL, "wait_halt", handle_wait_halt_command, COMMAND_EXEC, "wait for target halt [time (s)]");
register_command(cmd_ctx, NULL, "halt", handle_halt_command, COMMAND_EXEC, "halt target");
register_command(cmd_ctx, NULL, "resume", handle_resume_command, COMMAND_EXEC, "resume target [addr]");
register_command(cmd_ctx, NULL, "step", handle_step_command, COMMAND_EXEC, "step one instruction");
register_command(cmd_ctx, NULL, "wp", handle_wp_command, COMMAND_EXEC, "set watchpoint <address> <length> <r/w/a> [value] [mask]");
register_command(cmd_ctx, NULL, "rwp", handle_rwp_command, COMMAND_EXEC, "remove watchpoint <adress>");
- register_command(cmd_ctx, NULL, "load_binary", handle_load_binary_command, COMMAND_EXEC, "load binary <file> <address>");
- register_command(cmd_ctx, NULL, "dump_binary", handle_dump_binary_command, COMMAND_EXEC, "dump binary <file> <address> <size>");
+ register_command(cmd_ctx, NULL, "load_image", handle_load_image_command, COMMAND_EXEC, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19']");
+ register_command(cmd_ctx, NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image <file> <address> <size>");
+ register_command(cmd_ctx, NULL, "load_binary", handle_load_image_command, COMMAND_EXEC, "[DEPRECATED] load_binary <file> <address>");
+ register_command(cmd_ctx, NULL, "dump_binary", handle_dump_image_command, COMMAND_EXEC, "[DEPRECATED] dump_binary <file> <address> <size>");
return ERROR_OK;
}
(*last_target_p)->working_areas = NULL;
(*last_target_p)->backup_working_area = 0;
- (*last_target_p)->endianness = TARGET_LITTLE_ENDIAN;
(*last_target_p)->state = TARGET_UNKNOWN;
(*last_target_p)->reg_cache = NULL;
(*last_target_p)->breakpoints = NULL;
int count = 0;
char *value;
- DEBUG("");
+ DEBUG("-");
target = get_current_target(cmd_ctx);
struct timeval timeout, now;
gettimeofday(&timeout, NULL);
- timeval_add_time(&timeout, 5, 0);
+ if (!argc)
+ timeval_add_time(&timeout, 5, 0);
+ else {
+ char *end;
+
+ timeval_add_time(&timeout, strtoul(args[0], &end, 0), 0);
+ if (*end) {
+ command_print(cmd_ctx, "usage: wait_halt [seconds]");
+ return ERROR_OK;
+ }
+ }
command_print(cmd_ctx, "waiting for target halted...");
int retval;
target_t *target = get_current_target(cmd_ctx);
- DEBUG("");
+ DEBUG("-");
command_print(cmd_ctx, "requesting target halt...");
target_t *target = get_current_target(cmd_ctx);
enum target_reset_mode reset_mode = RESET_RUN;
- DEBUG("");
+ DEBUG("-");
if (argc >= 1)
{
int retval;
target_t *target = get_current_target(cmd_ctx);
- DEBUG("");
+ DEBUG("-");
if (argc == 0)
retval = target->type->resume(target, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
{
target_t *target = get_current_target(cmd_ctx);
- DEBUG("");
+ DEBUG("-");
if (argc == 0)
target->type->step(target, 1, 0, 1); /* current pc, addr = 0, handle breakpoints */
}
-int handle_load_binary_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- FILE *binary;
- u32 address;
- struct stat binary_stat;
- u32 binary_size;
-
u8 *buffer;
u32 buf_cnt;
+ u32 image_size;
+ int i;
+ int retval;
+
+ image_t image;
+
+ duration_t duration;
+ char *duration_text;
- struct timeval start, end, duration;
-
target_t *target = get_current_target(cmd_ctx);
- if (argc != 2)
+ if (argc < 1)
{
- command_print(cmd_ctx, "usage: load_binary <filename> <address>");
+ command_print(cmd_ctx, "usage: load_image <filename> [address] [type]");
return ERROR_OK;
}
-
- address = strtoul(args[1], NULL, 0);
-
- if (stat(args[0], &binary_stat) == -1)
+
+ /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */
+ if (argc >= 2)
{
- ERROR("couldn't stat() %s: %s", args[0], strerror(errno));
- command_print(cmd_ctx, "error accessing file %s", args[0]);
- return ERROR_OK;
+ image.base_address_set = 1;
+ image.base_address = strtoul(args[1], NULL, 0);
+ }
+ else
+ {
+ image.base_address_set = 0;
}
+
+ image.start_address_set = 0;
- if (!(binary = fopen(args[0], "rb")))
+ duration_start_measure(&duration);
+
+ if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK)
{
- ERROR("couldn't open %s: %s", args[0], strerror(errno));
- command_print(cmd_ctx, "error accessing file %s", args[0]);
+ command_print(cmd_ctx, "load_image error: %s", image.error_str);
return ERROR_OK;
}
- buffer = malloc(128 * 1024);
-
- gettimeofday(&start, NULL);
-
- binary_size = binary_stat.st_size;
- while (binary_size > 0)
+ image_size = 0x0;
+ for (i = 0; i < image.num_sections; i++)
{
- buf_cnt = fread(buffer, 1, 128*1024, binary);
- target_write_buffer(target, address, buf_cnt, buffer);
- address += buf_cnt;
- binary_size -= buf_cnt;
+ buffer = malloc(image.sections[i].size);
+ if ((retval = image_read_section(&image, i, 0x0, image.sections[i].size, buffer, &buf_cnt)) != ERROR_OK)
+ {
+ ERROR("image_read_section failed with error code: %i", retval);
+ command_print(cmd_ctx, "image reading failed, download aborted");
+ free(buffer);
+ image_close(&image);
+ return ERROR_OK;
+ }
+ target_write_buffer(target, image.sections[i].base_address, buf_cnt, buffer);
+ image_size += buf_cnt;
+ command_print(cmd_ctx, "%u byte written at address 0x%8.8x", buf_cnt, image.sections[i].base_address);
+
+ free(buffer);
}
- gettimeofday(&end, NULL);
-
- free(buffer);
+ duration_stop_measure(&duration, &duration_text);
+ command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text);
+ free(duration_text);
- timeval_subtract(&duration, &end, &start);
- command_print(cmd_ctx, "downloaded %lli byte in %is %ius", (long long) binary_stat.st_size, duration.tv_sec, duration.tv_usec);
-
- fclose(binary);
+ image_close(&image);
return ERROR_OK;
}
-int handle_dump_binary_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
- FILE *binary;
+ fileio_t fileio;
+
u32 address;
u32 size;
u8 buffer[560];
- struct timeval start, end, duration;
+ duration_t duration;
+ char *duration_text;
target_t *target = get_current_target(cmd_ctx);
if (argc != 3)
{
- command_print(cmd_ctx, "usage: dump_binary <filename> <address> <size>");
+ command_print(cmd_ctx, "usage: dump_image <filename> <address> <size>");
return ERROR_OK;
}
address = strtoul(args[1], NULL, 0);
size = strtoul(args[2], NULL, 0);
- if (!(binary = fopen(args[0], "wb")))
+ if ((address & 3) || (size & 3))
{
- ERROR("couldn't open %s for writing: %s", args[0], strerror(errno));
- command_print(cmd_ctx, "error accessing file %s", args[0]);
+ command_print(cmd_ctx, "only 32-bit aligned address and size are supported");
return ERROR_OK;
}
-
- if ((address & 3) || (size & 3))
+
+ if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK)
{
- command_print(cmd_ctx, "only 32-bit aligned address and size are supported");
+ command_print(cmd_ctx, "dump_image error: %s", fileio.error_str);
return ERROR_OK;
}
-
- gettimeofday(&start, NULL);
+
+ duration_start_measure(&duration);
while (size > 0)
{
+ u32 size_written;
u32 this_run_size = (size > 560) ? 560 : size;
+
target->type->read_memory(target, address, 4, this_run_size / 4, buffer);
- fwrite(buffer, 1, this_run_size, binary);
+ fileio_write(&fileio, this_run_size, buffer, &size_written);
+
size -= this_run_size;
address += this_run_size;
}
- fclose(binary);
-
- gettimeofday(&end, NULL);
+ fileio_close(&fileio);
- timeval_subtract(&duration, &end, &start);
- command_print(cmd_ctx, "dumped %i byte in %is %ius", strtoul(args[2], NULL, 0), duration.tv_sec, duration.tv_usec);
+ duration_stop_measure(&duration, &duration_text);
+ command_print(cmd_ctx, "dumped %"PRIi64" byte in %s", fileio.size, duration_text);
+ free(duration_text);
return ERROR_OK;
int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
+ int retval;
if (argc == 0)
{
{
data_mask = strtoul(args[4], NULL, 0);
}
- watchpoint_add(target, strtoul(args[0], NULL, 0), strtoul(args[1], NULL, 0), type, data_value, data_mask);
+
+ if ((retval = watchpoint_add(target, strtoul(args[0], NULL, 0),
+ strtoul(args[1], NULL, 0), type, data_value, data_mask)) != ERROR_OK)
+ {
+ switch (retval)
+ {
+ case ERROR_TARGET_NOT_HALTED:
+ command_print(cmd_ctx, "target must be halted to set watchpoints");
+ break;
+ case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
+ command_print(cmd_ctx, "no more watchpoints available");
+ break;
+ default:
+ command_print(cmd_ctx, "unknown error, watchpoint not set");
+ break;
+ }
+ }
}
else
{