X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=c2caa311bb20aa463385baf861d86c553e395ad1;hb=0ffbc6033346d182f37b9a8ff9fa5af8d9f0ce6a;hp=523b6fa13de5481e445ab22792bcd4155a2815a4;hpb=bb37adadab7e99ce139179c1cb8322a7e1e921cb;p=openocd.git diff --git a/src/target/target.c b/src/target/target.c index 523b6fa13d..c2caa311bb 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -2128,66 +2128,70 @@ static int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char } -static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +static int parse_load_image_command_args(char **args, int argc, + image_t *image, u32 *min_address, u32 *max_address) { - u8 *buffer; - u32 buf_cnt; - u32 image_size; - u32 min_address=0; - u32 max_address=0xffffffff; - int i; - int retval, retvaltemp; - - image_t image; - - duration_t duration; - char *duration_text; - - target_t *target = get_current_target(cmd_ctx); - - if ((argc < 1)||(argc > 5)) - { + if (argc < 1 || argc > 5) return ERROR_COMMAND_SYNTAX_ERROR; - } - /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */ + /* a base address isn't always necessary, + * default to 0x0 (i.e. don't relocate) */ if (argc >= 2) { u32 addr; - retval = parse_u32(args[1], &addr); + int retval = parse_u32(args[1], &addr); if (ERROR_OK != retval) return ERROR_COMMAND_SYNTAX_ERROR; - image.base_address = addr; - image.base_address_set = 1; + image->base_address = addr; + image->base_address_set = 1; } else - { - image.base_address_set = 0; - } - + image->base_address_set = 0; - image.start_address_set = 0; + image->start_address_set = 0; - if (argc>=4) + if (argc >= 4) { - retval = parse_u32(args[3], &min_address); + int retval = parse_u32(args[3], min_address); if (ERROR_OK != retval) return ERROR_COMMAND_SYNTAX_ERROR; } - if (argc>=5) + if (argc == 5) { - retval = parse_u32(args[4], &max_address); + int retval = parse_u32(args[4], max_address); if (ERROR_OK != retval) return ERROR_COMMAND_SYNTAX_ERROR; // use size (given) to find max (required) - max_address += min_address; + *max_address += *min_address; } - if (min_address>max_address) - { + if (*min_address > *max_address) return ERROR_COMMAND_SYNTAX_ERROR; - } + return ERROR_OK; +} + +static int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + u8 *buffer; + u32 buf_cnt; + u32 image_size; + u32 min_address = 0; + u32 max_address = 0xffffffff; + int i; + int retvaltemp; + + image_t image; + + duration_t duration; + char *duration_text; + + int retval = parse_load_image_command_args(args, argc, + &image, &min_address, &max_address); + if (ERROR_OK != retval) + return retval; + + target_t *target = get_current_target(cmd_ctx); duration_start_measure(&duration); if (image_open(&image, args[0], (argc >= 3) ? args[2] : NULL) != ERROR_OK) @@ -2266,10 +2270,8 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm { fileio_t fileio; - u32 address; - u32 size; u8 buffer[560]; - int retval=ERROR_OK, retvaltemp; + int retvaltemp; duration_t duration; char *duration_text; @@ -2282,8 +2284,15 @@ static int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cm return ERROR_OK; } - address = strtoul(args[1], NULL, 0); - size = strtoul(args[2], NULL, 0); + u32 address; + int retval = parse_u32(args[1], &address); + if (ERROR_OK != retval) + return retval; + + u32 size; + retval = parse_u32(args[2], &size); + if (ERROR_OK != retval) + return retval; if (fileio_open(&fileio, args[0], FILEIO_WRITE, FILEIO_BINARY) != ERROR_OK) { @@ -2361,8 +2370,12 @@ static int handle_verify_image_command_internal(struct command_context_s *cmd_ct if (argc >= 2) { + u32 addr; + retval = parse_u32(args[1], &addr); + if (ERROR_OK != retval) + return ERROR_COMMAND_SYNTAX_ERROR; + image.base_address = addr; image.base_address_set = 1; - image.base_address = strtoul(args[1], NULL, 0); } else { @@ -2532,8 +2545,15 @@ static int handle_bp_command(struct command_context_s *cmd_ctx, return ERROR_COMMAND_SYNTAX_ERROR; } - u32 addr = strtoul(args[0], NULL, 0); - u32 length = strtoul(args[1], NULL, 0); + u32 addr; + int retval = parse_u32(args[0], &addr); + if (ERROR_OK != retval) + return retval; + + u32 length; + retval = parse_u32(args[1], &length); + if (ERROR_OK != retval) + return retval; int hw = BKPT_SOFT; if (argc == 3) @@ -2549,10 +2569,16 @@ static int handle_bp_command(struct command_context_s *cmd_ctx, static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - target_t *target = get_current_target(cmd_ctx); + if (argc != 1) + return ERROR_COMMAND_SYNTAX_ERROR; - if (argc > 0) - breakpoint_remove(target, strtoul(args[0], NULL, 0)); + u32 addr; + int retval = parse_u32(args[0], &addr); + if (ERROR_OK != retval) + return retval; + + target_t *target = get_current_target(cmd_ctx); + breakpoint_remove(target, addr); return ERROR_OK; } @@ -2560,7 +2586,6 @@ static int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char static 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) { @@ -2571,52 +2596,65 @@ static int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char command_print(cmd_ctx, "address: 0x%8.8x, len: 0x%8.8x, r/w/a: %i, value: 0x%8.8x, mask: 0x%8.8x", watchpoint->address, watchpoint->length, watchpoint->rw, watchpoint->value, watchpoint->mask); watchpoint = watchpoint->next; } + return ERROR_OK; } - else if (argc >= 2) - { - enum watchpoint_rw type = WPT_ACCESS; - u32 data_value = 0x0; - u32 data_mask = 0xffffffff; - if (argc >= 3) - { - switch(args[2][0]) - { - case 'r': - type = WPT_READ; - break; - case 'w': - type = WPT_WRITE; - break; - case 'a': - type = WPT_ACCESS; - break; - default: - command_print(cmd_ctx, "usage: wp
[r/w/a] [value] [mask]"); - return ERROR_OK; - } - } - if (argc >= 4) - { - data_value = strtoul(args[3], NULL, 0); - } - if (argc >= 5) - { - data_mask = strtoul(args[4], NULL, 0); - } + enum watchpoint_rw type = WPT_ACCESS; + u32 addr = 0; + u32 length = 0; + u32 data_value = 0x0; + u32 data_mask = 0xffffffff; + int retval; - if ((retval = watchpoint_add(target, strtoul(args[0], NULL, 0), - strtoul(args[1], NULL, 0), type, data_value, data_mask)) != ERROR_OK) + switch (argc) + { + case 5: + retval = parse_u32(args[4], &data_mask); + if (ERROR_OK != retval) + return retval; + // fall through + case 4: + retval = parse_u32(args[3], &data_value); + if (ERROR_OK != retval) + return retval; + // fall through + case 3: + switch(args[2][0]) { - LOG_ERROR("Failure setting breakpoints"); + case 'r': + type = WPT_READ; + break; + case 'w': + type = WPT_WRITE; + break; + case 'a': + type = WPT_ACCESS; + break; + default: + LOG_ERROR("invalid watchpoint mode ('%c')", args[2][0]); + return ERROR_COMMAND_SYNTAX_ERROR; } - } - else - { + // fall through + case 2: + retval = parse_u32(args[1], &length); + if (ERROR_OK != retval) + return retval; + retval = parse_u32(args[0], &addr); + if (ERROR_OK != retval) + return retval; + break; + + default: command_print(cmd_ctx, "usage: wp
[r/w/a] [value] [mask]"); + return ERROR_COMMAND_SYNTAX_ERROR; } - return ERROR_OK; + retval = watchpoint_add(target, addr, length, type, + data_value, data_mask); + if (ERROR_OK != retval) + LOG_ERROR("Failure setting watchpoints"); + + return retval; } static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) @@ -2624,8 +2662,13 @@ static int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char if (argc != 1) return ERROR_COMMAND_SYNTAX_ERROR; + u32 addr; + int retval = parse_u32(args[0], &addr); + if (ERROR_OK != retval) + return retval; + target_t *target = get_current_target(cmd_ctx); - watchpoint_remove(target, strtoul(args[0], NULL, 0)); + watchpoint_remove(target, addr); return ERROR_OK; } @@ -2643,11 +2686,14 @@ static int handle_virt2phys_command(command_context_t *cmd_ctx, if (argc != 1) return ERROR_COMMAND_SYNTAX_ERROR; - target_t *target = get_current_target(cmd_ctx); - u32 va = strtoul(args[0], NULL, 0); + u32 va; + int retval = parse_u32(args[0], &va); + if (ERROR_OK != retval) + return retval; u32 pa; - int retval = target->type->virt2phys(target, va, &pa); + target_t *target = get_current_target(cmd_ctx); + retval = target->type->virt2phys(target, va, &pa); if (retval == ERROR_OK) command_print(cmd_ctx, "Physical address 0x%08x", pa); @@ -2781,12 +2827,12 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, { return ERROR_COMMAND_SYNTAX_ERROR; } - char *end; - timeval_add_time(&timeout, strtoul(args[0], &end, 0), 0); - if (*end) - { - return ERROR_OK; - } + unsigned offset; + int retval = parse_uint(args[0], &offset); + if (ERROR_OK != retval) + return retval; + + timeval_add_time(&timeout, offset, 0); command_print(cmd_ctx, "Starting profiling. Halting and resuming the target as often as we can..."); @@ -2796,7 +2842,6 @@ static int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, return ERROR_OK; int numSamples=0; - int retval=ERROR_OK; /* hopefully it is safe to cache! We want to stop/restart as quickly as possible. */ reg_t *reg = register_get_by_name(target->reg_cache, "pc", 1); @@ -4275,45 +4320,16 @@ static int handle_fast_load_image_command(struct command_context_s *cmd_ctx, cha u32 min_address=0; u32 max_address=0xffffffff; int i; - int retval; image_t image; duration_t duration; char *duration_text; - if ((argc < 1)||(argc > 5)) - { - return ERROR_COMMAND_SYNTAX_ERROR; - } - - /* a base address isn't always necessary, default to 0x0 (i.e. don't relocate) */ - if (argc >= 2) - { - 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 (argc>=4) - { - min_address=strtoul(args[3], NULL, 0); - } - if (argc>=5) - { - max_address=strtoul(args[4], NULL, 0)+min_address; - } - - if (min_address>max_address) - { - return ERROR_COMMAND_SYNTAX_ERROR; - } + int retval = parse_load_image_command_args(args, argc, + &image, &min_address, &max_address); + if (ERROR_OK != retval) + return retval; duration_start_measure(&duration);