OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [remote-mm.c] - Diff between revs 105 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 105 Rev 1765
/* Remote debugging interface for Am290*0 running MiniMON monitor, for GDB.
/* Remote debugging interface for Am290*0 running MiniMON monitor, for GDB.
   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
   Originally written by Daniel Mann at AMD.
   Originally written by Daniel Mann at 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
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */
   Boston, MA 02111-1307, USA.  */
 
 
/* This is like remote.c but ecpects MiniMON to be running on the Am29000
/* This is like remote.c but ecpects MiniMON to be running on the Am29000
   target hardware.
   target hardware.
   - David Wood (wood@lab.ultra.nyu.edu) at New York University adapted this
   - 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
   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
   with termio, only with sgtty.  Because we are only attempting to
   use this module to debug our kernel, which is already loaded when
   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.
   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.
   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
   You should get tagged at compile time if you need to make any
   changes/additions.  */
   changes/additions.  */
 
 
#include "defs.h"
#include "defs.h"
#include "inferior.h"
#include "inferior.h"
#include "gdb_wait.h"
#include "gdb_wait.h"
#include "value.h"
#include "value.h"
#include <ctype.h>
#include <ctype.h>
#include <fcntl.h>
#include <fcntl.h>
#include <signal.h>
#include <signal.h>
#include <errno.h>
#include <errno.h>
#include "gdb_string.h"
#include "gdb_string.h"
#include "terminal.h"
#include "terminal.h"
#include "minimon.h"
#include "minimon.h"
#include "target.h"
#include "target.h"
 
 
/* Offset of member MEMBER in a struct of type TYPE.  */
/* Offset of member MEMBER in a struct of type TYPE.  */
#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
 
 
#define DRAIN_INPUT()   (msg_recv_serial((union msg_t*)0))
#define DRAIN_INPUT()   (msg_recv_serial((union msg_t*)0))
 
 
extern int stop_soon_quietly;   /* for wait_for_inferior */
extern int stop_soon_quietly;   /* for wait_for_inferior */
 
 
static void mm_resume ();
static void mm_resume ();
static void mm_fetch_registers ();
static void mm_fetch_registers ();
static int fetch_register ();
static int fetch_register ();
static void mm_store_registers ();
static void mm_store_registers ();
static int store_register ();
static int store_register ();
static int regnum_to_srnum ();
static int regnum_to_srnum ();
static void mm_close ();
static void mm_close ();
static char *msg_str ();
static char *msg_str ();
static char *error_msg_str ();
static char *error_msg_str ();
static int expect_msg ();
static int expect_msg ();
static void init_target_mm ();
static void init_target_mm ();
static int mm_memory_space ();
static int mm_memory_space ();
 
 
#define FREEZE_MODE     (read_register(CPS_REGNUM) && 0x400)
#define FREEZE_MODE     (read_register(CPS_REGNUM) && 0x400)
#define USE_SHADOW_PC   ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
#define USE_SHADOW_PC   ((processor_type == a29k_freeze_mode) && FREEZE_MODE)
 
 
/* FIXME: Replace with `set remotedebug'.  */
/* FIXME: Replace with `set remotedebug'.  */
#define LLOG_FILE "minimon.log"
#define LLOG_FILE "minimon.log"
#if defined (LOG_FILE)
#if defined (LOG_FILE)
FILE *log_file;
FILE *log_file;
#endif
#endif
 
 
/*
/*
 * Size of message buffers.  I couldn't get memory reads to work when
 * Size of message buffers.  I couldn't get memory reads to work when
 * the byte_count was larger than 512 (it may be a baud rate problem).
 * the byte_count was larger than 512 (it may be a baud rate problem).
 */
 */
#define BUFER_SIZE  512
#define BUFER_SIZE  512
/*
/*
 * Size of data area in message buffer on the TARGET (remote system).
 * Size of data area in message buffer on the TARGET (remote system).
 */
 */
#define MAXDATA_T  (target_config.max_msg_size - \
#define MAXDATA_T  (target_config.max_msg_size - \
                        offsetof(struct write_r_msg_t,data[0]))
                        offsetof(struct write_r_msg_t,data[0]))
/*
/*
 * Size of data area in message buffer on the HOST (gdb).
 * Size of data area in message buffer on the HOST (gdb).
 */
 */
#define MAXDATA_H  (BUFER_SIZE - offsetof(struct write_r_msg_t,data[0]))
#define MAXDATA_H  (BUFER_SIZE - offsetof(struct write_r_msg_t,data[0]))
/*
/*
 * Defined as the minimum size of data areas of the two message buffers
 * Defined as the minimum size of data areas of the two message buffers
 */
 */
#define MAXDATA    (MAXDATA_H < MAXDATA_T ? MAXDATA_H : MAXDATA_T)
#define MAXDATA    (MAXDATA_H < MAXDATA_T ? MAXDATA_H : MAXDATA_T)
 
 
static char out_buf[BUFER_SIZE];
static char out_buf[BUFER_SIZE];
static char in_buf[BUFER_SIZE];
static char in_buf[BUFER_SIZE];
 
 
int msg_recv_serial ();
int msg_recv_serial ();
int msg_send_serial ();
int msg_send_serial ();
 
 
#define MAX_RETRIES 5000
#define MAX_RETRIES 5000
extern struct target_ops mm_ops;        /* Forward declaration */
extern struct target_ops mm_ops;        /* Forward declaration */
struct config_msg_t target_config;      /* HIF needs this */
struct config_msg_t target_config;      /* HIF needs this */
union msg_t *out_msg_buf = (union msg_t *) out_buf;
union msg_t *out_msg_buf = (union msg_t *) out_buf;
union msg_t *in_msg_buf = (union msg_t *) in_buf;
union msg_t *in_msg_buf = (union msg_t *) in_buf;
 
 
static int timeout = 5;
static int timeout = 5;
 
 
/* Descriptor for I/O to remote machine.  Initialize it to -1 so that
/* Descriptor for I/O to remote machine.  Initialize it to -1 so that
   mm_open knows that we don't have a file open when the program
   mm_open knows that we don't have a file open when the program
   starts.  */
   starts.  */
int mm_desc = -1;
int mm_desc = -1;
 
 
/* stream which is fdopen'd from mm_desc.  Only valid when
/* stream which is fdopen'd from mm_desc.  Only valid when
   mm_desc != -1.  */
   mm_desc != -1.  */
FILE *mm_stream;
FILE *mm_stream;
 
 
/* Called when SIGALRM signal sent due to alarm() timeout.  */
/* Called when SIGALRM signal sent due to alarm() timeout.  */
#ifndef HAVE_TERMIO
#ifndef HAVE_TERMIO
 
 
#ifndef __STDC__
#ifndef __STDC__
#ifndef volatile
#ifndef volatile
#define volatile
#define volatile
/**/
/**/
# endif
# endif
#endif
#endif
volatile int n_alarms;
volatile int n_alarms;
 
 
static void
static void
mm_timer ()
mm_timer ()
{
{
#if 0
#if 0
  if (kiodebug)
  if (kiodebug)
    printf ("mm_timer called\n");
    printf ("mm_timer called\n");
#endif
#endif
  n_alarms++;
  n_alarms++;
}
}
#endif  /* HAVE_TERMIO */
#endif  /* HAVE_TERMIO */
 
 
/* malloc'd name of the program on the remote system.  */
/* malloc'd name of the program on the remote system.  */
static char *prog_name = NULL;
static char *prog_name = NULL;
 
 
 
 
/* Number of SIGTRAPs we need to simulate.  That is, the next
/* Number of SIGTRAPs we need to simulate.  That is, the next
   NEED_ARTIFICIAL_TRAP calls to mm_wait should just return
   NEED_ARTIFICIAL_TRAP calls to mm_wait should just return
   SIGTRAP without actually waiting for anything.  */
   SIGTRAP without actually waiting for anything.  */
 
 
/**************************************************** REMOTE_CREATE_INFERIOR */
/**************************************************** REMOTE_CREATE_INFERIOR */
/* This is called not only when we first attach, but also when the
/* This is called not only when we first attach, but also when the
   user types "run" after having attached.  */
   user types "run" after having attached.  */
static void
static void
mm_create_inferior (execfile, args, env)
mm_create_inferior (execfile, args, env)
     char *execfile;
     char *execfile;
     char *args;
     char *args;
     char **env;
     char **env;
{
{
#define MAX_TOKENS 25
#define MAX_TOKENS 25
#define BUFFER_SIZE 256
#define BUFFER_SIZE 256
  int token_count;
  int token_count;
  int result;
  int result;
  char *token[MAX_TOKENS];
  char *token[MAX_TOKENS];
  char cmd_line[BUFFER_SIZE];
  char cmd_line[BUFFER_SIZE];
 
 
  if (args && *args)
  if (args && *args)
    error ("Can't pass arguments to remote mm process (yet).");
    error ("Can't pass arguments to remote mm process (yet).");
 
 
  if (execfile == 0 /* || exec_bfd == 0 */ )
  if (execfile == 0 /* || exec_bfd == 0 */ )
    error ("No executable file specified");
    error ("No executable file specified");
 
 
  if (!mm_stream)
  if (!mm_stream)
    {
    {
      printf ("Minimon not open yet.\n");
      printf ("Minimon not open yet.\n");
      return;
      return;
    }
    }
 
 
  /* On ultra3 (NYU) we assume the kernel is already running so there is
  /* On ultra3 (NYU) we assume the kernel is already running so there is
     no file to download.
     no file to download.
     FIXME: Fixed required here -> load your program, possibly with mm_load().
     FIXME: Fixed required here -> load your program, possibly with mm_load().
   */
   */
  printf_filtered ("\n\
  printf_filtered ("\n\
Assuming you are at NYU debuging a kernel, i.e., no need to download.\n\n");
Assuming you are at NYU debuging a kernel, i.e., no need to download.\n\n");
 
 
  /* We will get a task spawn event immediately.  */
  /* We will get a task spawn event immediately.  */
  init_wait_for_inferior ();
  init_wait_for_inferior ();
  clear_proceed_status ();
  clear_proceed_status ();
  stop_soon_quietly = 1;
  stop_soon_quietly = 1;
  proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
  proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
  normal_stop ();
  normal_stop ();
}
}
/**************************************************** REMOTE_MOURN_INFERIOR */
/**************************************************** REMOTE_MOURN_INFERIOR */
static void
static void
mm_mourn ()
mm_mourn ()
{
{
  pop_target ();                /* Pop back to no-child state */
  pop_target ();                /* Pop back to no-child state */
  generic_mourn_inferior ();
  generic_mourn_inferior ();
}
}
 
 
/********************************************************************** damn_b
/********************************************************************** damn_b
*/
*/
/* Translate baud rates from integers to damn B_codes.  Unix should
/* Translate baud rates from integers to damn B_codes.  Unix should
   have outgrown this crap years ago, but even POSIX wouldn't buck it.  */
   have outgrown this crap years ago, but even POSIX wouldn't buck it.  */
 
 
#ifndef B19200
#ifndef B19200
#define B19200 EXTA
#define B19200 EXTA
#endif
#endif
#ifndef B38400
#ifndef B38400
#define B38400 EXTB
#define B38400 EXTB
#endif
#endif
 
 
static struct
static struct
{
{
  int rate, damn_b;
  int rate, damn_b;
}
}
baudtab[] =
baudtab[] =
{
{
  {
  {
    0, B0
    0, B0
  }
  }
  ,
  ,
  {
  {
    50, B50
    50, B50
  }
  }
  ,
  ,
  {
  {
    75, B75
    75, B75
  }
  }
  ,
  ,
  {
  {
    110, B110
    110, B110
  }
  }
  ,
  ,
  {
  {
    134, B134
    134, B134
  }
  }
  ,
  ,
  {
  {
    150, B150
    150, B150
  }
  }
  ,
  ,
  {
  {
    200, B200
    200, B200
  }
  }
  ,
  ,
  {
  {
    300, B300
    300, B300
  }
  }
  ,
  ,
  {
  {
    600, B600
    600, B600
  }
  }
  ,
  ,
  {
  {
    1200, B1200
    1200, B1200
  }
  }
  ,
  ,
  {
  {
    1800, B1800
    1800, B1800
  }
  }
  ,
  ,
  {
  {
    2400, B2400
    2400, B2400
  }
  }
  ,
  ,
  {
  {
    4800, B4800
    4800, B4800
  }
  }
  ,
  ,
  {
  {
    9600, B9600
    9600, B9600
  }
  }
  ,
  ,
  {
  {
    19200, B19200
    19200, B19200
  }
  }
  ,
  ,
  {
  {
    38400, B38400
    38400, B38400
  }
  }
  ,
  ,
  {
  {
    -1, -1
    -1, -1
  }
  }
  ,
  ,
};
};
 
 
static int
static int
damn_b (rate)
damn_b (rate)
     int rate;
     int rate;
{
{
  int i;
  int i;
 
 
  for (i = 0; baudtab[i].rate != -1; i++)
  for (i = 0; baudtab[i].rate != -1; i++)
    if (rate == baudtab[i].rate)
    if (rate == baudtab[i].rate)
      return baudtab[i].damn_b;
      return baudtab[i].damn_b;
  return B38400;                /* Random */
  return B38400;                /* Random */
}
}
 
 
 
 
/***************************************************************** REMOTE_OPEN
/***************************************************************** REMOTE_OPEN
** Open a connection to remote minimon.
** Open a connection to remote minimon.
   NAME is the filename used for communication, then a space,
   NAME is the filename used for communication, then a space,
   then the baud rate.
   then the baud rate.
   'target adapt /dev/ttya 9600 [prognam]' for example.
   'target adapt /dev/ttya 9600 [prognam]' for example.
 */
 */
 
 
static char *dev_name;
static char *dev_name;
int baudrate = 9600;
int baudrate = 9600;
static void
static void
mm_open (name, from_tty)
mm_open (name, from_tty)
     char *name;
     char *name;
     int from_tty;
     int from_tty;
{
{
  TERMINAL sg;
  TERMINAL sg;
  unsigned int prl;
  unsigned int prl;
  char *p;
  char *p;
 
 
  /* Find the first whitespace character, it separates dev_name from
  /* Find the first whitespace character, it separates dev_name from
     prog_name.  */
     prog_name.  */
  for (p = name;
  for (p = name;
       p && *p && !isspace (*p); p++)
       p && *p && !isspace (*p); p++)
    ;
    ;
  if (p == 0 || *p == '\0')
  if (p == 0 || *p == '\0')
  erroid:
  erroid:
    error ("Usage : <command> <serial-device> <baud-rate> [progname]");
    error ("Usage : <command> <serial-device> <baud-rate> [progname]");
  dev_name = (char *) xmalloc (p - name + 1);
  dev_name = (char *) xmalloc (p - name + 1);
  strncpy (dev_name, name, p - name);
  strncpy (dev_name, name, p - name);
  dev_name[p - name] = '\0';
  dev_name[p - name] = '\0';
 
 
  /* Skip over the whitespace after dev_name */
  /* Skip over the whitespace after dev_name */
  for (; isspace (*p); p++)
  for (; isspace (*p); p++)
    /*EMPTY */ ;
    /*EMPTY */ ;
 
 
  if (1 != sscanf (p, "%d ", &baudrate))
  if (1 != sscanf (p, "%d ", &baudrate))
    goto erroid;
    goto erroid;
 
 
  /* Skip the number and then the spaces */
  /* Skip the number and then the spaces */
  for (; isdigit (*p); p++)
  for (; isdigit (*p); p++)
    /*EMPTY */ ;
    /*EMPTY */ ;
  for (; isspace (*p); p++)
  for (; isspace (*p); p++)
    /*EMPTY */ ;
    /*EMPTY */ ;
 
 
  if (prog_name != NULL)
  if (prog_name != NULL)
    free (prog_name);
    free (prog_name);
  prog_name = savestring (p, strlen (p));
  prog_name = savestring (p, strlen (p));
 
 
 
 
  if (mm_desc >= 0)
  if (mm_desc >= 0)
    close (mm_desc);
    close (mm_desc);
 
 
  mm_desc = open (dev_name, O_RDWR);
  mm_desc = open (dev_name, O_RDWR);
  if (mm_desc < 0)
  if (mm_desc < 0)
    perror_with_name (dev_name);
    perror_with_name (dev_name);
  ioctl (mm_desc, TIOCGETP, &sg);
  ioctl (mm_desc, TIOCGETP, &sg);
#ifdef HAVE_TERMIO
#ifdef HAVE_TERMIO
  sg.c_cc[VMIN] = 0;             /* read with timeout.  */
  sg.c_cc[VMIN] = 0;             /* read with timeout.  */
  sg.c_cc[VTIME] = timeout * 10;
  sg.c_cc[VTIME] = timeout * 10;
  sg.c_lflag &= ~(ICANON | ECHO);
  sg.c_lflag &= ~(ICANON | ECHO);
  sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
  sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
#else
#else
  sg.sg_ispeed = damn_b (baudrate);
  sg.sg_ispeed = damn_b (baudrate);
  sg.sg_ospeed = damn_b (baudrate);
  sg.sg_ospeed = damn_b (baudrate);
  sg.sg_flags |= RAW;
  sg.sg_flags |= RAW;
  sg.sg_flags |= ANYP;
  sg.sg_flags |= ANYP;
  sg.sg_flags &= ~ECHO;
  sg.sg_flags &= ~ECHO;
#endif
#endif
 
 
 
 
  ioctl (mm_desc, TIOCSETP, &sg);
  ioctl (mm_desc, TIOCSETP, &sg);
  mm_stream = fdopen (mm_desc, "r+");
  mm_stream = fdopen (mm_desc, "r+");
 
 
  push_target (&mm_ops);
  push_target (&mm_ops);
 
 
#ifndef HAVE_TERMIO
#ifndef HAVE_TERMIO
#ifndef NO_SIGINTERRUPT
#ifndef NO_SIGINTERRUPT
  /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
  /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
     the read.  */
     the read.  */
  if (siginterrupt (SIGALRM, 1) != 0)
  if (siginterrupt (SIGALRM, 1) != 0)
    perror ("mm_open: error in siginterrupt");
    perror ("mm_open: error in siginterrupt");
#endif
#endif
 
 
  /* Set up read timeout timer.  */
  /* Set up read timeout timer.  */
  if ((void (*)) signal (SIGALRM, mm_timer) == (void (*)) -1)
  if ((void (*)) signal (SIGALRM, mm_timer) == (void (*)) -1)
    perror ("mm_open: error in signal");
    perror ("mm_open: error in signal");
#endif
#endif
 
 
#if defined (LOG_FILE)
#if defined (LOG_FILE)
  log_file = fopen (LOG_FILE, "w");
  log_file = fopen (LOG_FILE, "w");
  if (log_file == NULL)
  if (log_file == NULL)
    perror_with_name (LOG_FILE);
    perror_with_name (LOG_FILE);
#endif
#endif
  /*
  /*
     ** Initialize target configuration structure (global)
     ** Initialize target configuration structure (global)
   */
   */
  DRAIN_INPUT ();
  DRAIN_INPUT ();
  out_msg_buf->config_req_msg.code = CONFIG_REQ;
  out_msg_buf->config_req_msg.code = CONFIG_REQ;
  out_msg_buf->config_req_msg.length = 4 * 0;
  out_msg_buf->config_req_msg.length = 4 * 0;
  msg_send_serial (out_msg_buf);        /* send config request message */
  msg_send_serial (out_msg_buf);        /* send config request message */
 
 
  expect_msg (CONFIG, in_msg_buf, 1);
  expect_msg (CONFIG, in_msg_buf, 1);
 
 
  a29k_get_processor_type ();
  a29k_get_processor_type ();
 
 
  /* Print out some stuff, letting the user now what's going on */
  /* Print out some stuff, letting the user now what's going on */
  printf_filtered ("Connected to MiniMon via %s.\n", dev_name);
  printf_filtered ("Connected to MiniMon via %s.\n", dev_name);
  /* FIXME: can this restriction be removed? */
  /* FIXME: can this restriction be removed? */
  printf_filtered ("Remote debugging using virtual addresses works only\n");
  printf_filtered ("Remote debugging using virtual addresses works only\n");
  printf_filtered ("\twhen virtual addresses map 1:1 to physical addresses.\n")
  printf_filtered ("\twhen virtual addresses map 1:1 to physical addresses.\n")
    ;
    ;
  if (processor_type != a29k_freeze_mode)
  if (processor_type != a29k_freeze_mode)
    {
    {
      fprintf_filtered (gdb_stderr,
      fprintf_filtered (gdb_stderr,
                        "Freeze-mode debugging not available, and can only be done on an A29050.\n");
                        "Freeze-mode debugging not available, and can only be done on an A29050.\n");
    }
    }
 
 
  target_config.code = CONFIG;
  target_config.code = CONFIG;
  target_config.length = 0;
  target_config.length = 0;
  target_config.processor_id = in_msg_buf->config_msg.processor_id;
  target_config.processor_id = in_msg_buf->config_msg.processor_id;
  target_config.version = in_msg_buf->config_msg.version;
  target_config.version = in_msg_buf->config_msg.version;
  target_config.I_mem_start = in_msg_buf->config_msg.I_mem_start;
  target_config.I_mem_start = in_msg_buf->config_msg.I_mem_start;
  target_config.I_mem_size = in_msg_buf->config_msg.I_mem_size;
  target_config.I_mem_size = in_msg_buf->config_msg.I_mem_size;
  target_config.D_mem_start = in_msg_buf->config_msg.D_mem_start;
  target_config.D_mem_start = in_msg_buf->config_msg.D_mem_start;
  target_config.D_mem_size = in_msg_buf->config_msg.D_mem_size;
  target_config.D_mem_size = in_msg_buf->config_msg.D_mem_size;
  target_config.ROM_start = in_msg_buf->config_msg.ROM_start;
  target_config.ROM_start = in_msg_buf->config_msg.ROM_start;
  target_config.ROM_size = in_msg_buf->config_msg.ROM_size;
  target_config.ROM_size = in_msg_buf->config_msg.ROM_size;
  target_config.max_msg_size = in_msg_buf->config_msg.max_msg_size;
  target_config.max_msg_size = in_msg_buf->config_msg.max_msg_size;
  target_config.max_bkpts = in_msg_buf->config_msg.max_bkpts;
  target_config.max_bkpts = in_msg_buf->config_msg.max_bkpts;
  target_config.coprocessor = in_msg_buf->config_msg.coprocessor;
  target_config.coprocessor = in_msg_buf->config_msg.coprocessor;
  target_config.reserved = in_msg_buf->config_msg.reserved;
  target_config.reserved = in_msg_buf->config_msg.reserved;
  if (from_tty)
  if (from_tty)
    {
    {
      printf ("Connected to MiniMON :\n");
      printf ("Connected to MiniMON :\n");
      printf ("    Debugcore version            %d.%d\n",
      printf ("    Debugcore version            %d.%d\n",
              0x0f & (target_config.version >> 4),
              0x0f & (target_config.version >> 4),
              0x0f & (target_config.version));
              0x0f & (target_config.version));
      printf ("    Configuration version        %d.%d\n",
      printf ("    Configuration version        %d.%d\n",
              0x0f & (target_config.version >> 12),
              0x0f & (target_config.version >> 12),
              0x0f & (target_config.version >> 8));
              0x0f & (target_config.version >> 8));
      printf ("    Message system version       %d.%d\n",
      printf ("    Message system version       %d.%d\n",
              0x0f & (target_config.version >> 20),
              0x0f & (target_config.version >> 20),
              0x0f & (target_config.version >> 16));
              0x0f & (target_config.version >> 16));
      printf ("    Communication driver version %d.%d\n",
      printf ("    Communication driver version %d.%d\n",
              0x0f & (target_config.version >> 28),
              0x0f & (target_config.version >> 28),
              0x0f & (target_config.version >> 24));
              0x0f & (target_config.version >> 24));
    }
    }
 
 
  /* Leave the target running...
  /* Leave the target running...
   * The above message stopped the target in the dbg core (MiniMon),
   * The above message stopped the target in the dbg core (MiniMon),
   * so restart the target out of MiniMon,
   * so restart the target out of MiniMon,
   */
   */
  out_msg_buf->go_msg.code = GO;
  out_msg_buf->go_msg.code = GO;
  out_msg_buf->go_msg.length = 0;
  out_msg_buf->go_msg.length = 0;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  /* No message to expect after a GO */
  /* No message to expect after a GO */
}
}
 
 
/**************************************************************** REMOTE_CLOSE
/**************************************************************** REMOTE_CLOSE
** Close the open connection to the minimon debugger.
** Close the open connection to the minimon debugger.
   Use this when you want to detach and do something else
   Use this when you want to detach and do something else
   with your gdb.  */
   with your gdb.  */
static void
static void
mm_close (quitting)             /*FIXME: how is quitting used */
mm_close (quitting)             /*FIXME: how is quitting used */
     int quitting;
     int quitting;
{
{
  if (mm_desc < 0)
  if (mm_desc < 0)
    error ("Can't close remote connection: not debugging remotely.");
    error ("Can't close remote connection: not debugging remotely.");
 
 
  /* We should never get here if there isn't something valid in
  /* We should never get here if there isn't something valid in
     mm_desc and mm_stream.
     mm_desc and mm_stream.
 
 
     Due to a bug in Unix, fclose closes not only the stdio stream,
     Due to a bug in Unix, fclose closes not only the stdio stream,
     but also the file descriptor.  So we don't actually close
     but also the file descriptor.  So we don't actually close
     mm_desc.  */
     mm_desc.  */
  DRAIN_INPUT ();
  DRAIN_INPUT ();
  fclose (mm_stream);
  fclose (mm_stream);
  /* close (mm_desc); */
  /* close (mm_desc); */
 
 
  /* Do not try to close mm_desc again, later in the program.  */
  /* Do not try to close mm_desc again, later in the program.  */
  mm_stream = NULL;
  mm_stream = NULL;
  mm_desc = -1;
  mm_desc = -1;
 
 
#if defined (LOG_FILE)
#if defined (LOG_FILE)
  if (ferror (log_file))
  if (ferror (log_file))
    printf ("Error writing log file.\n");
    printf ("Error writing log file.\n");
  if (fclose (log_file) != 0)
  if (fclose (log_file) != 0)
    printf ("Error closing log file.\n");
    printf ("Error closing log file.\n");
#endif
#endif
 
 
  printf ("Ending remote debugging\n");
  printf ("Ending remote debugging\n");
}
}
 
 
/************************************************************* REMOTE_ATACH */
/************************************************************* REMOTE_ATACH */
/* Attach to a program that is already loaded and running
/* Attach to a program that is already loaded and running
 * Upon exiting the process's execution is stopped.
 * Upon exiting the process's execution is stopped.
 */
 */
static void
static void
mm_attach (args, from_tty)
mm_attach (args, from_tty)
     char *args;
     char *args;
     int from_tty;
     int from_tty;
{
{
 
 
  if (!mm_stream)
  if (!mm_stream)
    error ("MiniMon not opened yet, use the 'target minimon' command.\n");
    error ("MiniMon not opened yet, use the 'target minimon' command.\n");
 
 
  if (from_tty)
  if (from_tty)
    printf ("Attaching to remote program %s...\n", prog_name);
    printf ("Attaching to remote program %s...\n", prog_name);
 
 
  /* Make sure the target is currently running, it is supposed to be. */
  /* Make sure the target is currently running, it is supposed to be. */
  /* FIXME: is it ok to send MiniMon a BREAK if it is already stopped in
  /* FIXME: is it ok to send MiniMon a BREAK if it is already stopped in
   *  the dbg core.  If so, we don't need to send this GO.
   *  the dbg core.  If so, we don't need to send this GO.
   */
   */
  out_msg_buf->go_msg.code = GO;
  out_msg_buf->go_msg.code = GO;
  out_msg_buf->go_msg.length = 0;
  out_msg_buf->go_msg.length = 0;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  sleep (2);                    /* At the worst it will stop, receive a message, continue */
  sleep (2);                    /* At the worst it will stop, receive a message, continue */
 
 
  /* Send the mm a break. */
  /* Send the mm a break. */
  out_msg_buf->break_msg.code = BREAK;
  out_msg_buf->break_msg.code = BREAK;
  out_msg_buf->break_msg.length = 0;
  out_msg_buf->break_msg.length = 0;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
}
}
/********************************************************** REMOTE_DETACH */
/********************************************************** REMOTE_DETACH */
/* Terminate the open connection to the remote debugger.
/* Terminate the open connection to the remote debugger.
   Use this when you want to detach and do something else
   Use this when you want to detach and do something else
   with your gdb.  Leave remote process running (with no breakpoints set). */
   with your gdb.  Leave remote process running (with no breakpoints set). */
static void
static void
mm_detach (args, from_tty)
mm_detach (args, from_tty)
     char *args;
     char *args;
     int from_tty;
     int from_tty;
{
{
  remove_breakpoints ();        /* Just in case there were any left in */
  remove_breakpoints ();        /* Just in case there were any left in */
  out_msg_buf->go_msg.code = GO;
  out_msg_buf->go_msg.code = GO;
  out_msg_buf->go_msg.length = 0;
  out_msg_buf->go_msg.length = 0;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  pop_target ();                /* calls mm_close to do the real work */
  pop_target ();                /* calls mm_close to do the real work */
}
}
 
 
 
 
/*************************************************************** REMOTE_RESUME
/*************************************************************** REMOTE_RESUME
** Tell the remote machine to resume.  */
** Tell the remote machine to resume.  */
 
 
static void
static void
mm_resume (pid, step, sig)
mm_resume (pid, step, sig)
     int pid, step;
     int pid, step;
     enum target_signal sig;
     enum target_signal sig;
{
{
  if (sig != TARGET_SIGNAL_0)
  if (sig != TARGET_SIGNAL_0)
    warning ("Can't send signals to a remote MiniMon system.");
    warning ("Can't send signals to a remote MiniMon system.");
 
 
  if (step)
  if (step)
    {
    {
      out_msg_buf->step_msg.code = STEP;
      out_msg_buf->step_msg.code = STEP;
      out_msg_buf->step_msg.length = 1 * 4;
      out_msg_buf->step_msg.length = 1 * 4;
      out_msg_buf->step_msg.count = 1;  /* step 1 instruction */
      out_msg_buf->step_msg.count = 1;  /* step 1 instruction */
      msg_send_serial (out_msg_buf);
      msg_send_serial (out_msg_buf);
    }
    }
  else
  else
    {
    {
      out_msg_buf->go_msg.code = GO;
      out_msg_buf->go_msg.code = GO;
      out_msg_buf->go_msg.length = 0;
      out_msg_buf->go_msg.length = 0;
      msg_send_serial (out_msg_buf);
      msg_send_serial (out_msg_buf);
    }
    }
}
}
 
 
/***************************************************************** REMOTE_WAIT
/***************************************************************** REMOTE_WAIT
** Wait until the remote machine stops, then return,
** Wait until the remote machine stops, then return,
   storing status in STATUS just as `wait' would.  */
   storing status in STATUS just as `wait' would.  */
 
 
static int
static int
mm_wait (status)
mm_wait (status)
     struct target_waitstatus *status;
     struct target_waitstatus *status;
{
{
  int i, result;
  int i, result;
  int old_timeout = timeout;
  int old_timeout = timeout;
  int old_immediate_quit = immediate_quit;
  int old_immediate_quit = immediate_quit;
 
 
  status->kind = TARGET_WAITKIND_EXITED;
  status->kind = TARGET_WAITKIND_EXITED;
  status->value.integer = 0;
  status->value.integer = 0;
 
 
/* wait for message to arrive. It should be:
/* wait for message to arrive. It should be:
   - A HIF service request.
   - A HIF service request.
   - A HIF exit service request.
   - A HIF exit service request.
   - A CHANNEL0_ACK.
   - A CHANNEL0_ACK.
   - A CHANNEL1 request.
   - A CHANNEL1 request.
   - a debugcore HALT message.
   - a debugcore HALT message.
   HIF services must be responded too, and while-looping continued.
   HIF services must be responded too, and while-looping continued.
   If the target stops executing, mm_wait() should return.
   If the target stops executing, mm_wait() should return.
 */
 */
  timeout = 0;                   /* Wait indefinetly for a message */
  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)
    {
    {
      while (msg_recv_serial (in_msg_buf))
      while (msg_recv_serial (in_msg_buf))
        {
        {
          QUIT;                 /* Let user quit if they want */
          QUIT;                 /* Let user quit if they want */
        }
        }
      switch (in_msg_buf->halt_msg.code)
      switch (in_msg_buf->halt_msg.code)
        {
        {
        case HIF_CALL:
        case HIF_CALL:
          i = in_msg_buf->hif_call_rtn_msg.service_number;
          i = in_msg_buf->hif_call_rtn_msg.service_number;
          result = service_HIF (in_msg_buf);
          result = service_HIF (in_msg_buf);
          if (i == 1)           /* EXIT */
          if (i == 1)           /* EXIT */
            goto exit;
            goto exit;
          if (result)
          if (result)
            printf ("Warning: failure during HIF service %d\n", i);
            printf ("Warning: failure during HIF service %d\n", i);
          break;
          break;
        case CHANNEL0_ACK:
        case CHANNEL0_ACK:
          service_HIF (in_msg_buf);
          service_HIF (in_msg_buf);
          break;
          break;
        case CHANNEL1:
        case CHANNEL1:
          i = in_msg_buf->channel1_msg.length;
          i = in_msg_buf->channel1_msg.length;
          in_msg_buf->channel1_msg.data[i] = '\0';
          in_msg_buf->channel1_msg.data[i] = '\0';
          printf ("%s", in_msg_buf->channel1_msg.data);
          printf ("%s", in_msg_buf->channel1_msg.data);
          gdb_flush (gdb_stdout);
          gdb_flush (gdb_stdout);
          /* Send CHANNEL1_ACK message */
          /* Send CHANNEL1_ACK message */
          out_msg_buf->channel1_ack_msg.code = CHANNEL1_ACK;
          out_msg_buf->channel1_ack_msg.code = CHANNEL1_ACK;
          out_msg_buf->channel1_ack_msg.length = 0;
          out_msg_buf->channel1_ack_msg.length = 0;
          result = msg_send_serial (out_msg_buf);
          result = msg_send_serial (out_msg_buf);
          break;
          break;
        case HALT:
        case HALT:
          goto halted;
          goto halted;
        default:
        default:
          goto halted;
          goto halted;
        }
        }
    }
    }
halted:
halted:
  /* FIXME, these printfs should not be here.  This is a source level
  /* FIXME, these printfs should not be here.  This is a source level
     debugger, guys!  */
     debugger, guys!  */
  if (in_msg_buf->halt_msg.trap_number == 0)
  if (in_msg_buf->halt_msg.trap_number == 0)
    {
    {
      printf ("Am290*0 received vector number %d (break point)\n",
      printf ("Am290*0 received vector number %d (break point)\n",
              in_msg_buf->halt_msg.trap_number);
              in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
      status->value.sig = TARGET_SIGNAL_TRAP;
    }
    }
  else if (in_msg_buf->halt_msg.trap_number == 1)
  else if (in_msg_buf->halt_msg.trap_number == 1)
    {
    {
      printf ("Am290*0 received vector number %d\n",
      printf ("Am290*0 received vector number %d\n",
              in_msg_buf->halt_msg.trap_number);
              in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_BUS;
      status->value.sig = TARGET_SIGNAL_BUS;
    }
    }
  else if (in_msg_buf->halt_msg.trap_number == 3
  else if (in_msg_buf->halt_msg.trap_number == 3
           || in_msg_buf->halt_msg.trap_number == 4)
           || in_msg_buf->halt_msg.trap_number == 4)
    {
    {
      printf ("Am290*0 received vector number %d\n",
      printf ("Am290*0 received vector number %d\n",
              in_msg_buf->halt_msg.trap_number);
              in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_FPE;
      status->value.sig = TARGET_SIGNAL_FPE;
    }
    }
  else if (in_msg_buf->halt_msg.trap_number == 5)
  else if (in_msg_buf->halt_msg.trap_number == 5)
    {
    {
      printf ("Am290*0 received vector number %d\n",
      printf ("Am290*0 received vector number %d\n",
              in_msg_buf->halt_msg.trap_number);
              in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_ILL;
      status->value.sig = TARGET_SIGNAL_ILL;
    }
    }
  else if (in_msg_buf->halt_msg.trap_number >= 6
  else if (in_msg_buf->halt_msg.trap_number >= 6
           && in_msg_buf->halt_msg.trap_number <= 11)
           && in_msg_buf->halt_msg.trap_number <= 11)
    {
    {
      printf ("Am290*0 received vector number %d\n",
      printf ("Am290*0 received vector number %d\n",
              in_msg_buf->halt_msg.trap_number);
              in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_SEGV;
      status->value.sig = TARGET_SIGNAL_SEGV;
    }
    }
  else if (in_msg_buf->halt_msg.trap_number == 12
  else if (in_msg_buf->halt_msg.trap_number == 12
           || in_msg_buf->halt_msg.trap_number == 13)
           || in_msg_buf->halt_msg.trap_number == 13)
    {
    {
      printf ("Am290*0 received vector number %d\n",
      printf ("Am290*0 received vector number %d\n",
              in_msg_buf->halt_msg.trap_number);
              in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_ILL;
      status->value.sig = TARGET_SIGNAL_ILL;
    }
    }
  else if (in_msg_buf->halt_msg.trap_number == 14)
  else if (in_msg_buf->halt_msg.trap_number == 14)
    {
    {
      printf ("Am290*0 received vector number %d\n",
      printf ("Am290*0 received vector number %d\n",
              in_msg_buf->halt_msg.trap_number);
              in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_ALRM;
      status->value.sig = TARGET_SIGNAL_ALRM;
    }
    }
  else if (in_msg_buf->halt_msg.trap_number == 15)
  else if (in_msg_buf->halt_msg.trap_number == 15)
    {
    {
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
      status->value.sig = TARGET_SIGNAL_TRAP;
    }
    }
  else if (in_msg_buf->halt_msg.trap_number >= 16
  else if (in_msg_buf->halt_msg.trap_number >= 16
           && in_msg_buf->halt_msg.trap_number <= 21)
           && in_msg_buf->halt_msg.trap_number <= 21)
    {
    {
      printf ("Am290*0 received vector number %d\n",
      printf ("Am290*0 received vector number %d\n",
              in_msg_buf->halt_msg.trap_number);
              in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_INT;
      status->value.sig = TARGET_SIGNAL_INT;
    }
    }
  else if (in_msg_buf->halt_msg.trap_number == 22)
  else if (in_msg_buf->halt_msg.trap_number == 22)
    {
    {
      printf ("Am290*0 received vector number %d\n",
      printf ("Am290*0 received vector number %d\n",
              in_msg_buf->halt_msg.trap_number);
              in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_ILL;
      status->value.sig = TARGET_SIGNAL_ILL;
    }                           /* BREAK message was sent */
    }                           /* BREAK message was sent */
  else if (in_msg_buf->halt_msg.trap_number == 75)
  else if (in_msg_buf->halt_msg.trap_number == 75)
    {
    {
      status->kind = TARGET_WAITKIND_STOPPED;
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
      status->value.sig = TARGET_SIGNAL_TRAP;
    }
    }
  else
  else
  exit:
  exit:
    {
    {
      status->kind = TARGET_WAITKIND_EXITED;
      status->kind = TARGET_WAITKIND_EXITED;
      status->value.integer = 0;
      status->value.integer = 0;
    }
    }
 
 
  timeout = old_timeout;        /* Restore original timeout value */
  timeout = old_timeout;        /* Restore original timeout value */
  immediate_quit = old_immediate_quit;
  immediate_quit = old_immediate_quit;
  return 0;
  return 0;
}
}
 
 
/******************************************************* REMOTE_FETCH_REGISTERS
/******************************************************* REMOTE_FETCH_REGISTERS
 * Read a remote register 'regno'.
 * Read a remote register 'regno'.
 * If regno==-1 then read all the registers.
 * If regno==-1 then read all the registers.
 */
 */
static void
static void
mm_fetch_registers (regno)
mm_fetch_registers (regno)
     int regno;
     int regno;
{
{
  INT32 *data_p;
  INT32 *data_p;
 
 
  if (regno >= 0)
  if (regno >= 0)
    {
    {
      fetch_register (regno);
      fetch_register (regno);
      return;
      return;
    }
    }
 
 
/* Gr1/rsp */
/* Gr1/rsp */
  out_msg_buf->read_req_msg.byte_count = 4 * 1;
  out_msg_buf->read_req_msg.byte_count = 4 * 1;
  out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
  out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
  out_msg_buf->read_req_msg.address = 1;
  out_msg_buf->read_req_msg.address = 1;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
  supply_register (GR1_REGNUM, data_p);
  supply_register (GR1_REGNUM, data_p);
 
 
#if defined(GR64_REGNUM)        /* Read gr64-127 */
#if defined(GR64_REGNUM)        /* Read gr64-127 */
/* Global Registers gr64-gr95 */
/* Global Registers gr64-gr95 */
  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.length = 4 * 3;
  out_msg_buf->read_req_msg.length = 4 * 3;
  out_msg_buf->read_req_msg.byte_count = 4 * 32;
  out_msg_buf->read_req_msg.byte_count = 4 * 32;
  out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
  out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
  out_msg_buf->read_req_msg.address = 64;
  out_msg_buf->read_req_msg.address = 64;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
 
 
  for (regno = GR64_REGNUM; regno < GR64_REGNUM + 32; regno++)
  for (regno = GR64_REGNUM; regno < GR64_REGNUM + 32; regno++)
    {
    {
      supply_register (regno, data_p++);
      supply_register (regno, data_p++);
    }
    }
#endif /*  GR64_REGNUM */
#endif /*  GR64_REGNUM */
 
 
/* Global Registers gr96-gr127 */
/* Global Registers gr96-gr127 */
  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.length = 4 * 3;
  out_msg_buf->read_req_msg.length = 4 * 3;
  out_msg_buf->read_req_msg.byte_count = 4 * 32;
  out_msg_buf->read_req_msg.byte_count = 4 * 32;
  out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
  out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
  out_msg_buf->read_req_msg.address = 96;
  out_msg_buf->read_req_msg.address = 96;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
 
 
  for (regno = GR96_REGNUM; regno < GR96_REGNUM + 32; regno++)
  for (regno = GR96_REGNUM; regno < GR96_REGNUM + 32; regno++)
    {
    {
      supply_register (regno, data_p++);
      supply_register (regno, data_p++);
    }
    }
 
 
/* Local Registers */
/* Local Registers */
  out_msg_buf->read_req_msg.byte_count = 4 * (128);
  out_msg_buf->read_req_msg.byte_count = 4 * (128);
  out_msg_buf->read_req_msg.memory_space = LOCAL_REG;
  out_msg_buf->read_req_msg.memory_space = LOCAL_REG;
  out_msg_buf->read_req_msg.address = 0;
  out_msg_buf->read_req_msg.address = 0;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
 
 
  for (regno = LR0_REGNUM; regno < LR0_REGNUM + 128; regno++)
  for (regno = LR0_REGNUM; regno < LR0_REGNUM + 128; regno++)
    {
    {
      supply_register (regno, data_p++);
      supply_register (regno, data_p++);
    }
    }
 
 
/* Protected Special Registers */
/* Protected Special Registers */
  out_msg_buf->read_req_msg.byte_count = 4 * 15;
  out_msg_buf->read_req_msg.byte_count = 4 * 15;
  out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
  out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
  out_msg_buf->read_req_msg.address = 0;
  out_msg_buf->read_req_msg.address = 0;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
 
 
  for (regno = 0; regno <= 14; regno++)
  for (regno = 0; regno <= 14; regno++)
    {
    {
      supply_register (SR_REGNUM (regno), data_p++);
      supply_register (SR_REGNUM (regno), data_p++);
    }
    }
  if (USE_SHADOW_PC)
  if (USE_SHADOW_PC)
    {                           /* Let regno_to_srnum() handle the register number */
    {                           /* Let regno_to_srnum() handle the register number */
      fetch_register (NPC_REGNUM);
      fetch_register (NPC_REGNUM);
      fetch_register (PC_REGNUM);
      fetch_register (PC_REGNUM);
      fetch_register (PC2_REGNUM);
      fetch_register (PC2_REGNUM);
    }
    }
 
 
/* Unprotected Special Registers */
/* Unprotected Special Registers */
  out_msg_buf->read_req_msg.byte_count = 4 * 8;
  out_msg_buf->read_req_msg.byte_count = 4 * 8;
  out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
  out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
  out_msg_buf->read_req_msg.address = 128;
  out_msg_buf->read_req_msg.address = 128;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
 
 
  for (regno = 128; regno <= 135; regno++)
  for (regno = 128; regno <= 135; regno++)
    {
    {
      supply_register (SR_REGNUM (regno), data_p++);
      supply_register (SR_REGNUM (regno), data_p++);
    }
    }
 
 
  /* There doesn't seem to be any way to get these.  */
  /* There doesn't seem to be any way to get these.  */
  {
  {
    int val = -1;
    int val = -1;
    supply_register (FPE_REGNUM, &val);
    supply_register (FPE_REGNUM, &val);
    supply_register (INTE_REGNUM, &val);
    supply_register (INTE_REGNUM, &val);
    supply_register (FPS_REGNUM, &val);
    supply_register (FPS_REGNUM, &val);
    supply_register (EXO_REGNUM, &val);
    supply_register (EXO_REGNUM, &val);
  }
  }
}
}
 
 
 
 
/****************************************************** REMOTE_STORE_REGISTERS
/****************************************************** REMOTE_STORE_REGISTERS
 * Store register regno into the target.
 * Store register regno into the target.
 * If regno==-1 then store all the registers.
 * If regno==-1 then store all the registers.
 * Result is 0 for success, -1 for failure.
 * Result is 0 for success, -1 for failure.
 */
 */
 
 
static void
static void
mm_store_registers (regno)
mm_store_registers (regno)
     int regno;
     int regno;
{
{
  int result;
  int result;
 
 
  if (regno >= 0)
  if (regno >= 0)
    {
    {
      store_register (regno);
      store_register (regno);
      return;
      return;
    }
    }
 
 
  result = 0;
  result = 0;
 
 
  out_msg_buf->write_r_msg.code = WRITE_REQ;
  out_msg_buf->write_r_msg.code = WRITE_REQ;
 
 
/* Gr1/rsp */
/* Gr1/rsp */
  out_msg_buf->write_r_msg.byte_count = 4 * 1;
  out_msg_buf->write_r_msg.byte_count = 4 * 1;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.memory_space = GLOBAL_REG;
  out_msg_buf->write_r_msg.memory_space = GLOBAL_REG;
  out_msg_buf->write_r_msg.address = 1;
  out_msg_buf->write_r_msg.address = 1;
  out_msg_buf->write_r_msg.data[0] = read_register (GR1_REGNUM);
  out_msg_buf->write_r_msg.data[0] = read_register (GR1_REGNUM);
 
 
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
    {
      result = -1;
      result = -1;
    }
    }
 
 
#if defined(GR64_REGNUM)
#if defined(GR64_REGNUM)
/* Global registers gr64-gr95 */
/* Global registers gr64-gr95 */
  out_msg_buf->write_r_msg.byte_count = 4 * (32);
  out_msg_buf->write_r_msg.byte_count = 4 * (32);
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.address = 64;
  out_msg_buf->write_r_msg.address = 64;
 
 
  for (regno = GR64_REGNUM; regno < GR64_REGNUM + 32; regno++)
  for (regno = GR64_REGNUM; regno < GR64_REGNUM + 32; regno++)
    {
    {
      out_msg_buf->write_r_msg.data[regno - GR64_REGNUM] = read_register (regno);
      out_msg_buf->write_r_msg.data[regno - GR64_REGNUM] = read_register (regno);
    }
    }
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
    {
      result = -1;
      result = -1;
    }
    }
#endif /* GR64_REGNUM */
#endif /* GR64_REGNUM */
 
 
/* Global registers gr96-gr127 */
/* Global registers gr96-gr127 */
  out_msg_buf->write_r_msg.byte_count = 4 * (32);
  out_msg_buf->write_r_msg.byte_count = 4 * (32);
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.address = 96;
  out_msg_buf->write_r_msg.address = 96;
  for (regno = GR96_REGNUM; regno < GR96_REGNUM + 32; regno++)
  for (regno = GR96_REGNUM; regno < GR96_REGNUM + 32; regno++)
    {
    {
      out_msg_buf->write_r_msg.data[regno - GR96_REGNUM] = read_register (regno);
      out_msg_buf->write_r_msg.data[regno - GR96_REGNUM] = read_register (regno);
    }
    }
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
    {
      result = -1;
      result = -1;
    }
    }
 
 
/* Local Registers */
/* Local Registers */
  out_msg_buf->write_r_msg.memory_space = LOCAL_REG;
  out_msg_buf->write_r_msg.memory_space = LOCAL_REG;
  out_msg_buf->write_r_msg.byte_count = 4 * 128;
  out_msg_buf->write_r_msg.byte_count = 4 * 128;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.address = 0;
  out_msg_buf->write_r_msg.address = 0;
 
 
  for (regno = LR0_REGNUM; regno < LR0_REGNUM + 128; regno++)
  for (regno = LR0_REGNUM; regno < LR0_REGNUM + 128; regno++)
    {
    {
      out_msg_buf->write_r_msg.data[regno - LR0_REGNUM] = read_register (regno);
      out_msg_buf->write_r_msg.data[regno - LR0_REGNUM] = read_register (regno);
    }
    }
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
    {
      result = -1;
      result = -1;
    }
    }
 
 
/* Protected Special Registers */
/* Protected Special Registers */
  /* VAB through TMR */
  /* VAB through TMR */
  out_msg_buf->write_r_msg.memory_space = SPECIAL_REG;
  out_msg_buf->write_r_msg.memory_space = SPECIAL_REG;
  out_msg_buf->write_r_msg.byte_count = 4 * 10;
  out_msg_buf->write_r_msg.byte_count = 4 * 10;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.address = 0;
  out_msg_buf->write_r_msg.address = 0;
  for (regno = 0; regno <= 9; regno++)   /* VAB through TMR */
  for (regno = 0; regno <= 9; regno++)   /* VAB through TMR */
    out_msg_buf->write_r_msg.data[regno] = read_register (SR_REGNUM (regno));
    out_msg_buf->write_r_msg.data[regno] = read_register (SR_REGNUM (regno));
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
    {
      result = -1;
      result = -1;
    }
    }
 
 
  /* PC0, PC1, PC2 possibly as shadow registers */
  /* PC0, PC1, PC2 possibly as shadow registers */
  out_msg_buf->write_r_msg.byte_count = 4 * 3;
  out_msg_buf->write_r_msg.byte_count = 4 * 3;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  for (regno = 10; regno <= 12; regno++)        /* LRU and MMU */
  for (regno = 10; regno <= 12; regno++)        /* LRU and MMU */
    out_msg_buf->write_r_msg.data[regno - 10] = read_register (SR_REGNUM (regno));
    out_msg_buf->write_r_msg.data[regno - 10] = read_register (SR_REGNUM (regno));
  if (USE_SHADOW_PC)
  if (USE_SHADOW_PC)
    out_msg_buf->write_r_msg.address = 20;      /* SPC0 */
    out_msg_buf->write_r_msg.address = 20;      /* SPC0 */
  else
  else
    out_msg_buf->write_r_msg.address = 10;      /* PC0 */
    out_msg_buf->write_r_msg.address = 10;      /* PC0 */
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
    {
      result = -1;
      result = -1;
    }
    }
 
 
  /* LRU and MMU */
  /* LRU and MMU */
  out_msg_buf->write_r_msg.byte_count = 4 * 2;
  out_msg_buf->write_r_msg.byte_count = 4 * 2;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.address = 13;
  out_msg_buf->write_r_msg.address = 13;
  for (regno = 13; regno <= 14; regno++)        /* LRU and MMU */
  for (regno = 13; regno <= 14; regno++)        /* LRU and MMU */
    out_msg_buf->write_r_msg.data[regno - 13] = read_register (SR_REGNUM (regno));
    out_msg_buf->write_r_msg.data[regno - 13] = read_register (SR_REGNUM (regno));
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
    {
      result = -1;
      result = -1;
    }
    }
 
 
/* Unprotected Special Registers */
/* Unprotected Special Registers */
  out_msg_buf->write_r_msg.byte_count = 4 * 8;
  out_msg_buf->write_r_msg.byte_count = 4 * 8;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.address = 128;
  out_msg_buf->write_r_msg.address = 128;
  for (regno = 128; regno <= 135; regno++)
  for (regno = 128; regno <= 135; regno++)
    out_msg_buf->write_r_msg.data[regno - 128] = read_register (SR_REGNUM (regno));
    out_msg_buf->write_r_msg.data[regno - 128] = read_register (SR_REGNUM (regno));
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
    {
      result = -1;
      result = -1;
    }
    }
 
 
  registers_changed ();
  registers_changed ();
}
}
 
 
/*************************************************** REMOTE_PREPARE_TO_STORE */
/*************************************************** REMOTE_PREPARE_TO_STORE */
/* Get ready to modify the registers array.  On machines which store
/* Get ready to modify the registers array.  On machines which store
   individual registers, this doesn't need to do anything.  On machines
   individual registers, this doesn't need to do anything.  On machines
   which store all the registers in one fell swoop, this makes sure
   which store all the registers in one fell swoop, this makes sure
   that registers contains all the registers from the program being
   that registers contains all the registers from the program being
   debugged.  */
   debugged.  */
 
 
static void
static void
mm_prepare_to_store ()
mm_prepare_to_store ()
{
{
  /* Do nothing, since we can store individual regs */
  /* Do nothing, since we can store individual regs */
}
}
 
 
/******************************************************* REMOTE_XFER_MEMORY */
/******************************************************* REMOTE_XFER_MEMORY */
static CORE_ADDR
static CORE_ADDR
translate_addr (addr)
translate_addr (addr)
     CORE_ADDR addr;
     CORE_ADDR addr;
{
{
#if defined(KERNEL_DEBUGGING)
#if defined(KERNEL_DEBUGGING)
  /* Check for a virtual address in the kernel */
  /* Check for a virtual address in the kernel */
  /* Assume physical address of ublock is in  paddr_u register */
  /* Assume physical address of ublock is in  paddr_u register */
  /* FIXME: doesn't work for user virtual addresses */
  /* FIXME: doesn't work for user virtual addresses */
  if (addr >= UVADDR)
  if (addr >= UVADDR)
    {
    {
      /* PADDR_U register holds the physical address of the ublock */
      /* PADDR_U register holds the physical address of the ublock */
      CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM);
      CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM);
      return (i + addr - (CORE_ADDR) UVADDR);
      return (i + addr - (CORE_ADDR) UVADDR);
    }
    }
  else
  else
    {
    {
      return (addr);
      return (addr);
    }
    }
#else
#else
  return (addr);
  return (addr);
#endif
#endif
}
}
 
 
/******************************************************* REMOTE_FILES_INFO */
/******************************************************* REMOTE_FILES_INFO */
static void
static void
mm_files_info ()
mm_files_info ()
{
{
  printf ("\tAttached to %s at %d baud and running program %s.\n",
  printf ("\tAttached to %s at %d baud and running program %s.\n",
          dev_name, baudrate, prog_name);
          dev_name, baudrate, prog_name);
}
}
 
 
/************************************************* REMOTE_INSERT_BREAKPOINT */
/************************************************* REMOTE_INSERT_BREAKPOINT */
static int
static int
mm_insert_breakpoint (addr, contents_cache)
mm_insert_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     CORE_ADDR addr;
     char *contents_cache;
     char *contents_cache;
{
{
  out_msg_buf->bkpt_set_msg.code = BKPT_SET;
  out_msg_buf->bkpt_set_msg.code = BKPT_SET;
  out_msg_buf->bkpt_set_msg.length = 4 * 4;
  out_msg_buf->bkpt_set_msg.length = 4 * 4;
  out_msg_buf->bkpt_set_msg.memory_space = I_MEM;
  out_msg_buf->bkpt_set_msg.memory_space = I_MEM;
  out_msg_buf->bkpt_set_msg.bkpt_addr = (ADDR32) addr;
  out_msg_buf->bkpt_set_msg.bkpt_addr = (ADDR32) addr;
  out_msg_buf->bkpt_set_msg.pass_count = 1;
  out_msg_buf->bkpt_set_msg.pass_count = 1;
  out_msg_buf->bkpt_set_msg.bkpt_type = -1;     /* use illop for 29000 */
  out_msg_buf->bkpt_set_msg.bkpt_type = -1;     /* use illop for 29000 */
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (expect_msg (BKPT_SET_ACK, in_msg_buf, 1))
  if (expect_msg (BKPT_SET_ACK, in_msg_buf, 1))
    {
    {
      return 0;                  /* Success */
      return 0;                  /* Success */
    }
    }
  else
  else
    {
    {
      return 1;                 /* Failure */
      return 1;                 /* Failure */
    }
    }
}
}
 
 
/************************************************* REMOTE_DELETE_BREAKPOINT */
/************************************************* REMOTE_DELETE_BREAKPOINT */
static int
static int
mm_remove_breakpoint (addr, contents_cache)
mm_remove_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     CORE_ADDR addr;
     char *contents_cache;
     char *contents_cache;
{
{
  out_msg_buf->bkpt_rm_msg.code = BKPT_RM;
  out_msg_buf->bkpt_rm_msg.code = BKPT_RM;
  out_msg_buf->bkpt_rm_msg.length = 4 * 3;
  out_msg_buf->bkpt_rm_msg.length = 4 * 3;
  out_msg_buf->bkpt_rm_msg.memory_space = I_MEM;
  out_msg_buf->bkpt_rm_msg.memory_space = I_MEM;
  out_msg_buf->bkpt_rm_msg.bkpt_addr = (ADDR32) addr;
  out_msg_buf->bkpt_rm_msg.bkpt_addr = (ADDR32) addr;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  if (expect_msg (BKPT_RM_ACK, in_msg_buf, 1))
  if (expect_msg (BKPT_RM_ACK, in_msg_buf, 1))
    {
    {
      return 0;                  /* Success */
      return 0;                  /* Success */
    }
    }
  else
  else
    {
    {
      return 1;                 /* Failure */
      return 1;                 /* Failure */
    }
    }
}
}
 
 
 
 
/******************************************************* REMOTE_KILL */
/******************************************************* REMOTE_KILL */
static void
static void
mm_kill (arg, from_tty)
mm_kill (arg, from_tty)
     char *arg;
     char *arg;
     int from_tty;
     int from_tty;
{
{
  char buf[4];
  char buf[4];
 
 
#if defined(KERNEL_DEBUGGING)
#if defined(KERNEL_DEBUGGING)
  /* We don't ever kill the kernel */
  /* We don't ever kill the kernel */
  if (from_tty)
  if (from_tty)
    {
    {
      printf ("Kernel not killed, but left in current state.\n");
      printf ("Kernel not killed, but left in current state.\n");
      printf ("Use detach to leave kernel running.\n");
      printf ("Use detach to leave kernel running.\n");
    }
    }
#else
#else
  out_msg_buf->break_msg.code = BREAK;
  out_msg_buf->break_msg.code = BREAK;
  out_msg_buf->bkpt_set_msg.length = 4 * 0;
  out_msg_buf->bkpt_set_msg.length = 4 * 0;
  expect_msg (HALT, in_msg_buf, from_tty);
  expect_msg (HALT, in_msg_buf, from_tty);
  if (from_tty)
  if (from_tty)
    {
    {
      printf ("Target has been stopped.");
      printf ("Target has been stopped.");
      printf ("Would you like to do a hardware reset (y/n) [n] ");
      printf ("Would you like to do a hardware reset (y/n) [n] ");
      fgets (buf, 3, stdin);
      fgets (buf, 3, stdin);
      if (buf[0] == 'y')
      if (buf[0] == 'y')
        {
        {
          out_msg_buf->reset_msg.code = RESET;
          out_msg_buf->reset_msg.code = RESET;
          out_msg_buf->bkpt_set_msg.length = 4 * 0;
          out_msg_buf->bkpt_set_msg.length = 4 * 0;
          expect_msg (RESET_ACK, in_msg_buf, from_tty);
          expect_msg (RESET_ACK, in_msg_buf, from_tty);
          printf ("Target has been reset.");
          printf ("Target has been reset.");
        }
        }
    }
    }
  pop_target ();
  pop_target ();
#endif
#endif
}
}
 
 
 
 
 
 
/***************************************************************************/
/***************************************************************************/
/*
/*
 * Load a program into the target.
 * Load a program into the target.
 */
 */
static void
static void
mm_load (arg_string, from_tty)
mm_load (arg_string, from_tty)
     char *arg_string;
     char *arg_string;
     int from_tty;
     int from_tty;
{
{
  dont_repeat ();
  dont_repeat ();
 
 
#if defined(KERNEL_DEBUGGING)
#if defined(KERNEL_DEBUGGING)
  printf ("The kernel had better be loaded already!  Loading not done.\n");
  printf ("The kernel had better be loaded already!  Loading not done.\n");
#else
#else
  if (arg_string == 0)
  if (arg_string == 0)
    error ("The load command takes a file name");
    error ("The load command takes a file name");
 
 
  arg_string = tilde_expand (arg_string);
  arg_string = tilde_expand (arg_string);
  make_cleanup (free, arg_string);
  make_cleanup (free, arg_string);
  QUIT;
  QUIT;
  immediate_quit++;
  immediate_quit++;
  error ("File loading is not yet supported for MiniMon.");
  error ("File loading is not yet supported for MiniMon.");
  /* FIXME, code to load your file here... */
  /* FIXME, code to load your file here... */
  /* You may need to do an init_target_mm() */
  /* You may need to do an init_target_mm() */
  /* init_target_mm(?,?,?,?,?,?,?,?); */
  /* init_target_mm(?,?,?,?,?,?,?,?); */
  immediate_quit--;
  immediate_quit--;
  /* symbol_file_add (arg_string, from_tty, text_addr, 0, 0); */
  /* symbol_file_add (arg_string, from_tty, text_addr, 0, 0); */
#endif
#endif
 
 
}
}
 
 
/************************************************ REMOTE_WRITE_INFERIOR_MEMORY
/************************************************ REMOTE_WRITE_INFERIOR_MEMORY
** Copy LEN bytes of data from debugger memory at MYADDR
** Copy LEN bytes of data from debugger memory at MYADDR
   to inferior's memory at MEMADDR.  Returns number of bytes written.  */
   to inferior's memory at MEMADDR.  Returns number of bytes written.  */
static int
static int
mm_write_inferior_memory (memaddr, myaddr, len)
mm_write_inferior_memory (memaddr, myaddr, len)
     CORE_ADDR memaddr;
     CORE_ADDR memaddr;
     char *myaddr;
     char *myaddr;
     int len;
     int len;
{
{
  int i, nwritten;
  int i, nwritten;
 
 
  out_msg_buf->write_req_msg.code = WRITE_REQ;
  out_msg_buf->write_req_msg.code = WRITE_REQ;
  out_msg_buf->write_req_msg.memory_space = mm_memory_space (memaddr);
  out_msg_buf->write_req_msg.memory_space = mm_memory_space (memaddr);
 
 
  nwritten = 0;
  nwritten = 0;
  while (nwritten < len)
  while (nwritten < len)
    {
    {
      int num_to_write = len - nwritten;
      int num_to_write = len - nwritten;
      if (num_to_write > MAXDATA)
      if (num_to_write > MAXDATA)
        num_to_write = MAXDATA;
        num_to_write = MAXDATA;
      for (i = 0; i < num_to_write; i++)
      for (i = 0; i < num_to_write; i++)
        out_msg_buf->write_req_msg.data[i] = myaddr[i + nwritten];
        out_msg_buf->write_req_msg.data[i] = myaddr[i + nwritten];
      out_msg_buf->write_req_msg.byte_count = num_to_write;
      out_msg_buf->write_req_msg.byte_count = num_to_write;
      out_msg_buf->write_req_msg.length = 3 * 4 + num_to_write;
      out_msg_buf->write_req_msg.length = 3 * 4 + num_to_write;
      out_msg_buf->write_req_msg.address = memaddr + nwritten;
      out_msg_buf->write_req_msg.address = memaddr + nwritten;
      msg_send_serial (out_msg_buf);
      msg_send_serial (out_msg_buf);
 
 
      if (expect_msg (WRITE_ACK, in_msg_buf, 1))
      if (expect_msg (WRITE_ACK, in_msg_buf, 1))
        {
        {
          nwritten += in_msg_buf->write_ack_msg.byte_count;
          nwritten += in_msg_buf->write_ack_msg.byte_count;
        }
        }
      else
      else
        {
        {
          break;
          break;
        }
        }
    }
    }
  return (nwritten);
  return (nwritten);
}
}
 
 
/************************************************* REMOTE_READ_INFERIOR_MEMORY
/************************************************* REMOTE_READ_INFERIOR_MEMORY
** Read LEN bytes from inferior memory at MEMADDR.  Put the result
** Read LEN bytes from inferior memory at MEMADDR.  Put the result
   at debugger address MYADDR.  Returns number of bytes read.  */
   at debugger address MYADDR.  Returns number of bytes read.  */
static int
static int
mm_read_inferior_memory (memaddr, myaddr, len)
mm_read_inferior_memory (memaddr, myaddr, len)
     CORE_ADDR memaddr;
     CORE_ADDR memaddr;
     char *myaddr;
     char *myaddr;
     int len;
     int len;
{
{
  int i, nread;
  int i, nread;
 
 
  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.memory_space = mm_memory_space (memaddr);
  out_msg_buf->read_req_msg.memory_space = mm_memory_space (memaddr);
 
 
  nread = 0;
  nread = 0;
  while (nread < len)
  while (nread < len)
    {
    {
      int num_to_read = (len - nread);
      int num_to_read = (len - nread);
      if (num_to_read > MAXDATA)
      if (num_to_read > MAXDATA)
        num_to_read = MAXDATA;
        num_to_read = MAXDATA;
      out_msg_buf->read_req_msg.byte_count = num_to_read;
      out_msg_buf->read_req_msg.byte_count = num_to_read;
      out_msg_buf->read_req_msg.length = 3 * 4 + num_to_read;
      out_msg_buf->read_req_msg.length = 3 * 4 + num_to_read;
      out_msg_buf->read_req_msg.address = memaddr + nread;
      out_msg_buf->read_req_msg.address = memaddr + nread;
      msg_send_serial (out_msg_buf);
      msg_send_serial (out_msg_buf);
 
 
      if (expect_msg (READ_ACK, in_msg_buf, 1))
      if (expect_msg (READ_ACK, in_msg_buf, 1))
        {
        {
          for (i = 0; i < in_msg_buf->read_ack_msg.byte_count; i++)
          for (i = 0; i < in_msg_buf->read_ack_msg.byte_count; i++)
            myaddr[i + nread] = in_msg_buf->read_ack_msg.data[i];
            myaddr[i + nread] = in_msg_buf->read_ack_msg.data[i];
          nread += in_msg_buf->read_ack_msg.byte_count;
          nread += in_msg_buf->read_ack_msg.byte_count;
        }
        }
      else
      else
        {
        {
          break;
          break;
        }
        }
    }
    }
  return (nread);
  return (nread);
}
}
 
 
/* FIXME!  Merge these two.  */
/* FIXME!  Merge these two.  */
static int
static int
mm_xfer_inferior_memory (memaddr, myaddr, len, write)
mm_xfer_inferior_memory (memaddr, myaddr, len, write)
     CORE_ADDR memaddr;
     CORE_ADDR memaddr;
     char *myaddr;
     char *myaddr;
     int len;
     int len;
     int write;
     int write;
{
{
 
 
  memaddr = translate_addr (memaddr);
  memaddr = translate_addr (memaddr);
 
 
  if (write)
  if (write)
    return mm_write_inferior_memory (memaddr, myaddr, len);
    return mm_write_inferior_memory (memaddr, myaddr, len);
  else
  else
    return mm_read_inferior_memory (memaddr, myaddr, len);
    return mm_read_inferior_memory (memaddr, myaddr, len);
}
}
 
 
 
 
/********************************************************** MSG_SEND_SERIAL
/********************************************************** MSG_SEND_SERIAL
** This function is used to send a message over the
** This function is used to send a message over the
** serial line.
** serial line.
**
**
** If the message is successfully sent, a zero is
** If the message is successfully sent, a zero is
** returned.  If the message was not sendable, a -1
** returned.  If the message was not sendable, a -1
** is returned.  This function blocks.  That is, it
** is returned.  This function blocks.  That is, it
** does not return until the message is completely
** does not return until the message is completely
** sent, or until an error is encountered.
** sent, or until an error is encountered.
**
**
*/
*/
 
 
int
int
msg_send_serial (msg_ptr)
msg_send_serial (msg_ptr)
     union msg_t *msg_ptr;
     union msg_t *msg_ptr;
{
{
  INT32 message_size;
  INT32 message_size;
  int byte_count;
  int byte_count;
  int result;
  int result;
  char c;
  char c;
 
 
  /* Send message header */
  /* Send message header */
  byte_count = 0;
  byte_count = 0;
  message_size = msg_ptr->generic_msg.length + (2 * sizeof (INT32));
  message_size = msg_ptr->generic_msg.length + (2 * sizeof (INT32));
  do
  do
    {
    {
      c = *((char *) msg_ptr + byte_count);
      c = *((char *) msg_ptr + byte_count);
      result = write (mm_desc, &c, 1);
      result = write (mm_desc, &c, 1);
      if (result == 1)
      if (result == 1)
        {
        {
          byte_count = byte_count + 1;
          byte_count = byte_count + 1;
        }
        }
    }
    }
  while ((byte_count < message_size));
  while ((byte_count < message_size));
 
 
  return (0);
  return (0);
}                               /* end msg_send_serial() */
}                               /* end msg_send_serial() */
 
 
/********************************************************** MSG_RECV_SERIAL
/********************************************************** MSG_RECV_SERIAL
** This function is used to receive a message over a
** This function is used to receive a message over a
** serial line.
** serial line.
**
**
** If the message is waiting in the buffer, a zero is
** If the message is waiting in the buffer, a zero is
** returned and the buffer pointed to by msg_ptr is filled
** returned and the buffer pointed to by msg_ptr is filled
** in.  If no message was available, a -1 is returned.
** in.  If no message was available, a -1 is returned.
** If timeout==0, wait indefinetly for a character.
** If timeout==0, wait indefinetly for a character.
**
**
*/
*/
 
 
int
int
msg_recv_serial (msg_ptr)
msg_recv_serial (msg_ptr)
     union msg_t *msg_ptr;
     union msg_t *msg_ptr;
{
{
  static INT32 length = 0;
  static INT32 length = 0;
  static INT32 byte_count = 0;
  static INT32 byte_count = 0;
  int result;
  int result;
  char c;
  char c;
  if (msg_ptr == 0)              /* re-sync request */
  if (msg_ptr == 0)              /* re-sync request */
    {
    {
      length = 0;
      length = 0;
      byte_count = 0;
      byte_count = 0;
#ifdef HAVE_TERMIO
#ifdef HAVE_TERMIO
      /* The timeout here is the prevailing timeout set with VTIME */
      /* The timeout here is the prevailing timeout set with VTIME */
      ->"timeout==0 semantics not supported"
      ->"timeout==0 semantics not supported"
        read (mm_desc, in_buf, BUFER_SIZE);
        read (mm_desc, in_buf, BUFER_SIZE);
#else
#else
      alarm (1);
      alarm (1);
      read (mm_desc, in_buf, BUFER_SIZE);
      read (mm_desc, in_buf, BUFER_SIZE);
      alarm (0);
      alarm (0);
#endif
#endif
      return (0);
      return (0);
    }
    }
  /* Receive message */
  /* Receive message */
#ifdef HAVE_TERMIO
#ifdef HAVE_TERMIO
/* Timeout==0, help support the mm_wait() routine */
/* Timeout==0, help support the mm_wait() routine */
  ->"timeout==0 semantics not supported (and its nice if they are)"
  ->"timeout==0 semantics not supported (and its nice if they are)"
    result = read (mm_desc, &c, 1);
    result = read (mm_desc, &c, 1);
#else
#else
  alarm (timeout);
  alarm (timeout);
  result = read (mm_desc, &c, 1);
  result = read (mm_desc, &c, 1);
  alarm (0);
  alarm (0);
#endif
#endif
  if (result < 0)
  if (result < 0)
    {
    {
      if (errno == EINTR)
      if (errno == EINTR)
        {
        {
          error ("Timeout reading from remote system.");
          error ("Timeout reading from remote system.");
        }
        }
      else
      else
        perror_with_name ("remote");
        perror_with_name ("remote");
    }
    }
  else if (result == 1)
  else if (result == 1)
    {
    {
      *((char *) msg_ptr + byte_count) = c;
      *((char *) msg_ptr + byte_count) = c;
      byte_count = byte_count + 1;
      byte_count = byte_count + 1;
    }
    }
 
 
  /* Message header received.  Save message length. */
  /* Message header received.  Save message length. */
  if (byte_count == (2 * sizeof (INT32)))
  if (byte_count == (2 * sizeof (INT32)))
    length = msg_ptr->generic_msg.length;
    length = msg_ptr->generic_msg.length;
 
 
  if (byte_count >= (length + (2 * sizeof (INT32))))
  if (byte_count >= (length + (2 * sizeof (INT32))))
    {
    {
      /* Message received */
      /* Message received */
      byte_count = 0;
      byte_count = 0;
      return (0);
      return (0);
    }
    }
  else
  else
    return (-1);
    return (-1);
 
 
}                               /* end msg_recv_serial() */
}                               /* end msg_recv_serial() */
 
 
/********************************************************************* KBD_RAW
/********************************************************************* KBD_RAW
** This function is used to put the keyboard in "raw"
** This function is used to put the keyboard in "raw"
** mode for BSD Unix.  The original status is saved
** mode for BSD Unix.  The original status is saved
** so that it may be restored later.
** so that it may be restored later.
*/
*/
TERMINAL kbd_tbuf;
TERMINAL kbd_tbuf;
 
 
int
int
kbd_raw ()
kbd_raw ()
{
{
  int result;
  int result;
  TERMINAL tbuf;
  TERMINAL tbuf;
 
 
  /* Get keyboard termio (to save to restore original modes) */
  /* Get keyboard termio (to save to restore original modes) */
#ifdef HAVE_TERMIO
#ifdef HAVE_TERMIO
  result = ioctl (0, TCGETA, &kbd_tbuf);
  result = ioctl (0, TCGETA, &kbd_tbuf);
#else
#else
  result = ioctl (0, TIOCGETP, &kbd_tbuf);
  result = ioctl (0, TIOCGETP, &kbd_tbuf);
#endif
#endif
  if (result == -1)
  if (result == -1)
    return (errno);
    return (errno);
 
 
  /* Get keyboard TERMINAL (for modification) */
  /* Get keyboard TERMINAL (for modification) */
#ifdef HAVE_TERMIO
#ifdef HAVE_TERMIO
  result = ioctl (0, TCGETA, &tbuf);
  result = ioctl (0, TCGETA, &tbuf);
#else
#else
  result = ioctl (0, TIOCGETP, &tbuf);
  result = ioctl (0, TIOCGETP, &tbuf);
#endif
#endif
  if (result == -1)
  if (result == -1)
    return (errno);
    return (errno);
 
 
  /* Set up new parameters */
  /* Set up new parameters */
#ifdef HAVE_TERMIO
#ifdef HAVE_TERMIO
  tbuf.c_iflag = tbuf.c_iflag &
  tbuf.c_iflag = tbuf.c_iflag &
    ~(INLCR | ICRNL | IUCLC | ISTRIP | IXON | BRKINT);
    ~(INLCR | ICRNL | IUCLC | ISTRIP | IXON | BRKINT);
  tbuf.c_lflag = tbuf.c_lflag & ~(ICANON | ISIG | ECHO);
  tbuf.c_lflag = tbuf.c_lflag & ~(ICANON | ISIG | ECHO);
  tbuf.c_cc[4] = 0;              /* MIN */
  tbuf.c_cc[4] = 0;              /* MIN */
  tbuf.c_cc[5] = 0;              /* TIME */
  tbuf.c_cc[5] = 0;              /* TIME */
#else
#else
  /* FIXME: not sure if this is correct (matches HAVE_TERMIO). */
  /* FIXME: not sure if this is correct (matches HAVE_TERMIO). */
  tbuf.sg_flags |= RAW;
  tbuf.sg_flags |= RAW;
  tbuf.sg_flags |= ANYP;
  tbuf.sg_flags |= ANYP;
  tbuf.sg_flags &= ~ECHO;
  tbuf.sg_flags &= ~ECHO;
#endif
#endif
 
 
  /* Set keyboard termio to new mode (RAW) */
  /* Set keyboard termio to new mode (RAW) */
#ifdef HAVE_TERMIO
#ifdef HAVE_TERMIO
  result = ioctl (0, TCSETAF, &tbuf);
  result = ioctl (0, TCSETAF, &tbuf);
#else
#else
  result = ioctl (0, TIOCSETP, &tbuf);
  result = ioctl (0, TIOCSETP, &tbuf);
#endif
#endif
  if (result == -1)
  if (result == -1)
    return (errno);
    return (errno);
 
 
  return (0);
  return (0);
}                               /* end kbd_raw() */
}                               /* end kbd_raw() */
 
 
 
 
 
 
/***************************************************************** KBD_RESTORE
/***************************************************************** KBD_RESTORE
** This function is used to put the keyboard back in the
** This function is used to put the keyboard back in the
** mode it was in before kbk_raw was called.  Note that
** mode it was in before kbk_raw was called.  Note that
** kbk_raw() must have been called at least once before
** kbk_raw() must have been called at least once before
** kbd_restore() is called.
** kbd_restore() is called.
*/
*/
 
 
int
int
kbd_restore ()
kbd_restore ()
{
{
  int result;
  int result;
 
 
  /* Set keyboard termio to original mode */
  /* Set keyboard termio to original mode */
#ifdef HAVE_TERMIO
#ifdef HAVE_TERMIO
  result = ioctl (0, TCSETAF, &kbd_tbuf);
  result = ioctl (0, TCSETAF, &kbd_tbuf);
#else
#else
  result = ioctl (0, TIOCGETP, &kbd_tbuf);
  result = ioctl (0, TIOCGETP, &kbd_tbuf);
#endif
#endif
 
 
  if (result == -1)
  if (result == -1)
    return (errno);
    return (errno);
 
 
  return (0);
  return (0);
}                               /* end kbd_cooked() */
}                               /* end kbd_cooked() */
 
 
 
 
/*****************************************************************************/
/*****************************************************************************/
/* Fetch a single register indicatated by 'regno'.
/* Fetch a single register indicatated by 'regno'.
 * Returns 0/-1 on success/failure.
 * Returns 0/-1 on success/failure.
 */
 */
static int
static int
fetch_register (regno)
fetch_register (regno)
     int regno;
     int regno;
{
{
  int result;
  int result;
  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.length = 4 * 3;
  out_msg_buf->read_req_msg.length = 4 * 3;
  out_msg_buf->read_req_msg.byte_count = 4;
  out_msg_buf->read_req_msg.byte_count = 4;
 
 
  if (regno == GR1_REGNUM)
  if (regno == GR1_REGNUM)
    {
    {
      out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->read_req_msg.address = 1;
      out_msg_buf->read_req_msg.address = 1;
    }
    }
  else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
  else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
    {
    {
      out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->read_req_msg.address = (regno - GR96_REGNUM) + 96;
      out_msg_buf->read_req_msg.address = (regno - GR96_REGNUM) + 96;
    }
    }
#if defined(GR64_REGNUM)
#if defined(GR64_REGNUM)
  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
    {
    {
      out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->read_req_msg.address = (regno - GR64_REGNUM) + 64;
      out_msg_buf->read_req_msg.address = (regno - GR64_REGNUM) + 64;
    }
    }
#endif /* GR64_REGNUM */
#endif /* GR64_REGNUM */
  else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
  else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
    {
    {
      out_msg_buf->read_req_msg.memory_space = LOCAL_REG;
      out_msg_buf->read_req_msg.memory_space = LOCAL_REG;
      out_msg_buf->read_req_msg.address = (regno - LR0_REGNUM);
      out_msg_buf->read_req_msg.address = (regno - LR0_REGNUM);
    }
    }
  else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
  else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
    {
    {
      int val = -1;
      int val = -1;
      supply_register (160 + (regno - FPE_REGNUM), &val);
      supply_register (160 + (regno - FPE_REGNUM), &val);
      return 0;                  /* Pretend Success */
      return 0;                  /* Pretend Success */
    }
    }
  else
  else
    {
    {
      out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
      out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
      out_msg_buf->read_req_msg.address = regnum_to_srnum (regno);
      out_msg_buf->read_req_msg.address = regnum_to_srnum (regno);
    }
    }
 
 
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
 
 
  if (expect_msg (READ_ACK, in_msg_buf, 1))
  if (expect_msg (READ_ACK, in_msg_buf, 1))
    {
    {
      supply_register (regno, &(in_msg_buf->read_r_ack_msg.data[0]));
      supply_register (regno, &(in_msg_buf->read_r_ack_msg.data[0]));
      result = 0;
      result = 0;
    }
    }
  else
  else
    {
    {
      result = -1;
      result = -1;
    }
    }
  return result;
  return result;
}
}
/*****************************************************************************/
/*****************************************************************************/
/* Store a single register indicated by 'regno'.
/* Store a single register indicated by 'regno'.
 * Returns 0/-1 on success/failure.
 * Returns 0/-1 on success/failure.
 */
 */
static int
static int
store_register (regno)
store_register (regno)
     int regno;
     int regno;
{
{
  int result;
  int result;
 
 
  out_msg_buf->write_req_msg.code = WRITE_REQ;
  out_msg_buf->write_req_msg.code = WRITE_REQ;
  out_msg_buf->write_req_msg.length = 4 * 4;
  out_msg_buf->write_req_msg.length = 4 * 4;
  out_msg_buf->write_req_msg.byte_count = 4;
  out_msg_buf->write_req_msg.byte_count = 4;
  out_msg_buf->write_r_msg.data[0] = read_register (regno);
  out_msg_buf->write_r_msg.data[0] = read_register (regno);
 
 
  if (regno == GR1_REGNUM)
  if (regno == GR1_REGNUM)
    {
    {
      out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->write_req_msg.address = 1;
      out_msg_buf->write_req_msg.address = 1;
      /* Setting GR1 changes the numbers of all the locals, so invalidate the
      /* Setting GR1 changes the numbers of all the locals, so invalidate the
       * register cache.  Do this *after* calling read_register, because we want
       * register cache.  Do this *after* calling read_register, because we want
       * read_register to return the value that write_register has just stuffed
       * read_register to return the value that write_register has just stuffed
       * into the registers array, not the value of the register fetched from
       * into the registers array, not the value of the register fetched from
       * the inferior.
       * the inferior.
       */
       */
      registers_changed ();
      registers_changed ();
    }
    }
#if defined(GR64_REGNUM)
#if defined(GR64_REGNUM)
  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
    {
    {
      out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->write_req_msg.address = (regno - GR64_REGNUM) + 64;
      out_msg_buf->write_req_msg.address = (regno - GR64_REGNUM) + 64;
    }
    }
#endif /* GR64_REGNUM */
#endif /* GR64_REGNUM */
  else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
  else if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
    {
    {
      out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->write_req_msg.address = (regno - GR96_REGNUM) + 96;
      out_msg_buf->write_req_msg.address = (regno - GR96_REGNUM) + 96;
    }
    }
  else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
  else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
    {
    {
      out_msg_buf->write_req_msg.memory_space = LOCAL_REG;
      out_msg_buf->write_req_msg.memory_space = LOCAL_REG;
      out_msg_buf->write_req_msg.address = (regno - LR0_REGNUM);
      out_msg_buf->write_req_msg.address = (regno - LR0_REGNUM);
    }
    }
  else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
  else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
    {
    {
      return 0;                  /* Pretend Success */
      return 0;                  /* Pretend Success */
    }
    }
  else
  else
    /* An unprotected or protected special register */
    /* An unprotected or protected special register */
    {
    {
      out_msg_buf->write_req_msg.memory_space = SPECIAL_REG;
      out_msg_buf->write_req_msg.memory_space = SPECIAL_REG;
      out_msg_buf->write_req_msg.address = regnum_to_srnum (regno);
      out_msg_buf->write_req_msg.address = regnum_to_srnum (regno);
    }
    }
 
 
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
 
 
  if (expect_msg (WRITE_ACK, in_msg_buf, 1))
  if (expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
    {
      result = 0;
      result = 0;
    }
    }
  else
  else
    {
    {
      result = -1;
      result = -1;
    }
    }
  return result;
  return result;
}
}
/****************************************************************************/
/****************************************************************************/
/*
/*
 * Convert a gdb special register number to a 29000 special register number.
 * Convert a gdb special register number to a 29000 special register number.
 */
 */
static int
static int
regnum_to_srnum (regno)
regnum_to_srnum (regno)
     int regno;
     int regno;
{
{
  switch (regno)
  switch (regno)
    {
    {
    case VAB_REGNUM:
    case VAB_REGNUM:
      return (0);
      return (0);
    case OPS_REGNUM:
    case OPS_REGNUM:
      return (1);
      return (1);
    case CPS_REGNUM:
    case CPS_REGNUM:
      return (2);
      return (2);
    case CFG_REGNUM:
    case CFG_REGNUM:
      return (3);
      return (3);
    case CHA_REGNUM:
    case CHA_REGNUM:
      return (4);
      return (4);
    case CHD_REGNUM:
    case CHD_REGNUM:
      return (5);
      return (5);
    case CHC_REGNUM:
    case CHC_REGNUM:
      return (6);
      return (6);
    case RBP_REGNUM:
    case RBP_REGNUM:
      return (7);
      return (7);
    case TMC_REGNUM:
    case TMC_REGNUM:
      return (8);
      return (8);
    case TMR_REGNUM:
    case TMR_REGNUM:
      return (9);
      return (9);
    case NPC_REGNUM:
    case NPC_REGNUM:
      return (USE_SHADOW_PC ? (20) : (10));
      return (USE_SHADOW_PC ? (20) : (10));
    case PC_REGNUM:
    case PC_REGNUM:
      return (USE_SHADOW_PC ? (21) : (11));
      return (USE_SHADOW_PC ? (21) : (11));
    case PC2_REGNUM:
    case PC2_REGNUM:
      return (USE_SHADOW_PC ? (22) : (12));
      return (USE_SHADOW_PC ? (22) : (12));
    case MMU_REGNUM:
    case MMU_REGNUM:
      return (13);
      return (13);
    case LRU_REGNUM:
    case LRU_REGNUM:
      return (14);
      return (14);
    case IPC_REGNUM:
    case IPC_REGNUM:
      return (128);
      return (128);
    case IPA_REGNUM:
    case IPA_REGNUM:
      return (129);
      return (129);
    case IPB_REGNUM:
    case IPB_REGNUM:
      return (130);
      return (130);
    case Q_REGNUM:
    case Q_REGNUM:
      return (131);
      return (131);
    case ALU_REGNUM:
    case ALU_REGNUM:
      return (132);
      return (132);
    case BP_REGNUM:
    case BP_REGNUM:
      return (133);
      return (133);
    case FC_REGNUM:
    case FC_REGNUM:
      return (134);
      return (134);
    case CR_REGNUM:
    case CR_REGNUM:
      return (135);
      return (135);
    case FPE_REGNUM:
    case FPE_REGNUM:
      return (160);
      return (160);
    case INTE_REGNUM:
    case INTE_REGNUM:
      return (161);
      return (161);
    case FPS_REGNUM:
    case FPS_REGNUM:
      return (162);
      return (162);
    case EXO_REGNUM:
    case EXO_REGNUM:
      return (164);
      return (164);
    default:
    default:
      return (255);             /* Failure ? */
      return (255);             /* Failure ? */
    }
    }
}
}
/****************************************************************************/
/****************************************************************************/
/*
/*
 * Initialize the target debugger (minimon only).
 * Initialize the target debugger (minimon only).
 */
 */
static void
static void
init_target_mm (tstart, tend, dstart, dend, entry, ms_size, rs_size, arg_start)
init_target_mm (tstart, tend, dstart, dend, entry, ms_size, rs_size, arg_start)
     ADDR32 tstart, tend, dstart, dend, entry;
     ADDR32 tstart, tend, dstart, dend, entry;
     INT32 ms_size, rs_size;
     INT32 ms_size, rs_size;
     ADDR32 arg_start;
     ADDR32 arg_start;
{
{
  out_msg_buf->init_msg.code = INIT;
  out_msg_buf->init_msg.code = INIT;
  out_msg_buf->init_msg.length = sizeof (struct init_msg_t) - 2 * sizeof (INT32);
  out_msg_buf->init_msg.length = sizeof (struct init_msg_t) - 2 * sizeof (INT32);
  out_msg_buf->init_msg.text_start = tstart;
  out_msg_buf->init_msg.text_start = tstart;
  out_msg_buf->init_msg.text_end = tend;
  out_msg_buf->init_msg.text_end = tend;
  out_msg_buf->init_msg.data_start = dstart;
  out_msg_buf->init_msg.data_start = dstart;
  out_msg_buf->init_msg.data_end = dend;
  out_msg_buf->init_msg.data_end = dend;
  out_msg_buf->init_msg.entry_point = entry;
  out_msg_buf->init_msg.entry_point = entry;
  out_msg_buf->init_msg.mem_stack_size = ms_size;
  out_msg_buf->init_msg.mem_stack_size = ms_size;
  out_msg_buf->init_msg.reg_stack_size = rs_size;
  out_msg_buf->init_msg.reg_stack_size = rs_size;
  out_msg_buf->init_msg.arg_start = arg_start;
  out_msg_buf->init_msg.arg_start = arg_start;
  msg_send_serial (out_msg_buf);
  msg_send_serial (out_msg_buf);
  expect_msg (INIT_ACK, in_msg_buf, 1);
  expect_msg (INIT_ACK, in_msg_buf, 1);
}
}
/****************************************************************************/
/****************************************************************************/
/*
/*
 * Return a pointer to a string representing the given message code.
 * Return a pointer to a string representing the given message code.
 * Not all messages are represented here, only the ones that we expect
 * Not all messages are represented here, only the ones that we expect
 * to be called with.
 * to be called with.
 */
 */
static char *
static char *
msg_str (code)
msg_str (code)
     INT32 code;
     INT32 code;
{
{
  static char cbuf[32];
  static char cbuf[32];
 
 
  switch (code)
  switch (code)
    {
    {
    case BKPT_SET_ACK:
    case BKPT_SET_ACK:
      sprintf (cbuf, "%s (%d)", "BKPT_SET_ACK", code);
      sprintf (cbuf, "%s (%d)", "BKPT_SET_ACK", code);
      break;
      break;
    case BKPT_RM_ACK:
    case BKPT_RM_ACK:
      sprintf (cbuf, "%s (%d)", "BKPT_RM_ACK", code);
      sprintf (cbuf, "%s (%d)", "BKPT_RM_ACK", code);
      break;
      break;
    case INIT_ACK:
    case INIT_ACK:
      sprintf (cbuf, "%s (%d)", "INIT_ACK", code);
      sprintf (cbuf, "%s (%d)", "INIT_ACK", code);
      break;
      break;
    case READ_ACK:
    case READ_ACK:
      sprintf (cbuf, "%s (%d)", "READ_ACK", code);
      sprintf (cbuf, "%s (%d)", "READ_ACK", code);
      break;
      break;
    case WRITE_ACK:
    case WRITE_ACK:
      sprintf (cbuf, "%s (%d)", "WRITE_ACK", code);
      sprintf (cbuf, "%s (%d)", "WRITE_ACK", code);
      break;
      break;
    case ERROR:
    case ERROR:
      sprintf (cbuf, "%s (%d)", "ERROR", code);
      sprintf (cbuf, "%s (%d)", "ERROR", code);
      break;
      break;
    case HALT:
    case HALT:
      sprintf (cbuf, "%s (%d)", "HALT", code);
      sprintf (cbuf, "%s (%d)", "HALT", code);
      break;
      break;
    default:
    default:
      sprintf (cbuf, "UNKNOWN (%d)", code);
      sprintf (cbuf, "UNKNOWN (%d)", code);
      break;
      break;
    }
    }
  return (cbuf);
  return (cbuf);
}
}
/****************************************************************************/
/****************************************************************************/
/*
/*
 * Selected (not all of them) error codes that we might get.
 * Selected (not all of them) error codes that we might get.
 */
 */
static char *
static char *
error_msg_str (code)
error_msg_str (code)
     INT32 code;
     INT32 code;
{
{
  static char cbuf[50];
  static char cbuf[50];
 
 
  switch (code)
  switch (code)
    {
    {
    case EMFAIL:
    case EMFAIL:
      return ("EMFAIL: unrecoverable error");
      return ("EMFAIL: unrecoverable error");
    case EMBADADDR:
    case EMBADADDR:
      return ("EMBADADDR: Illegal address");
      return ("EMBADADDR: Illegal address");
    case EMBADREG:
    case EMBADREG:
      return ("EMBADREG: Illegal register ");
      return ("EMBADREG: Illegal register ");
    case EMACCESS:
    case EMACCESS:
      return ("EMACCESS: Could not access memory");
      return ("EMACCESS: Could not access memory");
    case EMBADMSG:
    case EMBADMSG:
      return ("EMBADMSG: Unknown message type");
      return ("EMBADMSG: Unknown message type");
    case EMMSG2BIG:
    case EMMSG2BIG:
      return ("EMMSG2BIG: Message to large");
      return ("EMMSG2BIG: Message to large");
    case EMNOSEND:
    case EMNOSEND:
      return ("EMNOSEND: Could not send message");
      return ("EMNOSEND: Could not send message");
    case EMNORECV:
    case EMNORECV:
      return ("EMNORECV: Could not recv message");
      return ("EMNORECV: Could not recv message");
    case EMRESET:
    case EMRESET:
      return ("EMRESET: Could not RESET target");
      return ("EMRESET: Could not RESET target");
    case EMCONFIG:
    case EMCONFIG:
      return ("EMCONFIG: Could not get target CONFIG");
      return ("EMCONFIG: Could not get target CONFIG");
    case EMSTATUS:
    case EMSTATUS:
      return ("EMSTATUS: Could not get target STATUS");
      return ("EMSTATUS: Could not get target STATUS");
    case EMREAD:
    case EMREAD:
      return ("EMREAD: Could not READ target memory");
      return ("EMREAD: Could not READ target memory");
    case EMWRITE:
    case EMWRITE:
      return ("EMWRITE: Could not WRITE target memory");
      return ("EMWRITE: Could not WRITE target memory");
    case EMBKPTSET:
    case EMBKPTSET:
      return ("EMBKPTSET: Could not set breakpoint");
      return ("EMBKPTSET: Could not set breakpoint");
    case EMBKPTRM:
    case EMBKPTRM:
      return ("EMBKPTRM: Could not remove breakpoint");
      return ("EMBKPTRM: Could not remove breakpoint");
    case EMBKPTSTAT:
    case EMBKPTSTAT:
      return ("EMBKPTSTAT: Could not get breakpoint status");
      return ("EMBKPTSTAT: Could not get breakpoint status");
    case EMBKPTNONE:
    case EMBKPTNONE:
      return ("EMBKPTNONE: All breakpoints in use");
      return ("EMBKPTNONE: All breakpoints in use");
    case EMBKPTUSED:
    case EMBKPTUSED:
      return ("EMBKPTUSED: Breakpoints already in use");
      return ("EMBKPTUSED: Breakpoints already in use");
    case EMINIT:
    case EMINIT:
      return ("EMINIT: Could not init target memory");
      return ("EMINIT: Could not init target memory");
    case EMGO:
    case EMGO:
      return ("EMGO: Could not start execution");
      return ("EMGO: Could not start execution");
    case EMSTEP:
    case EMSTEP:
      return ("EMSTEP: Could not single step");
      return ("EMSTEP: Could not single step");
    case EMBREAK:
    case EMBREAK:
      return ("EMBREAK: Could not BREAK");
      return ("EMBREAK: Could not BREAK");
    case EMCOMMERR:
    case EMCOMMERR:
      return ("EMCOMMERR: Communication error");
      return ("EMCOMMERR: Communication error");
    default:
    default:
      sprintf (cbuf, "error number %d", code);
      sprintf (cbuf, "error number %d", code);
      break;
      break;
    }                           /* end switch */
    }                           /* end switch */
 
 
  return (cbuf);
  return (cbuf);
}
}
/****************************************************************************/
/****************************************************************************/
/*
/*
 *  Receive a message and expect it to be of type msgcode.
 *  Receive a message and expect it to be of type msgcode.
 *  Returns 0/1 on failure/success.
 *  Returns 0/1 on failure/success.
 */
 */
static int
static int
expect_msg (msgcode, msg_buf, from_tty)
expect_msg (msgcode, msg_buf, from_tty)
     INT32 msgcode;             /* Msg code we expect */
     INT32 msgcode;             /* Msg code we expect */
     union msg_t *msg_buf;      /* Where to put  the message received */
     union msg_t *msg_buf;      /* Where to put  the message received */
     int from_tty;              /* Print message on error if non-zero */
     int from_tty;              /* Print message on error if non-zero */
{
{
  int retries = 0;
  int retries = 0;
  while (msg_recv_serial (msg_buf) && (retries++ < MAX_RETRIES));
  while (msg_recv_serial (msg_buf) && (retries++ < MAX_RETRIES));
  if (retries >= MAX_RETRIES)
  if (retries >= MAX_RETRIES)
    {
    {
      printf ("Expected msg %s, ", msg_str (msgcode));
      printf ("Expected msg %s, ", msg_str (msgcode));
      printf ("no message received!\n");
      printf ("no message received!\n");
      return (0);                /* Failure */
      return (0);                /* Failure */
    }
    }
 
 
  if (msg_buf->generic_msg.code != msgcode)
  if (msg_buf->generic_msg.code != msgcode)
    {
    {
      if (from_tty)
      if (from_tty)
        {
        {
          printf ("Expected msg %s, ", msg_str (msgcode));
          printf ("Expected msg %s, ", msg_str (msgcode));
          printf ("got msg %s\n", msg_str (msg_buf->generic_msg.code));
          printf ("got msg %s\n", msg_str (msg_buf->generic_msg.code));
          if (msg_buf->generic_msg.code == ERROR)
          if (msg_buf->generic_msg.code == ERROR)
            printf ("%s\n", error_msg_str (msg_buf->error_msg.error_code));
            printf ("%s\n", error_msg_str (msg_buf->error_msg.error_code));
        }
        }
      return (0);                /* Failure */
      return (0);                /* Failure */
    }
    }
  return (1);                   /* Success */
  return (1);                   /* Success */
}
}
/****************************************************************************/
/****************************************************************************/
/*
/*
 * Determine the MiniMon memory space qualifier based on the addr.
 * Determine the MiniMon memory space qualifier based on the addr.
 * FIXME: Can't distinguis I_ROM/D_ROM.
 * FIXME: Can't distinguis I_ROM/D_ROM.
 * FIXME: Doesn't know anything about I_CACHE/D_CACHE.
 * FIXME: Doesn't know anything about I_CACHE/D_CACHE.
 */
 */
static int
static int
mm_memory_space (addr)
mm_memory_space (addr)
     CORE_ADDR *addr;
     CORE_ADDR *addr;
{
{
  ADDR32 tstart = target_config.I_mem_start;
  ADDR32 tstart = target_config.I_mem_start;
  ADDR32 tend = tstart + target_config.I_mem_size;
  ADDR32 tend = tstart + target_config.I_mem_size;
  ADDR32 dstart = target_config.D_mem_start;
  ADDR32 dstart = target_config.D_mem_start;
  ADDR32 dend = tstart + target_config.D_mem_size;
  ADDR32 dend = tstart + target_config.D_mem_size;
  ADDR32 rstart = target_config.ROM_start;
  ADDR32 rstart = target_config.ROM_start;
  ADDR32 rend = tstart + target_config.ROM_size;
  ADDR32 rend = tstart + target_config.ROM_size;
 
 
  if (((ADDR32) addr >= tstart) && ((ADDR32) addr < tend))
  if (((ADDR32) addr >= tstart) && ((ADDR32) addr < tend))
    {
    {
      return I_MEM;
      return I_MEM;
    }
    }
  else if (((ADDR32) addr >= dstart) && ((ADDR32) addr < dend))
  else if (((ADDR32) addr >= dstart) && ((ADDR32) addr < dend))
    {
    {
      return D_MEM;
      return D_MEM;
    }
    }
  else if (((ADDR32) addr >= rstart) && ((ADDR32) addr < rend))
  else if (((ADDR32) addr >= rstart) && ((ADDR32) addr < rend))
    {
    {
      /* FIXME: how do we determine between D_ROM and I_ROM */
      /* FIXME: how do we determine between D_ROM and I_ROM */
      return D_ROM;
      return D_ROM;
    }
    }
  else                          /* FIXME: what do me do now? */
  else                          /* FIXME: what do me do now? */
    return D_MEM;               /* Hmmm! */
    return D_MEM;               /* Hmmm! */
}
}
 
 
/****************************************************************************/
/****************************************************************************/
/*
/*
 *  Define the target subroutine names
 *  Define the target subroutine names
 */
 */
struct target_ops mm_ops;
struct target_ops mm_ops;
 
 
static void
static void
init_mm_ops (void)
init_mm_ops (void)
{
{
  mm_ops.to_shortname = "minimon";
  mm_ops.to_shortname = "minimon";
  mm_ops.to_longname = "Remote AMD/Minimon target";
  mm_ops.to_longname = "Remote AMD/Minimon target";
  mm_ops.to_doc = "Remote debug an AMD 290*0 using the MiniMon dbg core on the target";
  mm_ops.to_doc = "Remote debug an AMD 290*0 using the MiniMon dbg core on the target";
  mm_ops.to_open = mm_open;
  mm_ops.to_open = mm_open;
  mm_ops.to_close = mm_close;
  mm_ops.to_close = mm_close;
  mm_ops.to_attach = mm_attach;
  mm_ops.to_attach = mm_attach;
  mm_ops.to_post_attach = NULL;
  mm_ops.to_post_attach = NULL;
  mm_ops.to_require_attach = NULL;
  mm_ops.to_require_attach = NULL;
  mm_ops.to_detach = mm_detach;
  mm_ops.to_detach = mm_detach;
  mm_ops.to_require_detach = NULL;
  mm_ops.to_require_detach = NULL;
  mm_ops.to_resume = mm_resume;
  mm_ops.to_resume = mm_resume;
  mm_ops.to_wait = mm_wait;
  mm_ops.to_wait = mm_wait;
  mm_ops.to_post_wait = NULL;
  mm_ops.to_post_wait = NULL;
  mm_ops.to_fetch_registers = mm_fetch_registers;
  mm_ops.to_fetch_registers = mm_fetch_registers;
  mm_ops.to_store_registers = mm_store_registers;
  mm_ops.to_store_registers = mm_store_registers;
  mm_ops.to_prepare_to_store = mm_prepare_to_store;
  mm_ops.to_prepare_to_store = mm_prepare_to_store;
  mm_ops.to_xfer_memory = mm_xfer_inferior_memory;
  mm_ops.to_xfer_memory = mm_xfer_inferior_memory;
  mm_ops.to_files_info = mm_files_info;
  mm_ops.to_files_info = mm_files_info;
  mm_ops.to_insert_breakpoint = mm_insert_breakpoint;
  mm_ops.to_insert_breakpoint = mm_insert_breakpoint;
  mm_ops.to_remove_breakpoint = mm_remove_breakpoint;
  mm_ops.to_remove_breakpoint = mm_remove_breakpoint;
  mm_ops.to_terminal_init = 0;
  mm_ops.to_terminal_init = 0;
  mm_ops.to_terminal_inferior = 0;
  mm_ops.to_terminal_inferior = 0;
  mm_ops.to_terminal_ours_for_output = 0;
  mm_ops.to_terminal_ours_for_output = 0;
  mm_ops.to_terminal_ours = 0;
  mm_ops.to_terminal_ours = 0;
  mm_ops.to_terminal_info = 0;
  mm_ops.to_terminal_info = 0;
  mm_ops.to_kill = mm_kill;
  mm_ops.to_kill = mm_kill;
  mm_ops.to_load = mm_load;
  mm_ops.to_load = mm_load;
  mm_ops.to_lookup_symbol = 0;
  mm_ops.to_lookup_symbol = 0;
  mm_ops.to_create_inferior = mm_create_inferior;
  mm_ops.to_create_inferior = mm_create_inferior;
  mm_ops.to_post_startup_inferior = NULL;
  mm_ops.to_post_startup_inferior = NULL;
  mm_ops.to_acknowledge_created_inferior = NULL;
  mm_ops.to_acknowledge_created_inferior = NULL;
  mm_ops.to_clone_and_follow_inferior = NULL;
  mm_ops.to_clone_and_follow_inferior = NULL;
  mm_ops.to_post_follow_inferior_by_clone = NULL;
  mm_ops.to_post_follow_inferior_by_clone = NULL;
  mm_ops.to_insert_fork_catchpoint = NULL;
  mm_ops.to_insert_fork_catchpoint = NULL;
  mm_ops.to_remove_fork_catchpoint = NULL;
  mm_ops.to_remove_fork_catchpoint = NULL;
  mm_ops.to_insert_vfork_catchpoint = NULL;
  mm_ops.to_insert_vfork_catchpoint = NULL;
  mm_ops.to_remove_vfork_catchpoint = NULL;
  mm_ops.to_remove_vfork_catchpoint = NULL;
  mm_ops.to_has_forked = NULL;
  mm_ops.to_has_forked = NULL;
  mm_ops.to_has_vforked = NULL;
  mm_ops.to_has_vforked = NULL;
  mm_ops.to_can_follow_vfork_prior_to_exec = NULL;
  mm_ops.to_can_follow_vfork_prior_to_exec = NULL;
  mm_ops.to_post_follow_vfork = NULL;
  mm_ops.to_post_follow_vfork = NULL;
  mm_ops.to_insert_exec_catchpoint = NULL;
  mm_ops.to_insert_exec_catchpoint = NULL;
  mm_ops.to_remove_exec_catchpoint = NULL;
  mm_ops.to_remove_exec_catchpoint = NULL;
  mm_ops.to_has_execd = NULL;
  mm_ops.to_has_execd = NULL;
  mm_ops.to_reported_exec_events_per_exec_call = NULL;
  mm_ops.to_reported_exec_events_per_exec_call = NULL;
  mm_ops.to_has_exited = NULL;
  mm_ops.to_has_exited = NULL;
  mm_ops.to_mourn_inferior = mm_mourn;
  mm_ops.to_mourn_inferior = mm_mourn;
  mm_ops.to_can_run = 0;
  mm_ops.to_can_run = 0;
  mm_ops.to_notice_signals = 0;
  mm_ops.to_notice_signals = 0;
  mm_ops.to_thread_alive = 0;
  mm_ops.to_thread_alive = 0;
  mm_ops.to_stop = 0;
  mm_ops.to_stop = 0;
  mm_ops.to_pid_to_exec_file = NULL;
  mm_ops.to_pid_to_exec_file = NULL;
  mm_ops.to_core_file_to_sym_file = NULL;
  mm_ops.to_core_file_to_sym_file = NULL;
  mm_ops.to_stratum = process_stratum;
  mm_ops.to_stratum = process_stratum;
  mm_ops.DONT_USE = 0;
  mm_ops.DONT_USE = 0;
  mm_ops.to_has_all_memory = 1;
  mm_ops.to_has_all_memory = 1;
  mm_ops.to_has_memory = 1;
  mm_ops.to_has_memory = 1;
  mm_ops.to_has_stack = 1;
  mm_ops.to_has_stack = 1;
  mm_ops.to_has_registers = 1;
  mm_ops.to_has_registers = 1;
  mm_ops.to_has_execution = 1;
  mm_ops.to_has_execution = 1;
  mm_ops.to_sections = 0;
  mm_ops.to_sections = 0;
  mm_ops.to_sections_end = 0;
  mm_ops.to_sections_end = 0;
  mm_ops.to_magic = OPS_MAGIC;
  mm_ops.to_magic = OPS_MAGIC;
};
};
 
 
void
void
_initialize_remote_mm ()
_initialize_remote_mm ()
{
{
  init_mm_ops ();
  init_mm_ops ();
  add_target (&mm_ops);
  add_target (&mm_ops);
}
}
 
 
#ifdef NO_HIF_SUPPORT
#ifdef NO_HIF_SUPPORT
service_HIF (msg)
service_HIF (msg)
     union msg_t *msg;
     union msg_t *msg;
{
{
  return (0);                    /* Emulate a failure */
  return (0);                    /* Emulate a failure */
}
}
#endif
#endif
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.