* remote-nindy.c: Install Kung patch for PR 6820. I have no idea
authorStu Grossman <grossman@cygnus>
Tue, 23 May 1995 00:01:17 +0000 (00:01 +0000)
committerStu Grossman <grossman@cygnus>
Tue, 23 May 1995 00:01:17 +0000 (00:01 +0000)
what this does...

gdb/ChangeLog
gdb/remote-nindy.c

index b066e57c2895e8f6e8c56177b0ce10ea8d6a9025..95b1c733617a8ed4019c742fc7fbce31f72f028e 100644 (file)
@@ -1,5 +1,8 @@
 Mon May 22 15:38:25 1995  Stu Grossman  (grossman@cygnus.com)
 
+       * remote-nindy.c:  Install Kung patch for PR 6820.  I have no idea
+       what this does...
+
        * breakpoint.c:  Move defaults of watchpoint related macros into
        target.h.
        * target.h:  Macros from breakpoint.c.  Conditionalize based on
index dd3dc0beae113fc907977bd8525e7284d88bbd15..7876d5bfb62076c4440d6335b9fc7216d1f95c2e 100644 (file)
@@ -283,6 +283,7 @@ struct clean_up_tty_args {
   serial_ttystate state;
   serial_t serial;
 };
+static  struct clean_up_tty_args tty_args;
 
 static void
 clean_up_tty (ptrarg)
@@ -291,8 +292,26 @@ clean_up_tty (ptrarg)
   struct clean_up_tty_args *args = (struct clean_up_tty_args *) ptrarg;
   SERIAL_SET_TTY_STATE (args->serial, args->state);
   free (args->state);
-  warning ("\n\n\
-You may need to reset the 80960 and/or reload your program.\n");
+  warning ("\n\nYou may need to reset the 80960 and/or reload your program.\n");
+}
+
+/* Recover from ^Z or ^C while remote process is running */
+static void (*old_ctrlc)();  
+#ifdef SIGTSTP
+static void (*old_ctrlz)();
+#endif
+
+static void
+clean_up_int()
+{
+  SERIAL_SET_TTY_STATE (tty_args.serial, tty_args.state);
+  free (tty_args.state);
+
+  signal(SIGINT, old_ctrlc);
+#ifdef SIGTSTP
+  signal(SIGTSTP, old_ctrlz);
+#endif
+  error("\n\nYou may need to reset the 80960 and/or reload your program.\n");
 }
 
 /* Wait until the remote machine stops. While waiting, operate in passthrough
@@ -308,11 +327,11 @@ nindy_wait( pid, status )
     struct target_waitstatus *status;
 {
   fd_set fds;
-  char buf[500];       /* FIXME, what is "500" here? */
+  int c;
+  char buf[2];
   int i, n;
   unsigned char stop_exit;
   unsigned char stop_code;
-  struct clean_up_tty_args tty_args;
   struct cleanup *old_cleanups;
   long ip_value, fp_value, sp_value;   /* Reg values from stop */
 
@@ -324,6 +343,11 @@ nindy_wait( pid, status )
   /* Save current tty attributes, and restore them when done.  */
   tty_args.serial = SERIAL_FDOPEN (0);
   tty_args.state = SERIAL_GET_TTY_STATE (tty_args.serial);
+  old_ctrlc = signal( SIGINT, clean_up_int );
+#ifdef SIGTSTP
+  old_ctrlz = signal( SIGTSTP, clean_up_int );
+#endif
+
   old_cleanups = make_cleanup (clean_up_tty, &tty_args);
 
   /* Pass input from keyboard to NINDY as it arrives.  NINDY will interpret
@@ -334,40 +358,25 @@ nindy_wait( pid, status )
 
   while (1)
     {
-      /* Wait for input on either the remote port or stdin.  */
-      FD_ZERO (&fds);
-      FD_SET (0, &fds);
-      FD_SET (nindy_serial->fd, &fds);
-      if (select (nindy_serial->fd + 1, &fds, 0, 0, 0) <= 0)
-       continue;
-
-      /* Pass input through to correct place */
-      if (FD_ISSET (0, &fds))
-       {
-         /* Input on stdin */
-         n = read (0, buf, sizeof (buf));
-         if (n)
+         /* Input on remote */
+         c = SERIAL_READCHAR (nindy_serial, 0);
+         if (c == SERIAL_ERROR)
            {
-             SERIAL_WRITE (nindy_serial, buf, n );
+             error ("Cannot read from serial line");
            }
-       }
-
-      if (FD_ISSET (nindy_serial->fd, &fds))
-       {
-         /* Input on remote */
-         n = read (nindy_serial->fd, buf, sizeof (buf));
-         if (n)
+         else if (c == 0x1b) /* ESC */
+           {
+             c = SERIAL_READCHAR (nindy_serial, 0);
+             c &= ~0x40;
+           } 
+         else if (c != 0x10) /* DLE */
+         /* Write out any characters preceding DLE */
+           {
+             buf[0] = (char)c;
+             write (1, buf, 1);
+           }
+         else
            {
-             /* Write out any characters in buffer preceding DLE */
-             i = non_dle( buf, n );
-             if ( i > 0 )
-               {
-                 write (1, buf, i);
-               }
-
-             if (i != n)
-               {
-                 /* There *was* a DLE in the buffer */
                  stop_exit = ninStopWhy(&stop_code,
                                         &ip_value, &fp_value, &sp_value);
                  if (!stop_exit && (stop_code == STOP_SRQ))
@@ -387,12 +396,12 @@ nindy_wait( pid, status )
                                       (char *)&sp_value);
                      break;
                    }
-               }
            }
-       }
     }
 
-  do_cleanups (old_cleanups);
+  SERIAL_SET_TTY_STATE (tty_args.serial, tty_args.state);
+  free (tty_args.state);
+  discard_cleanups (old_cleanups);
 
   if (stop_exit)
     {
@@ -401,6 +410,9 @@ nindy_wait( pid, status )
     }
   else
     {
+      /* nindy has some special stop code need to be handled */
+      if (stop_code == STOP_GDB_BPT)
+       stop_code = TRACE_STEP;
       status->kind = TARGET_WAITKIND_STOPPED;
       status->value.sig = i960_fault_to_signal (stop_code);
     }