* symtab.c (find_pc_symtab): Don't lose if OBJF_REORDERED
[deliverable/binutils-gdb.git] / gdb / remote-os9k.c
index b6d6758fc476d50848f69bdf9b397ced5fc6bd4e..fda527283cb4795b75ee6755e8a851f83c04e64f 100644 (file)
@@ -1,4 +1,4 @@
- /* Remote debugging interface for boot monitors, for GDB.
+/* Remote debugging interface for boot monitors, for GDB.
    Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
 
 This file is part of GDB.
@@ -15,7 +15,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 /* This file was derived from remote-eb.c, which did a similar job, but for
    an AMD-29K running EBMON.  That file was in turn derived from remote.c
@@ -37,9 +37,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "gdbcore.h"
 #include "target.h"
 #include "wait.h"
+#ifdef ANSI_PROTOTYPES
+#include <stdarg.h>
+#else
 #include <varargs.h>
+#endif
 #include <signal.h>
-#include <string.h>
+#include "gdb_string.h"
 #include <sys/types.h>
 #include "command.h"
 #include "serial.h"
@@ -50,12 +54,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "objfiles.h"
 #include "gdb-stabs.h"
 
-#ifdef HAVE_TERMIO
-#  define TERMINAL struct termios
-#else
-#  define TERMINAL struct sgttyb
-#endif
-
 struct monitor_ops *current_monitor;
 struct cmd_list_element *showlist;
 extern struct target_ops rombug_ops;           /* Forward declaration */
@@ -76,30 +74,43 @@ static int rombug_is_open = 0;
 
 /* FIXME: Replace with sr_get_debug ().  */
 #define LOG_FILE "monitor.log"
-#if defined (LOG_FILE)
 FILE *log_file;
-#endif
+static int monitor_log = 0;
+static int tty_xon = 0;
+static int tty_xoff = 0;
 
-static int timeout = 5;
+static int timeout = 10;
 static int is_trace_mode = 0;
 /* Descriptor for I/O to remote machine.  Initialize it to NULL*/
 static serial_t monitor_desc = NULL;
 
+static CORE_ADDR bufaddr = 0;
+static int buflen = 0;
+static char readbuf[16];
+
 /* Send data to monitor.  Works just like printf. */
 static void
+#ifdef ANSI_PROTOTYPES
+printf_monitor(char *pattern, ...)
+#else
 printf_monitor(va_alist)
      va_dcl
+#endif
 {
   va_list args;
-  char *pattern;
   char buf[200];
   int i;
 
+#ifdef ANSI_PROTOTYPES
+  va_start (args, pattern);
+#else
+  char *pattern;
   va_start(args);
-
   pattern = va_arg(args, char *);
+#endif
 
   vsprintf(buf, pattern, args);
+  va_end(args);
 
   if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
     fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
@@ -117,10 +128,8 @@ readchar(timeout)
   if (sr_get_debug())
     putchar(c & 0x7f);
 
-#ifdef LOG_FILE
-  if (isascii (c))
+  if (monitor_log && isascii(c))
     putc(c & 0x7f, log_file);
-#endif
 
   if (c >= 0)
     return c & 0x7f;
@@ -197,14 +206,13 @@ static void
 expect_prompt(discard)
      int discard;
 {
-#if defined (LOG_FILE)
+  if (monitor_log)
   /* This is a convenient place to do this.  The idea is to do it often
      enough that we never lose much data if we terminate abnormally.  */
-  fflush(log_file);
-#endif
+    fflush(log_file);
+
   if (is_trace_mode) {
     expect("trace", discard);
-    is_trace_mode = 0;
   } else {
     expect (PROMPT, discard);
   }
@@ -267,13 +275,11 @@ get_hex_regs (n, regno)
       val = 0;
       for (j = 0; j < 4; j++)
        {
-#if TARGET_BYTE_ORDER == BIG_ENDIAN
-         get_hex_byte(&b);
-         val = (val << 8) + b;
-#else
-         get_hex_byte(&b);
-         val = val + (b << (j*8));
-#endif
+         get_hex_byte (&b);
+         if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+           val = (val << 8) + b;
+         else
+           val = val + (b << (j*8));
        }
       supply_register (regno++, (char *) &val);
     }
@@ -289,9 +295,6 @@ rombug_create_inferior (execfile, args, env)
 {
   int entry_pt;
 
-  /* Nonzero value indicates that a process really is running.  */
-  inferior_pid = 42;
-
   if (args && *args)
     error("Can't pass arguments to remote ROMBUG process");
 
@@ -300,9 +303,9 @@ rombug_create_inferior (execfile, args, env)
 
   entry_pt = (int) bfd_get_start_address (exec_bfd);
 
-#ifdef LOG_FILE
-  fputs ("\nIn Create_inferior()", log_file);
-#endif
+  if (monitor_log)
+    fputs ("\nIn Create_inferior()", log_file);
+
 
 /* The "process" (board) is already stopped awaiting our commands, and
    the program is already downloaded.  We just set its PC and go.  */
@@ -314,7 +317,6 @@ rombug_create_inferior (execfile, args, env)
 /* Open a connection to a remote debugger.
    NAME is the filename used for communication.  */
 
-static int baudrate = 9600;
 static char dev_name[100];
 
 static void
@@ -336,34 +338,45 @@ rombug_open(args, from_tty)
   if (monitor_desc == NULL)
     perror_with_name(dev_name);
 
-  /* The baud rate was specified when GDB was started. ***
+  /* if baud rate is set by 'set remotebaud' */
   if (SERIAL_SETBAUDRATE (monitor_desc, sr_get_baud_rate()))
     {
       SERIAL_CLOSE (monitor_desc);
       perror_with_name ("RomBug");
     }
-  */
   SERIAL_RAW(monitor_desc);
+  if (tty_xon || tty_xoff)
+    {
+    struct hardware_ttystate { struct termios t;} *tty_s;
+
+      tty_s =(struct hardware_ttystate  *)SERIAL_GET_TTY_STATE(monitor_desc);
+      if (tty_xon) tty_s->t.c_iflag |= IXON; 
+      if (tty_xoff) tty_s->t.c_iflag |= IXOFF;
+      SERIAL_SET_TTY_STATE(monitor_desc, (serial_ttystate) tty_s);
+    }
+
   rombug_is_open = 1;
 
-#if defined (LOG_FILE)
   log_file = fopen (LOG_FILE, "w");
   if (log_file == NULL)
     perror_with_name (LOG_FILE);
-#endif
 
   push_monitor (&rombug_cmds);
-
   printf_monitor("\r");        /* CR wakes up monitor */
   expect_prompt(1);
-
   push_target (&rombug_ops);
+  attach_flag = 1;
+
   if (from_tty)
     printf("Remote %s connected to %s\n", target_shortname,
           dev_name);
 
-  attach_flag = 1;
   rombug_fetch_registers();
+
+  printf_monitor ("ov e \r");
+  expect_prompt(1);
+  bufaddr = 0;
+  buflen = 0;
 }
 
 /*
@@ -380,7 +393,6 @@ rombug_close (quitting)
     rombug_is_open = 0;
   }
 
-#if defined (LOG_FILE)
   if (log_file) {
     if (ferror(log_file))
       fprintf(stderr, "Error writing log file.\n");
@@ -388,7 +400,6 @@ rombug_close (quitting)
       fprintf(stderr, "Error closing log file.\n");
     log_file = 0;
   }
-#endif
 }
 
 int
@@ -442,23 +453,26 @@ rombug_resume (pid, step, sig)
      int pid, step;
      enum target_signal sig;
 {
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Resume (step=%d, sig=%d)\n", step, sig);
-#endif
+  if (monitor_log)
+    fprintf (log_file, "\nIn Resume (step=%d, sig=%d)\n", step, sig);
 
   if (step)
     {
       is_trace_mode = 1;
       printf_monitor (STEP_CMD);
-      /* wait for the echo.  */
+      /* wait for the echo.  **
       expect (STEP_CMD, 1);
+      */
     }
   else
     {
       printf_monitor (GO_CMD);
-      /* swallow the echo.  */
+      /* swallow the echo.  **
       expect (GO_CMD, 1);
+      */
     }
+  bufaddr = 0;
+  buflen= 0;
 }
 
 /*
@@ -476,40 +490,40 @@ rombug_wait (pid, status)
   CORE_ADDR addr, pc;
   struct obj_section *obj_sec;
 
-#ifdef LOG_FILE
-  fputs ("\nIn wait ()", log_file);
-#endif
+  if (monitor_log)
+    fputs ("\nIn wait ()", log_file);
 
   status->kind = TARGET_WAITKIND_EXITED;
   status->value.integer = 0;
 
-  timeout = 0;         /* Don't time out -- user program is running. */
+  timeout = -1;                /* Don't time out -- user program is running. */
+  expect ("eax:", 0);   /* output any message before register display */
   expect_prompt(1);     /* Wait for prompt, outputting extraneous text */
 
   status->kind = TARGET_WAITKIND_STOPPED;
   status->value.sig = TARGET_SIGNAL_TRAP;
   timeout = old_timeout;
   rombug_fetch_registers();
+  bufaddr = 0;
+  buflen = 0;
   pc = read_register(PC_REGNUM);
   addr = read_register(DATABASE_REG);
-
   obj_sec = find_pc_section (pc);
   if (obj_sec != NULL)
-    new_symfile_objfile (obj_sec, 1, 0);
-
-  offs = ((struct section_offsets *)
+    {
+      if (obj_sec->objfile != symfile_objfile)
+        new_symfile_objfile(obj_sec->objfile, 1, 0);
+      offs = ((struct section_offsets *)
         alloca (sizeof (struct section_offsets)
         + (symfile_objfile->num_sections * sizeof (offs->offsets))));
-  memcpy (offs, symfile_objfile->section_offsets,
+      memcpy (offs, symfile_objfile->section_offsets,
          (sizeof (struct section_offsets) + 
         (symfile_objfile->num_sections * sizeof (offs->offsets))));
-  ANOFFSET (offs, SECT_OFF_DATA) = addr;
-  ANOFFSET (offs, SECT_OFF_BSS) = addr;
+      ANOFFSET (offs, SECT_OFF_DATA) = addr;
+      ANOFFSET (offs, SECT_OFF_BSS) = addr;
 
-  /* Because we only set offsets for DATA and BSS sections, and the other
-     offsets are unchanged from ->section_offsets, the other sections won't
-     get relocated.  */
-  objfile_relocate (symfile_objfile, offs);
+      objfile_relocate(symfile_objfile, offs);
+    }
 
   return 0;
 }
@@ -570,13 +584,11 @@ rombug_fetch_registers ()
          val = 0;
          for (j = 0; j < 2; j++)
             {
-#if TARGET_BYTE_ORDER == BIG_ENDIAN
-              get_hex_byte(&b);
-              val = (val << 8) + b;
-#else
-              get_hex_byte(&b);
-              val = val + (b << (j*8));
-#endif
+              get_hex_byte (&b);
+             if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+               val = (val << 8) + b;
+             else
+               val = val + (b << (j*8));
             }
 
          if (regno == 8) i = 10;
@@ -598,6 +610,7 @@ rombug_fetch_registers ()
          supply_register(regno, (char *) &val);
        }
     }
+  is_trace_mode = 0;
   expect_prompt (1);
 }
 
@@ -610,10 +623,10 @@ rombug_fetch_register (regno)
   int val, j;
   unsigned char b;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
-  fflush (log_file);
-#endif
+  if (monitor_log) {
+    fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
+    fflush (log_file);
+  }
 
   if (regno < 0)
     {
@@ -632,13 +645,11 @@ rombug_fetch_register (regno)
          val = 0;
          for (j = 0; j < 2; j++)
             {
-#if TARGET_BYTE_ORDER == BIG_ENDIAN
-              get_hex_byte(&b);
-              val = (val << 8) + b;
-#else
-              get_hex_byte(&b);
-              val = val + (b << (j*8));
-#endif
+              get_hex_byte (&b);
+             if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+               val = (val << 8) + b;
+             else
+               val = val + (b << (j*8));
             }
          supply_register (regno, (char *) &val);
        }
@@ -691,9 +702,9 @@ rombug_store_register (regno)
 {
 char *name;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
-#endif
+  if (monitor_log)
+    fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);
+
   if (regno == -1)
     rombug_store_registers ();
   else
@@ -705,6 +716,7 @@ char *name;
       if (name == 0) return;
       printf_monitor (SET_REG, name, read_register (regno));
 
+      is_trace_mode = 0;
       expect_prompt (1);
     }
 }
@@ -725,7 +737,7 @@ static void
 rombug_files_info ()
 {
   printf ("\tAttached to %s at %d baud.\n",
-         dev_name, baudrate);
+         dev_name, sr_get_baud_rate());
 }
 
 /* Copy LEN bytes of data from debugger memory at MYADDR
@@ -739,21 +751,25 @@ rombug_write_inferior_memory (memaddr, myaddr, len)
   int i;
   char buf[10];
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
-#endif
-  printf_monitor (MEM_SET_CMD, memaddr + i);
+  if (monitor_log)
+    fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
+
+  printf_monitor (MEM_SET_CMD, memaddr);
   for (i = 0; i < len; i++)
     {
       expect (CMD_DELIM, 1);
-      printf_monitor ("%x", myaddr[i]);
+      printf_monitor ("%x \r", myaddr[i]);
       if (sr_get_debug())
        printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
     }
+  expect (CMD_DELIM, 1);
   if (CMD_END)
     printf_monitor (CMD_END);
+  is_trace_mode = 0;
   expect_prompt (1);
 
+  bufaddr = 0;
+  buflen = 0;
   return len;
 }
 
@@ -766,7 +782,6 @@ rombug_read_inferior_memory(memaddr, myaddr, len)
      int len;
 {
   int i, j;
-  char buf[20];
 
   /* Number of bytes read so far.  */
   int count;
@@ -777,9 +792,8 @@ rombug_read_inferior_memory(memaddr, myaddr, len)
   /* Number of bytes to read in this pass.  */
   int len_this_pass;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
-#endif
+  if (monitor_log)
+    fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);
 
   /* Note that this code works correctly if startaddr is just less
      than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
@@ -794,6 +808,11 @@ rombug_read_inferior_memory(memaddr, myaddr, len)
     errno = EIO;
     return 0;
   }
+  if (bufaddr <= memaddr && (memaddr+len) <= (bufaddr+buflen))
+    {
+      memcpy(myaddr, &readbuf[memaddr-bufaddr], len);
+      return len;
+    }
   
   startaddr = memaddr;
   count = 0;
@@ -807,19 +826,22 @@ rombug_read_inferior_memory(memaddr, myaddr, len)
       if (sr_get_debug())
        printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);
 
-      printf_monitor (MEM_DIS_CMD, startaddr, 16);
+      printf_monitor (MEM_DIS_CMD, startaddr, 8);
       expect ("- ", 1);
-      for (i = 0; i < len_this_pass; i++)
+      for (i = 0; i < 16; i++)
        {
-         get_hex_byte (&myaddr[count++]);
-         if (sr_get_debug())
-           printf ("\nRead a 0x%x from 0x%x\n", myaddr[count-1], startaddr);
-         startaddr += 1;
+         get_hex_byte (&readbuf[i]);
        }
+      bufaddr = startaddr;
+      buflen = 16;
+      memcpy(&myaddr[count], readbuf, len_this_pass); 
+      count += len_this_pass;
+      startaddr += len_this_pass;
       expect(CMD_DELIM, 1);
     }
   if (CMD_END) 
       printf_monitor (CMD_END);
+  is_trace_mode = 0;
   expect_prompt (1);
 
   return len;
@@ -872,9 +894,9 @@ rombug_insert_breakpoint (addr, shadow)
 {
   int i;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
-#endif
+  if (monitor_log)
+    fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
+
   for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++)
     if (breakaddr[i] == 0)
       {
@@ -883,6 +905,7 @@ rombug_insert_breakpoint (addr, shadow)
          printf ("Breakpoint at %x\n", addr);
        rombug_read_inferior_memory(addr, shadow, memory_breakpoint_size);
        printf_monitor(SET_BREAK_CMD, addr);
+       is_trace_mode = 0;
        expect_prompt(1);
        return 0;
       }
@@ -901,18 +924,15 @@ rombug_remove_breakpoint (addr, shadow)
 {
   int i;
 
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
-#endif
+  if (monitor_log)
+    fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);
+
   for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++)
     if (breakaddr[i] == addr)
       {
        breakaddr[i] = 0;
-       /* some monitors remove breakpoints based on the address */
-       if (strcasecmp (target_shortname, "bug") == 0)   
-           printf_monitor(CLR_BREAK_CMD, addr);
-         else
-           printf_monitor(CLR_BREAK_CMD, i);
+       printf_monitor(CLR_BREAK_CMD, addr);
+       is_trace_mode = 0;
        expect_prompt(1);
        return 0;
       }
@@ -990,12 +1010,12 @@ rombug_command (args, fromtty)
      char      *args;
      int       fromtty;
 {
-#ifdef LOG_FILE
-  fprintf (log_file, "\nIn command (args=%s)\n", args);
-#endif
   if (monitor_desc == NULL)
     error("monitor target not open.");
   
+  if (monitor_log)
+    fprintf (log_file, "\nIn command (args=%s)\n", args);
+
   if (!args)
     error("Missing command.");
        
@@ -1104,7 +1124,7 @@ connect_command (args, fromtty)
 struct monitor_ops rombug_cmds = {
   "g \r",                              /* execute or usually GO command */
   "g \r",                              /* continue command */
-  "gs \r",                             /* single step */
+  "t \r",                              /* single step */
   "b %x\r",                            /* set a breakpoint */
   "k %x\r",                            /* clear a breakpoint */
   "c %x\r",                            /* set memory to a value */
@@ -1144,11 +1164,12 @@ Specify the serial device it is connected to (e.g. /dev/ttya).",
   0,                           /* Terminal handling */
   rombug_kill,
   rombug_load,                 /* load */
-  rombug_link,                 /* lookup_symbol */
+  rombug_link,                         /* lookup_symbol */
   rombug_create_inferior,
   rombug_mourn_inferior,
   0,                           /* can_run */
   0,                           /* notice_signals */
+  0,                           /* to_stop */
   process_stratum,
   0,                           /* next */
   1,
@@ -1179,6 +1200,26 @@ _initialize_remote_os9k ()
                  &setlist),
         &showlist);
 
+  add_show_from_set (
+        add_set_cmd ("remotelog", no_class, var_zinteger,
+                 (char *) &monitor_log,
+                 "Set monitor activity log on(=1) or off(=0).",
+                 &setlist),
+        &showlist);
+
+  add_show_from_set (
+        add_set_cmd ("remotexon", no_class, var_zinteger,
+                 (char *) &tty_xon,
+                 "Set remote tty line XON control",
+                 &setlist),
+        &showlist);
+
+  add_show_from_set (
+        add_set_cmd ("remotexoff", no_class, var_zinteger,
+                 (char *) &tty_xoff,
+                 "Set remote tty line XOFF control",
+                 &setlist),
+        &showlist);
 
   add_com ("rombug <command>", class_obscure, rombug_command,
           "Send a command to the debug monitor."); 
This page took 0.041959 seconds and 4 git commands to generate.