1999-01-19 Fernando Nasser <fnasser@totem.to.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / remote-sds.c
index d39af60fd744cb411c04afebed35d70ceefd2537..33e2bb522a297a318fcc534abaec79aedd21679d 100644 (file)
@@ -35,7 +35,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "objfiles.h"
 #include "gdb-stabs.h"
 #include "gdbthread.h"
-
+#include "gdbcore.h"
 #include "dcache.h"
 
 #ifdef USG
@@ -62,7 +62,7 @@ static void sds_fetch_registers PARAMS ((int));
 
 static void sds_resume PARAMS ((int, int, enum target_signal));
 
-static int sds_start_remote PARAMS ((char *));
+static int sds_start_remote PARAMS ((PTR));
 
 static void sds_open PARAMS ((char *, int));
 
@@ -72,10 +72,10 @@ static void sds_store_registers PARAMS ((int));
 
 static void sds_mourn PARAMS ((void));
 
-static void sds_restart PARAMS ((void));
-
 static void sds_create_inferior PARAMS ((char *, char *, char **));
 
+static void sds_load PARAMS ((char *, int));
+
 static int getmessage PARAMS ((unsigned char *, int));
 
 static int putmessage PARAMS ((unsigned char *, int));
@@ -138,13 +138,6 @@ static int just_started;
 
 static int message_pending;
 
-\f
-/*  Restart the remote side; this is an extended protocol operation.  */
-
-static void
-sds_restart ()
-{
-}
 \f
 /* Clean up connection to a remote debugger.  */
 
@@ -162,7 +155,7 @@ sds_close (quitting)
 
 static int
 sds_start_remote (dummy)
-     char *dummy;
+     PTR dummy;
 {
   char c;
   unsigned char buf[200];
@@ -174,7 +167,7 @@ sds_start_remote (dummy)
   SERIAL_WRITE (sds_desc, "{#}\r\n", 5);
 
   while ((c = readchar (1)) >= 0)
-    printf_unfiltered ("%c");
+    printf_unfiltered ("%c", c);
   printf_unfiltered ("\n");
 
   next_msg_id = 251;
@@ -239,21 +232,12 @@ device is attached to the remote system (e.g. /dev/ttya).");
     }
   push_target (&sds_ops);      /* Switch to using remote target now */
 
-  /* Without this, some commands which require an active target (such
-     as kill) won't work.  This variable serves (at least) double duty
-     as both the pid of the target process (if it has such), and as a
-     flag indicating that a target is active.  These functions should
-     be split out into seperate variables, especially since GDB will
-     someday have a notion of debugging several processes.  */
-
-  inferior_pid = 42000;
-
   just_started = 1;
 
   /* Start the remote connection; if error (0), discard this target.
      In particular, if the user quits, be sure to discard it (we'd be
      in an inconsistent state otherwise).  */
-  if (!catch_errors (sds_start_remote, (char *)0
+  if (!catch_errors (sds_start_remote, NULL
                     "Couldn't establish connection to remote target\n",
                     RETURN_MASK_ALL))
     pop_target ();
@@ -992,7 +976,7 @@ getmessage (buf, forever)
          if (c3 == '+')
            {
              message_pending = 1;
-             return;
+             return 0; /*????*/
            }
          continue;
        }
@@ -1044,29 +1028,13 @@ getmessage (buf, forever)
   /* We have tried hard enough, and just can't receive the packet.  Give up. */
 
   printf_unfiltered ("Ignoring packet error, continuing...\n");
+  return 0;
 }
 \f
 static void
 sds_kill ()
 {
-  /* For some mysterious reason, wait_for_inferior calls kill instead of
-     mourn after it gets TARGET_WAITKIND_SIGNALLED.  Work around it.  */
-  if (kill_kludge)
-    {
-      kill_kludge = 0;
-      target_mourn_inferior ();
-      return;
-    }
-
-#if 0 /* fix to use 1-arg fn */
-  /* Use catch_errors so the user can quit from gdb even when we aren't on
-     speaking terms with the remote system.  */
-  catch_errors (putmessage, "k", "", RETURN_MASK_ERROR);
-#endif
-
-  /* Don't wait for it to die.  I'm not really sure it matters whether
-     we do or not.  For the existing stubs, kill is a noop.  */
-  target_mourn_inferior ();
+  /* Don't try to do anything to the target.  */
 }
 
 static void
@@ -1082,24 +1050,24 @@ sds_create_inferior (exec_file, args, env)
      char *args;
      char **env;
 {
-  /* Rip out the breakpoints; we'll reinsert them after restarting
-     the remote server.  */
-  remove_breakpoints ();
-
-  /* Now restart the remote server.  */
-  sds_restart ();
-
-  /* Now put the breakpoints back in.  This way we're safe if the
-     restart function works via a unix fork on the remote side.  */
-  insert_breakpoints ();
+  inferior_pid = 42000;
 
   /* Clean up from the last time we were running.  */
   clear_proceed_status ();
 
   /* Let the remote process run.  */
-  proceed (-1, TARGET_SIGNAL_0, 0);
+  proceed (bfd_get_start_address (exec_bfd), TARGET_SIGNAL_0, 0);
 }
 
+static void
+sds_load (filename, from_tty)
+    char *filename;
+    int from_tty;
+{
+  generic_load (filename, from_tty);
+
+  inferior_pid = 0;
+}
 \f
 /* The SDS monitor has commands for breakpoint insertion, although it
    it doesn't actually manage the breakpoints, it just returns the
@@ -1154,50 +1122,75 @@ sds_remove_breakpoint (addr, contents_cache)
 \f
 /* Define the target operations vector. */
 
-static struct target_ops sds_ops =
+static struct target_ops sds_ops ;
+
+static void 
+init_sds_ops(void)
 {
-  "sds",                       /* to_shortname */
-  "Remote serial target with SDS protocol",    /* to_longname */
-  "Use a remote computer via a serial line, using the SDS protocol.\n\
-Specify the serial device it is connected to (e.g. /dev/ttya).",  /* to_doc */
-  sds_open,                    /* to_open */
-  sds_close,                   /* to_close */
-  NULL,                                /* to_attach */
-  sds_detach,                  /* to_detach */
-  sds_resume,                  /* to_resume */
-  sds_wait,                    /* to_wait */
-  sds_fetch_registers,         /* to_fetch_registers */
-  sds_store_registers,         /* to_store_registers */
-  sds_prepare_to_store,                /* to_prepare_to_store */
-  sds_xfer_memory,             /* to_xfer_memory */
-  sds_files_info,              /* to_files_info */
-  sds_insert_breakpoint,       /* to_insert_breakpoint */
-  sds_remove_breakpoint,       /* to_remove_breakpoint */
-  NULL,                                /* to_terminal_init */
-  NULL,                                /* to_terminal_inferior */
-  NULL,                                /* to_terminal_ours_for_output */
-  NULL,                                /* to_terminal_ours */
-  NULL,                                /* to_terminal_info */
-  sds_kill,                    /* to_kill */
-  generic_load,                        /* to_load */
-  NULL,                                /* to_lookup_symbol */
-  sds_create_inferior,         /* to_create_inferior */
-  sds_mourn,                   /* to_mourn_inferior */
-  0,                           /* to_can_run */
-  0,                           /* to_notice_signals */
-  0,                           /* to_thread_alive */
-  0,                           /* to_stop */
-  process_stratum,             /* to_stratum */
-  NULL,                                /* to_next */
-  1,                           /* to_has_all_memory */
-  1,                           /* to_has_memory */
-  1,                           /* to_has_stack */
-  1,                           /* to_has_registers */
-  1,                           /* to_has_execution */
-  NULL,                                /* sections */
-  NULL,                                /* sections_end */
-  OPS_MAGIC                    /* to_magic */
-};
+  sds_ops.to_shortname =   "sds";
+  sds_ops.to_longname =   "Remote serial target with SDS protocol";
+  sds_ops.to_doc =   "Use a remote computer via a serial line; using the SDS protocol.\n\
+Specify the serial device it is connected to (e.g. /dev/ttya).", 
+    sds_ops.to_open =   sds_open;      
+  sds_ops.to_close =   sds_close;      
+  sds_ops.to_attach =   NULL;
+  sds_ops.to_post_attach = NULL;
+  sds_ops.to_require_attach = NULL;            
+  sds_ops.to_detach =   sds_detach;
+  sds_ops.to_require_detach = NULL;    
+  sds_ops.to_resume =   sds_resume;    
+  sds_ops.to_wait  =   sds_wait;
+  sds_ops.to_post_wait = NULL; 
+  sds_ops.to_fetch_registers  =   sds_fetch_registers;
+  sds_ops.to_store_registers  =   sds_store_registers; 
+  sds_ops.to_prepare_to_store =   sds_prepare_to_store;        
+  sds_ops.to_xfer_memory  =   sds_xfer_memory; 
+  sds_ops.to_files_info  =   sds_files_info;   
+  sds_ops.to_insert_breakpoint =   sds_insert_breakpoint;
+  sds_ops.to_remove_breakpoint =   sds_remove_breakpoint;
+  sds_ops.to_terminal_init  =   NULL;          
+  sds_ops.to_terminal_inferior =   NULL;       
+  sds_ops.to_terminal_ours_for_output =   NULL;        
+  sds_ops.to_terminal_ours  =   NULL;  
+  sds_ops.to_terminal_info  =   NULL;  
+  sds_ops.to_kill  =   sds_kill;       
+  sds_ops.to_load  =   sds_load;       
+  sds_ops.to_lookup_symbol =   NULL;                   
+  sds_ops.to_create_inferior =   sds_create_inferior;
+  sds_ops.to_post_startup_inferior = NULL;
+  sds_ops.to_acknowledge_created_inferior = NULL;
+  sds_ops.to_clone_and_follow_inferior = NULL;
+  sds_ops.to_post_follow_inferior_by_clone = NULL;
+  sds_ops.to_insert_fork_catchpoint = NULL;
+  sds_ops.to_remove_fork_catchpoint = NULL;
+  sds_ops.to_insert_vfork_catchpoint = NULL;
+  sds_ops.to_remove_vfork_catchpoint = NULL;
+  sds_ops.to_has_forked = NULL;
+  sds_ops.to_has_vforked = NULL;
+  sds_ops.to_can_follow_vfork_prior_to_exec = NULL;
+  sds_ops.to_post_follow_vfork = NULL;
+  sds_ops.to_insert_exec_catchpoint = NULL;
+  sds_ops.to_remove_exec_catchpoint = NULL;
+  sds_ops.to_has_execd = NULL;
+  sds_ops.to_reported_exec_events_per_exec_call = NULL;
+  sds_ops.to_has_exited = NULL;
+  sds_ops.to_mourn_inferior =   sds_mourn;
+  sds_ops.to_can_run  =   0;           
+  sds_ops.to_notice_signals =   0;     
+  sds_ops.to_thread_alive  =   0;      
+  sds_ops.to_stop  =   0;
+  sds_ops.to_pid_to_exec_file = NULL;
+  sds_ops.to_core_file_to_sym_file = NULL;             
+  sds_ops.to_stratum =   process_stratum;
+  sds_ops.DONT_USE =   NULL;           
+  sds_ops.to_has_all_memory =   1;
+  sds_ops.to_has_memory =   1; 
+  sds_ops.to_has_stack =   1;                          /* to_has_stack */
+  sds_ops.to_has_registers =   1;  sds_ops.to_has_execution =   1;
+  sds_ops.to_sections =   NULL;        
+  sds_ops.to_sections_end =   NULL;
+  sds_ops.to_magic =   OPS_MAGIC ;
+}
 
 /* Put a command string, in args, out to the monitor and display the
    reply message.  */
@@ -1235,6 +1228,7 @@ sds_command (args, from_tty)
 void
 _initialize_remote_sds ()
 {
+  init_sds_ops() ;
   add_target (&sds_ops);
 
   add_show_from_set (add_set_cmd ("sdstimeout", no_class,
This page took 0.026309 seconds and 4 git commands to generate.