fix telnet async messages. retired telnet_async command - no user serviceable parts...
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 5 Nov 2008 08:48:50 +0000 (08:48 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 5 Nov 2008 08:48:50 +0000 (08:48 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1135 b42882b7-edfa-0310-969c-e2dbd0fdcd60

doc/openocd.texi
src/helper/startup.tcl
src/openocd.c
src/server/gdb_server.c
src/server/telnet_server.c
src/target/target.c
src/target/target.h

index cae6a6d3a12a767bb3df3d97440348100abd319b..7e537b3289484196804cc1bf06d8071f1fd8b3e9 100644 (file)
@@ -265,10 +265,6 @@ OpenOCD command line using the @option{-c} command line switch.
 @item @b{telnet_port} <@var{number}>
 @cindex telnet_port
 @*Port on which to listen for incoming telnet connections 
-@item @b{telnet_async} <@var{enable/disable}>
-@cindex telnet_async
-@*Enable/disable asynchronous messages. Default off. Slows down debugging
-if enabled and telnet session is open while stepping.
 @item @b{tcl_port} <@var{number}>
 @cindex tcl_port
 @*Port on which to listen for incoming TCL syntax. This port is intended as
index 794654c6435bdac97e0d9040ab8bdcec1a2d53d1..f4396710421f6f7f6013fdcb9b7cadfca88f6a3e 100644 (file)
@@ -302,21 +302,6 @@ proc verify {args} {
 add_help_text verify "synonym to verify_image"
 
 
-add_help_text telnet_async "<enable/disable> - enable/disable async messages. Default 0."
-
-global telnet_async_state
-set telnet_async_state 0
-proc telnet_async {state} {
-       global telnet_async_state
-       if {[string compare $state enable]==0} {
-               set telnet_async_state 1 
-       } elseif {[string compare $state disable]==0} {
-               set telnet_async_state 0 
-       } else {
-               return -code error "Illegal option $state"              
-       }
-}
-
 
 add_help_text cpu "<name> - prints out target options and a comment on CPU which matches name"
 
index 13b0555965c9d02e7f0423695205861c9c2eabae..51e40537781e5e35b9d012519b0f6570c7903b51 100644 (file)
@@ -106,8 +106,18 @@ static int log_target_callback_event_handler(struct target_s *target, enum targe
 {
        switch (event)
        {
+               case TARGET_EVENT_GDB_START:
+                       target->display=0;
+                       break;
+               case TARGET_EVENT_GDB_END:
+                       target->display=1;
+                       break;
                case TARGET_EVENT_HALTED:
-                       target_arch_state(target);
+                       if (target->display)
+                       {
+                               /* do not display information when debugger caused the halt */
+                               target_arch_state(target);
+                       }
                        break;
                default:
                        break;
@@ -123,11 +133,11 @@ int handle_init_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
        static int initialized=0;
        if (initialized)
                return ERROR_OK;
-       
+
        initialized=1;
-       
+
        atexit(exit_handler);
-       
+
        if (target_init(cmd_ctx) != ERROR_OK)
                return ERROR_FAIL;
        LOG_DEBUG("target init complete");
@@ -149,7 +159,7 @@ int handle_init_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
                        LOG_DEBUG("jtag examine complete");
                }
        }
-       
+
        if (flash_init_drivers(cmd_ctx) != ERROR_OK)
                return ERROR_FAIL;
        LOG_DEBUG("flash init complete");
@@ -175,7 +185,7 @@ int handle_init_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
        tcl_init(); /* allows tcl to just connect without going thru telnet */
 
        target_register_event_callback(log_target_callback_event_handler, cmd_ctx);
-       
+
        return ERROR_OK;
 }
 
@@ -184,12 +194,12 @@ command_context_t *global_cmd_ctx;
 command_context_t *setup_command_handler(void)
 {
        command_context_t *cmd_ctx;
-       
+
        global_cmd_ctx = cmd_ctx = command_init();
-       
+
        register_command(cmd_ctx, NULL, "version", handle_version_command,
                                         COMMAND_EXEC, "show OpenOCD version");
-       
+
        /* register subsystem commands */
        server_register_commands(cmd_ctx);
        telnet_register_commands(cmd_ctx);
@@ -211,7 +221,7 @@ command_context_t *setup_command_handler(void)
        LOG_DEBUG("log init complete");
 
        LOG_OUTPUT( OPENOCD_VERSION "\n" );
-       
+
        register_command(cmd_ctx, NULL, "init", handle_init_command,
                                         COMMAND_ANY, "initializes target and servers - nop on subsequent invocations");
 
@@ -229,27 +239,27 @@ int openocd_main(int argc, char *argv[])
        command_context_t *cmd_ctx;
 
        cmd_ctx = setup_command_handler();
-       
+
        LOG_OUTPUT( "\n\nBUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS\n\n\n");
 
        print_version();
-       
+
        command_context_mode(cmd_ctx, COMMAND_CONFIG);
        command_set_output_handler(cmd_ctx, configuration_output_handler, NULL);
 
        if (parse_cmdline_args(cmd_ctx, argc, argv) != ERROR_OK)
                return EXIT_FAILURE;
-       
+
        ret = parse_config_file(cmd_ctx);
        if ( (ret != ERROR_OK) && (ret != ERROR_COMMAND_CLOSE_CONNECTION) )
                return EXIT_FAILURE;
 
-       if (ret != ERROR_COMMAND_CLOSE_CONNECTION) 
+       if (ret != ERROR_COMMAND_CLOSE_CONNECTION)
        {
                command_context_mode(cmd_ctx, COMMAND_EXEC);
                if (command_run_line(cmd_ctx, "init")!=ERROR_OK)
                        return EXIT_FAILURE;
-       
+
                /* handle network connections */
                server_loop(cmd_ctx);
        }
@@ -258,7 +268,7 @@ int openocd_main(int argc, char *argv[])
        server_quit();
 
        unregister_all_commands(cmd_ctx);
-       
+
        /* free commandline interface */
        command_done(cmd_ctx);
 
index 0ebe56cb49c32fdc0de18c4d8856669e3c02c2bd..febad6e2f5e4f8f2a0aaf8122e3b9e70f1ba5735 100644 (file)
@@ -671,6 +671,7 @@ static void gdb_frontend_halted(struct target_s *target, connection_t *connectio
        {
                char sig_reply[4];
                int signal;
+
                /* stop forwarding log packets! */
                log_remove_callback(gdb_log_callback, connection);
 
@@ -701,6 +702,9 @@ int gdb_target_callback_event_handler(struct target_s *target, enum target_event
                case TARGET_EVENT_EARLY_HALTED:
                        gdb_frontend_halted(target, connection);
                        break;
+               case TARGET_EVENT_HALTED:
+                       target_call_event_callbacks(target, TARGET_EVENT_GDB_END);
+                       break;
                case TARGET_EVENT_GDB_FLASH_ERASE_START:
                        target_handle_event( target, TARGET_EVENT_OLD_gdb_program_config );
                        if((retval = jtag_execute_queue()) != ERROR_OK)
@@ -815,6 +819,7 @@ int gdb_connection_closed(connection_t *connection)
        }
 
        target_unregister_event_callback(gdb_target_callback_event_handler, connection);
+       target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_END);
        log_remove_callback(gdb_log_callback, connection);
 
        target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_DETACH );
@@ -2054,6 +2059,7 @@ int gdb_input_inner(connection_t *connection)
                                                        gdb_connection_t *gdb_con = connection->priv;
                                                        gdb_con->frontend_state = TARGET_RUNNING;
                                                        log_add_callback(gdb_log_callback, connection);
+                                                       target_call_event_callbacks(target, TARGET_EVENT_GDB_START);
                                                        int retval=gdb_step_continue_packet(connection, target, packet, packet_size);
                                                        if (retval!=ERROR_OK)
                                                        {
index ef22348a9b7cd282cb9ed1caf498d1f4ba279370..6b090495123239415fe34a4bcdbc901f1ccbe1c4 100644 (file)
@@ -48,11 +48,6 @@ static unsigned short telnet_port = 0;
 int handle_exit_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_telnet_port_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
-static int telnet_async()
-{
-       return jim_global_long("telnet_async_state");
-}
-
 static char *negotiate =
                "\xFF\xFB\x03"          /* IAC WILL Suppress Go Ahead */
                "\xFF\xFB\x01"          /* IAC WILL Echo */
@@ -191,8 +186,7 @@ int telnet_new_connection(connection_t *connection)
        telnet_connection->next_history = 0;
        telnet_connection->current_history = 0;
 
-       if (telnet_async())
-               log_add_callback(telnet_log_callback, connection);
+       log_add_callback(telnet_log_callback, connection);
 
 
 
@@ -348,14 +342,8 @@ int telnet_input(connection_t *connection)
 
                                                        t_con->line_cursor = -1; /* to supress prompt in log callback during command execution */
 
-                                                       if (!telnet_async())
-                                                               log_add_callback(telnet_log_callback, connection);
-
                                                        retval = command_run_line(command_context, t_con->line);
 
-                                                       if (!telnet_async())
-                                                               log_remove_callback(telnet_log_callback, connection);
-
                                                        t_con->line_cursor = 0;
 
                                                        if (retval == ERROR_COMMAND_CLOSE_CONNECTION)
index 30b5c2cdc4447c310cafc67100b1034fd04ba126..66c80f4e7d96b6f603ae114f47a3b5afd09983e0 100644 (file)
@@ -175,6 +175,11 @@ const Jim_Nvp nvp_target_event[] = {
        { .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
        { .value = TARGET_EVENT_RESUME_END, .name = "resume-end" },
 
+
+       { .name = "gdb-start", .value = TARGET_EVENT_GDB_START },
+       { .name = "gdb-end", .value = TARGET_EVENT_GDB_END },
+
+
        /* historical name */
 
        { .value = TARGET_EVENT_RESET_START, .name = "reset-start" },
@@ -3841,6 +3846,8 @@ target_create( Jim_GetOptInfo *goi )
        target->next                = NULL;
        target->arch_info           = NULL;
 
+       target->display             = 1;
+
        /* initialize trace information */
        target->trace_info = malloc(sizeof(trace_t));
        target->trace_info->num_trace_points         = 0;
index baae2562d9c161345de8f0773539ab0b1b4e4259..c2ca257238f6e977bdab1222f132ac1d6a392672 100644 (file)
@@ -113,7 +113,7 @@ typedef struct working_area_s
 typedef struct target_type_s
 {
        char *name;
-       
+
        int examined;
 
        /* poll current target status */
@@ -129,39 +129,39 @@ typedef struct target_type_s
        int (*halt)(struct target_s *target);
        int (*resume)(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution);
        int (*step)(struct target_s *target, int current, u32 address, int handle_breakpoints);
-       
+
        /* target reset control. assert reset can be invoked when OpenOCD and
         * the target is out of sync.
-        * 
+        *
         * A typical example is that the target was power cycled while OpenOCD
         * thought the target was halted or running.
-        * 
+        *
         * assert_reset() can therefore make no assumptions whatsoever about the
-        * state of the target 
-        * 
+        * state of the target
+        *
         * Before assert_reset() for the target is invoked, a TRST/tms and
         * chain validation is executed. TRST should not be asserted
         * during target assert unless there is no way around it due to
         * the way reset's are configured.
-        * 
+        *
         */
        int (*assert_reset)(struct target_s *target);
        int (*deassert_reset)(struct target_s *target);
        int (*soft_reset_halt_imp)(struct target_s *target);
        int (*soft_reset_halt)(struct target_s *target);
-       
+
        /* target register access for gdb.
-        * 
+        *
         * Danger! this function will succeed even if the target is running
         * and return a register list with dummy values.
-        * 
+        *
         * The reason is that GDB connection will fail without a valid register
         * list, however it is after GDB is connected that monitor commands can
         * be run to properly initialize the target
         */
        int (*get_gdb_reg_list)(struct target_s *target, struct reg_s **reg_list[], int *reg_list_size);
-       
-       /* target memory access 
+
+       /* target memory access
        * size: 1 = byte (8bit), 2 = half-word (16bit), 4 = word (32bit)
        * count: number of items of <size>
        */
@@ -169,26 +169,26 @@ typedef struct target_type_s
        int (*read_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
        int (*write_memory_imp)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
        int (*write_memory)(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer);
-       
+
        /* write target memory in multiples of 4 byte, optimized for writing large quantities of data */
        int (*bulk_write_memory)(struct target_s *target, u32 address, u32 count, u8 *buffer);
-       
+
        int (*checksum_memory)(struct target_s *target, u32 address, u32 count, u32* checksum);
        int (*blank_check_memory)(struct target_s *target, u32 address, u32 count, u32* blank);
-       
-       /* 
-        * target break-/watchpoint control 
+
+       /*
+        * target break-/watchpoint control
         * rw: 0 = write, 1 = read, 2 = access
-        * 
+        *
         * Target must be halted while this is invoked as this
         * will actually set up breakpoints on target.
-        * 
+        *
         * The breakpoint hardware will be set up upon adding the first breakpoint.
-        * 
+        *
         * Upon GDB connection all breakpoints/watchpoints are cleared.
         */
        int (*add_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
-       
+
        /* remove breakpoint. hw will only be updated if the target is currently halted.
         * However, this method can be invoked on unresponsive targets.
         */
@@ -203,7 +203,7 @@ typedef struct target_type_s
        int (*run_algorithm_imp)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
        int (*run_algorithm)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
 
-       int (*register_commands)(struct command_context_s *cmd_ctx);    
+       int (*register_commands)(struct command_context_s *cmd_ctx);
 
        /* called when target is created */
        int (*target_create)( struct target_s *target, Jim_Interp *interp );
@@ -220,21 +220,21 @@ typedef struct target_type_s
        /* invoked after JTAG chain has been examined & validated. During
         * this stage the target is examined and any additional setup is
         * performed.
-        * 
+        *
         * invoked every time after the jtag chain has been validated/examined
         */
        int (*examine)(struct target_s *target);
        /* Set up structures for target.
-        *  
+        *
         * It is illegal to talk to the target at this stage as this fn is invoked
         * before the JTAG chain has been examined/verified
      */
        int (*init_target)(struct command_context_s *cmd_ctx, struct target_s *target);
        int (*quit)(void);
-       
+
        int (*virt2phys)(struct target_s *target, u32 address, u32 *physical);
        int (*mmu)(struct target_s *target, int *enabled);
-       
+
 } target_type_t;
 
 // forward decloration
@@ -250,7 +250,7 @@ typedef struct target_s
        target_event_action_t *event_action;
 
        int reset_halt;                                         /* attempt resetting the CPU into the halted mode? */
-       u32 working_area;                                       /* working area (initialized RAM). Evaluated 
+       u32 working_area;                                       /* working area (initialized RAM). Evaluated
                                                                                   upon first allocation from virtual/physical address. */
        u32 working_area_virt;                          /* virtual address */
        u32 working_area_phys;                          /* physical address */
@@ -268,6 +268,9 @@ typedef struct target_s
        u32 dbg_msg_enabled;                            /* debug message status */
        void *arch_info;                                        /* architecture specific information */
        struct target_s *next;                          /* next target in list */
+
+       int display;                                            /* display async info in telnet session. Do not display
+                                                                                  lots of halted/resumed info when stepping in debugger. */
 } target_t;
 
 enum target_event
@@ -290,6 +293,9 @@ enum target_event
        TARGET_EVENT_RESUME_START,
        TARGET_EVENT_RESUME_END,
 
+       TARGET_EVENT_GDB_START, /* debugger started execution (step/run) */
+       TARGET_EVENT_GDB_END, /* debugger stopped execution (step/run) */
+
        TARGET_EVENT_RESET_START,
        TARGET_EVENT_RESET_ASSERT_PRE,
        TARGET_EVENT_RESET_ASSERT_POST,
@@ -308,7 +314,7 @@ enum target_event
 
        TARGET_EVENT_EXAMINE_START,
        TARGET_EVENT_EXAMINE_END,
-       
+
 
        TARGET_EVENT_GDB_ATTACH,
        TARGET_EVENT_GDB_DETACH,
@@ -359,7 +365,7 @@ extern int target_resume(target_t *target, int current, u32 address, int handle_
 extern int target_halt(target_t *target);
 extern int target_call_event_callbacks(target_t *target, enum target_event event);
 
-/* The period is very approximate, the callback can happen much more often 
+/* The period is very approximate, the callback can happen much more often
  * or much more rarely than specified
  */
 extern int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv);
@@ -381,15 +387,15 @@ extern int target_blank_check_memory(struct target_s *target, u32 address, u32 s
 extern int target_wait_state(target_t *target, enum target_state state, int ms);
 
 /* DANGER!!!!!
- * 
+ *
  * if "area" passed in to target_alloc_working_area() points to a memory
  * location that goes out of scope (e.g. a pointer on the stack), then
  * the caller of target_alloc_working_area() is responsible for invoking
  * target_free_working_area() before "area" goes out of scope.
- * 
+ *
  * target_free_all_working_areas() will NULL out the "area" pointer
  * upon resuming or resetting the CPU.
- * 
+ *
  */
 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);