* config/i386/nm-nbsd.h (FLOAT_INFO): Comment out.
[deliverable/binutils-gdb.git] / gdb / remote-rdp.c
index d98531f56b103d46966b986c4c02cfeaf80fda4e..3cc4c4eed2d3a4d779e5bed5d63d1b82609a785d 100644 (file)
 #else
 #include <varargs.h>
 #endif
-
+#include <ctype.h>
 #include <fcntl.h>
 #include "symfile.h"
 #include "remote-utils.h"
+#include "gdb_string.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 
 extern struct target_ops remote_rdp_ops;
 static serial_t io;
 static host_callback *callback = &default_callback;
 
 struct
-{
-  int step_info;
-  int break_info;
-  int model_info;
-  int target_info;
-  int can_step;
-  char command_line[10];
-  int rdi_level;
-  int rdi_stopped_status;
-} ds;
+  {
+    int step_info;
+    int break_info;
+    int model_info;
+    int target_info;
+    int can_step;
+    char command_line[10];
+    int rdi_level;
+    int rdi_stopped_status;
+  }
+ds;
 
 
 
@@ -77,6 +83,12 @@ struct
 #define RDP_OPEN                       0
 #define RDP_OPEN_TYPE_COLD             0
 #define RDP_OPEN_TYPE_WARM             1
+#define RDP_OPEN_TYPE_BAUDRATE          2
+
+#define RDP_OPEN_BAUDRATE_9600         1
+#define RDP_OPEN_BAUDRATE_19200                2
+#define RDP_OPEN_BAUDRATE_38400                3
+
 #define RDP_OPEN_TYPE_RETURN_SEX       (1<<3)
 
 #define RDP_CLOSE                      1
@@ -97,8 +109,8 @@ struct
 #define RDP_FPU_READWRITE_MASK_FPS     (1<<8)
 
 #define RDP_SET_BREAK                  0xa
-#define RDP_SET_BREAK_TYPE_PC_EQUAL     0              
-#define RDP_SET_BREAK_TYPE_GET_HANDLE   (0x10)         
+#define RDP_SET_BREAK_TYPE_PC_EQUAL     0
+#define RDP_SET_BREAK_TYPE_GET_HANDLE   (0x10)
 
 #define RDP_CLEAR_BREAK                0xb
 
@@ -138,7 +150,7 @@ struct
 #define RDP_RES_VALUE_BIG_ENDIAN       241
 #define RDP_RES_RESET                  0x7f
 #define RDP_RES_AT_BREAKPOINT          143
-
+#define RDP_RES_IDUNNO                 0xe6
 #define RDP_OSOpReply                  0x13
 #define RDP_OSOpWord                   2
 #define RDP_OSOpNothing                0
@@ -147,10 +159,10 @@ static int timeout = 2;
 
 static int
 remote_rdp_xfer_inferior_memory PARAMS ((CORE_ADDR memaddr,
-                                    char *myaddr,
-                                    int len,
-                                    int write,
-                                    struct target_ops * target));
+                                        char *myaddr,
+                                        int len,
+                                        int write,
+                                        struct target_ops * target));
 
 
 /* Stuff for talking to the serial layer. */
@@ -160,6 +172,9 @@ get_byte ()
 {
   int c = SERIAL_READCHAR (io, timeout);
 
+  if (remote_debug)
+    printf ("[%02x]\n", c);
+
   if (c == SERIAL_TIMEOUT)
     {
       if (timeout == 0)
@@ -168,8 +183,6 @@ get_byte ()
       error ("Timeout reading from remote_system");
     }
 
-  if (remote_debug)
-    printf ("[%02x]", c);
   return c;
 }
 
@@ -193,12 +206,14 @@ static void
 put_byte (val)
      char val;
 {
+  if (remote_debug)
+    printf ("(%02x)\n", val);
   SERIAL_WRITE (io, &val, 1);
 }
 
 static void
 put_word (val)
-     long val;
+     int val;
 {
   /* We always send in little endian */
   unsigned char b[4];
@@ -207,6 +222,9 @@ put_word (val)
   b[2] = val >> 16;
   b[3] = val >> 24;
 
+  if (remote_debug)
+    printf ("(%04x)", val);
+
   SERIAL_WRITE (io, b, 4);
 }
 
@@ -214,66 +232,98 @@ put_word (val)
 
 /* Stuff for talking to the RDP layer. */
 
+/* This is a bit more fancy that need be so that it syncs even in nasty cases.
 
-/* This is a bit more fancy that need be so that it syncs even in nasty cases. */
+   I'be been unable to make it reliably sync up with the change
+   baudrate open command.  It likes to sit and say it's been reset,
+   with no more action.  So I took all that code out.  I'd rather sync
+   reliably at 9600 than wait forever for a possible 19200 connection.
 
+ */
 static void
-rdp_init ()
+rdp_init (cold, tty)
+     int cold;
+     int tty;
 {
-  int oloop;
+  int sync = 0;
+  int type = cold ? RDP_OPEN_TYPE_COLD : RDP_OPEN_TYPE_WARM;
+  int baudtry = 9600;
 
-  for (oloop = 0; oloop < 2; oloop++)
+  time_t now = time (0);
+  time_t stop_time = now + 10; /* Try and sync for 10 seconds, then give up */
+
+
+  while (time (0) < stop_time && !sync)
     {
-      int longtry;
+      int restype;
+      QUIT;
+
       SERIAL_FLUSH_INPUT (io);
-      for (longtry = 0; longtry < 2; longtry++)
-       {
-         int try;
-         int flush_and_retry = 0;
+      SERIAL_FLUSH_OUTPUT (io);
 
-         for (try = 0; try < 10 && !flush_and_retry; try++)
-           {
-             int restype;
+      if (tty)
+       printf_unfiltered ("Trying to connect at %d baud.\n", baudtry);
+      put_byte (RDP_OPEN);
 
-             put_byte (RDP_OPEN);
-             put_byte (RDP_OPEN_TYPE_COLD | RDP_OPEN_TYPE_RETURN_SEX);
-             put_word (0);
+      put_byte (type | RDP_OPEN_TYPE_RETURN_SEX);
+      put_word (0);
 
-             restype = SERIAL_READCHAR (io, 1);
+      while (!sync && (restype = SERIAL_READCHAR (io, 1)) > 0)
+       {
+         if (remote_debug)
+           printf_unfiltered ("[%02x]\n", restype);
 
-             switch (restype)
+         switch (restype)
+           {
+           case SERIAL_TIMEOUT:
+             break;
+           case RDP_RESET:
+             while ((restype = SERIAL_READCHAR (io, 1)) == RDP_RESET)
+               ;
+             while ((restype = SERIAL_READCHAR (io, 1)) > 0)
                {
-               case SERIAL_TIMEOUT:
-                 flush_and_retry = 1;
-                 break;
-               case RDP_RESET:
-                 return;
-               default:
-                 printf_unfiltered ("Got res return %d\n", restype);
-                 break;
-               case RDP_RES_VALUE:
+                 printf_unfiltered ("%c", isgraph (restype) ? restype : ' ');
+               }
+             while ((restype = SERIAL_READCHAR (io, 1)) > 0)
+               ;
+             if (tty)
+               {
+                 printf_unfiltered ("\nThe board has sent notification that it was reset.\n");
+                 printf_unfiltered ("Waiting for it to settle down...\n");
+               }
+             sleep (3);
+             if (tty)
+               printf_unfiltered ("\nTrying again.\n");
+             break;
+           default:
+             break;
+           case RDP_RES_VALUE:
+             {
+               int resval = SERIAL_READCHAR (io, 1);
+               switch (resval)
                  {
-                   int resval = SERIAL_READCHAR (io, 1);
-
-                   switch (resval)
-                     {
-                     case SERIAL_TIMEOUT:
-                       break;
-                     case RDP_RES_VALUE_LITTLE_ENDIAN:
-                       target_byte_order = LITTLE_ENDIAN;
-                       return;
-                     case RDP_RES_VALUE_BIG_ENDIAN:
-                       target_byte_order = BIG_ENDIAN;
-                       return;
-                     default:
-                       printf_unfiltered ("Trying to sync, got resval %d\n", resval);
-                     }
+                 case SERIAL_TIMEOUT:
+                   break;
+                 case RDP_RES_VALUE_LITTLE_ENDIAN:
+                   target_byte_order = LITTLE_ENDIAN;
+                   sync = 1;
+                   break;
+                 case RDP_RES_VALUE_BIG_ENDIAN:
+                   target_byte_order = BIG_ENDIAN;
+                   sync = 1;
+                   break;
+                 default:
+                   break;
                  }
-               }
+             }
            }
        }
     }
-  error ("Couldn't reset the board, try pressing the reset button");
+
+  if (!sync)
+    {
+      error ("Couldn't reset the board, try pressing the reset button");
+    }
 }
 
 
@@ -450,7 +500,7 @@ rdp_fetch_one_fpu_register (mask, buf)
     {
       /* There are 12 bytes long 
          !! fixme about endianness 
-        */
+       */
       int dummy;               /* I've seen these come back as four words !! */
       send_rdp ("bbw-SWWWWZ", RDP_COPRO_READ, FPU_COPRO_NUMBER, mask, buf + 0, buf + 4, buf + 8, &dummy);
     }
@@ -507,8 +557,8 @@ rdp_store_one_fpu_register (mask, buf)
     }
 #endif
 }
-
 \f
+
 /* Convert between GDB requests and the RDP layer. */
 
 static void
@@ -742,7 +792,7 @@ exec_swi (swi, args)
 }
 
 
-static void 
+static void
 handle_swi ()
 {
   argsin args[3];
@@ -826,7 +876,7 @@ rdp_execute_finish ()
       res = SERIAL_READCHAR (io, 1);
       while (res == SERIAL_TIMEOUT)
        {
-         QUIT ;
+         QUIT;
          printf_filtered ("Waiting for target..\n");
          res = SERIAL_READCHAR (io, 1);
        }
@@ -939,6 +989,8 @@ remote_rdp_open (args, from_tty)
   if (!args)
     error_no_arg ("serial port device name");
 
+  baud_rate = 9600;
+
   target_preopen (from_tty);
 
   io = SERIAL_OPEN (args);
@@ -948,14 +1000,16 @@ remote_rdp_open (args, from_tty)
 
   SERIAL_RAW (io);
 
-  rdp_init ();
+  rdp_init (1, from_tty);
+
 
-  rdp_info ();
   if (from_tty)
     {
-      printf_unfiltered ("Remote RDP debugging using %s\n", args);
+      printf_unfiltered ("Remote RDP debugging using %s at %d baud\n", args, baud_rate);
     }
 
+  rdp_info ();
+
   push_target (&remote_rdp_ops);
 
   callback->init (callback);
@@ -976,18 +1030,11 @@ remote_rdp_close (quitting)
      int quitting;
 {
   callback->shutdown (callback);
-  SERIAL_CLOSE (io);
+  if (io)
+    SERIAL_CLOSE (io);
+  io = 0;
 }
 
-/* Terminate the open connection to the remote debugger. */
-
-static void
-remote_rdp_detach (args, from_tty)
-     char *args;
-     int from_tty;
-{
-  pop_target (); 
-}
 
 /* Resume execution of the target process.  STEP says whether to single-step
    or to run free; SIGGNAL is the signal value (e.g. SIGINT) to be given
@@ -1115,8 +1162,8 @@ static struct yn breakinfo[] =
   {"watchpoints for half-word writes supported", RDP_INFO_ABOUT_BREAK_HALFWORD_WRITE},
   {"watchpoints for word writes supported", RDP_INFO_ABOUT_BREAK_WORD_WRITE},
   {"mask break/watch-points supported", RDP_INFO_ABOUT_BREAK_MASK},
-  {"thread-specific breakpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_BREAK},
-  {"thread-specific watchpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_WATCH},
+{"thread-specific breakpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_BREAK},
+{"thread-specific watchpoints supported", RDP_INFO_ABOUT_BREAK_THREAD_WATCH},
   {"conditional breakpoints supported", RDP_INFO_ABOUT_BREAK_COND},
   {0}
 };
@@ -1151,7 +1198,7 @@ struct target_ops remote_rdp_ops =
 {
   "rdp",                       /* to_shortname */
   /* to_longname */
-  "Remote Target using the RDProtocol",        
+  "Remote Target using the RDProtocol",
   /* to_doc */
   "Use a remote ARM system which uses the ARM Remote Debugging Protocol",
   remote_rdp_open,             /* to_open */
@@ -1163,7 +1210,7 @@ struct target_ops remote_rdp_ops =
   remote_rdp_fetch_register,   /* to_fetch_registers */
   remote_rdp_store_register,   /* to_store_registers */
   remote_rdp_prepare_to_store, /* to_prepare_to_store */
-  remote_rdp_xfer_inferior_memory, /* to_xfer_memory */
+  remote_rdp_xfer_inferior_memory,     /* to_xfer_memory */
   remote_rdp_files_info,       /* to_files_info */
   remote_rdp_insert_breakpoint,        /* to_insert_breakpoint */
   remote_rdp_remove_breakpoint,        /* to_remove_breakpoint */
This page took 0.028657 seconds and 4 git commands to generate.