From 0a3b6213bbb8b9b3edaec944610eec48d213a81e Mon Sep 17 00:00:00 2001 From: oharboe Date: Mon, 13 Oct 2008 06:52:05 +0000 Subject: [PATCH] Laurentiu Cocanu - Added additional error checks mostly to src/target/target.c git-svn-id: svn://svn.berlios.de/openocd/trunk@1041 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/helper/time_support.c | 4 +- src/helper/time_support.h | 2 +- src/target/breakpoints.c | 8 +-- src/target/breakpoints.h | 4 +- src/target/image.c | 4 +- src/target/image.h | 2 +- src/target/target.c | 135 ++++++++++++++++++++++++++++---------- src/target/target.h | 4 +- 8 files changed, 110 insertions(+), 53 deletions(-) diff --git a/src/helper/time_support.c b/src/helper/time_support.c index b8ad45cbb..6968ab7d2 100644 --- a/src/helper/time_support.c +++ b/src/helper/time_support.c @@ -89,11 +89,9 @@ int timeval_add_time(struct timeval *result, int sec, int usec) return 0; } -int duration_start_measure(duration_t *duration) +void duration_start_measure(duration_t *duration) { gettimeofday(&duration->start, NULL); - - return ERROR_OK; } int duration_stop_measure(duration_t *duration, char **text) diff --git a/src/helper/time_support.h b/src/helper/time_support.h index 8594eb226..c7b8b4041 100644 --- a/src/helper/time_support.h +++ b/src/helper/time_support.h @@ -49,7 +49,7 @@ typedef struct duration_s struct timeval duration; } duration_t; -extern int duration_start_measure(duration_t *duration); +extern void duration_start_measure(duration_t *duration); extern int duration_stop_measure(duration_t *duration, char **text); #endif /* TIME_SUPPORT_H */ diff --git a/src/target/breakpoints.c b/src/target/breakpoints.c index 4a949cca7..c73d1f9aa 100644 --- a/src/target/breakpoints.c +++ b/src/target/breakpoints.c @@ -119,7 +119,7 @@ static void breakpoint_free(target_t *target, breakpoint_t *breakpoint_remove) free(breakpoint); } -int breakpoint_remove(target_t *target, u32 address) +void breakpoint_remove(target_t *target, u32 address) { breakpoint_t *breakpoint = target->breakpoints; breakpoint_t **breakpoint_p = &target->breakpoints; @@ -140,8 +140,6 @@ int breakpoint_remove(target_t *target, u32 address) { LOG_ERROR("no breakpoint at address 0x%8.8x found", address); } - - return ERROR_OK; } void breakpoint_clear_target(target_t *target) @@ -242,7 +240,7 @@ static void watchpoint_free(target_t *target, watchpoint_t *watchpoint_remove) -int watchpoint_remove(target_t *target, u32 address) +void watchpoint_remove(target_t *target, u32 address) { watchpoint_t *watchpoint = target->watchpoints; watchpoint_t **watchpoint_p = &target->watchpoints; @@ -263,8 +261,6 @@ int watchpoint_remove(target_t *target, u32 address) { LOG_ERROR("no watchpoint at address 0x%8.8x found", address); } - - return ERROR_OK; } diff --git a/src/target/breakpoints.h b/src/target/breakpoints.h index 18ad8d3cc..2ded1f02e 100644 --- a/src/target/breakpoints.h +++ b/src/target/breakpoints.h @@ -62,10 +62,10 @@ typedef struct watchpoint_s extern void breakpoint_clear_target(struct target_s *target); extern int breakpoint_add(struct target_s *target, u32 address, u32 length, enum breakpoint_type type); -extern int breakpoint_remove(struct target_s *target, u32 address); +extern void breakpoint_remove(struct target_s *target, u32 address); extern breakpoint_t* breakpoint_find(struct target_s *target, u32 address); extern int watchpoint_add(struct target_s *target, u32 address, u32 length, enum watchpoint_rw rw, u32 value, u32 mask); -extern int watchpoint_remove(struct target_s *target, u32 address); +extern void watchpoint_remove(struct target_s *target, u32 address); extern void watchpoint_clear_target(struct target_s *target); #endif /* BREAKPOINTS_H */ diff --git a/src/target/image.c b/src/target/image.c index 48c6a6c8c..a8753ac9c 100644 --- a/src/target/image.c +++ b/src/target/image.c @@ -912,7 +912,7 @@ int image_add_section(image_t *image, u32 base, u32 size, int flags, u8 *data) return ERROR_OK; } -int image_close(image_t *image) +void image_close(image_t *image) { if (image->type == IMAGE_BINARY) { @@ -994,8 +994,6 @@ int image_close(image_t *image) free(image->sections); image->sections = NULL; } - - return ERROR_OK; } int image_calculate_checksum(u8* buffer, u32 nbytes, u32* checksum) diff --git a/src/target/image.h b/src/target/image.h index 94ec70d1b..062a54672 100644 --- a/src/target/image.h +++ b/src/target/image.h @@ -107,7 +107,7 @@ typedef struct image_mot_s extern int image_open(image_t *image, char *url, char *type_string); extern int image_read_section(image_t *image, int section, u32 offset, u32 size, u8 *buffer, u32 *size_read); -extern int image_close(image_t *image); +extern void image_close(image_t *image); extern int image_add_section(image_t *image, u32 base, u32 size, int flags, u8 *data); extern int image_calculate_checksum(u8* buffer, u32 nbytes, u32* checksum); diff --git a/src/target/target.c b/src/target/target.c index 1ba4234af..0ba25dbbb 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -425,6 +425,7 @@ int target_resume(struct target_s *target, int current, u32 address, int handle_ static int NEW_target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode) { char buf[100]; + int retval; Jim_Nvp *n; n = Jim_Nvp_value2name_simple( nvp_reset_modes, reset_mode ); if( n->name == NULL ){ @@ -433,12 +434,16 @@ static int NEW_target_process_reset(struct command_context_s *cmd_ctx, enum targ } sprintf( buf, "ocd_process_reset %s", n->name ); - Jim_Eval( interp, buf ); + retval = Jim_Eval( interp, buf ); + + if(retval != JIM_ERR){ + return ERROR_FAIL; + } /* We want any events to be processed before the prompt */ - target_call_timer_callbacks_now(); + retval = target_call_timer_callbacks_now(); - return ERROR_OK; + return retval; } // Next patch - this turns into TCL... @@ -499,7 +504,8 @@ static int OLD_target_process_reset(struct command_context_s *cmd_ctx, enum targ if (target->reset_halt) { /* wait up to 1 second for halt. */ - target_wait_state(target, TARGET_HALTED, 1000); + if ((retval = target_wait_state(target, TARGET_HALTED, 1000)) != ERROR_OK) + return retval; if (target->state != TARGET_HALTED) { LOG_WARNING("Failed to reset target into halted mode - issuing halt"); @@ -532,7 +538,8 @@ static int OLD_target_process_reset(struct command_context_s *cmd_ctx, enum targ } /* We want any events to be processed before the prompt */ - target_call_timer_callbacks_now(); + if ((retval = target_call_timer_callbacks_now()) != ERROR_OK) + return retval; return retval; } @@ -627,6 +634,7 @@ static int target_run_algorithm_imp(struct target_s *target, int num_mem_params, int target_init(struct command_context_s *cmd_ctx) { target_t *target = all_targets; + int retval; while (target) { @@ -670,8 +678,10 @@ int target_init(struct command_context_s *cmd_ctx) if (all_targets) { - target_register_user_commands(cmd_ctx); - target_register_timer_callback(handle_target, 100, 1, NULL); + if((retval = target_register_user_commands(cmd_ctx)) != ERROR_OK) + return retval; + if((retval = target_register_timer_callback(handle_target, 100, 1, NULL)) != ERROR_OK) + return retval; } return ERROR_OK; @@ -855,7 +865,11 @@ static int target_call_timer_callbacks_check_time(int checktime) } } else - target_unregister_timer_callback(callback->callback, callback->priv); + { + int retval; + if((retval = target_unregister_timer_callback(callback->callback, callback->priv)) != ERROR_OK) + return retval; + } } } @@ -950,8 +964,14 @@ int target_alloc_working_area(struct target_s *target, u32 size, working_area_t if (target->backup_working_area) { + int retval; new_wa->backup = malloc(new_wa->size); - target->type->read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup); + if((retval = target->type->read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup)) != ERROR_OK) + { + free(new_wa->backup); + free(new_wa); + return retval; + } } else { @@ -978,7 +998,11 @@ int target_free_working_area_restore(struct target_s *target, working_area_t *ar return ERROR_OK; if (restore&&target->backup_working_area) - target->type->write_memory(target, area->address, 4, area->size / 4, area->backup); + { + int retval; + if((retval = target->type->write_memory(target, area->address, 4, area->size / 4, area->backup)) != ERROR_OK) + return retval; + } area->free = 1; @@ -994,7 +1018,10 @@ int target_free_working_area(struct target_s *target, working_area_t *area) return target_free_working_area_restore(target, area, 1); } -int target_free_all_working_areas_restore(struct target_s *target, int restore) +/* free resources and restore memory, if restoring memory fails, + * free up resources anyway + */ +void target_free_all_working_areas_restore(struct target_s *target, int restore) { working_area_t *c = target->working_areas; @@ -1012,13 +1039,11 @@ int target_free_all_working_areas_restore(struct target_s *target, int restore) } target->working_areas = NULL; - - return ERROR_OK; } -int target_free_all_working_areas(struct target_s *target) +void target_free_all_working_areas(struct target_s *target) { - return target_free_all_working_areas_restore(target, 1); + target_free_all_working_areas_restore(target, 1); } int target_register_commands(struct command_context_s *cmd_ctx) @@ -1396,6 +1421,7 @@ int target_write_u8(struct target_s *target, u32 address, u8 value) int target_register_user_commands(struct command_context_s *cmd_ctx) { + int retval = ERROR_OK; 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 [time (s)]"); @@ -1423,10 +1449,13 @@ int target_register_user_commands(struct command_context_s *cmd_ctx) register_command(cmd_ctx, NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image
"); register_command(cmd_ctx, NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image [offset] [type]"); - target_request_register_commands(cmd_ctx); - trace_register_commands(cmd_ctx); + if((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK) + return retval; + if((retval = trace_register_commands(cmd_ctx)) != ERROR_OK) + return retval; - return ERROR_OK; + + return retval; } int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) @@ -1487,6 +1516,7 @@ int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char ** int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { + int retval = ERROR_OK; target_t *target = NULL; if ((argc < 4) || (argc > 5)) @@ -1522,13 +1552,14 @@ int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, ch return ERROR_COMMAND_SYNTAX_ERROR; } - return ERROR_OK; + return retval; } /* process target state changes */ int handle_target(void *priv) { + int retval = ERROR_OK; target_t *target = all_targets; while (target) @@ -1536,13 +1567,14 @@ int handle_target(void *priv) if (target_continous_poll) { /* polling may fail silently until the target has been examined */ - target_poll(target); + if((retval = target_poll(target)) != ERROR_OK) + return retval; } target = target->next; } - return ERROR_OK; + return retval; } int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) @@ -1659,14 +1691,18 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { + int retval = ERROR_OK; target_t *target = get_current_target(cmd_ctx); if (argc == 0) { - target_poll(target); - target_arch_state(target); + if((retval = target_poll(target)) != ERROR_OK) + return retval; + if((retval = target_arch_state(target)) != ERROR_OK) + return retval; + } - else + else if (argc==1) { if (strcmp(args[0], "on") == 0) { @@ -1680,10 +1716,13 @@ int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **arg { command_print(cmd_ctx, "arg is \"on\" or \"off\""); } + } else + { + return ERROR_COMMAND_SYNTAX_ERROR; } - return ERROR_OK; + return retval; } int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) @@ -1989,7 +2028,7 @@ int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char u32 min_address=0; u32 max_address=0xffffffff; int i; - int retval; + int retval, retvaltemp; image_t image; @@ -2089,7 +2128,12 @@ int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char free(buffer); } - duration_stop_measure(&duration, &duration_text); + if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) + { + image_close(&image); + return retvaltemp; + } + if (retval==ERROR_OK) { command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text); @@ -2109,7 +2153,7 @@ int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char u32 address; u32 size; u8 buffer[560]; - int retval=ERROR_OK; + int retval=ERROR_OK, retvaltemp; duration_t duration; char *duration_text; @@ -2159,9 +2203,12 @@ int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char address += this_run_size; } - fileio_close(&fileio); + if((retvaltemp = fileio_close(&fileio)) != ERROR_OK) + return retvaltemp; + + if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) + return retvaltemp; - duration_stop_measure(&duration, &duration_text); if (retval==ERROR_OK) { command_print(cmd_ctx, "dumped %"PRIi64" byte in %s", fileio.size, duration_text); @@ -2177,7 +2224,7 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch u32 buf_cnt; u32 image_size; int i; - int retval; + int retval, retvaltemp; u32 checksum = 0; u32 mem_checksum = 0; @@ -2290,7 +2337,13 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch image_size += buf_cnt; } done: - duration_stop_measure(&duration, &duration_text); + + if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK) + { + image_close(&image); + return retvaltemp; + } + if (retval==ERROR_OK) { command_print(cmd_ctx, "verified %u bytes in %s", image_size, duration_text); @@ -2616,7 +2669,11 @@ int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char ** } else if (target->state == TARGET_RUNNING) { // We want to quickly sample the PC. - target_halt(target); + if((retval = target_halt(target)) != ERROR_OK) + { + free(samples); + return retval; + } } else { command_print(cmd_ctx, "Target not halted or running"); @@ -2632,12 +2689,20 @@ int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char ** if ((numSamples>=maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec))) { command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples); - target_poll(target); + if((retval = target_poll(target)) != ERROR_OK) + { + free(samples); + return retval; + } if (target->state == TARGET_HALTED) { target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */ } - target_poll(target); + if((retval = target_poll(target)) != ERROR_OK) + { + free(samples); + return retval; + } writeGmon(samples, numSamples, args[1]); command_print(cmd_ctx, "Wrote %s", args[1]); break; diff --git a/src/target/target.h b/src/target/target.h index 5b160d126..baae2562d 100644 --- a/src/target/target.h +++ b/src/target/target.h @@ -394,8 +394,8 @@ extern int target_wait_state(target_t *target, enum target_state state, int ms); extern int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area); extern int target_free_working_area(struct target_s *target, working_area_t *area); extern int target_free_working_area_restore(struct target_s *target, working_area_t *area, int restore); -extern int target_free_all_working_areas(struct target_s *target); -extern int target_free_all_working_areas_restore(struct target_s *target, int restore); +extern void target_free_all_working_areas(struct target_s *target); +extern void target_free_all_working_areas_restore(struct target_s *target, int restore); extern target_t *all_targets;