* hppa-tdep.c (hppa_push_arguments): Allocate enough space for
[deliverable/binutils-gdb.git] / gdb / remote-nindy.c
index 1e38f3d3bd412f4117582a6fddc53f8358a9890a..55efac778dacd76f295b15290bd7604916163f8c 100644 (file)
@@ -1,5 +1,5 @@
 /* Memory-access and commands for remote NINDY process, for GDB.
-   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
    Contributed by Intel Corporation.  Modified from remote.c by Chris Benenati.
 
 GDB is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -102,10 +102,11 @@ NINDY ROM monitor at the other end of the line.
 
 #include "frame.h"
 #include "inferior.h"
+#include "bfd.h"
+#include "symfile.h"
 #include "target.h"
 #include "gdbcore.h"
 #include "command.h"
-#include "bfd.h"
 #include "ieee-float.h"
 
 #include "wait.h"
@@ -121,11 +122,9 @@ extern int unlink();
 extern char *getenv();
 extern char *mktemp();
 
-extern char *coffstrip();
 extern void generic_mourn_inferior ();
 
 extern struct target_ops nindy_ops;
-extern jmp_buf to_top_level;
 extern FILE *instream;
 extern struct ext_format ext_format_i960;      /* i960-tdep.c */
 
@@ -145,8 +144,18 @@ static int have_regs = 0;  /* 1 iff regs read since i960 last halted */
 static int regs_changed = 0;   /* 1 iff regs were modified since last read */
 
 extern char *exists();
-static void dcache_flush (), dcache_poke (), dcache_init();
-static int dcache_fetch ();
+
+static void
+dcache_flush (), dcache_poke (), dcache_init();
+
+static int
+dcache_fetch ();
+
+static void
+nindy_fetch_registers PARAMS ((int));
+
+static void
+nindy_store_registers PARAMS ((int));
 \f
 /* FIXME, we can probably use the normal terminal_inferior stuff here.
    We have to do terminal_inferior and then set up the passthrough
@@ -262,57 +271,8 @@ nindy_files_info ()
          nindy_initial_brk? " with initial break": "");
 }
 \f
-/******************************************************************************
- * remote_load:
- *     Download an object file to the remote system by invoking the "comm960"
- *     utility.  We look for "comm960" in $G960BIN, $G960BASE/bin, and
- *     DEFAULT_BASE/bin/HOST/bin where
- *             DEFAULT_BASE is defined in env.h, and
- *             HOST must be defined on the compiler invocation line.
- ******************************************************************************/
-
-static void
-nindy_load( filename, from_tty )
-    char *filename;
-    int from_tty;
-{
-  char *tmpfile;
-  struct cleanup *old_chain;
-  char *scratch_pathname;
-  int scratch_chan;
-
-  if (!filename)
-    filename = get_exec_file (1);
-
-  filename = tilde_expand (filename);
-  make_cleanup (free, filename);
-
-  scratch_chan = openp (getenv ("PATH"), 1, filename, O_RDONLY, 0,
-                       &scratch_pathname);
-  if (scratch_chan < 0)
-    perror_with_name (filename);
-  close (scratch_chan);                /* Slightly wasteful FIXME */
-
-  have_regs = regs_changed = 0;
-  mark_breakpoints_out();
-  inferior_pid = 0;
-  dcache_flush();
-
-  tmpfile = coffstrip(scratch_pathname);
-  if ( tmpfile ){
-         old_chain = make_cleanup (unlink,tmpfile);
-         immediate_quit++;
-         ninDownload( tmpfile, !from_tty );
-/* FIXME, don't we want this merged in here? */
-         immediate_quit--;
-         do_cleanups (old_chain);
-  }
-}
-
-
-
-/* Return the number of characters in the buffer before the first DLE character.
- */
+/* Return the number of characters in the buffer before
+   the first DLE character.  */
 
 static
 int
@@ -341,7 +301,7 @@ nindy_resume (step, siggnal)
 
        dcache_flush();
        if ( regs_changed ){
-               nindy_store_registers ();
+               nindy_store_registers (-1);
                regs_changed = 0;
        }
        have_regs = 0;
@@ -355,7 +315,7 @@ nindy_resume (step, siggnal)
  * Return to caller, storing status in 'status' just as `wait' would.
  */
 
-void
+static int
 nindy_wait( status )
     WAITTYPE *status;
 {
@@ -419,9 +379,12 @@ nindy_wait( status )
                                        immediate_quit--;
                                } else {
                                        /* Get out of loop */
-                                       supply_register (IP_REGNUM, &ip_value);
-                                       supply_register (FP_REGNUM, &fp_value);
-                                       supply_register (SP_REGNUM, &sp_value);
+                                       supply_register (IP_REGNUM, 
+                                                        (char *)&ip_value);
+                                       supply_register (FP_REGNUM, 
+                                                        (char *)&fp_value);
+                                       supply_register (SP_REGNUM, 
+                                                        (char *)&sp_value);
                                        break;
                                }
                        }
@@ -456,6 +419,7 @@ nindy_wait( status )
                }
                WSETSTOP( (*status), stop_code );
        }
+       return inferior_pid;
 }
 
 /* Read the remote registers into the block REGS.  */
@@ -519,7 +483,7 @@ nindy_store_registers(regno)
   bcopy (&registers[REGISTER_BYTE (PCW_REGNUM)], nindy_regs.pcw_acw,     2*4);
   bcopy (&registers[REGISTER_BYTE (IP_REGNUM)], nindy_regs.ip,           1*4);
   bcopy (&registers[REGISTER_BYTE (TCW_REGNUM)], nindy_regs.tcw,         1*4);
-  /* Float regs.  Only works on IEEE_FLOAT hosts.  */
+  /* Float regs.  Only works on IEEE_FLOAT hosts.  FIXME!  */
   for (regnum = FP0_REGNUM; regnum < FP0_REGNUM + 4; regnum++) {
     ieee_extended_to_double (&ext_format_i960,
                             &registers[REGISTER_BYTE (regnum)], &dub);
@@ -527,7 +491,7 @@ nindy_store_registers(regno)
     /* FIXME-someday, the arguments to unpack_double are backward.
        It expects a target double and returns a host; we pass the opposite.
        This mostly works but not quite.  */
-    dub = unpack_double (builtin_type_double, &dub, &inv);
+    dub = unpack_double (builtin_type_double, (char *)&dub, &inv);
     /* dub now in target byte order */
     bcopy ((char *)&dub, &nindy_regs.fp_as_double[8 * (regnum - FP0_REGNUM)],
        8);
@@ -871,9 +835,27 @@ void
 nindy_mourn_inferior ()
 {
   remove_breakpoints ();
+  unpush_target (&nindy_ops);
   generic_mourn_inferior ();   /* Do all the proper things now */
 }
 \f
+/* Pass the args the way catch_errors wants them.  */
+static int
+nindy_open_stub (arg)
+     char *arg;
+{
+  nindy_open (arg, 1);
+  return 1;
+}
+
+static int
+load_stub (arg)
+     char *arg;
+{
+  target_load (arg, 1);
+  return 1;
+}
+
 /* This routine is run as a hook, just before the main command loop is
    entered.  If gdb is configured for the i960, but has not had its
    nindy target specified yet, this will loop prompting the user to do so.
@@ -882,12 +864,12 @@ nindy_mourn_inferior ()
    of this with a RETURN.  This is useful when e.g. simply examining
    an i960 object file on the host system.  */
 
+void
 nindy_before_main_loop ()
 {
   char ttyname[100];
   char *p, *p2;
 
-  setjmp(to_top_level);
   while (current_target != &nindy_ops) { /* remote tty not specified yet */
        if ( instream == stdin ){
                printf("\nAttach /dev/ttyNN -- specify NN, or \"quit\" to quit:  ");
@@ -906,17 +888,20 @@ nindy_before_main_loop ()
                ;
        }
        *p2= '\0';
-       if ( !strcmp("quit",p) ){
+       if ( STREQ("quit",p) ){
                exit(1);
        }
 
-       nindy_open( p, 1 );
-
-       /* Now that we have a tty open for talking to the remote machine,
-          download the executable file if one was specified.  */
-       if ( !setjmp(to_top_level) && exec_bfd ) {
-             target_load (bfd_get_filename (exec_bfd), 1);
-       }
+       if (catch_errors (nindy_open_stub, p, "", RETURN_MASK_ALL))
+         {
+           /* Now that we have a tty open for talking to the remote machine,
+              download the executable file if one was specified.  */
+           if (exec_bfd)
+             {
+               catch_errors (load_stub, bfd_get_filename (exec_bfd), "",
+                             RETURN_MASK_ALL);
+             }
+         }
   }
 }
 \f
@@ -930,17 +915,22 @@ The speed (baud rate), whether to use the old NINDY protocol,\n\
 and whether to send a break on startup, are controlled by options\n\
 specified when you started GDB.",
        nindy_open, nindy_close,
-       0, nindy_detach, nindy_resume, nindy_wait,
+       0,
+       nindy_detach,
+       nindy_resume,
+       nindy_wait,
        nindy_fetch_registers, nindy_store_registers,
-       nindy_prepare_to_store, 0, 0, /* conv_from, conv_to */
+       nindy_prepare_to_store,
        nindy_xfer_inferior_memory, nindy_files_info,
        0, 0, /* insert_breakpoint, remove_breakpoint, */
        0, 0, 0, 0, 0,  /* Terminal crud */
        nindy_kill,
-       nindy_load,
+       generic_load,
        0, /* lookup_symbol */
        nindy_create_inferior,
        nindy_mourn_inferior,
+       0,              /* can_run */
+       0, /* notice_signals */
        process_stratum, 0, /* next */
        1, 1, 1, 1, 1,  /* all mem, mem, stack, regs, exec */
        0, 0,                   /* Section pointers */
This page took 0.026059 seconds and 4 git commands to generate.