reset cleanup
[fw/openocd] / src / target / target.c
index f530eb31334877a4c333db8b67bdcc2d79946232..f843a6ed51bffd25e4f1d706f5d6d6c1d71db579 100644 (file)
@@ -56,8 +56,6 @@
 #include <fileio.h>
 #include <image.h>
 
-static int USE_OLD_RESET = 0; // temp
-
 int cli_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv);
 
 
@@ -69,7 +67,6 @@ 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_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);
-int handle_NEWreset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -422,9 +419,10 @@ 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)
+int 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,119 +431,19 @@ 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 );
-
-       /* We want any events to be processed before the prompt */
-       target_call_timer_callbacks_now();
-
-       return ERROR_OK;
-}
-
-// Next patch - this turns into TCL...
-static int OLD_target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode)
-{
-       int retval = ERROR_OK;
-       target_t *target;
-
-       target = all_targets;
-
-       target_all_handle_event( TARGET_EVENT_OLD_pre_reset );
-
-       if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
-               return retval;
-
-       keep_alive(); /* we might be running on a very slow JTAG clk */
-
-       /* First time this is executed after launching OpenOCD, it will read out
-        * the type of CPU, etc. and init Embedded ICE registers in host
-        * memory.
-        *
-        * It will also set up ICE registers in the target.
-        *
-        * However, if we assert TRST later, we need to set up the registers again.
-        *
-        * For the "reset halt/init" case we must only set up the registers here.
-        */
-       if ((retval = target_examine()) != ERROR_OK)
-               return retval;
-
-       keep_alive(); /* we might be running on a very slow JTAG clk */
-
-       target = all_targets;
-       while (target)
-       {
-               /* we have no idea what state the target is in, so we
-                * have to drop working areas
-                */
-               target_free_all_working_areas_restore(target, 0);
-               target->reset_halt=((reset_mode==RESET_HALT)||(reset_mode==RESET_INIT));
-               if ((retval = target->type->assert_reset(target))!=ERROR_OK)
-                       return retval;
-               target = target->next;
-       }
+       retval = Jim_Eval( interp, buf );
 
-       target = all_targets;
-       while (target)
-       {
-               if ((retval = target->type->deassert_reset(target))!=ERROR_OK)
-                       return retval;
-               target = target->next;
-       }
-
-       target = all_targets;
-       while (target)
-       {
-               /* We can fail to bring the target into the halted state, try after reset has been deasserted  */
-               if (target->reset_halt)
-               {
-                       /* wait up to 1 second for halt. */
-                       target_wait_state(target, TARGET_HALTED, 1000);
-                       if (target->state != TARGET_HALTED)
-                       {
-                               LOG_WARNING("Failed to reset target into halted mode - issuing halt");
-                               if ((retval = target->type->halt(target))!=ERROR_OK)
-                                       return retval;
-                       }
-               }
-
-               target = target->next;
-       }
-
-
-       LOG_DEBUG("Waiting for halted stated as appropriate");
-
-       if ((reset_mode == RESET_HALT) || (reset_mode == RESET_INIT))
-       {
-               target = all_targets;
-               while (target)
-               {
-                       /* Wait for reset to complete, maximum 5 seconds. */
-                       if (((retval=target_wait_state(target, TARGET_HALTED, 5000)))==ERROR_OK)
-                       {
-                               if (reset_mode == RESET_INIT){
-                                       target_handle_event( target, TARGET_EVENT_OLD_post_reset );
-                               }
-
-                       }
-                       target = target->next;
-               }
+       if(retval != JIM_OK) {
+               Jim_PrintErrorMessage(interp);
+               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 retval;
 }
 
-int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode)
-{
-       if( USE_OLD_RESET ){
-               return OLD_target_process_reset( cmd_ctx, reset_mode );
-       } else {
-               return NEW_target_process_reset( cmd_ctx, reset_mode );
-       }
-}
-
 
 static int default_virt2phys(struct target_s *target, u32 virtual, u32 *physical)
 {
@@ -627,6 +525,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 +569,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 +756,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 +855,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 +889,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 +909,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 +930,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,14 +1312,14 @@ 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)]");
        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 from current PC or [addr]");
-       register_command(cmd_ctx,  NULL, "NEWreset", handle_NEWreset_command, COMMAND_EXEC, "reset target [run|halt|init] - default is run");
-       register_command(cmd_ctx,  NULL, "reset", handle_reset_command, COMMAND_EXEC, "OLDreset target [run|halt|init] - default is run");
+       register_command(cmd_ctx,  NULL, "reset", handle_reset_command, COMMAND_EXEC, "reset target [run|halt|init] - default is run");
        register_command(cmd_ctx,  NULL, "soft_reset_halt", handle_soft_reset_halt_command, COMMAND_EXEC, "halt the target and do a soft reset");
 
        register_command(cmd_ctx,  NULL, "mdw", handle_md_command, COMMAND_EXEC, "display memory words <addr> [count]");
@@ -1423,10 +1339,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, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image <file> [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 +1406,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 +1442,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 +1457,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 +1581,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 +1606,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)
@@ -1786,24 +1715,6 @@ int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **ar
        return target_process_reset(cmd_ctx, reset_mode);
 }
 
-int handle_NEWreset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       int x;
-       char *cp;
-
-       if (argc >= 1){
-               x = strtol( args[0], &cp, 0 );
-               if( *cp != 0 ){
-                       command_print( cmd_ctx, "Not numeric: %s\n", args[0] );
-                       return ERROR_COMMAND_SYNTAX_ERROR;
-               }
-               USE_OLD_RESET = !!x;
-       }
-       command_print( cmd_ctx, "reset method: %d (%s)\n",
-                                  USE_OLD_RESET,
-                                  USE_OLD_RESET ? "old-method" : "new-method" );
-       return ERROR_OK;
-}
 
 int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
@@ -1969,6 +1880,8 @@ int handle_mw_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
                        default:
                        return ERROR_OK;
                }
+               keep_alive();
+
                if (retval!=ERROR_OK)
                {
                        return retval;
@@ -1987,7 +1900,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;
 
@@ -2087,7 +2000,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);
@@ -2107,7 +2025,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;
@@ -2157,9 +2075,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);
@@ -2175,7 +2096,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;
 
@@ -2288,7 +2209,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);
@@ -2614,7 +2541,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");
@@ -2630,12 +2561,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;
@@ -3045,7 +2984,10 @@ target_handle_event( target_t *target, enum target_event e )
                                           e,
                                           Jim_Nvp_value2name_simple( nvp_target_event, e )->name,
                                           Jim_GetString( teap->body, NULL ) );
-                       Jim_EvalObj( interp, teap->body );
+                       if (Jim_EvalObj( interp, teap->body )!=JIM_OK)
+                       {
+                               Jim_PrintErrorMessage(interp);
+                       }
                }
                teap = teap->next;
        }
@@ -3148,7 +3090,7 @@ target_configure( Jim_GetOptInfo *goi,
                        }
 
                        if( goi->isconfigure ){
-                               if( goi->argc == 0 ){
+                               if( goi->argc != 1 ){
                                        Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
                                        return JIM_ERR;
                                }