]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/remote-udi.c
Protoization.
[thirdparty/binutils-gdb.git] / gdb / remote-udi.c
index 6b586cb7da7d667ff2d21bfdf50c3c96c95a5b51..7127ca61ad60dc86717a01f121a0d38de8fb21a9 100644 (file)
@@ -1,22 +1,23 @@
 /* Remote debugging interface for AMD 29k interfaced via UDI, for GDB.
-   Copyright 1990, 1992 Free Software Foundation, Inc.
+   Copyright 1990, 1992, 1995, 2000 Free Software Foundation, Inc.
    Written by Daniel Mann.  Contributed by AMD.
 
-This file is part of GDB.
+   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 2 of the License, or
-(at your option) any later version.
+   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 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
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   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; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+   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., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 /* This is like remote.c but uses the Universal Debug Interface (UDI) to 
    talk to the target hardware (or simulator).  UDI is a TCP/IP based
@@ -24,84 +25,68 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
    daemon talks UDI on one side, and talks to the hardware (typically
    over a serial port) on the other side.
 
- - Originally written by Daniel Mann at AMD for MiniMON and gdb 3.91.6.
- - David Wood (wood@lab.ultra.nyu.edu) at New York University adapted this
-       file to gdb 3.95.  I was unable to get this working on sun3os4
-       with termio, only with sgtty.  Because we are only attempting to
-       use this module to debug our kernel, which is already loaded when
-       gdb is started up, I did not code up the file downloading facilities.  
-       As a result this module has only the stubs to download files. 
-       You should get tagged at compile time if you need to make any 
-       changes/additions.
- - Daniel Mann at AMD took the 3.95 adaptions above and replaced
-       MiniMON interface with UDI-p interface.   */
+   - Originally written by Daniel Mann at AMD for MiniMON and gdb 3.91.6.
+   - David Wood (wood@lab.ultra.nyu.edu) at New York University adapted this
+   file to gdb 3.95.  I was unable to get this working on sun3os4
+   with termio, only with sgtty.
+   - Daniel Mann at AMD took the 3.95 adaptions above and replaced
+   MiniMON interface with UDI-p interface.        */
+
 #include "defs.h"
+#include "frame.h"
 #include "inferior.h"
-#include "wait.h"
+#include "gdb_wait.h"
 #include "value.h"
 #include <ctype.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <errno.h>
-#include <string.h>
+#include "gdb_string.h"
 #include "terminal.h"
 #include "target.h"
 #include "29k-share/udi/udiproc.h"
 #include "gdbcmd.h"
 #include "bfd.h"
+#include "gdbcore.h"           /* For download function */
 
 /* access the register store directly, without going through
    the normal handler functions. This avoids an extra data copy.  */
 
-static int kiodebug;
-extern int stop_soon_quietly;           /* for wait_for_inferior */
-extern struct value *call_function_by_hand();
-static void udi_resume PARAMS ((int step, int sig));
-static void udi_fetch_registers PARAMS ((int regno));
-static void udi_load PARAMS ((char *args, int from_tty));
-static void fetch_register PARAMS ((int regno));
-static void udi_store_registers PARAMS ((int regno));
-static int store_register PARAMS ((int regno));
-static int regnum_to_srnum PARAMS ((int regno));
-static void udi_close PARAMS ((int quitting));
-static CPUSpace udi_memory_space PARAMS ((CORE_ADDR addr));
-static int udi_write_inferior_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
-                                             int len));
-static int udi_read_inferior_memory PARAMS ((CORE_ADDR memaddr, char *myaddr,
-                                            int len));
-static void download PARAMS ((char *load_arg_string, int from_tty));
-char   CoffFileName[100] = "";
-/*
- * Processor types. 
- */
-#define TYPE_UNKNOWN    0
-#define TYPE_A29000     1
-#define TYPE_A29030     2
-#define TYPE_A29050     3
-static  char *processor_name[] = { "Unknown", "Am29000", "Am29030", "Am29050" };
-static  int processor_type=TYPE_UNKNOWN;
-#define FREEZE_MODE     (read_register(CPS_REGNUM) & 0x400)
-#define USE_SHADOW_PC  ((processor_type == TYPE_A29050) && FREEZE_MODE) 
+extern int stop_soon_quietly;  /* for wait_for_inferior */
+extern struct value *call_function_by_hand ();
+static void udi_resume (int pid, int step, enum target_signal sig);
+static void udi_fetch_registers (int regno);
+static void udi_load (char *args, int from_tty);
+static void fetch_register (int regno);
+static void udi_store_registers (int regno);
+static int store_register (int regno);
+static int regnum_to_srnum (int regno);
+static void udi_close (int quitting);
+static CPUSpace udi_memory_space (CORE_ADDR addr);
+static int udi_write_inferior_memory (CORE_ADDR memaddr, char *myaddr,
+                                     int len);
+static int udi_read_inferior_memory (CORE_ADDR memaddr, char *myaddr,
+                                    int len);
+static void download (char *load_arg_string, int from_tty);
+char CoffFileName[100] = "";
 
-#define LLOG_FILE "udi.log"
-#if defined (LOG_FILE)
-FILE *log_file;
-#endif
+#define FREEZE_MODE     (read_register(CPS_REGNUM) & 0x400)
+#define USE_SHADOW_PC  ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
 
 static int timeout = 5;
-extern struct target_ops udi_ops;             /* Forward declaration */
+extern struct target_ops udi_ops;      /* Forward declaration */
 
 /* Special register enumeration.
-*/
+ */
 
 /******************************************************************* UDI DATA*/
-#define        MAXDATA         2*1024          /* max UDI[read/write] byte size */
+#define        MAXDATA         2*1024  /* max UDI[read/write] byte size */
 /* Descriptor for I/O to remote machine.  Initialize it to -1 so that
    udi_open knows that we don't have a file open when the program
    starts.  */
 
 UDISessionId udi_session_id = -1;
+static char *udi_config_id;
 
 CPUOffset IMemStart = 0;
 CPUSizeT IMemSize = 0;
@@ -112,55 +97,34 @@ CPUSizeT RMemSize = 0;
 UDIUInt32 CPUPRL;
 UDIUInt32 CoProcPRL;
 
-UDIMemoryRange address_ranges[2]; /* Text and data */
-UDIResource entry = {0, 0};    /* Entry point */
+UDIMemoryRange address_ranges[2];      /* Text and data */
+UDIResource entry =
+{0, 0};                                /* Entry point */
 CPUSizeT stack_sizes[2];       /* Regular and memory stacks */
 
 #define        SBUF_MAX        1024    /* maximum size of string handling buffer */
 char sbuf[SBUF_MAX];
 
-typedef        struct  bkpt_entry_str
-{
-    UDIResource         Addr;
-    UDIUInt32   PassCount;
+typedef struct bkpt_entry_str
+  {
+    UDIResource Addr;
+    UDIUInt32 PassCount;
     UDIBreakType Type;
     unsigned int BreakId;
-} bkpt_entry_t;
+  }
+bkpt_entry_t;
 #define                BKPT_TABLE_SIZE 40
-static bkpt_entry_t    bkpt_table[BKPT_TABLE_SIZE];
-extern char    dfe_errmsg[];           /* error string */
-
-/* Called when SIGALRM signal sent due to alarm() timeout.  */
-#ifndef HAVE_TERMIO
-
-volatile int n_alarms;
-
-static void
-udi_timer ()
-{
-#if 0
-  if (kiodebug)
-    printf ("udi_timer called\n");
-#endif
-  n_alarms++;
-}
-#endif /* HAVE_TERMIO */
+static bkpt_entry_t bkpt_table[BKPT_TABLE_SIZE];
+extern char dfe_errmsg[];      /* error string */
 
 /* malloc'd name of the program on the remote system.  */
 static char *prog_name = NULL;
 
-/* Number of SIGTRAPs we need to simulate.  That is, the next
-   NEED_ARTIFICIAL_TRAP calls to udi_wait should just return
-   SIGTRAP without actually waiting for anything.  */
-
 /* This is called not only when we first attach, but also when the
    user types "run" after having attached.  */
 
 static void
-udi_create_inferior (execfile, args, env)
-     char *execfile;
-     char *args;
-     char **env;
+udi_create_inferior (char *execfile, char *args, char **env)
 {
   char *args1;
 
@@ -177,38 +141,62 @@ udi_create_inferior (execfile, args, env)
 
   if (udi_session_id < 0)
     {
-      printf("UDI connection not open yet.\n");
-      return;
+      /* If the TIP is not open, open it.  */
+      if (UDIConnect (udi_config_id, &udi_session_id))
+       error ("UDIConnect() failed: %s\n", dfe_errmsg);
+      /* We will need to download the program.  */
+      entry.Offset = 0;
     }
 
   inferior_pid = 40000;
 
   if (!entry.Offset)
-    download(execfile, 0);
+    download (execfile, 0);
+
+  args1 = alloca (strlen (execfile) + strlen (args) + 2);
 
-  args1 = alloca (strlen(execfile) + strlen(args) + 2);
+  if (execfile[0] == '\0')
 
-  strcpy (args1, execfile);
+    /* It is empty.  We need to quote it somehow, or else the target
+       will think there is no argument being passed here.  According
+       to the UDI spec it is quoted "according to TIP OS rules" which
+       I guess means quoting it like the Unix shell should work
+       (sounds pretty bogus to me...).  In fact it doesn't work (with
+       isstip anyway), but passing in two quotes as the argument seems
+       like a reasonable enough behavior anyway (I guess).  */
+
+    strcpy (args1, "''");
+  else
+    strcpy (args1, execfile);
   strcat (args1, " ");
   strcat (args1, args);
 
   UDIInitializeProcess (address_ranges,                /* ProcessMemory[] */
-                       (UDIInt)2,              /* NumberOfRanges */
-                       entry,                  /* EntryPoint */
-                       stack_sizes,            /* *StackSizes */
-                       (UDIInt)2,              /* NumberOfStacks */
-                       args1);                 /* ArgString */
+                       (UDIInt) 2,     /* NumberOfRanges */
+                       entry,  /* EntryPoint */
+                       stack_sizes,    /* *StackSizes */
+                       (UDIInt) 2,     /* NumberOfStacks */
+                       args1); /* ArgString */
 
   init_wait_for_inferior ();
   clear_proceed_status ();
-  proceed(-1,-1,0);
+  proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
 }
 
 static void
-udi_mourn()
+udi_mourn (void)
 {
-        pop_target ();                /* Pop back to no-child state */
-        generic_mourn_inferior ();
+#if 0
+  /* Requiring "target udi" each time you run is a major pain.  I suspect
+     this was just blindy copied from remote.c, in which "target" and
+     "run" are combined.  Having a udi target without an inferior seems
+     to work between "target udi" and "run", so why not now?  */
+  pop_target ();               /* Pop back to no-child state */
+#endif
+  /* But if we're going to want to run it again, we better remove the
+     breakpoints...  */
+  remove_breakpoints ();
+  generic_mourn_inferior ();
 }
 
 /******************************************************************** UDI_OPEN
@@ -220,11 +208,8 @@ udi_mourn()
 
 /* XXX - need cleanups for udiconnect for various failures!!! */
 
-static char *udi_config_id;
 static void
-udi_open (name, from_tty)
-     char *name;
-     int from_tty;
+udi_open (char *name, int from_tty)
 {
   unsigned int prl;
   char *p;
@@ -236,7 +221,7 @@ udi_open (name, from_tty)
   UDIPId PId;
   UDIUInt32 TIPId, TargetId, DFEId, DFE, TIP, DFEIPCId, TIPIPCId;
 
-  target_preopen(from_tty);
+  target_preopen (from_tty);
 
   entry.Offset = 0;
 
@@ -247,47 +232,30 @@ udi_open (name, from_tty)
     free (udi_config_id);
 
   if (!name)
-    error("Usage: target udi config_id, where config_id appears in udi_soc file");
+    error ("Usage: target udi config_id, where config_id appears in udi_soc file");
 
   udi_config_id = strdup (strtok (name, " \t"));
 
   if (UDIConnect (udi_config_id, &udi_session_id))
-    error("UDIConnect() failed: %s\n", dfe_errmsg);
+    /* FIXME: Should set udi_session_id to -1 here.  */
+    error ("UDIConnect() failed: %s\n", dfe_errmsg);
 
   push_target (&udi_ops);
 
-#ifndef HAVE_TERMIO
-#ifndef NO_SIGINTERRUPT
-  /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
-     the read.  */
-  if (siginterrupt (SIGALRM, 1) != 0)
-    error ("udi_open: siginterrupt() %s", safe_strerror(errno));
-#endif
-
-  /* Set up read timeout timer.  */
-  if ((void (*)) signal (SIGALRM, udi_timer) == (void (*)) -1)
-    error ("udi_open: signal() %s", safe_strerror(errno));
-#endif
-
-#if defined (LOG_FILE)
-  log_file = fopen (LOG_FILE, "w");
-  if (log_file == NULL)
-    error ("udi_open: fopen(%s) %s", LOG_FILE, safe_strerror(errno));
-#endif
   /*
-  ** Initialize target configuration structure (global)
-  */
+     ** Initialize target configuration structure (global)
+   */
   if (UDIGetTargetConfig (KnownMemory, &NumberOfRanges,
                          ChipVersions, &NumberOfChips))
     error ("UDIGetTargetConfig() failed");
   if (NumberOfChips > 2)
-    fprintf(stderr,"Target has more than one processor\n");
-  for (cnt=0; cnt < NumberOfRanges; cnt++)
+    fprintf_unfiltered (gdb_stderr, "Target has more than one processor\n");
+  for (cnt = 0; cnt < NumberOfRanges; cnt++)
     {
-      switch(KnownMemory[cnt].Space)
+      switch (KnownMemory[cnt].Space)
        {
        default:
-         fprintf(stderr, "UDIGetTargetConfig() unknown memory space\n");
+         fprintf_unfiltered (gdb_stderr, "UDIGetTargetConfig() unknown memory space\n");
          break;
        case UDI29KCP_S:
          break;
@@ -306,33 +274,10 @@ udi_open (name, from_tty)
        }
     }
 
-  /* Determine the processor revision level */
-  prl = (unsigned int)read_register (CFG_REGNUM) >> 24;
-  if ((prl&0xe0) == 0)
-    {
-      fprintf_filtered (stderr,
-                       "Remote debugging Am29000 rev %c\n",'A'+(prl&0x1f));
-      processor_type = TYPE_A29000;
-    }
-  else if ((prl&0xe0) == 0x40)       /* 29030 = 0x4* */
-    {
-      fprintf_filtered (stderr,
-                       "Remote debugging Am2903* rev %c\n",'A'+(prl&0x1f));
-      processor_type = TYPE_A29030;
-    }
-  else if ((prl&0xe0) == 0x20)       /* 29050 = 0x2* */
-    {
-      fprintf_filtered (stderr,
-                       "Remote debugging Am29050 rev %c\n",'A'+(prl&0x1f));
-      processor_type = TYPE_A29050;
-    }
-  else
-    {
-      processor_type = TYPE_UNKNOWN;
-      fprintf_filtered (stderr,"WARNING: processor type unknown.\n");
-    }
+  a29k_get_processor_type ();
+
   if (UDICreateProcess (&PId))
-     fprintf(stderr, "UDICreateProcess() failed\n");
+    fprintf_unfiltered (gdb_stderr, "UDICreateProcess() failed\n");
 
   /* Print out some stuff, letting the user now what's going on */
   if (UDICapabilities (&TIPId, &TargetId, DFEId, DFE, &TIP, &DFEIPCId,
@@ -340,12 +285,11 @@ udi_open (name, from_tty)
     error ("UDICapabilities() failed");
   if (from_tty)
     {
-      printf_filtered ("Remote debugging an %s connected via UDI socket,\n\
+      printf_filtered ("Connected via UDI socket,\n\
  DFE-IPC version %x.%x.%x  TIP-IPC version %x.%x.%x  TIP version %x.%x.%x\n %s\n",
-                      processor_name[processor_type],
-                      (DFEIPCId>>8)&0xf, (DFEIPCId>>4)&0xf, DFEIPCId&0xf,
-                      (TIPIPCId>>8)&0xf, (TIPIPCId>>4)&0xf, TIPIPCId&0xf,
-                      (TargetId>>8)&0xf, (TargetId>>4)&0xf, TargetId&0xf,
+              (DFEIPCId >> 8) & 0xf, (DFEIPCId >> 4) & 0xf, DFEIPCId & 0xf,
+              (TIPIPCId >> 8) & 0xf, (TIPIPCId >> 4) & 0xf, TIPIPCId & 0xf,
+              (TargetId >> 8) & 0xf, (TargetId >> 4) & 0xf, TargetId & 0xf,
                       sbuf);
     }
 }
@@ -355,81 +299,83 @@ udi_open (name, from_tty)
    Use this when you want to detach and do something else
    with your gdb.  */
 static void
-udi_close (quitting)   /*FIXME: how is quitting used */
-     int quitting;
+udi_close (                    /*FIXME: how is quitting used */
+           int quitting)
 {
   if (udi_session_id < 0)
     return;
 
   /* We should never get here if there isn't something valid in
-     udi_session_id. */
+     udi_session_id.  */
 
   if (UDIDisconnect (udi_session_id, UDITerminateSession))
-    error ("UDIDisconnect() failed in udi_close");
+    {
+      if (quitting)
+       warning ("UDIDisconnect() failed in udi_close");
+      else
+       error ("UDIDisconnect() failed in udi_close");
+    }
 
   /* Do not try to close udi_session_id again, later in the program.  */
   udi_session_id = -1;
   inferior_pid = 0;
 
-#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");
-#endif
-
   printf_filtered ("  Ending remote debugging\n");
-} 
+}
 
 /**************************************************************** UDI_ATACH */
 /* Attach to a program that is already loaded and running 
  * Upon exiting the process's execution is stopped.
  */
 static void
-udi_attach (args, from_tty)
-     char *args;
-     int from_tty;
+udi_attach (char *args, int from_tty)
 {
-  UDIResource  From;
-  UDIInt32     PC_adds;
-  UDICount     Count = 1;
-  UDISizeT     Size = 4;
-  UDICount     CountDone;
-  UDIBool      HostEndian = 0;
-  UDIError     err;
+  UDIResource From;
+  UDIInt32 PC_adds;
+  UDICount Count = 1;
+  UDISizeT Size = 4;
+  UDICount CountDone;
+  UDIBool HostEndian = 0;
+  UDIError err;
+
+  if (args == NULL)
+    error_no_arg ("program to attach");
 
   if (udi_session_id < 0)
-      error ("UDI connection not opened yet, use the 'target udi' command.\n");
-       
+    error ("UDI connection not opened yet, use the 'target udi' command.\n");
+
   if (from_tty)
-      printf ("Attaching to remote program %s...\n", prog_name);
+    printf_unfiltered ("Attaching to remote program %s...\n", prog_name);
 
-  UDIStop();
+  UDIStop ();
   From.Space = UDI29KSpecialRegs;
   From.Offset = 11;
-  if (err = UDIRead(From, &PC_adds, Count, Size, &CountDone, HostEndian))
+  if (err = UDIRead (From, &PC_adds, Count, Size, &CountDone, HostEndian))
     error ("UDIRead failed in udi_attach");
-  printf ("Remote process is now halted, pc1 = 0x%x.\n", PC_adds);
+  printf_unfiltered ("Remote process is now halted, pc1 = 0x%x.\n", PC_adds);
 }
 /************************************************************* UDI_DETACH */
 /* Terminate the open connection to the TIP process.
    Use this when you want to detach and do something else
    with your gdb.  Leave remote process running (with no breakpoints set). */
 static void
-udi_detach (args,from_tty)
-     char *args;
-     int from_tty;
+udi_detach (char *args, int from_tty)
 {
 
-  remove_breakpoints();                /* Just in case there were any left in */
+  remove_breakpoints ();       /* Just in case there were any left in */
 
   if (UDIDisconnect (udi_session_id, UDIContinueSession))
     error ("UDIDisconnect() failed in udi_detach");
 
-  pop_target();                /* calls udi_close to do the real work */
+  /* Don't try to UDIDisconnect it again in udi_close, which is called from
+     pop_target.  */
+  udi_session_id = -1;
+  inferior_pid = 0;
+
+  pop_target ();
 
   if (from_tty)
-    printf ("Ending remote debugging\n");
+    printf_unfiltered ("Detaching from TIP\n");
 }
 
 
@@ -437,25 +383,24 @@ udi_detach (args,from_tty)
 ** Tell the remote machine to resume.  */
 
 static void
-udi_resume (step, sig)
-     int step, sig;
+udi_resume (int pid, int step, enum target_signal sig)
 {
   UDIError tip_error;
   UDIUInt32 Steps = 1;
   UDIStepType StepType = UDIStepNatural;
   UDIRange Range;
 
-  if (step)                    /* step 1 instruction */
+  if (step)                    /* step 1 instruction */
     {
       tip_error = UDIStep (Steps, StepType, Range);
       if (!tip_error)
        return;
 
-      fprintf (stderr,  "UDIStep() error = %d\n", tip_error);
+      fprintf_unfiltered (gdb_stderr, "UDIStep() error = %d\n", tip_error);
       error ("failed in udi_resume");
     }
 
-  if (UDIExecute())
+  if (UDIExecute ())
     error ("UDIExecute() failed in udi_resume");
 }
 
@@ -464,50 +409,66 @@ udi_resume (step, sig)
    storing status in STATUS just as `wait' would.  */
 
 static int
-udi_wait (status)
-     WAITTYPE *status;
+udi_wait (int pid, struct target_waitstatus *status)
 {
-  UDIInt32     MaxTime;
-  UDIPId       PId;
-  UDIInt32     StopReason;
-  UDISizeT     CountDone;
-  int          old_timeout = timeout;
-  int          old_immediate_quit = immediate_quit;
-  int          i;
+  UDIInt32 MaxTime;
+  UDIPId PId;
+  UDIInt32 StopReason;
+  UDISizeT CountDone;
+  int old_timeout = timeout;
+  int old_immediate_quit = immediate_quit;
+  int i;
 
-  WSETEXIT ((*status), 0);
+  status->kind = TARGET_WAITKIND_EXITED;
+  status->value.integer = 0;
 
 /* wait for message to arrive. It should be:
-  If the target stops executing, udi_wait() should return.
-*/
+   If the target stops executing, udi_wait() should return.
+ */
   timeout = 0;                 /* Wait indefinetly for a message */
-  immediate_quit = 1;          /* Helps ability to QUIT */
+  immediate_quit = 1;          /* Helps ability to QUIT */
 
-  while(1)
+  while (1)
     {
       i = 0;
       MaxTime = UDIWaitForever;
-      UDIWait(MaxTime, &PId, &StopReason);
+      UDIWait (MaxTime, &PId, &StopReason);
       QUIT;                    /* Let user quit if they want */
 
       switch (StopReason & UDIGrossState)
        {
        case UDIStdoutReady:
-         if (UDIGetStdout (sbuf, (UDISizeT)SBUF_MAX, &CountDone))
-           error ("UDIGetStdout() failed in udi_wait");
+         if (UDIGetStdout (sbuf, (UDISizeT) SBUF_MAX, &CountDone))
+           /* This is said to happen if the program tries to output
+              a whole bunch of output (more than SBUF_MAX, I would
+              guess).  It doesn't seem to happen with the simulator.  */
+           warning ("UDIGetStdout() failed in udi_wait");
          fwrite (sbuf, 1, CountDone, stdout);
-         fflush(stdout);
+         gdb_flush (gdb_stdout);
          continue;
+
        case UDIStderrReady:
-         UDIGetStderr (sbuf, (UDISizeT)SBUF_MAX, &CountDone);
+         UDIGetStderr (sbuf, (UDISizeT) SBUF_MAX, &CountDone);
          fwrite (sbuf, 1, CountDone, stderr);
-         fflush(stderr);
+         gdb_flush (gdb_stderr);
          continue;
+
        case UDIStdinNeeded:
-         scanf ("%s", sbuf);
-         i = strlen (sbuf);
-         UDIPutStdin (sbuf, (UDISizeT)i, &CountDone);
-         continue;
+         {
+           int ch;
+           i = 0;
+           do
+             {
+               ch = getchar ();
+               if (ch == EOF)
+                 break;
+               sbuf[i++] = ch;
+             }
+           while (i < SBUF_MAX && ch != '\n');
+           UDIPutStdin (sbuf, (UDISizeT) i, &CountDone);
+           continue;
+         }
+
        case UDIRunning:
          /* In spite of the fact that we told UDIWait to wait forever, it will
             return spuriously sometimes.  */
@@ -522,41 +483,50 @@ udi_wait (status)
   switch (StopReason & UDIGrossState)
     {
     case UDITrapped:
-      printf("Am290*0 received vector number %d\n", StopReason >> 24);
-         
-      switch (StopReason >> 8)
+      printf_unfiltered ("Am290*0 received vector number %d\n", StopReason >> 24);
+
+      switch ((StopReason >> 8) & 0xff)
        {
-       case 0:                 /* Illegal opcode */
-         printf("      (break point)\n");
-         WSETSTOP ((*status), SIGTRAP);
+       case 0:         /* Illegal opcode */
+         printf_unfiltered ("  (break point)\n");
+         status->kind = TARGET_WAITKIND_STOPPED;
+         status->value.sig = TARGET_SIGNAL_TRAP;
          break;
-       case 1:                 /* Unaligned Access */
-         WSETSTOP ((*status), SIGBUS);
+       case 1:         /* Unaligned Access */
+         status->kind = TARGET_WAITKIND_STOPPED;
+         status->value.sig = TARGET_SIGNAL_BUS;
          break;
        case 3:
        case 4:
-         WSETSTOP ((*status), SIGFPE);
+         status->kind = TARGET_WAITKIND_STOPPED;
+         status->value.sig = TARGET_SIGNAL_FPE;
          break;
-       case 5:                 /* Protection Violation */
-         WSETSTOP ((*status), SIGILL);
+       case 5:         /* Protection Violation */
+         status->kind = TARGET_WAITKIND_STOPPED;
+         /* Why not SEGV?  What is a Protection Violation?  */
+         status->value.sig = TARGET_SIGNAL_ILL;
          break;
        case 6:
        case 7:
-       case 8:                 /* User Instruction Mapping Miss */
-       case 9:                 /* User Data Mapping Miss */
+       case 8:         /* User Instruction Mapping Miss */
+       case 9:         /* User Data Mapping Miss */
        case 10:                /* Supervisor Instruction Mapping Miss */
        case 11:                /* Supervisor Data Mapping Miss */
-         WSETSTOP ((*status), SIGSEGV);
+         status->kind = TARGET_WAITKIND_STOPPED;
+         status->value.sig = TARGET_SIGNAL_SEGV;
          break;
        case 12:
        case 13:
-         WSETSTOP ((*status), SIGILL);
+         status->kind = TARGET_WAITKIND_STOPPED;
+         status->value.sig = TARGET_SIGNAL_ILL;
          break;
        case 14:                /* Timer */
-         WSETSTOP ((*status), SIGALRM);
+         status->kind = TARGET_WAITKIND_STOPPED;
+         status->value.sig = TARGET_SIGNAL_ALRM;
          break;
        case 15:                /* Trace */
-         WSETSTOP ((*status), SIGTRAP);
+         status->kind = TARGET_WAITKIND_STOPPED;
+         status->value.sig = TARGET_SIGNAL_TRAP;
          break;
        case 16:                /* INTR0 */
        case 17:                /* INTR1 */
@@ -564,104 +534,165 @@ udi_wait (status)
        case 19:                /* INTR3/Internal */
        case 20:                /* TRAP0 */
        case 21:                /* TRAP1 */
-         WSETSTOP ((*status), SIGINT);
+         status->kind = TARGET_WAITKIND_STOPPED;
+         status->value.sig = TARGET_SIGNAL_INT;
          break;
        case 22:                /* Floating-Point Exception */
-         WSETSTOP ((*status), SIGILL);
+         status->kind = TARGET_WAITKIND_STOPPED;
+         /* Why not FPE?  */
+         status->value.sig = TARGET_SIGNAL_ILL;
          break;
        case 77:                /* assert 77 */
-         WSETSTOP ((*status), SIGTRAP);
+         status->kind = TARGET_WAITKIND_STOPPED;
+         status->value.sig = TARGET_SIGNAL_TRAP;
          break;
        default:
-         WSETEXIT ((*status), 0);
+         status->kind = TARGET_WAITKIND_EXITED;
+         status->value.integer = 0;
        }
       break;
     case UDINotExecuting:
-      WSETSTOP ((*status), SIGTERM);
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_TERM;
       break;
     case UDIStopped:
-      WSETSTOP ((*status), SIGTSTP);
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_TSTP;
       break;
     case UDIWarned:
-      WSETSTOP ((*status), SIGURG);
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_URG;
       break;
     case UDIStepped:
     case UDIBreak:
-      WSETSTOP ((*status), SIGTRAP);
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_TRAP;
       break;
     case UDIWaiting:
-      WSETSTOP ((*status), SIGSTOP);
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_STOP;
       break;
     case UDIHalted:
-      WSETSTOP ((*status), SIGKILL);
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_KILL;
       break;
     case UDIExited:
     default:
-      WSETEXIT ((*status), 0);
+      status->kind = TARGET_WAITKIND_EXITED;
+      status->value.integer = 0;
     }
 
   timeout = old_timeout;       /* Restore original timeout value */
   immediate_quit = old_immediate_quit;
-  return 0;
+  return inferior_pid;
+}
+
+#if 0
+/* Handy for debugging */
+udi_pc (void)
+{
+  UDIResource From;
+  UDIUInt32 *To;
+  UDICount Count;
+  UDISizeT Size = 4;
+  UDICount CountDone;
+  UDIBool HostEndian = 0;
+  UDIError err;
+  int pc[2];
+  unsigned long myregs[256];
+  int i;
+
+  From.Space = UDI29KPC;
+  From.Offset = 0;
+  To = (UDIUInt32 *) pc;
+  Count = 2;
+
+  err = UDIRead (From, To, Count, Size, &CountDone, HostEndian);
+
+  printf_unfiltered ("err = %d, CountDone = %d, pc[0] = 0x%x, pc[1] = 0x%x\n",
+                    err, CountDone, pc[0], pc[1]);
+
+  udi_fetch_registers (-1);
+
+  printf_unfiltered ("other pc1 = 0x%x, pc0 = 0x%x\n", *(int *) &registers[4 * PC_REGNUM],
+                    *(int *) &registers[4 * NPC_REGNUM]);
+
+  /* Now, read all the registers globally */
+
+  From.Space = UDI29KGlobalRegs;
+  From.Offset = 0;
+  err = UDIRead (From, myregs, 256, 4, &CountDone, HostEndian);
+
+  printf ("err = %d, CountDone = %d\n", err, CountDone);
+
+  printf ("\n");
+
+  for (i = 0; i < 256; i += 2)
+    printf ("%d:\t%#10x\t%11d\t%#10x\t%11d\n", i, myregs[i], myregs[i],
+           myregs[i + 1], myregs[i + 1]);
+  printf ("\n");
+
+  return pc[0];
 }
+#endif
 
 /********************************************************** UDI_FETCH_REGISTERS
  * Read a remote register 'regno'. 
  * If regno==-1 then read all the registers.
  */
-static void 
-udi_fetch_registers (regno)
-int    regno;
+static void
+udi_fetch_registers (int regno)
 {
-  UDIResource  From;
-  UDIUInt32    *To;
-  UDICount     Count;
-  UDISizeT     Size = 4;
-  UDICount     CountDone;
-  UDIBool      HostEndian = 0;
-  UDIError     err;
-  int          i;
-
-  if (regno >= 0)  {
-    fetch_register(regno);
-    return;
-  }
+  UDIResource From;
+  UDIUInt32 *To;
+  UDICount Count;
+  UDISizeT Size = 4;
+  UDICount CountDone;
+  UDIBool HostEndian = 0;
+  UDIError err;
+  int i;
+
+  if (regno >= 0)
+    {
+      fetch_register (regno);
+      return;
+    }
 
 /* Gr1/rsp */
 
   From.Space = UDI29KGlobalRegs;
   From.Offset = 1;
-  To = (UDIUInt32 *)&registers[4 * GR1_REGNUM];
+  To = (UDIUInt32 *) & registers[4 * GR1_REGNUM];
   Count = 1;
-  if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIRead() failed in udi_fetch_registers");
+  if (err = UDIRead (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIRead() failed in udi_fetch_registers");
 
   register_valid[GR1_REGNUM] = 1;
 
 #if defined(GR64_REGNUM)       /* Read gr64-127 */
 
-/* Global Registers gr64-gr95 */ 
+/* Global Registers gr64-gr95 */
 
   From.Space = UDI29KGlobalRegs;
   From.Offset = 64;
-  To = (UDIUInt32 *)&registers[4 * GR64_REGNUM];
+  To = (UDIUInt32 *) & registers[4 * GR64_REGNUM];
   Count = 32;
-  if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIRead() failed in udi_fetch_registers");
+  if (err = UDIRead (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIRead() failed in udi_fetch_registers");
 
   for (i = GR64_REGNUM; i < GR64_REGNUM + 32; i++)
     register_valid[i] = 1;
 
-#endif /*  GR64_REGNUM */
+#endif /*  GR64_REGNUM */
 
-/* Global Registers gr96-gr127 */ 
+/* Global Registers gr96-gr127 */
 
   From.Space = UDI29KGlobalRegs;
   From.Offset = 96;
-  To = (UDIUInt32 *)&registers[4 * GR96_REGNUM];
+  To = (UDIUInt32 *) & registers[4 * GR96_REGNUM];
   Count = 32;
-  if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIRead() failed in udi_fetch_registers");
+  if (err = UDIRead (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIRead() failed in udi_fetch_registers");
 
   for (i = GR96_REGNUM; i < GR96_REGNUM + 32; i++)
     register_valid[i] = 1;
@@ -670,10 +701,10 @@ int       regno;
 
   From.Space = UDI29KLocalRegs;
   From.Offset = 0;
-  To = (UDIUInt32 *)&registers[4 * LR0_REGNUM];
+  To = (UDIUInt32 *) & registers[4 * LR0_REGNUM];
   Count = 128;
-  if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIRead() failed in udi_fetch_registers");
+  if (err = UDIRead (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIRead() failed in udi_fetch_registers");
 
   for (i = LR0_REGNUM; i < LR0_REGNUM + 128; i++)
     register_valid[i] = 1;
@@ -682,38 +713,41 @@ int       regno;
 
   From.Space = UDI29KSpecialRegs;
   From.Offset = 0;
-  To = (UDIUInt32 *)&registers[4 * SR_REGNUM(0)];
+  To = (UDIUInt32 *) & registers[4 * SR_REGNUM (0)];
   Count = 15;
-  if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIRead() failed in udi_fetch_registers");
+  if (err = UDIRead (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIRead() failed in udi_fetch_registers");
 
-  for (i = SR_REGNUM(0); i < SR_REGNUM(0) + 15; i++)
+  for (i = SR_REGNUM (0); i < SR_REGNUM (0) + 15; i++)
     register_valid[i] = 1;
 
-  if (USE_SHADOW_PC) { /* Let regno_to_srnum() handle the register number */
-    fetch_register(NPC_REGNUM);
-    fetch_register(PC_REGNUM);
-    fetch_register(PC2_REGNUM);
+  if (USE_SHADOW_PC)
+    {                          /* Let regno_to_srnum() handle the register number */
+      fetch_register (NPC_REGNUM);
+      fetch_register (PC_REGNUM);
+      fetch_register (PC2_REGNUM);
 
 /* Unprotected Special Registers sr128-sr135 */
 
-    From.Space = UDI29KSpecialRegs;
-    From.Offset = 128;
-    To = (UDIUInt32 *)&registers[4 * SR_REGNUM(128)];
-    Count = 135-128 + 1;
-    if (err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
-      error("UDIRead() failed in udi_fetch_registers");
-
-    for (i = SR_REGNUM(128); i < SR_REGNUM(128) + 135-128+1; i++)
-      register_valid[i] = 1;
-  }
+      From.Space = UDI29KSpecialRegs;
+      From.Offset = 128;
+      To = (UDIUInt32 *) & registers[4 * SR_REGNUM (128)];
+      Count = 135 - 128 + 1;
+      if (err = UDIRead (From, To, Count, Size, &CountDone, HostEndian))
+       error ("UDIRead() failed in udi_fetch_registers");
+
+      for (i = SR_REGNUM (128); i < SR_REGNUM (128) + 135 - 128 + 1; i++)
+       register_valid[i] = 1;
+    }
 
-  if (kiodebug)
+  if (remote_debug)
     {
-      printf("Fetching all registers\n");
-      printf("Fetching PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n",
-            read_register(NPC_REGNUM), read_register(PC_REGNUM),
-            read_register(PC2_REGNUM));
+      fprintf_unfiltered (gdb_stdlog, "Fetching all registers\n");
+      fprintf_unfiltered (gdb_stdlog,
+                         "Fetching PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n",
+                         read_register (NPC_REGNUM),
+                         read_register (PC_REGNUM),
+                         read_register (PC2_REGNUM));
     }
 
   /* There doesn't seem to be any way to get these.  */
@@ -733,108 +767,119 @@ int     regno;
  */
 
 static void
-udi_store_registers (regno)
-int regno;
+udi_store_registers (int regno)
 {
-  UDIUInt32    *From;
-  UDIResource  To;
-  UDICount     Count;
-  UDISizeT     Size = 4;
-  UDICount     CountDone;
-  UDIBool      HostEndian = 0;
-  
+  UDIUInt32 *From;
+  UDIResource To;
+  UDICount Count;
+  UDISizeT Size = 4;
+  UDICount CountDone;
+  UDIBool HostEndian = 0;
+
   if (regno >= 0)
     {
-      store_register(regno);
+      store_register (regno);
       return;
     }
 
-  if (kiodebug)
+  if (remote_debug)
     {
-      printf("Storing all registers\n");
-      printf("PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n", read_register(NPC_REGNUM),
-            read_register(PC_REGNUM), read_register(PC2_REGNUM));
+      fprintf_unfiltered (gdb_stdlog, "Storing all registers\n");
+      fprintf_unfiltered (gdb_stdlog,
+                         "PC0 = 0x%x, PC1 = 0x%x, PC2 = 0x%x\n",
+                         read_register (NPC_REGNUM),
+                         read_register (PC_REGNUM),
+                         read_register (PC2_REGNUM));
     }
 
 /* Gr1/rsp */
 
-  From = (UDIUInt32 *)&registers[4 * GR1_REGNUM];
+  From = (UDIUInt32 *) & registers[4 * GR1_REGNUM];
   To.Space = UDI29KGlobalRegs;
   To.Offset = 1;
   Count = 1;
-  if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIWrite() failed in udi_store_regisetrs");
+  if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIWrite() failed in udi_store_regisetrs");
 
 #if defined(GR64_REGNUM)
 
 /* Global registers gr64-gr95 */
 
-  From = (UDIUInt32 *)&registers[4 * GR64_REGNUM];
+  From = (UDIUInt32 *) & registers[4 * GR64_REGNUM];
   To.Space = UDI29KGlobalRegs;
   To.Offset = 64;
   Count = 32;
-  if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIWrite() failed in udi_store_regisetrs");
+  if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIWrite() failed in udi_store_regisetrs");
 
-#endif /* GR64_REGNUM */
+#endif /* GR64_REGNUM */
 
 /* Global registers gr96-gr127 */
 
-  From = (UDIUInt32 *)&registers[4 * GR96_REGNUM];
+  From = (UDIUInt32 *) & registers[4 * GR96_REGNUM];
   To.Space = UDI29KGlobalRegs;
   To.Offset = 96;
   Count = 32;
-  if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIWrite() failed in udi_store_regisetrs");
+  if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIWrite() failed in udi_store_regisetrs");
 
 /* Local Registers */
 
-  From = (UDIUInt32 *)&registers[4 * LR0_REGNUM];
+  From = (UDIUInt32 *) & registers[4 * LR0_REGNUM];
   To.Space = UDI29KLocalRegs;
   To.Offset = 0;
   Count = 128;
-  if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIWrite() failed in udi_store_regisetrs");
+  if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIWrite() failed in udi_store_regisetrs");
 
 
-/* Protected Special Registers */ /* VAB through TMR */
+  /* Protected Special Registers *//* VAB through TMR */
 
-  From = (UDIUInt32 *)&registers[4 * SR_REGNUM(0)];
+  From = (UDIUInt32 *) & registers[4 * SR_REGNUM (0)];
   To.Space = UDI29KSpecialRegs;
   To.Offset = 0;
   Count = 10;
-  if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIWrite() failed in udi_store_regisetrs");
+  if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIWrite() failed in udi_store_regisetrs");
 
 /* PC0, PC1, PC2 possibly as shadow registers */
 
-  From = (UDIUInt32 *)&registers[4 * SR_REGNUM(10)];
+  From = (UDIUInt32 *) & registers[4 * SR_REGNUM (10)];
   To.Space = UDI29KSpecialRegs;
   Count = 3;
-  if (USE_SHADOW_PC) 
-    To.Offset = 20;                            /* SPC0 */
-  else 
-    To.Offset = 10;                            /* PC0 */
-  if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIWrite() failed in udi_store_regisetrs");
+  if (USE_SHADOW_PC)
+    To.Offset = 20;            /* SPC0 */
+  else
+    To.Offset = 10;            /* PC0 */
+  if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIWrite() failed in udi_store_regisetrs");
+
+/* PC1 via UDI29KPC */
+
+  From = (UDIUInt32 *) & registers[4 * PC_REGNUM];
+  To.Space = UDI29KPC;
+  To.Offset = 0;               /* PC1 */
+  Count = 1;
+  if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIWrite() failed in udi_store_regisetrs");
 
   /* LRU and MMU */
 
-  From = (UDIUInt32 *)&registers[4 * SR_REGNUM(13)];
+  From = (UDIUInt32 *) & registers[4 * SR_REGNUM (13)];
   To.Space = UDI29KSpecialRegs;
   To.Offset = 13;
   Count = 2;
-  if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIWrite() failed in udi_store_regisetrs");
+  if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIWrite() failed in udi_store_regisetrs");
 
-/* Unprotected Special Registers */ 
+/* Unprotected Special Registers */
 
-  From = (UDIUInt32 *)&registers[4 * SR_REGNUM(128)];
+  From = (UDIUInt32 *) & registers[4 * SR_REGNUM (128)];
   To.Space = UDI29KSpecialRegs;
   To.Offset = 128;
-  Count = 135-128 +1;
-  if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
-    error("UDIWrite() failed in udi_store_regisetrs");
+  Count = 135 - 128 + 1;
+  if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+    error ("UDIWrite() failed in udi_store_regisetrs");
 
   registers_changed ();
 }
@@ -847,42 +892,40 @@ int regno;
    debugged.  */
 
 static void
-udi_prepare_to_store ()
+udi_prepare_to_store (void)
 {
   /* Do nothing, since we can store individual regs */
 }
 
 /********************************************************** TRANSLATE_ADDR */
 static CORE_ADDR
-translate_addr(addr)
-CORE_ADDR addr;
+translate_addr (CORE_ADDR addr)
 {
 #if defined(ULTRA3) && defined(KERNEL_DEBUGGING)
-        /* Check for a virtual address in the kernel */
-        /* Assume physical address of ublock is in  paddr_u register */
-       /* FIXME: doesn't work for user virtual addresses */
-        if (addr >= UVADDR) {
-                /* PADDR_U register holds the physical address of the ublock */
-                CORE_ADDR i = (CORE_ADDR)read_register(PADDR_U_REGNUM);
-                return(i + addr - (CORE_ADDR)UVADDR);
-        } else {
-               return(addr);
-        }
+  /* Check for a virtual address in the kernel */
+  /* Assume physical address of ublock is in  paddr_u register */
+  /* FIXME: doesn't work for user virtual addresses */
+  if (addr >= UVADDR)
+    {
+      /* PADDR_U register holds the physical address of the ublock */
+      CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM);
+      return (i + addr - (CORE_ADDR) UVADDR);
+    }
+  else
+    {
+      return (addr);
+    }
 #else
-        return(addr);
+  return (addr);
 #endif
 }
 /************************************************* UDI_XFER_INFERIOR_MEMORY */
 /* FIXME!  Merge these two.  */
 static int
-udi_xfer_inferior_memory (memaddr, myaddr, len, write)
-     CORE_ADDR memaddr;
-     char *myaddr;
-     int len;
-     int write;
+udi_xfer_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len, int write)
 {
 
-  memaddr = translate_addr(memaddr);
+  memaddr = translate_addr (memaddr);
 
   if (write)
     return udi_write_inferior_memory (memaddr, myaddr, len);
@@ -892,91 +935,102 @@ udi_xfer_inferior_memory (memaddr, myaddr, len, write)
 
 /********************************************************** UDI_FILES_INFO */
 static void
-udi_files_info ()
+udi_files_info (void)
 {
-  printf ("\tAttached to UDI socket to %s and running program %s.\n",
-          udi_config_id, prog_name);
+  printf_unfiltered ("\tAttached to UDI socket to %s", udi_config_id);
+  if (prog_name != NULL)
+    printf_unfiltered ("and running program %s", prog_name);
+  printf_unfiltered (".\n");
 }
 
 /**************************************************** UDI_INSERT_BREAKPOINT */
 static int
-udi_insert_breakpoint (addr, contents_cache)
-     CORE_ADDR addr;
-     char *contents_cache;
+udi_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
 {
   int cnt;
   UDIError err;
 
   for (cnt = 0; cnt < BKPT_TABLE_SIZE; cnt++)
-    if (bkpt_table[cnt].Type == 0) /* Find first free slot */
+    if (bkpt_table[cnt].Type == 0)     /* Find first free slot */
       break;
 
-  if(cnt >= BKPT_TABLE_SIZE)
-    error("Too many breakpoints set");
+  if (cnt >= BKPT_TABLE_SIZE)
+    error ("Too many breakpoints set");
 
   bkpt_table[cnt].Addr.Offset = addr;
-  bkpt_table[cnt].Addr.Space  = UDI29KIRAMSpace;
+  bkpt_table[cnt].Addr.Space = UDI29KIRAMSpace;
   bkpt_table[cnt].PassCount = 1;
   bkpt_table[cnt].Type = UDIBreakFlagExecute;
-  
-  err = UDISetBreakpoint(bkpt_table[cnt].Addr,
-                        bkpt_table[cnt].PassCount,
-                        bkpt_table[cnt].Type,
-                        &bkpt_table[cnt].BreakId);
 
-  if (err == 0) return 0;              /* Success */
+  err = UDISetBreakpoint (bkpt_table[cnt].Addr,
+                         bkpt_table[cnt].PassCount,
+                         bkpt_table[cnt].Type,
+                         &bkpt_table[cnt].BreakId);
+
+  if (err == 0)
+    return 0;                  /* Success */
 
   bkpt_table[cnt].Type = 0;
-  error("UDISetBreakpoint returned error code %d\n", err);
+  error ("UDISetBreakpoint returned error code %d\n", err);
 }
 
 /**************************************************** UDI_REMOVE_BREAKPOINT */
 static int
-udi_remove_breakpoint (addr, contents_cache)
-     CORE_ADDR addr;
-     char *contents_cache;
+udi_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
 {
   int cnt;
   UDIError err;
 
   for (cnt = 0; cnt < BKPT_TABLE_SIZE; cnt++)
-    if (bkpt_table[cnt].Addr.Offset == addr) /* Find matching breakpoint */
+    if (bkpt_table[cnt].Addr.Offset == addr)   /* Find matching breakpoint */
       break;
 
-  if(cnt >= BKPT_TABLE_SIZE)
-    error("Can't find breakpoint in table");
+  if (cnt >= BKPT_TABLE_SIZE)
+    error ("Can't find breakpoint in table");
 
   bkpt_table[cnt].Type = 0;
 
-  err = UDIClearBreakpoint(bkpt_table[cnt].BreakId);
-  if (err == 0) return 0;      /* Success */
+  err = UDIClearBreakpoint (bkpt_table[cnt].BreakId);
+  if (err == 0)
+    return 0;                  /* Success */
 
-  error("UDIClearBreakpoint returned error code %d\n", err);
+  error ("UDIClearBreakpoint returned error code %d\n", err);
 }
 
 static void
-udi_kill(arg,from_tty)
-     char *arg;
-     int from_tty;
+udi_kill (char *arg, int from_tty)
 {
 
 #if 0
 /*
-UDIStop does not really work as advertised.  It causes the TIP to close it's
-connection, which usually results in GDB dying with a SIGPIPE.  For now, we
-just invoke udi_close, which seems to get things right.
-*/
-  UDIStop();
+   UDIStop does not really work as advertised.  It causes the TIP to close it's
+   connection, which usually results in GDB dying with a SIGPIPE.  For now, we
+   just invoke udi_close, which seems to get things right.
+ */
+  UDIStop ();
 
   udi_session_id = -1;
   inferior_pid = 0;
 
   if (from_tty)
-    printf("Target has been stopped.");
-#else
-  udi_close(0);
-#endif
-  pop_target();
+    printf_unfiltered ("Target has been stopped.");
+#endif /* 0 */
+#if 0
+  udi_close (0);
+  pop_target ();
+#endif /* 0 */
+
+  /* Keep the target around, e.g. so "run" can do the right thing when
+     we are already debugging something.  */
+
+  if (UDIDisconnect (udi_session_id, UDITerminateSession))
+    {
+      warning ("UDIDisconnect() failed");
+    }
+
+  /* Do not try to close udi_session_id again, later in the program.  */
+  udi_session_id = -1;
+  inferior_pid = 0;
 }
 
 /* 
@@ -985,20 +1039,18 @@ just invoke udi_close, which seems to get things right.
    loaded code as arguments.  (You need to use the `run' command to do that.)
 
    The options are:
-               -ms %d  Set mem stack size to %d
-               -rs %d  Set regular stack size to %d
-               -i      send init info (default)
-               -noi    don't send init info
-               -[tT]   Load Text section
-               -[dD]   Load Data section
-               -[bB]   Load BSS section
-               -[lL]   Load Lit section
 */
+   -ms %d       Set mem stack size to %d
+   -rs %d       Set regular stack size to %d
+   -i   send init info (default)
+   -noi don't send init info
+   -[tT]        Load Text section
+   -[dD]        Load Data section
+   -[bB]        Load BSS section
+   -[lL]        Load Lit section
+ */
 
 static void
-download(load_arg_string, from_tty)
-     char *load_arg_string;
-     int from_tty;
+download (char *load_arg_string, int from_tty)
 {
 #define DEFAULT_MEM_STACK_SIZE                 0x6000
 #define DEFAULT_REG_STACK_SIZE                 0x2000
@@ -1023,7 +1075,7 @@ download(load_arg_string, from_tty)
 
   dont_repeat ();
 
-  filename = strtok(load_arg_string, " \t");
+  filename = strtok (load_arg_string, " \t");
   if (!filename)
     error ("Must specify at least a file name with the load command");
 
@@ -1065,27 +1117,32 @@ download(load_arg_string, from_tty)
                      load_lit = 1;
                      break;
                    default:
-                     error ("Unknown UDI load option -%s", token-1);
+                     error ("Unknown UDI load option -%s", token - 1);
                    }
                }
            }
        }
     }
 
-  pbfd = bfd_openr (filename, 0);
+  pbfd = bfd_openr (filename, gnutarget);
 
-  if (!pbfd) 
+  if (!pbfd)
+    /* FIXME: should be using bfd_errmsg, not assuming it was
+       bfd_error_system_call.  */
     perror_with_name (filename);
-  
-  make_cleanup (bfd_close, pbfd);
+
+  /* FIXME: should be checking for errors from bfd_close (for one thing,
+     on error it does not free all the storage associated with the
+     bfd).  */
+  make_cleanup_bfd_close (pbfd);
 
   QUIT;
   immediate_quit++;
 
-  if (!bfd_check_format (pbfd, bfd_object)) 
+  if (!bfd_check_format (pbfd, bfd_object))
     error ("It doesn't seem to be an object file");
-  
-  for (section = pbfd->sections; section; section = section->next) 
+
+  for (section = pbfd->sections; section; section = section->next)
     {
       if (bfd_get_section_flags (pbfd, section) & SEC_ALLOC)
        {
@@ -1108,10 +1165,15 @@ download(load_arg_string, from_tty)
          section_size = bfd_section_size (pbfd, section);
          section_end = To.Offset + section_size;
 
-         printf("[Loading section %s at %x (%d bytes)]\n",
-                section_name,
-                To.Offset,
-                section_size);
+         if (section_size == 0)
+           /* This is needed at least in the BSS case, where the code
+              below starts writing before it even checks the size.  */
+           continue;
+
+         printf_unfiltered ("[Loading section %s at %x (%d bytes)]\n",
+                            section_name,
+                            To.Offset,
+                            section_size);
 
          if (bfd_get_section_flags (pbfd, section) & SEC_CODE)
            {
@@ -1134,7 +1196,7 @@ download(load_arg_string, from_tty)
                                            - address_ranges[1].Offset);
            }
 
-         if (bfd_get_section_flags (pbfd, section) & SEC_LOAD) /* Text, data or lit */
+         if (bfd_get_section_flags (pbfd, section) & SEC_LOAD)         /* Text, data or lit */
            {
              file_ptr fptr;
 
@@ -1149,12 +1211,12 @@ download(load_arg_string, from_tty)
                  bfd_get_section_contents (pbfd, section, buffer, fptr,
                                            Count);
 
-                 err = UDIWrite ((UDIHostMemPtr)buffer, /* From */
-                                 To,                   /* To */
-                                 Count,                /* Count */
-                                 (UDISizeT)1,          /* Size */
-                                 &Count,               /* CountDone */
-                                 (UDIBool)0);          /* HostEndian */
+                 err = UDIWrite ((UDIHostMemPtr) buffer,       /* From */
+                                 To,   /* To */
+                                 Count,        /* Count */
+                                 (UDISizeT) 1,         /* Size */
+                                 &Count,       /* CountDone */
+                                 (UDIBool) 0);         /* HostEndian */
                  if (err)
                    error ("UDIWrite failed, error = %d", err);
 
@@ -1163,41 +1225,44 @@ download(load_arg_string, from_tty)
                  section_size -= Count;
                }
            }
-         else                  /* BSS */
+         else
+           /* BSS */
            {
              UDIResource From;
              unsigned long zero = 0;
 
              /* Write a zero byte at the vma */
-             err = UDIWrite ((UDIHostMemPtr)&zero,     /* From */
-                             To,                       /* To */
-                             (UDICount)1,              /* Count */
-                             (UDISizeT)4,              /* Size */
-                             &Count,                   /* CountDone */
-                             (UDIBool)0);              /* HostEndian */
+             /* FIXME: Broken for sections of 1-3 bytes (we test for
+                zero above).  */
+             err = UDIWrite ((UDIHostMemPtr) & zero,   /* From */
+                             To,       /* To */
+                             (UDICount) 1,     /* Count */
+                             (UDISizeT) 4,     /* Size */
+                             &Count,   /* CountDone */
+                             (UDIBool) 0);     /* HostEndian */
              if (err)
                error ("UDIWrite failed, error = %d", err);
 
              From = To;
-             To.Offset+=4;
+             To.Offset += 4;
 
              /* Now, duplicate it for the length of the BSS */
-             err = UDICopy (From,                      /* From */
-                            To,                        /* To */
-                            (UDICount)(section_size/4 - 1), /* Count */
-                            (UDISizeT)4,               /* Size */
-                            &Count,                    /* CountDone */
-                            (UDIBool)1);               /* Direction */
+             err = UDICopy (From,      /* From */
+                            To,        /* To */
+                            (UDICount) (section_size / 4 - 1),         /* Count */
+                            (UDISizeT) 4,      /* Size */
+                            &Count,    /* CountDone */
+                            (UDIBool) 1);      /* Direction */
              if (err)
                {
                  char message[100];
                  int xerr;
 
-                 xerr = UDIGetErrorMsg(err, 100, message, &Count);
+                 xerr = UDIGetErrorMsg (err, 100, message, &Count);
                  if (!xerr)
-                   fprintf (stderr, "Error is %s\n", message);
+                   fprintf_unfiltered (gdb_stderr, "Error is %s\n", message);
                  else
-                   fprintf (stderr, "xerr is %d\n", xerr);
+                   fprintf_unfiltered (gdb_stderr, "xerr is %d\n", xerr);
                  error ("UDICopy failed, error = %d", err);
                }
            }
@@ -1207,122 +1272,125 @@ download(load_arg_string, from_tty)
 
   entry.Space = UDI29KIRAMSpace;
   entry.Offset = bfd_get_start_address (pbfd);
-  
+
   immediate_quit--;
 }
 
-/* User interface to download an image into the remote target.  See download()
- * for details on args.
- */
+/* Function to download an image into the remote target.  */
 
 static void
-udi_load(args, from_tty)
-     char *args;
-     int from_tty;
+udi_load (char *args, int from_tty)
 {
   download (args, from_tty);
 
-  symbol_file_add (strtok (args, " \t"), from_tty, 0, 0, 0, 0);
+  /* As a convenience, pick up any symbol info that is in the program
+     being loaded.  Note that we assume that the program is the``mainline'';
+     if this is not always true, then this code will need to be augmented.  */
+  symbol_file_add (strtok (args, " \t"), from_tty, NULL, 1, 0);
+
+  /* Getting new symbols may change our opinion about what is
+     frameless.  */
+  reinit_frame_cache ();
 }
 
 /*************************************************** UDI_WRITE_INFERIOR_MEMORY
 ** Copy LEN bytes of data from debugger memory at MYADDR
    to inferior's memory at MEMADDR.  Returns number of bytes written.  */
 static int
-udi_write_inferior_memory (memaddr, myaddr, len)
-     CORE_ADDR memaddr;
-     char *myaddr;
-     int len;
+udi_write_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
 {
-  int          nwritten = 0;
-  UDIUInt32    *From;
-  UDIResource  To;
-  UDICount     Count;
-  UDISizeT     Size = 1;
-  UDICount     CountDone = 0;
-  UDIBool      HostEndian = 0;
-  
-  To.Space = udi_memory_space(memaddr);
-  From = (UDIUInt32*)myaddr;
+  int nwritten = 0;
+  UDIUInt32 *From;
+  UDIResource To;
+  UDICount Count;
+  UDISizeT Size = 1;
+  UDICount CountDone = 0;
+  UDIBool HostEndian = 0;
+
+  To.Space = udi_memory_space (memaddr);
+  From = (UDIUInt32 *) myaddr;
 
   while (nwritten < len)
-  {    Count = len - nwritten;
-       if (Count > MAXDATA) Count = MAXDATA;
-       To.Offset = memaddr + nwritten;
-        if(UDIWrite(From, To, Count, Size, &CountDone, HostEndian))
-       {  error("UDIWrite() failed in udi_write_inferrior_memory");
-          break;       
+    {
+      Count = len - nwritten;
+      if (Count > MAXDATA)
+       Count = MAXDATA;
+      To.Offset = memaddr + nwritten;
+      if (UDIWrite (From, To, Count, Size, &CountDone, HostEndian))
+       {
+         error ("UDIWrite() failed in udi_write_inferior_memory");
+         break;
        }
-       else
-       {  nwritten += CountDone;
-          From += CountDone;
+      else
+       {
+         nwritten += CountDone;
+         From += CountDone;
        }
-  }
-  return(nwritten);
+    }
+  return (nwritten);
 }
 
 /**************************************************** UDI_READ_INFERIOR_MEMORY
 ** Read LEN bytes from inferior memory at MEMADDR.  Put the result
    at debugger address MYADDR.  Returns number of bytes read.  */
 static int
-udi_read_inferior_memory(memaddr, myaddr, len)
-     CORE_ADDR memaddr;
-     char *myaddr;
-     int len;
+udi_read_inferior_memory (CORE_ADDR memaddr, char *myaddr, int len)
 {
-  int          nread = 0;
-  UDIResource  From;
-  UDIUInt32    *To;
-  UDICount     Count;
-  UDISizeT     Size = 1;
-  UDICount     CountDone = 0;
-  UDIBool      HostEndian = 0;
-  UDIError     err;
-  
-  From.Space = udi_memory_space(memaddr);      
-  To = (UDIUInt32*)myaddr;
+  int nread = 0;
+  UDIResource From;
+  UDIUInt32 *To;
+  UDICount Count;
+  UDISizeT Size = 1;
+  UDICount CountDone = 0;
+  UDIBool HostEndian = 0;
+  UDIError err;
+
+  From.Space = udi_memory_space (memaddr);
+  To = (UDIUInt32 *) myaddr;
 
   while (nread < len)
-  {    Count = len - nread;
-       if (Count > MAXDATA) Count = MAXDATA;
-       From.Offset = memaddr + nread;
-        if(err = UDIRead(From, To, Count, Size, &CountDone, HostEndian))
-       {  error("UDIRead() failed in udi_read_inferrior_memory");
-          break;       
+    {
+      Count = len - nread;
+      if (Count > MAXDATA)
+       Count = MAXDATA;
+      From.Offset = memaddr + nread;
+      if (err = UDIRead (From, To, Count, Size, &CountDone, HostEndian))
+       {
+         error ("UDIRead() failed in udi_read_inferior_memory");
+         break;
        }
-       else
-       {  nread += CountDone;
-          To += CountDone;
+      else
+       {
+         nread += CountDone;
+         To += CountDone;
        }
-  }
-  return(nread);
+    }
+  return (nread);
 }
 
 /********************************************************************* WARNING
 */
-udi_warning(num)
-int    num;
+udi_warning (int num)
 {
-    error ("ERROR while loading program into remote TIP: $d\n", num);
+  error ("ERROR while loading program into remote TIP: $d\n", num);
 }
 
 
-/*****************************************************************************/ 
+/*****************************************************************************/
 /* Fetch a single register indicatated by 'regno'. 
  * Returns 0/-1 on success/failure.  
  */
 static void
-fetch_register (regno)
-     int regno;
+fetch_register (int regno)
 {
-  UDIResource  From;
-  UDIUInt32    To;
-  UDICount     Count = 1;
-  UDISizeT     Size = 4;
-  UDICount     CountDone;
-  UDIBool      HostEndian = 0;
-  UDIError     err;
-  int                  result;
+  UDIResource From;
+  UDIUInt32 To;
+  UDICount Count = 1;
+  UDISizeT Size = 4;
+  UDICount CountDone;
+  UDIBool HostEndian = 0;
+  UDIError err;
+  int result;
 
   if (regno == GR1_REGNUM)
     {
@@ -1337,144 +1405,189 @@ fetch_register (regno)
 
 #if defined(GR64_REGNUM)
 
-  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32 )
+  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
     {
       From.Space = UDI29KGlobalRegs;
       From.Offset = (regno - GR64_REGNUM) + 64;
     }
 
-#endif /* GR64_REGNUM */
+#endif /* GR64_REGNUM */
 
   else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
     {
       From.Space = UDI29KLocalRegs;
       From.Offset = (regno - LR0_REGNUM);
     }
-  else if (regno>=FPE_REGNUM && regno<=EXO_REGNUM)  
+  else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
     {
       int val = -1;
-      supply_register(160 + (regno - FPE_REGNUM),(char *) &val);
-      return;          /* Pretend Success */
+      /*supply_register(160 + (regno - FPE_REGNUM),(char *) &val); */
+      supply_register (regno, (char *) &val);
+      return;                  /* Pretend Success */
     }
-  else 
+  else
     {
       From.Space = UDI29KSpecialRegs;
-      From.Offset = regnum_to_srnum(regno); 
+      From.Offset = regnum_to_srnum (regno);
     }
 
-  if (err = UDIRead(From, &To, Count, Size, &CountDone, HostEndian))
-    error("UDIRead() failed in udi_fetch_registers");
+  if (err = UDIRead (From, &To, Count, Size, &CountDone, HostEndian))
+    error ("UDIRead() failed in udi_fetch_registers");
 
-  supply_register(regno, (char *) &To);
+  supply_register (regno, (char *) &To);
 
-  if (kiodebug)
-    printf("Fetching register %s = 0x%x\n", reg_names[regno], To);
+  if (remote_debug)
+    fprintf_unfiltered (gdb_stdlog, "Fetching register %s = 0x%x\n",
+                       REGISTER_NAME (regno), To);
 }
-/*****************************************************************************/ 
+/*****************************************************************************/
 /* Store a single register indicated by 'regno'. 
  * Returns 0/-1 on success/failure.  
  */
 static int
-store_register (regno)
-     int regno;
+store_register (int regno)
 {
-  int                  result;
-  UDIUInt32    From;
-  UDIResource  To;
-  UDICount     Count = 1;
-  UDISizeT     Size = 4;
-  UDICount     CountDone;
-  UDIBool      HostEndian = 0;
+  int result;
+  UDIUInt32 From;
+  UDIResource To;
+  UDICount Count = 1;
+  UDISizeT Size = 4;
+  UDICount CountDone;
+  UDIBool HostEndian = 0;
 
-  From =  read_register (regno);       /* get data value */
+  From = read_register (regno);        /* get data value */
 
-  if (kiodebug)
-    printf("Storing register %s = 0x%x\n", reg_names[regno], From);
+  if (remote_debug)
+    fprintf_unfiltered (gdb_stdlog, "Storing register %s = 0x%x\n",
+                       REGISTER_NAME (regno), From);
 
   if (regno == GR1_REGNUM)
-  { To.Space = UDI29KGlobalRegs;
-    To.Offset = 1;
-    result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
-    /* Setting GR1 changes the numbers of all the locals, so invalidate the 
-     * register cache.  Do this *after* calling read_register, because we want 
-     * read_register to return the value that write_register has just stuffed 
-     * into the registers array, not the value of the register fetched from 
-     * the inferior.  
-     */
-    registers_changed ();
-  }
+    {
+      To.Space = UDI29KGlobalRegs;
+      To.Offset = 1;
+      result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
+      /* Setting GR1 changes the numbers of all the locals, so invalidate the 
+       * register cache.  Do this *after* calling read_register, because we want 
+       * read_register to return the value that write_register has just stuffed 
+       * into the registers array, not the value of the register fetched from 
+       * the inferior.  
+       */
+      registers_changed ();
+    }
 #if defined(GR64_REGNUM)
-  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32 )
-  { To.Space = UDI29KGlobalRegs;
-    To.Offset = (regno - GR64_REGNUM) + 64;
-    result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
-  }
-#endif /* GR64_REGNUM */
+  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
+    {
+      To.Space = UDI29KGlobalRegs;
+      To.Offset = (regno - GR64_REGNUM) + 64;
+      result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
+    }
+#endif /* GR64_REGNUM */
   else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
-  { To.Space = UDI29KGlobalRegs;
-    To.Offset = (regno - GR96_REGNUM) + 96;
-    result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
-  }
+    {
+      To.Space = UDI29KGlobalRegs;
+      To.Offset = (regno - GR96_REGNUM) + 96;
+      result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
+    }
   else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
-  { To.Space = UDI29KLocalRegs;
-    To.Offset = (regno - LR0_REGNUM);
-    result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
-  }
-  else if (regno>=FPE_REGNUM && regno<=EXO_REGNUM)  
-  { 
-    return 0;          /* Pretend Success */
-  }
-  else         /* An unprotected or protected special register */
-  { To.Space = UDI29KSpecialRegs;
-    To.Offset = regnum_to_srnum(regno); 
-    result = UDIWrite(&From, To, Count, Size, &CountDone, HostEndian);
-  }
+    {
+      To.Space = UDI29KLocalRegs;
+      To.Offset = (regno - LR0_REGNUM);
+      result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
+    }
+  else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
+    return 0;                  /* Pretend Success */
+  else if (regno == PC_REGNUM)
+    {
+      /* PC1 via UDI29KPC */
 
-  if(result)
-  { result = -1;
-    error("UDIWrite() failed in store_registers");
-  }
-  return result;
+      To.Space = UDI29KPC;
+      To.Offset = 0;           /* PC1 */
+      result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
+
+      /* Writing to this loc actually changes the values of pc0 & pc1 */
+
+      register_valid[PC_REGNUM] = 0;   /* pc1 */
+      register_valid[NPC_REGNUM] = 0;  /* pc0 */
+    }
+  else
+    /* An unprotected or protected special register */
+    {
+      To.Space = UDI29KSpecialRegs;
+      To.Offset = regnum_to_srnum (regno);
+      result = UDIWrite (&From, To, Count, Size, &CountDone, HostEndian);
+    }
+
+  if (result != 0)
+    error ("UDIWrite() failed in store_registers");
+
+  return 0;
 }
 /********************************************************** REGNUM_TO_SRNUM */
 /* 
  * Convert a gdb special register number to a 29000 special register number.
  */
 static int
-regnum_to_srnum(regno)
-int    regno;
+regnum_to_srnum (int regno)
 {
-       switch(regno) {
-               case VAB_REGNUM: return(0); 
-               case OPS_REGNUM: return(1); 
-               case CPS_REGNUM: return(2); 
-               case CFG_REGNUM: return(3); 
-               case CHA_REGNUM: return(4); 
-               case CHD_REGNUM: return(5); 
-               case CHC_REGNUM: return(6); 
-               case RBP_REGNUM: return(7); 
-               case TMC_REGNUM: return(8); 
-               case TMR_REGNUM: return(9); 
-               case NPC_REGNUM: return(USE_SHADOW_PC ? (20) : (10));
-               case PC_REGNUM:  return(USE_SHADOW_PC ? (21) : (11));
-               case PC2_REGNUM: return(USE_SHADOW_PC ? (22) : (12));
-               case MMU_REGNUM: return(13); 
-               case LRU_REGNUM: return(14); 
-               case IPC_REGNUM: return(128); 
-               case IPA_REGNUM: return(129); 
-               case IPB_REGNUM: return(130); 
-               case Q_REGNUM:   return(131); 
-               case ALU_REGNUM: return(132); 
-               case BP_REGNUM:  return(133); 
-               case FC_REGNUM:  return(134); 
-               case CR_REGNUM:  return(135); 
-               case FPE_REGNUM: return(160); 
-               case INTE_REGNUM: return(161); 
-               case FPS_REGNUM: return(162); 
-               case EXO_REGNUM:return(164); 
-               default:
-                       return(255);    /* Failure ? */
-       }
+  switch (regno)
+    {
+    case VAB_REGNUM:
+      return (0);
+    case OPS_REGNUM:
+      return (1);
+    case CPS_REGNUM:
+      return (2);
+    case CFG_REGNUM:
+      return (3);
+    case CHA_REGNUM:
+      return (4);
+    case CHD_REGNUM:
+      return (5);
+    case CHC_REGNUM:
+      return (6);
+    case RBP_REGNUM:
+      return (7);
+    case TMC_REGNUM:
+      return (8);
+    case TMR_REGNUM:
+      return (9);
+    case NPC_REGNUM:
+      return (USE_SHADOW_PC ? (20) : (10));
+    case PC_REGNUM:
+      return (USE_SHADOW_PC ? (21) : (11));
+    case PC2_REGNUM:
+      return (USE_SHADOW_PC ? (22) : (12));
+    case MMU_REGNUM:
+      return (13);
+    case LRU_REGNUM:
+      return (14);
+    case IPC_REGNUM:
+      return (128);
+    case IPA_REGNUM:
+      return (129);
+    case IPB_REGNUM:
+      return (130);
+    case Q_REGNUM:
+      return (131);
+    case ALU_REGNUM:
+      return (132);
+    case BP_REGNUM:
+      return (133);
+    case FC_REGNUM:
+      return (134);
+    case CR_REGNUM:
+      return (135);
+    case FPE_REGNUM:
+      return (160);
+    case INTE_REGNUM:
+      return (161);
+    case FPS_REGNUM:
+      return (162);
+    case EXO_REGNUM:
+      return (164);
+    default:
+      return (255);            /* Failure ? */
+    }
 }
 /****************************************************************************/
 /*
@@ -1483,95 +1596,125 @@ int    regno;
  * FIXME: Doesn't know anything about I_CACHE/D_CACHE.
  */
 static CPUSpace
-udi_memory_space(addr)
-CORE_ADDR      addr;
+udi_memory_space (CORE_ADDR addr)
 {
-       UDIUInt32 tstart = IMemStart;
-       UDIUInt32 tend   = tstart + IMemSize;  
-       UDIUInt32 dstart = DMemStart;
-       UDIUInt32 dend   = tstart + DMemSize;  
-       UDIUInt32 rstart = RMemStart;
-       UDIUInt32 rend   = tstart + RMemSize;  
-
-       if (((UDIUInt32)addr >= tstart) && ((UDIUInt32)addr < tend)) { 
-               return UDI29KIRAMSpace;
-       } else if (((UDIUInt32)addr >= dstart) && ((UDIUInt32)addr < dend)) { 
-               return UDI29KDRAMSpace;
-       } else if (((UDIUInt32)addr >= rstart) && ((UDIUInt32)addr < rend)) {
-               /* FIXME: how do we determine between D_ROM and I_ROM */
-               return UDI29KIROMSpace;
-       } else  /* FIXME: what do me do now? */
-               return UDI29KDRAMSpace; /* Hmmm! */
+  UDIUInt32 tstart = IMemStart;
+  UDIUInt32 tend = tstart + IMemSize;
+  UDIUInt32 dstart = DMemStart;
+  UDIUInt32 dend = tstart + DMemSize;
+  UDIUInt32 rstart = RMemStart;
+  UDIUInt32 rend = tstart + RMemSize;
+
+  if (((UDIUInt32) addr >= tstart) && ((UDIUInt32) addr < tend))
+    {
+      return UDI29KIRAMSpace;
+    }
+  else if (((UDIUInt32) addr >= dstart) && ((UDIUInt32) addr < dend))
+    {
+      return UDI29KDRAMSpace;
+    }
+  else if (((UDIUInt32) addr >= rstart) && ((UDIUInt32) addr < rend))
+    {
+      /* FIXME: how do we determine between D_ROM and I_ROM */
+      return UDI29KIROMSpace;
+    }
+  else                         /* FIXME: what do me do now? */
+    return UDI29KDRAMSpace;    /* Hmmm! */
 }
 /*********************************************************************** STUBS
 */
 
-void  convert16() {;}
-void  convert32() {;}
-FILE* EchoFile = 0;            /* used for debugging */
-int   QuietMode = 0;           /* used for debugging */
+void
+convert16 (void)
+{;
+}
+void
+convert32 (void)
+{;
+}
+struct ui_file *EchoFile = 0;  /* used for debugging */
+int QuietMode = 0;             /* used for debugging */
+\f
+#ifdef NO_HIF_SUPPORT
+service_HIF (union msg_t *msg)
+{
+  return (0);                  /* Emulate a failure */
+}
+#endif
+\f
+/* Target_ops vector.  Not static because there does not seem to be
+   any portable way to do a forward declaration of a static variable.
+   The RS/6000 doesn't like "extern" followed by "static"; SunOS
+   /bin/cc doesn't like "static" twice.  */
 
-/****************************************************************************/
-/* 
- *  Define the target subroutine names 
- */
-static struct target_ops udi_ops = {
-        "udi",
-       "Remote UDI connected TIP",
-       "Remote debug an AMD 29k using UDI socket connection to TIP process",
-        udi_open,
-       udi_close,
-        udi_attach,
-       udi_detach,
-       udi_resume,
-       udi_wait,
-        udi_fetch_registers,
-       udi_store_registers,
-        udi_prepare_to_store,
-        udi_xfer_inferior_memory,
-        udi_files_info,
-        udi_insert_breakpoint,
-       udi_remove_breakpoint,
-        0,                     /* termial_init */
-       0,                      /* terminal_inferior */
-       0,                      /* terminal_ours_for_output */
-       0,                      /* terminal_ours */
-       0,                      /* terminal_info */
-        udi_kill,              /* FIXME, kill */
-        udi_load,
-        0,                      /* lookup_symbol */
-        udi_create_inferior,
-        udi_mourn,             /* mourn_inferior FIXME */
-       0,                      /* can_run */
-       0,                      /* notice_signals */
-        process_stratum,
-       0,                      /* next */
-        1,                     /* has_all_memory */
-       1,                      /* has_memory */
-       1,                      /* has_stack */
-       1,                      /* has_registers */
-       1,                      /* has_execution */
-       0,                      /* sections */
-       0,                      /* sections_end */
-       OPS_MAGIC,              /* Always the last thing */
-};
+struct target_ops udi_ops;
 
-void _initialize_remote_udi()
+static void
+init_udi_ops (void)
 {
-  add_target (&udi_ops);
-  add_show_from_set (
-                    add_set_cmd ("remotedebug", no_class, var_boolean,
-                                 (char *)&kiodebug,
-                                 "Set debugging of UDI I/O.\n\
-When enabled, debugging info is displayed.",
-                                 &setlist),
-                    &showlist);
-}
+  udi_ops.to_shortname = "udi";
+  udi_ops.to_longname = "Remote UDI connected TIP";
+  udi_ops.to_doc = "Remote debug an AMD 29k using UDI socket connection to TIP process.\n\
+Arguments are\n\
+`configuration-id AF_INET hostname port-number'\n\
+To connect via the network, where hostname and port-number specify the\n\
+host and port where you can connect via UDI.\n\
+configuration-id is unused.\n\
+\n\
+`configuration-id AF_UNIX socket-name tip-program'\n\
+To connect using a local connection to the \"tip.exe\" program which is\n\
+    supplied by AMD.  If socket-name specifies an AF_UNIX socket then the\n\
+    tip program must already be started; connect to it using that socket.\n\
+    If not, start up tip-program, which should be the name of the tip\n\
+    program.  If appropriate, the PATH environment variable is searched.\n\
+    configuration-id is unused.\n\
+\n\
+`configuration-id'\n\
+    Look up the configuration in ./udi_soc or /etc/udi_soc, which\n\
+    are files containing lines in the above formats.  configuration-id is\n\
+    used to pick which line of the file to use.";
+  udi_ops.to_open = udi_open;
+  udi_ops.to_close = udi_close;
+  udi_ops.to_attach = udi_attach;
+  udi_ops.to_detach = udi_detach;
+  udi_ops.to_resume = udi_resume;
+  udi_ops.to_wait = udi_wait;
+  udi_ops.to_fetch_registers = udi_fetch_registers;
+  udi_ops.to_store_registers = udi_store_registers;
+  udi_ops.to_prepare_to_store = udi_prepare_to_store;
+  udi_ops.to_xfer_memory = udi_xfer_inferior_memory;
+  udi_ops.to_files_info = udi_files_info;
+  udi_ops.to_insert_breakpoint = udi_insert_breakpoint;
+  udi_ops.to_remove_breakpoint = udi_remove_breakpoint;
+  udi_ops.to_terminal_init = 0;
+  udi_ops.to_terminal_inferior = 0;
+  udi_ops.to_terminal_ours_for_output = 0;
+  udi_ops.to_terminal_ours = 0;
+  udi_ops.to_terminal_info = 0;
+  udi_ops.to_kill = udi_kill;
+  udi_ops.to_load = udi_load;
+  udi_ops.to_lookup_symbol = 0;
+  udi_ops.to_create_inferior = udi_create_inferior;
+  udi_ops.to_mourn_inferior = udi_mourn;
+  udi_ops.to_can_run = 0;
+  udi_ops.to_notice_signals = 0;
+  udi_ops.to_thread_alive = 0;
+  udi_ops.to_stop = 0;
+  udi_ops.to_stratum = process_stratum;
+  udi_ops.DONT_USE = 0;
+  udi_ops.to_has_all_memory = 1;
+  udi_ops.to_has_memory = 1;
+  udi_ops.to_has_stack = 1;
+  udi_ops.to_has_registers = 1;
+  udi_ops.to_has_execution = 1;
+  udi_ops.to_sections = 0;
+  udi_ops.to_sections_end = 0;
+  udi_ops.to_magic = OPS_MAGIC;
+};
 
-#ifdef NO_HIF_SUPPORT
-service_HIF(msg)
-union msg_t    *msg;
+void
+_initialize_remote_udi (void)
 {
-       return(0);      /* Emulate a failure */
+  init_udi_ops ();
+  add_target (&udi_ops);
 }
-#endif