- Eleminated leading tabs/white space
[fw/openocd] / src / target / target.c
index f9d957d69e0927b561c727b8e1d60b398fe93e00..fc821f8f14e0b1caa9528d4cac5ea4d63909ccde 100644 (file)
@@ -313,6 +313,23 @@ int target_process_reset(struct command_context_s *cmd_ctx)
        while (target)
        {
                target->type->deassert_reset(target);
+
+               switch (target->reset_mode)
+               {
+                       case RESET_INIT:
+                       case RESET_HALT:
+                               // If we're already halted, then this is harmless(reducing # of execution paths here)
+                               // If nSRST & nTRST are tied together then the halt during reset failed(logged) and
+                               // we use this as fallback(there is no other output to tell the user that reset halt 
+                               // didn't work).
+                               target->type->poll(target);
+                               target->type->halt(target);
+                               break;
+                       default:
+                               break;
+               }
+               
+               
                target = target->next;
        }
        jtag_execute_queue();
@@ -1023,6 +1040,7 @@ int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **a
                                (*last_target_p)->reset_script = NULL;
                                (*last_target_p)->post_halt_script = NULL;
                                (*last_target_p)->pre_resume_script = NULL;
+                               (*last_target_p)->gdb_program_script = NULL;
                                
                                (*last_target_p)->working_area = 0x0;
                                (*last_target_p)->working_area_size = 0x0;
@@ -1047,6 +1065,7 @@ int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **a
                                (*last_target_p)->trace_info->trace_history_overflowed = 0;
                                
                                (*last_target_p)->dbgmsg = NULL;
+                               (*last_target_p)->dbg_msg_enabled = 0;
                                
                                (*last_target_p)->type->target_command(cmd_ctx, cmd, args, argc, *last_target_p);
                                
@@ -1103,6 +1122,12 @@ int handle_target_script_command(struct command_context_s *cmd_ctx, char *cmd, c
                        free(target->pre_resume_script);
                target->pre_resume_script = strdup(args[2]);
        }
+       else if (strcmp(args[1], "gdb_program_config") == 0)
+       {
+               if (target->gdb_program_script)
+                       free(target->gdb_program_script);
+               target->gdb_program_script = strdup(args[2]);
+       }
        else
        {
                ERROR("unknown event type: '%s", args[1]);
@@ -1188,8 +1213,7 @@ int handle_target(void *priv)
                        if (target_continous_poll)
                                if ((retval = target->type->poll(target)) < 0)
                                {
-                                       ERROR("couldn't poll target, exiting");
-                                       exit(-1);
+                                       ERROR("couldn't poll target. It's due for a reset.");
                                }
                }
        
@@ -1561,9 +1585,11 @@ int handle_step_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
 
 int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
+       const int line_bytecnt = 32;
        int count = 1;
        int size = 4;
-       u32 address = 0;
+       u32 address = 0;  
+       int line_modulo;
        int i;
 
        char output[128];
@@ -1586,20 +1612,21 @@ int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
        switch (cmd[2])
        {
                case 'w':
-                       size = 4;
+                       size = 4; line_modulo = line_bytecnt / 4;
                        break;
                case 'h':
-                       size = 2;
+                       size = 2; line_modulo = line_bytecnt / 2;
                        break;
                case 'b':
-                       size = 1;
+                       size = 1; line_modulo = line_bytecnt / 1;
                        break;
                default:
                        return ERROR_OK;
        }
 
        buffer = calloc(count, size);
-       if ((retval  = target->type->read_memory(target, address, size, count, buffer)) != ERROR_OK)
+       retval  = target->type->read_memory(target, address, size, count, buffer);
+       if (retval != ERROR_OK)
        {
                switch (retval)
                {
@@ -1623,7 +1650,7 @@ int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
 
        for (i = 0; i < count; i++)
        {
-               if (i%8 == 0)
+               if (i%line_modulo == 0)
                        output_len += snprintf(output + output_len, 128 - output_len, "0x%8.8x: ", address + (i*size));
                
                switch (size)
@@ -1639,7 +1666,7 @@ int handle_md_command(struct command_context_s *cmd_ctx, char *cmd, char **args,
                                break;
                }
 
-               if ((i%8 == 7) || (i == count - 1))
+               if ((i%line_modulo == line_modulo-1) || (i == count - 1))
                {
                        command_print(cmd_ctx, output);
                        output_len = 0;
@@ -1875,7 +1902,7 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch
                image.base_address_set = 0;
                image.base_address = 0x0;
        }
-       
+
        image.start_address_set = 0;
 
        if (image_open(&image, args[0], (argc == 3) ? args[2] : NULL) != ERROR_OK)
@@ -1899,27 +1926,59 @@ int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, ch
                
                /* calculate checksum of image */
                image_calculate_checksum( buffer, buf_cnt, &checksum );
-               free(buffer);
                
                retval = target_checksum_memory(target, image.sections[i].base_address, buf_cnt, &mem_checksum);
                
                if( retval != ERROR_OK )
                {
                        command_print(cmd_ctx, "image verify failed, verify aborted");
+                       free(buffer);
                        image_close(&image);
                        return ERROR_OK;
                }
                
                if( checksum != mem_checksum )
                {
-                       command_print(cmd_ctx, "image verify failed, verify aborted");
-                       image_close(&image);
-                       return ERROR_OK;
-               }
+                       /* failed crc checksum, fall back to a binary compare */
+                       u8 *data;
+                       
+                       command_print(cmd_ctx, "image verify checksum failed - attempting binary compare");
+                       
+                       data = (u8*)malloc(buf_cnt);
+                       
+                       /* Can we use 32bit word accesses? */
+                       int size = 1;
+                       int count = buf_cnt;
+                       if ((count % 4) == 0)
+                       {
+                               size *= 4;
+                               count /= 4;
+                       }
+                       retval = target->type->read_memory(target, image.sections[i].base_address, size, count, data);
+       
+                       if (retval == ERROR_OK)
+                       {
+                               int t;
+                               for (t = 0; t < buf_cnt; t++)
+                               {
+                                       if (data[t] != buffer[t])
+                                       {
+                                               command_print(cmd_ctx, "Verify operation failed address 0x%08x. Was 0x%02x instead of 0x%02x\n", t + image.sections[i].base_address, data[t], buffer[t]);
+                                               free(data);
+                                               free(buffer);
+                                               image_close(&image);
+                                               return ERROR_OK;
+                                       }
+                               }
+                       }
                        
+                       free(data);
+               }
+               
+               free(buffer);
                image_size += buf_cnt;
        }
-
+       
        duration_stop_measure(&duration, &duration_text);
        command_print(cmd_ctx, "verified %u bytes in %s", image_size, duration_text);
        free(duration_text);
@@ -2085,3 +2144,4 @@ int handle_rwp_command(struct command_context_s *cmd_ctx, char *cmd, char **args
        return ERROR_OK;
 }
 
+