Laurentiu Cocanu <laurentiu.cocanu@zylin.com> - 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
This commit is contained in:
oharboe 2008-10-13 06:52:05 +00:00
parent 809a796209
commit 0a3b6213bb
8 changed files with 110 additions and 53 deletions

View File

@ -89,11 +89,9 @@ int timeval_add_time(struct timeval *result, int sec, int usec)
return 0; return 0;
} }
int duration_start_measure(duration_t *duration) void duration_start_measure(duration_t *duration)
{ {
gettimeofday(&duration->start, NULL); gettimeofday(&duration->start, NULL);
return ERROR_OK;
} }
int duration_stop_measure(duration_t *duration, char **text) int duration_stop_measure(duration_t *duration, char **text)

View File

@ -49,7 +49,7 @@ typedef struct duration_s
struct timeval duration; struct timeval duration;
} duration_t; } 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); extern int duration_stop_measure(duration_t *duration, char **text);
#endif /* TIME_SUPPORT_H */ #endif /* TIME_SUPPORT_H */

View File

@ -119,7 +119,7 @@ static void breakpoint_free(target_t *target, breakpoint_t *breakpoint_remove)
free(breakpoint); 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 = target->breakpoints;
breakpoint_t **breakpoint_p = &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); LOG_ERROR("no breakpoint at address 0x%8.8x found", address);
} }
return ERROR_OK;
} }
void breakpoint_clear_target(target_t *target) 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 = target->watchpoints;
watchpoint_t **watchpoint_p = &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); LOG_ERROR("no watchpoint at address 0x%8.8x found", address);
} }
return ERROR_OK;
} }

View File

@ -62,10 +62,10 @@ typedef struct watchpoint_s
extern void breakpoint_clear_target(struct target_s *target); 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_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 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_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); extern void watchpoint_clear_target(struct target_s *target);
#endif /* BREAKPOINTS_H */ #endif /* BREAKPOINTS_H */

View File

@ -912,7 +912,7 @@ int image_add_section(image_t *image, u32 base, u32 size, int flags, u8 *data)
return ERROR_OK; return ERROR_OK;
} }
int image_close(image_t *image) void image_close(image_t *image)
{ {
if (image->type == IMAGE_BINARY) if (image->type == IMAGE_BINARY)
{ {
@ -994,8 +994,6 @@ int image_close(image_t *image)
free(image->sections); free(image->sections);
image->sections = NULL; image->sections = NULL;
} }
return ERROR_OK;
} }
int image_calculate_checksum(u8* buffer, u32 nbytes, u32* checksum) int image_calculate_checksum(u8* buffer, u32 nbytes, u32* checksum)

View File

@ -107,7 +107,7 @@ typedef struct image_mot_s
extern int image_open(image_t *image, char *url, char *type_string); 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_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_add_section(image_t *image, u32 base, u32 size, int flags, u8 *data);
extern int image_calculate_checksum(u8* buffer, u32 nbytes, u32* checksum); extern int image_calculate_checksum(u8* buffer, u32 nbytes, u32* checksum);

View File

@ -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) static int NEW_target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode)
{ {
char buf[100]; char buf[100];
int retval;
Jim_Nvp *n; Jim_Nvp *n;
n = Jim_Nvp_value2name_simple( nvp_reset_modes, reset_mode ); n = Jim_Nvp_value2name_simple( nvp_reset_modes, reset_mode );
if( n->name == NULL ){ 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 ); 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 */ /* 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... // 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) if (target->reset_halt)
{ {
/* wait up to 1 second for 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) if (target->state != TARGET_HALTED)
{ {
LOG_WARNING("Failed to reset target into halted mode - issuing halt"); 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 */ /* 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; 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) int target_init(struct command_context_s *cmd_ctx)
{ {
target_t *target = all_targets; target_t *target = all_targets;
int retval;
while (target) while (target)
{ {
@ -670,8 +678,10 @@ int target_init(struct command_context_s *cmd_ctx)
if (all_targets) if (all_targets)
{ {
target_register_user_commands(cmd_ctx); if((retval = target_register_user_commands(cmd_ctx)) != ERROR_OK)
target_register_timer_callback(handle_target, 100, 1, NULL); return retval;
if((retval = target_register_timer_callback(handle_target, 100, 1, NULL)) != ERROR_OK)
return retval;
} }
return ERROR_OK; return ERROR_OK;
@ -855,7 +865,11 @@ static int target_call_timer_callbacks_check_time(int checktime)
} }
} }
else 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) if (target->backup_working_area)
{ {
int retval;
new_wa->backup = malloc(new_wa->size); 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 else
{ {
@ -978,7 +998,11 @@ int target_free_working_area_restore(struct target_s *target, working_area_t *ar
return ERROR_OK; return ERROR_OK;
if (restore&&target->backup_working_area) 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; 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); 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; 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; 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) 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 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, "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, "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)]"); 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 <file> <address> <size>"); register_command(cmd_ctx, NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image <file> <address> <size>");
register_command(cmd_ctx, NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image <file> [offset] [type]"); register_command(cmd_ctx, NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image <file> [offset] [type]");
target_request_register_commands(cmd_ctx); if((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK)
trace_register_commands(cmd_ctx); 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) 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 handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{ {
int retval = ERROR_OK;
target_t *target = NULL; target_t *target = NULL;
if ((argc < 4) || (argc > 5)) 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_COMMAND_SYNTAX_ERROR;
} }
return ERROR_OK; return retval;
} }
/* process target state changes */ /* process target state changes */
int handle_target(void *priv) int handle_target(void *priv)
{ {
int retval = ERROR_OK;
target_t *target = all_targets; target_t *target = all_targets;
while (target) while (target)
@ -1536,13 +1567,14 @@ int handle_target(void *priv)
if (target_continous_poll) if (target_continous_poll)
{ {
/* polling may fail silently until the target has been examined */ /* 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; target = target->next;
} }
return ERROR_OK; return retval;
} }
int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) 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 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); target_t *target = get_current_target(cmd_ctx);
if (argc == 0) if (argc == 0)
{ {
target_poll(target); if((retval = target_poll(target)) != ERROR_OK)
target_arch_state(target); return retval;
if((retval = target_arch_state(target)) != ERROR_OK)
return retval;
} }
else else if (argc==1)
{ {
if (strcmp(args[0], "on") == 0) 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\""); 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) 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 min_address=0;
u32 max_address=0xffffffff; u32 max_address=0xffffffff;
int i; int i;
int retval; int retval, retvaltemp;
image_t image; image_t image;
@ -2089,7 +2128,12 @@ int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char
free(buffer); 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) if (retval==ERROR_OK)
{ {
command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text); 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 address;
u32 size; u32 size;
u8 buffer[560]; u8 buffer[560];
int retval=ERROR_OK; int retval=ERROR_OK, retvaltemp;
duration_t duration; duration_t duration;
char *duration_text; 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; 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) if (retval==ERROR_OK)
{ {
command_print(cmd_ctx, "dumped %"PRIi64" byte in %s", fileio.size, duration_text); 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 buf_cnt;
u32 image_size; u32 image_size;
int i; int i;
int retval; int retval, retvaltemp;
u32 checksum = 0; u32 checksum = 0;
u32 mem_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; image_size += buf_cnt;
} }
done: 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) if (retval==ERROR_OK)
{ {
command_print(cmd_ctx, "verified %u bytes in %s", image_size, duration_text); 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) } else if (target->state == TARGET_RUNNING)
{ {
// We want to quickly sample the PC. // We want to quickly sample the PC.
target_halt(target); if((retval = target_halt(target)) != ERROR_OK)
{
free(samples);
return retval;
}
} else } else
{ {
command_print(cmd_ctx, "Target not halted or running"); 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))) if ((numSamples>=maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
{ {
command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples); 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) if (target->state == TARGET_HALTED)
{ {
target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */ 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]); writeGmon(samples, numSamples, args[1]);
command_print(cmd_ctx, "Wrote %s", args[1]); command_print(cmd_ctx, "Wrote %s", args[1]);
break; break;

View File

@ -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_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(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_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 void 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_restore(struct target_s *target, int restore);
extern target_t *all_targets; extern target_t *all_targets;