Wed Nov 20 16:15:15 1996 Geoffrey Noer <noer@cygnus.com>
[deliverable/binutils-gdb.git] / gdb / remote-adapt.c
index 1a75b1b21d5ef13c2cd7e61c18773f5992fca97d..8fcb1f70ac981348f76eee52fdd3a2bea26fbd8e 100644 (file)
@@ -17,7 +17,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 is like remote.c but is for an esoteric situation--
    having a 29k board attached to an Adapt inline monitor. 
@@ -30,7 +30,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
    7/91 o - Freeze mode tracing can be done on a 29050.  */
 
 #include "defs.h"
-#include <string.h>
+#include "gdb_string.h"
 #include "inferior.h"
 #include "wait.h"
 #include "value.h"
@@ -50,37 +50,17 @@ extern struct target_ops adapt_ops;         /* Forward declaration */
 
 /* Forward function declarations */
 static void adapt_fetch_registers ();
-static int  adapt_store_registers ();
+static void adapt_store_registers ();
 static void adapt_close ();
 static int  adapt_clear_breakpoints();
 
-/* 
- * Processor types. It is assumed that the adapt has the correct 
- * ROM for the given processor. 
- */
-#define TYPE_UNKNOWN   0
-#define TYPE_A29000    1
-#define TYPE_A29030    2
-#define TYPE_A29050    3
-static char *processor_name[] = { "Unknown", "A29000", "A29030", "A29050" };
-static int processor_type=TYPE_UNKNOWN;
-
 #define FREEZE_MODE    (read_register(CPS_REGNUM) && 0x400) 
-#define USE_SHADOW_PC   ((processor_type == TYPE_A29050) && FREEZE_MODE)
-
-
-/* #define DEBUG       /* */
-#ifdef DEBUG
-# define DENTER(NAME)   (printf_filtered("Entering %s\n",NAME), fflush(stdout))
-# define DEXIT(NAME)    (printf_filtered("Exiting  %s\n",NAME), fflush(stdout))
-#else
-# define DENTER(NAME)
-# define DEXIT(NAME)
-#endif
+#define USE_SHADOW_PC  ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
 
 /* Can't seem to get binary coff working */
 #define ASCII_COFF             /* Adapt will be downloaded with ascii coff */
 
+/* FIXME: Replace with `set remotedebug'.  */
 #define LOG_FILE "adapt.log"
 #if defined (LOG_FILE)
 FILE *log_file=NULL;
@@ -287,7 +267,7 @@ get_hex_regs (n, regno)
        long val;
        while (n--) {
                val = get_hex_word();
-               supply_register(regno++,&val);
+               supply_register(regno++,(char *) &val);
        }
 }
 /* Called when SIGALRM signal sent due to alarm() timeout.  */
@@ -325,11 +305,9 @@ adapt_kill(arg,from_tty)
 char   *arg;
 int    from_tty;
 {
-       DENTER("adapt_kill()");
        fprintf (adapt_stream, "K");
        fprintf (adapt_stream, "\r");
        expect_prompt ();
-       DEXIT("adapt_kill()");
 }
 /*
  * Download a file specified in 'args', to the adapt. 
@@ -344,7 +322,6 @@ int fromtty;
        int     n;
        char    buffer[1024];
        
-       DENTER("adapt_load()");
        if (!adapt_stream) {
                printf_filtered("Adapt not open. Use 'target' command to open adapt\n");
                return;
@@ -384,7 +361,6 @@ int fromtty;
        expect_prompt ();       /* Skip garbage that comes out */
        fprintf (adapt_stream, "\r");
        expect_prompt ();
-       DEXIT("adapt_load()");
 }
 
 /* This is called not only when we first attach, but also when the
@@ -397,8 +373,6 @@ adapt_create_inferior (execfile, args, env)
 {
   int entry_pt;
 
-  DENTER("adapt_create_inferior()");
-
   if (args && *args)
     error ("Can't pass arguments to remote adapt process.");
 
@@ -433,13 +407,12 @@ adapt_create_inferior (execfile, args, env)
          expect_prompt ();
 #else
        insert_breakpoints ();  /* Needed to get correct instruction in cache */
-       proceed(entry_pt, -1, 0);
+       proceed(entry_pt, TARGET_SIGNAL_DEFAULT, 0);
 #endif
 
   } else {
        printf_filtered("Adapt not open yet.\n");
   }
-  DEXIT("adapt_create_inferior()");
 }
 
 /* Translate baud rates from integers to damn B_codes.  Unix should
@@ -498,7 +471,6 @@ adapt_open (name, from_tty)
   unsigned int prl;
   char *p;
 
-  DENTER("adapt_open()");
   /* Find the first whitespace character, it separates dev_name from
      prog_name.  */
   if (name == 0)
@@ -512,7 +484,7 @@ erroid:
     error ("\
 Please include the name of the device for the serial port,\n\
 the baud rate, and the name of the program to run on the remote system.");
-  dev_name = (char*)malloc(p - name + 1);
+  dev_name = (char*)xmalloc(p - name + 1);
   strncpy (dev_name, name, p - name);
   dev_name[p - name] = '\0';
 
@@ -555,8 +527,6 @@ the baud rate, and the name of the program to run on the remote system.");
   adapt_stream = fdopen (adapt_desc, "r+");
 
   push_target (&adapt_ops);
-  /* start_remote ();              /* Initialize gdb process mechanisms */
-
 
 #ifndef HAVE_TERMIO
 #ifndef NO_SIGINTERRUPT
@@ -590,32 +560,15 @@ the baud rate, and the name of the program to run on the remote system.");
   /* Clear any break points */
   adapt_clear_breakpoints();
 
-  /* Determine the processor revision level */
-  prl = (unsigned int)read_register(CFG_REGNUM) >> 24;
-  if (prl == 0x03) { 
-       processor_type = TYPE_A29000;  
-  } else if ((prl&0xf0) == 0x40) {     /* 29030 = 0x4* */
-       processor_type = TYPE_A29030;  
-       fprintf_filtered(stderr,"WARNING: debugging of A29030 not tested.\n");
-  } else if ((prl&0xf0) == 0x20) {     /* 29050 = 0x2* */
-       processor_type = TYPE_A29050;  
-       fprintf_filtered(stderr,"WARNING: debugging of A29050 not tested.\n");
-  } else {
-       processor_type = TYPE_UNKNOWN;  
-       fprintf_filtered(stderr,"WARNING: processor type unknown.\n");
-  }
-
   /* Print out some stuff, letting the user now what's going on */
-  printf_filtered("Remote debugging on an %s connect to an Adapt via %s.\n",
-               processor_name[processor_type],dev_name);
+  printf_filtered("Connected to an Adapt via %s.\n", dev_name);
     /* FIXME: can this restriction be removed? */
   printf_filtered("Remote debugging using virtual addresses works only\n");
   printf_filtered("\twhen virtual addresses map 1:1 to physical addresses.\n"); 
-  if (processor_type != TYPE_A29050) {
+  if (processor_type != a29k_freeze_mode) {
        fprintf_filtered(stderr,
        "Freeze-mode debugging not available, and can only be done on an A29050.\n");
   }
-  DEXIT("adapt_open()");
 }
 
 /* Close out all files and local state before this target loses control. */
@@ -625,8 +578,6 @@ adapt_close (quitting)
      int quitting;
 {
 
-  DENTER("adapt_close()");
-
   /* Clear any break points */
   adapt_clear_breakpoints();
 
@@ -658,7 +609,6 @@ adapt_close (quitting)
     log_file = NULL;
   }
 #endif
-  DEXIT("adapt_close()");
 }
 
 /* Attach to the target that is already loaded and possibly running */
@@ -668,26 +618,12 @@ adapt_attach (args, from_tty)
      int from_tty;
 {
 
-  DENTER("adapt_attach()");
   if (from_tty)
       printf_filtered ("Attaching to remote program %s.\n", prog_name);
 
-  /* push_target(&adapt_ops);  /* This done in adapt_open() */
-
-  mark_breakpoints_out ();
-
   /* Send the adapt a kill. It is ok if it is not already running */
   fprintf(adapt_stream, "K\r"); fflush(adapt_stream);
   expect_prompt();             /* Slurp the echo */
-
-  /* We will get a task spawn event immediately.  */
-  init_wait_for_inferior ();
-  clear_proceed_status ();
-  stop_soon_quietly = 1;
-  wait_for_inferior ();
-  stop_soon_quietly = 0;
-  normal_stop ();
-  DEXIT("adapt_attach()");
 }
 
 
@@ -699,7 +635,7 @@ adapt_detach (args,from_tty)
      char *args;
      int from_tty;
 {
-  DENTER("adapt_detach()");
+
   if (adapt_stream) { /* Send it on its way (tell it to continue)  */
        adapt_clear_breakpoints();
        fprintf(adapt_stream,"G\r");
@@ -708,16 +644,15 @@ adapt_detach (args,from_tty)
   pop_target();                /* calls adapt_close to do the real work */
   if (from_tty)
     printf_filtered ("Ending remote %s debugging\n", target_shortname);
-  DEXIT("adapt_detach()");
 }
  
 /* Tell the remote machine to resume.  */
 
 void
-adapt_resume (step, sig)
-     int step, sig;
+adapt_resume (pid, step, sig)
+     int pid, step;
+     enum target_signal sig;
 {
-  DENTER("adapt_resume()");
   if (step)    
     {
       write (adapt_desc, "t 1,s\r", 6);
@@ -739,7 +674,6 @@ adapt_resume (step, sig)
       /* Swallow the echo.  */
       expect_prompt(); 
     }
-  DEXIT("adapt_resume()");
 }
 
 /* Wait until the remote machine stops, then return,
@@ -747,7 +681,7 @@ adapt_resume (step, sig)
 
 int
 adapt_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
@@ -772,13 +706,13 @@ adapt_wait (status)
   int old_timeout = timeout;
   int old_immediate_quit = immediate_quit;
 
-  DENTER("adapt_wait()");
-
-  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;
     }
@@ -819,12 +753,17 @@ adapt_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;
   immediate_quit = old_immediate_quit;
-  DEXIT("adapt_wait()");
   return 0;
 }
 
@@ -876,8 +815,6 @@ adapt_fetch_registers ()
   int  sreg_buf[16];
   int i,j;
 
-  DENTER("adapt_fetch_registers()");
-
 /* 
  * Global registers
  */
@@ -947,7 +884,7 @@ adapt_fetch_registers ()
          sreg_buf[12] = read_register(PC2_REGNUM);     /* pc2 */
   }
   for (i=0 ; i<14 ; i++)               /* Supply vab -> lru */
-       supply_register(VAB_REGNUM+i,&sreg_buf[i]);
+       supply_register(VAB_REGNUM+i, (char *) &sreg_buf[i]);
   sprintf (tempbuf, "dw sr128\r");
   write (adapt_desc, tempbuf, strlen (tempbuf));
   for (i=0 ; i<2 ; i++) {                      /* SR128 - SR135 */
@@ -957,30 +894,28 @@ adapt_fetch_registers ()
                sreg_buf[i*4 + j] = get_hex_word();
   }            
   expect_prompt();
-  supply_register(IPC_REGNUM,&sreg_buf[0]);
-  supply_register(IPA_REGNUM,&sreg_buf[1]);
-  supply_register(IPB_REGNUM,&sreg_buf[2]);
-  supply_register(Q_REGNUM,  &sreg_buf[3]);
+  supply_register(IPC_REGNUM,(char *) &sreg_buf[0]);
+  supply_register(IPA_REGNUM,(char *) &sreg_buf[1]);
+  supply_register(IPB_REGNUM,(char *) &sreg_buf[2]);
+  supply_register(Q_REGNUM,  (char *) &sreg_buf[3]);
                /* Skip ALU */
-  supply_register(BP_REGNUM, &sreg_buf[5]);
-  supply_register(FC_REGNUM, &sreg_buf[6]);
-  supply_register(CR_REGNUM, &sreg_buf[7]);
+  supply_register(BP_REGNUM, (char *) &sreg_buf[5]);
+  supply_register(FC_REGNUM, (char *) &sreg_buf[6]);
+  supply_register(CR_REGNUM, (char *) &sreg_buf[7]);
 
   /* 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 (adapt_desc, "dw gr1,gr1\r", 11);
   expect ("GR001 ");
   get_hex_regs (1, GR1_REGNUM);
   expect_prompt ();
-
-  DEXIT("adapt_fetch_registers()");
 }
 
 /* Fetch register REGNO, or all registers if REGNO is -1.
@@ -989,7 +924,6 @@ static void
 adapt_fetch_register (regno)
      int regno;
 {
-  DENTER("adapt_fetch_register()");
   if (regno == -1)
     adapt_fetch_registers ();
   else
@@ -1001,17 +935,15 @@ adapt_fetch_register (regno)
       get_hex_regs (1, regno);
       expect_prompt ();
     }
-  DEXIT("adapt_fetch_register()");
 }
 
 /* Store the remote registers from the contents of the block REGS.  */
 
-static int 
+static void
 adapt_store_registers ()
 {
   int i, j;
 
-  DENTER("adapt_store_registers()");
   fprintf (adapt_stream, "s gr1,%x\r", read_register (GR1_REGNUM));
   expect_prompt ();
 
@@ -1063,7 +995,7 @@ adapt_store_registers ()
 
 /* Store register REGNO, or all if REGNO == -1.
    Return errno value.  */
-int
+void
 adapt_store_register (regno)
      int regno;
 {
@@ -1084,8 +1016,6 @@ adapt_store_register (regno)
        registers_changed ();
       expect_prompt ();
     }
-  DEXIT("adapt_store_registers()");
-  return 0;
 }
 
 /* Get ready to modify the registers array.  On machines which store
@@ -1158,9 +1088,7 @@ adapt_write_inferior_memory (memaddr, myaddr, len)
   int i;
   unsigned int cps;
 
-  /* DENTER("adapt_write_inferior_memory()"); */
-
-/* Turn TU bit off so we can do 'sb' commands */
+  /* Turn TU bit off so we can do 'sb' commands */
   cps = read_register(CPS_REGNUM);
   if (cps & 0x00000800)
        write_register(CPS_REGNUM,cps&~(0x00000800));
@@ -1180,7 +1108,6 @@ adapt_write_inferior_memory (memaddr, myaddr, len)
   /* Restore the old value of cps if the TU bit was on */
   if (cps & 0x00000800)
        write_register(CPS_REGNUM,cps);
-  /* DEXIT("adapt_write_inferior_memory()"); */
   return len;
 }
 
@@ -1212,7 +1139,6 @@ adapt_read_inferior_memory(memaddr, myaddr, len)
      adapt_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.  */
-  /* DENTER("adapt_read_inferior_memory()"); */
 
   if (((memaddr - 1) + len) < memaddr)
     return EIO;
@@ -1257,8 +1183,6 @@ adapt_read_inferior_memory(memaddr, myaddr, len)
 
       startaddr += len_this_pass;
     }
-
-  /* DEXIT("adapt_read_inferior_memory()"); */
   return count;
 }
 
@@ -1269,18 +1193,15 @@ adapt_insert_breakpoint(addr, save)
 CORE_ADDR      addr;
 char           *save;  /* Throw away, let adapt save instructions */
 {
-  DENTER("adapt_insert_breakpoint()"); 
   if (num_brkpts < MAX_BREAKS) {
        num_brkpts++;
        fprintf (adapt_stream, "B %x", addr);
        fprintf (adapt_stream, "\r");
        expect_prompt ();
-       DEXIT("adapt_insert_breakpoint() success"); 
        return(0);      /* Success */
   } else {
        fprintf_filtered(stderr,
                "Too many break points, break point not installed\n");
-       DEXIT("adapt_insert_breakpoint() failure"); 
        return(1);      /* Failure */
   }
 
@@ -1290,7 +1211,6 @@ adapt_remove_breakpoint(addr, save)
 CORE_ADDR      addr;
 char           *save;  /* Throw away, let adapt save instructions */
 {
-  DENTER("adapt_remove_breakpoint()");
   if (num_brkpts > 0) {
          num_brkpts--;
          fprintf (adapt_stream, "BR %x", addr);
@@ -1298,7 +1218,6 @@ char              *save;  /* Throw away, let adapt save instructions */
          fflush (adapt_stream);
          expect_prompt ();
   }
-  DEXIT("adapt_remove_breakpoint()");
   return(0);
 }
 
@@ -1306,7 +1225,6 @@ char              *save;  /* Throw away, let adapt save instructions */
 static int
 adapt_clear_breakpoints() 
 { 
-  DENTER("adapt_clear_breakpoint()");
   if (adapt_stream) {
        fprintf (adapt_stream, "BR");   /* Clear all break points */
        fprintf (adapt_stream, "\r");
@@ -1314,16 +1232,13 @@ adapt_clear_breakpoints()
        expect_prompt ();
   }
   num_brkpts = 0;
-  DEXIT("adapt_clear_breakpoint()");
 }
 static void
 adapt_mourn() 
 { 
-  DENTER("adapt_mourn()");
   adapt_clear_breakpoints();
   pop_target ();                /* Pop back to no-child state */
   generic_mourn_inferior ();
-  DEXIT("adapt_mourn()");
 }
 
 /* Display everthing we read in from the adapt until we match/see the
@@ -1399,7 +1314,7 @@ adapt_com (args, fromtty)
                break;
        /* Begin commands that take input in the form 'c x,y[,z...]' */
        case 'S':       /* Set memory or register */
-               if (index(args,',')) {  /* Assume it is properly formatted */
+               if (strchr(args,',')) { /* Assume it is properly formatted */
                        write(adapt_desc,args,strlen(args));
                        write(adapt_desc,"\r",1);
                        expect_prompt();
@@ -1416,7 +1331,7 @@ struct target_ops adapt_ops = {
        adapt_open, adapt_close, 
        adapt_attach, adapt_detach, adapt_resume, adapt_wait,
        adapt_fetch_register, adapt_store_register,
-       adapt_prepare_to_store, 0, 0,   /* conv_to, conv_from */
+       adapt_prepare_to_store,
        adapt_xfer_inferior_memory, 
        adapt_files_info,
        adapt_insert_breakpoint, adapt_remove_breakpoint, /* Breakpoints */
@@ -1426,6 +1341,9 @@ struct target_ops adapt_ops = {
        0,                      /* lookup_symbol */
        adapt_create_inferior,  /* create_inferior */ 
        adapt_mourn,            /* mourn_inferior FIXME */
+       0, /* can_run */
+       0, /* notice_signals */
+       0,                      /* to_stop */
        process_stratum, 0, /* next */
        1, 1, 1, 1, 1,  /* all mem, mem, stack, regs, exec */
        0,0,            /* Section pointers */
This page took 0.031702 seconds and 4 git commands to generate.