gdb_report_data_abort now ignores all target read errors, including address space...
[fw/openocd] / src / server / gdb_server.c
index 69e91dbead1bb3ec3629d7f6f6c75bfadebe0f95..0ebe56cb49c32fdc0de18c4d8856669e3c02c2bd 100644 (file)
@@ -37,6 +37,7 @@
 #include "jtag.h"
 #include "breakpoints.h"
 #include "flash.h"
+#include "target.h"
 #include "target_request.h"
 #include "configuration.h"
 
@@ -305,7 +306,7 @@ int gdb_put_packet_inner(connection_t *connection, char *buffer, int len)
                        break;
                if ((retval = gdb_get_char(connection, &reply)) != ERROR_OK)
                        return retval;
-        if( reply == '$' ){
+               if( reply == '$' ){
                        // fix a problem with some IAR tools
                        gdb_putback_char( connection, reply );
                        LOG_DEBUG("Unexpected start of new packet");
@@ -335,7 +336,10 @@ int gdb_put_packet_inner(connection_t *connection, char *buffer, int len)
                        local_buffer[len++] = '#';
                        local_buffer[len++] = DIGITS[(my_checksum >> 4) & 0xf];
                        local_buffer[len++] = DIGITS[my_checksum & 0xf];
-                       gdb_write(connection, local_buffer, len);
+                       if((retval = gdb_write(connection, local_buffer, len)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                }
                else
                {
@@ -344,9 +348,18 @@ int gdb_put_packet_inner(connection_t *connection, char *buffer, int len)
                        local_buffer[1] = '#';
                        local_buffer[2] = DIGITS[(my_checksum >> 4) & 0xf];
                        local_buffer[3] = DIGITS[my_checksum & 0xf];
-                       gdb_write(connection, local_buffer, 1);
-                       gdb_write(connection, buffer, len);
-                       gdb_write(connection, local_buffer+1, 3);
+                       if((retval = gdb_write(connection, local_buffer, 1)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
+                       if((retval = gdb_write(connection, buffer, len)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
+                       if((retval = gdb_write(connection, local_buffer+1, 3)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                }
 
                if (gdb_con->noack_mode)
@@ -381,17 +394,17 @@ int gdb_put_packet_inner(connection_t *connection, char *buffer, int len)
                                gdb_putback_char( connection, reply );
                                return ERROR_OK;
                        } else {
-                                       
+
                                LOG_ERROR("unknown character(1) 0x%2.2x in reply, dropping connection", reply);
                                gdb_con->closed=1;
                                return ERROR_SERVER_REMOTE_CLOSED;
                        }
-               } 
+               }
                else if( reply == '$' ){
                        LOG_ERROR("GDB missing ack(2) - assumed good");
                        gdb_putback_char( connection, reply );
                        return ERROR_OK;
-               } 
+               }
                else
                {
                        LOG_ERROR("unknown character(2) 0x%2.2x in reply, dropping connection", reply);
@@ -589,7 +602,10 @@ int gdb_get_packet_inner(connection_t *connection, char *buffer, int *len)
                }
                if (checksum_ok)
                {
-                       gdb_write(connection, "+", 1);
+                       if ((retval = gdb_write(connection, "+", 1)) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                        break;
                }
        }
@@ -624,10 +640,10 @@ int gdb_output_con(connection_t *connection, const char* line)
                snprintf(hex_buffer + 1 + i*2, 3, "%2.2x", line[i]);
        hex_buffer[bin_size*2+1] = 0;
 
-       gdb_put_packet(connection, hex_buffer, bin_size*2 + 1);
+       int retval = gdb_put_packet(connection, hex_buffer, bin_size*2 + 1);
 
        free(hex_buffer);
-       return ERROR_OK;
+       return retval;
 }
 
 int gdb_output(struct command_context_s *context, const char* line)
@@ -676,6 +692,7 @@ static void gdb_frontend_halted(struct target_s *target, connection_t *connectio
 
 int gdb_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv)
 {
+       int retval;
        connection_t *connection = priv;
 
        target_handle_event( target, event );
@@ -686,7 +703,10 @@ int gdb_target_callback_event_handler(struct target_s *target, enum target_event
                        break;
                case TARGET_EVENT_GDB_FLASH_ERASE_START:
                        target_handle_event( target, TARGET_EVENT_OLD_gdb_program_config );
-                       jtag_execute_queue();
+                       if((retval = jtag_execute_queue()) != ERROR_OK)
+                       {
+                               return retval;
+                       }
                        break;
                default:
                        break;
@@ -798,6 +818,7 @@ int gdb_connection_closed(connection_t *connection)
        log_remove_callback(gdb_log_callback, connection);
 
        target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_DETACH );
+
        return ERROR_OK;
 }
 
@@ -1117,7 +1138,7 @@ int gdb_read_memory_packet(connection_t *connection, target_t *target, char *pac
 
        retval = target_read_buffer(target, addr, len, buffer);
 
-       if ((retval == ERROR_TARGET_DATA_ABORT) && (!gdb_report_data_abort))
+       if ((retval!=ERROR_OK)&&!gdb_report_data_abort)
        {
                /* TODO : Here we have to lie and send back all zero's lest stack traces won't work.
                 * At some point this might be fixed in GDB, in which case this code can be removed.
@@ -1818,6 +1839,7 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
 
        if (strstr(packet, "vFlashWrite:"))
        {
+               int retval;
                unsigned long addr;
                unsigned long length;
                char *parse = packet + 12;
@@ -1843,7 +1865,10 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
                }
 
                /* create new section with content from packet buffer */
-               image_add_section(gdb_connection->vflash_image, addr, length, 0x0, (u8*)parse);
+               if((retval = image_add_section(gdb_connection->vflash_image, addr, length, 0x0, (u8*)parse)) != ERROR_OK)
+               {
+                       return retval;
+               }
 
                gdb_put_packet(connection, "OK", 2);
 
@@ -1960,7 +1985,7 @@ int gdb_input_inner(connection_t *connection)
 
                if( LOG_LEVEL_IS( LOG_LVL_DEBUG ) ){
                        if( packet[0] == 'X' ){
-                               // binary packets spew junk into the debug log stream 
+                               // binary packets spew junk into the debug log stream
                                char buf[ 50 ];
                                int x;
                                for( x = 0 ; (x < 49) && (packet[x] != ':') ; x++ ){
@@ -2152,7 +2177,10 @@ int gdb_init(void)
 int handle_gdb_port_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        if (argc == 0)
+       {
+               command_print(cmd_ctx, "gdb_port: %ld", gdb_port);
                return ERROR_OK;
+       }
 
        /* only if the port wasn't overwritten by cmdline */
        if (gdb_port == 0)
@@ -2185,10 +2213,11 @@ int handle_gdb_detach_command(struct command_context_s *cmd_ctx, char *cmd, char
                        detach_mode = GDB_DETACH_NOTHING;
                        return ERROR_OK;
                }
+               else
+                       LOG_WARNING("invalid gdb_detach configuration directive: %s", args[0]);
        }
 
-       LOG_WARNING("invalid gdb_detach configuration directive: %s", args[0]);
-       return ERROR_OK;
+       return ERROR_COMMAND_SYNTAX_ERROR;
 }
 
 int handle_gdb_memory_map_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
@@ -2205,10 +2234,11 @@ int handle_gdb_memory_map_command(struct command_context_s *cmd_ctx, char *cmd,
                        gdb_use_memory_map = 0;
                        return ERROR_OK;
                }
+               else
+                       LOG_WARNING("invalid gdb_memory_map configuration directive %s", args[0]);
        }
 
-       LOG_WARNING("invalid gdb_memory_map configuration directive: %s", args[0]);
-       return ERROR_OK;
+       return ERROR_COMMAND_SYNTAX_ERROR;
 }
 
 int handle_gdb_flash_program_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
@@ -2225,10 +2255,11 @@ int handle_gdb_flash_program_command(struct command_context_s *cmd_ctx, char *cm
                        gdb_flash_program = 0;
                        return ERROR_OK;
                }
+               else
+                       LOG_WARNING("invalid gdb_flash_program configuration directive: %s", args[0]);
        }
 
-       LOG_WARNING("invalid gdb_memory_map configuration directive: %s", args[0]);
-       return ERROR_OK;
+       return ERROR_COMMAND_SYNTAX_ERROR;
 }
 
 int handle_gdb_report_data_abort_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
@@ -2245,13 +2276,14 @@ int handle_gdb_report_data_abort_command(struct command_context_s *cmd_ctx, char
                        gdb_report_data_abort = 0;
                        return ERROR_OK;
                }
+               else
+                       LOG_WARNING("invalid gdb_report_data_abort configuration directive: %s", args[0]);
        }
 
-       LOG_WARNING("invalid gdb_report_data_abort configuration directive: %s", args[0]);
-       return ERROR_OK;
+       return ERROR_COMMAND_SYNTAX_ERROR;
 }
 
-/* daemon configuration command gdb_port */
+/* gdb_breakpoint_override */
 int handle_gdb_breakpoint_override_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        if (argc == 0)
@@ -2289,15 +2321,15 @@ int handle_gdb_breakpoint_override_command(struct command_context_s *cmd_ctx, ch
 int gdb_register_commands(command_context_t *command_context)
 {
        register_command(command_context, NULL, "gdb_port", handle_gdb_port_command,
-                       COMMAND_CONFIG, "");
+                       COMMAND_CONFIG, "daemon configuration command gdb_port");
        register_command(command_context, NULL, "gdb_detach", handle_gdb_detach_command,
                        COMMAND_CONFIG, "");
        register_command(command_context, NULL, "gdb_memory_map", handle_gdb_memory_map_command,
-                       COMMAND_CONFIG, "");
+                       COMMAND_CONFIG, "enable or disable memory map");
        register_command(command_context, NULL, "gdb_flash_program", handle_gdb_flash_program_command,
-                       COMMAND_CONFIG, "");
+                       COMMAND_CONFIG, "enable or disable flash program");
        register_command(command_context, NULL, "gdb_report_data_abort", handle_gdb_report_data_abort_command,
-                       COMMAND_CONFIG, "");
+                       COMMAND_CONFIG, "enable or disable report data");
        register_command(command_context, NULL, "gdb_breakpoint_override", handle_gdb_breakpoint_override_command,
                        COMMAND_EXEC, "hard/soft/disabled - force breakpoint type for gdb 'break' commands."
                        "The raison d'etre for this option is to support GDB GUI's without "