* configure.in (hppa*-*-*): Also configure and build stabs-only
[deliverable/binutils-gdb.git] / gdb / remote-eb.c
index 9f8cc5eaea2648dbef7e8c400e5ba72addc1e9a9..5cf0c7535c4e9c237ae863d3a56f909872a80155 100644 (file)
@@ -1,13 +1,13 @@
 /* Remote debugging interface for AMD 29000 EBMON on IBM PC, for GDB.
-   Copyright 1990-1991 Free Software Foundation, Inc.
+   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
    Contributed by Cygnus Support.  Written by Jim Kingdon for Cygnus.
 
 This file is part of GDB.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
-any later version.
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -15,22 +15,22 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with this program; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* This is like remote.c but is for an esoteric situation--
-   having a 29k board in a PC hooked up to a unix machine with
+   having a a29k board in a PC hooked up to a unix machine with
    a serial line, and running ctty com1 on the PC, through which
    the unix machine can run ebmon.  Not to mention that the PC
    has PC/NFS, so it can access the same executables that gdb can,
    over the net in real time.  */
 
-#include <stdio.h>
-#include <string.h>
 #include "defs.h"
-#include "tm-29k.h"
-#include "param-no-tm.h"
+#include <string.h>
+
 #include "inferior.h"
+#include "bfd.h"
+#include "symfile.h"
 #include "wait.h"
 #include "value.h"
 #include <ctype.h>
@@ -39,18 +39,18 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include <errno.h>
 #include "terminal.h"
 #include "target.h"
-
-extern void add_syms_addr_command ();
-extern struct value *call_function_by_hand();
+#include "gdbcore.h"
 
 extern struct target_ops eb_ops;               /* Forward declaration */
 
+static void eb_close();
+
 #define LOG_FILE "eb.log"
 #if defined (LOG_FILE)
 FILE *log_file;
 #endif
 
-static int timeout = 5;
+static int timeout = 24;
 
 /* Descriptor for I/O to remote machine.  Initialize it to -1 so that
    eb_open knows that we don't have a file open when the program
@@ -198,7 +198,7 @@ get_hex_regs (n, regno)
       val = 0;
       for (j = 0; j < 8; j++)
        val = (val << 4) + get_hex_digit (j == 0);
-      supply_register (regno++, &val);
+      supply_register (regno++, (char *) &val);
     }
 }
 
@@ -236,24 +236,56 @@ static int need_artificial_trap = 0;
 
 /* This is called not only when we first attach, but also when the
    user types "run" after having attached.  */
-void
-eb_start (inferior_args)
-char *inferior_args;
+static void
+eb_create_inferior (execfile, args, env)
+     char *execfile;
+     char *args;
+     char **env;
 {
-  /* OK, now read in the file.  Y=read, C=COFF, D=no symbols
-     0=start address, %s=filename.  */
+  int entry_pt;
 
-  fprintf (eb_stream, "YC D,0:%s", prog_name);
+  if (args && *args)
+    error ("Can't pass arguments to remote EBMON process");
 
-  if (inferior_args != NULL)
-      fprintf(eb_stream, " %s", inferior_args);
+  if (execfile == 0 || exec_bfd == 0)
+    error ("No exec file specified");
 
-  fprintf (eb_stream, "\n");
-  fflush (eb_stream);
+  entry_pt = (int) bfd_get_start_address (exec_bfd);
 
-  expect_prompt ();
+  {
+    /* OK, now read in the file.  Y=read, C=COFF, D=no symbols
+       0=start address, %s=filename.  */
+
+    fprintf (eb_stream, "YC D,0:%s", prog_name);
+
+    if (args != NULL)
+       fprintf(eb_stream, " %s", args);
+
+    fprintf (eb_stream, "\n");
+    fflush (eb_stream);
 
-  need_gi = 1;
+    expect_prompt ();
+
+    need_gi = 1;
+  }
+
+/* The "process" (board) is already stopped awaiting our commands, and
+   the program is already downloaded.  We just set its PC and go.  */
+
+  clear_proceed_status ();
+
+  /* Tell wait_for_inferior that we've started a new process.  */
+  init_wait_for_inferior ();
+
+  /* Set up the "saved terminal modes" of the inferior
+     based on what modes we are starting it with.  */
+  target_terminal_init ();
+
+  /* Install inferior's terminal modes.  */
+  target_terminal_inferior ();
+
+  /* insert_step_breakpoint ();  FIXME, do we need this?  */
+  proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);             /* Let 'er rip... */
 }
 
 /* Translate baud rates from integers to damn B_codes.  Unix should
@@ -401,7 +433,7 @@ the baud rate, and the name of the program to run on the remote system.");
 
 /* Close out all files and local state before this target loses control. */
 
-void
+static void
 eb_close (quitting)
      int quitting;
 {
@@ -419,10 +451,12 @@ eb_close (quitting)
   eb_desc = -1;
 
 #if defined (LOG_FILE)
-  if (ferror (log_file))
-    printf ("Error writing log file.\n");
-  if (fclose (log_file) != 0)
-    printf ("Error closing log file.\n");
+  if (log_file) {
+    if (ferror (log_file))
+      printf ("Error writing log file.\n");
+    if (fclose (log_file) != 0)
+      printf ("Error closing log file.\n");
+  }
 #endif
 }
 
@@ -441,8 +475,9 @@ eb_detach (from_tty)
 /* Tell the remote machine to resume.  */
 
 void
-eb_resume (step, sig)
-     int step, sig;
+eb_resume (pid, step, sig)
+     int pid, step;
+     enum target_signal sig;
 {
   if (step)
     {
@@ -483,7 +518,7 @@ eb_resume (step, sig)
 
 int
 eb_wait (status)
-     WAITTYPE *status;
+     struct target_waitstatus *status;
 {
   /* Strings to look for.  '?' means match any single character.  
      Note that with the algorithm we use, the initial character
@@ -508,11 +543,13 @@ eb_wait (status)
 
   int old_timeout = timeout;
 
-  WSETEXIT ((*status), 0);
+  status->kind = TARGET_WAITKIND_EXITED;
+  status->value.integer = 0;
 
   if (need_artificial_trap != 0)
     {
-      WSETSTOP ((*status), SIGTRAP);
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_TRAP;
       need_artificial_trap--;
       return 0;
     }
@@ -561,9 +598,15 @@ eb_wait (status)
     }
   expect_prompt ();
   if (*bp== '\0')
-    WSETSTOP ((*status), SIGTRAP);
+    {
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_TRAP;
+    }
   else
-    WSETEXIT ((*status), 0);
+    {
+      status->kind = TARGET_WAITKIND_EXITED;
+      status->value.integer = 0;
+    }
   timeout = old_timeout;
 
   return 0;
@@ -679,10 +722,10 @@ eb_fetch_registers ()
   /* There doesn't seem to be any way to get these.  */
   {
     int val = -1;
-    supply_register (FPE_REGNUM, &val);
-    supply_register (INT_REGNUM, &val);
-    supply_register (FPS_REGNUM, &val);
-    supply_register (EXO_REGNUM, &val);
+    supply_register (FPE_REGNUM, (char *) &val);
+    supply_register (INTE_REGNUM, (char *) &val);
+    supply_register (FPS_REGNUM, (char *) &val);
+    supply_register (EXO_REGNUM, (char *) &val);
   }
 
   write (eb_desc, "dw gr1,gr1\n", 11);
@@ -693,7 +736,7 @@ eb_fetch_registers ()
 
 /* Fetch register REGNO, or all registers if REGNO is -1.
    Returns errno value.  */
-int
+void
 eb_fetch_register (regno)
      int regno;
 {
@@ -708,7 +751,7 @@ eb_fetch_register (regno)
       get_hex_regs (1, regno);
       expect_prompt ();
     }
-  return 0;
+  return;
 }
 
 /* Store the remote registers from the contents of the block REGS.  */
@@ -752,7 +795,7 @@ eb_store_registers ()
 
 /* Store register REGNO, or all if REGNO == 0.
    Return errno value.  */
-int
+void
 eb_store_register (regno)
      int regno;
 {
@@ -772,7 +815,6 @@ eb_store_register (regno)
        registers_changed ();
       expect_prompt ();
     }
-  return 0;
 }
 
 /* Get ready to modify the registers array.  On machines which store
@@ -787,18 +829,20 @@ eb_prepare_to_store ()
   /* Do nothing, since we can store individual regs */
 }
 
-/* FIXME!  Merge these two.  */
+
+/* FIXME-someday!  Merge these two.  */
 int
-eb_xfer_inferior_memory (memaddr, myaddr, len, write)
+eb_xfer_inferior_memory (memaddr, myaddr, len, write, target)
      CORE_ADDR memaddr;
      char *myaddr;
      int len;
      int write;
+     struct target_ops *target;                /* ignored */
 {
   if (write)
     return eb_write_inferior_memory (memaddr, myaddr, len);
   else
-    return eb_write_inferior_memory (memaddr, myaddr, len);
+    return eb_read_inferior_memory (memaddr, myaddr, len);
 }
 
 void
@@ -809,7 +853,7 @@ eb_files_info ()
 }
 
 /* Copy LEN bytes of data from debugger memory at MYADDR
-   to inferior's memory at MEMADDR.  Returns errno value.  */
+   to inferior's memory at MEMADDR.  Returns length moved.  */
 int
 eb_write_inferior_memory (memaddr, myaddr, len)
      CORE_ADDR memaddr;
@@ -830,11 +874,11 @@ eb_write_inferior_memory (memaddr, myaddr, len)
       else
        fprintf (eb_stream, "%x,", ((unsigned char *)myaddr)[i]);
     }
-  return 0;
+  return len;
 }
 
 /* Read LEN bytes from inferior memory at MEMADDR.  Put the result
-   at debugger address MYADDR.  Returns errno value.  */
+   at debugger address MYADDR.  Returns length moved.  */
 int
 eb_read_inferior_memory(memaddr, myaddr, len)
      CORE_ADDR memaddr;
@@ -861,8 +905,10 @@ eb_read_inferior_memory(memaddr, myaddr, len)
      eb_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
      doesn't need to work.  Detect it and give up if there's an attempt
      to do that.  */
-  if (((memaddr - 1) + len) < memaddr)
-    return EIO;
+  if (((memaddr - 1) + len) < memaddr) {
+    errno = EIO;
+    return 0;
+  }
   
   startaddr = memaddr;
   count = 0;
@@ -902,9 +948,30 @@ eb_read_inferior_memory(memaddr, myaddr, len)
 
       startaddr += len_this_pass;
     }
-  return 0;
+  return len;
+}
+
+static void
+eb_kill (args, from_tty)
+     char *args;
+     int from_tty;
+{
+  return;              /* Ignore attempts to kill target system */
 }
 
+/* Clean up when a program exits.
+
+   The program actually lives on in the remote processor's RAM, and may be
+   run again without a download.  Don't leave it full of breakpoint
+   instructions.  */
+
+void
+eb_mourn_inferior ()
+{
+  remove_breakpoints ();
+  unpush_target (&eb_ops);
+  generic_mourn_inferior ();   /* Do all the proper things now */
+}
 /* Define the target subroutine names */
 
 struct target_ops eb_ops = {
@@ -917,18 +984,20 @@ executable as it exists on the remote computer.  For example,\n\
        eb_open, eb_close, 
        0, eb_detach, eb_resume, eb_wait,
        eb_fetch_register, eb_store_register,
-       eb_prepare_to_store, 0, 0,      /* conv_to, conv_from */
+       eb_prepare_to_store,
        eb_xfer_inferior_memory, eb_files_info,
        0, 0,   /* Breakpoints */
        0, 0, 0, 0, 0,  /* Terminal handling */
-       0,      /* FIXME, kill */
-       0, add_syms_addr_command,       /* load */
-       call_function_by_hand,
+       eb_kill,
+       generic_load,   /* load */
        0, /* lookup_symbol */
-       0, /* create_inferior FIXME, eb_start here or something? */
-       0, /* mourn_inferior FIXME */
+       eb_create_inferior,
+       eb_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 */
        OPS_MAGIC,              /* Always the last thing */
 };
 
This page took 0.028198 seconds and 4 git commands to generate.