/* Remote debugging interface for Am290*0 running MiniMON monitor, for GDB.
   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
   Originally written by Daniel Mann at AMD.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

/* This is like remote.c but ecpects MiniMON to be running on the Am29000 
   target hardware.
   - David Wood (wood@lab.ultra.nyu.edu) at New York University adapted this
   file to gdb 3.95.  I was unable to get this working on sun3os4
   with termio, only with sgtty.  Because we are only attempting to
   use this module to debug our kernel, which is already loaded when
   gdb is started up, I did not code up the file downloading facilities.  
   As a result this module has only the stubs to download files. 
   You should get tagged at compile time if you need to make any 
   changes/additions.  */

#include "defs.h"
#include "inferior.h"
#include "gdb_wait.h"
#include "value.h"
#include <ctype.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include "gdb_string.h"
#include "terminal.h"
#include "minimon.h"
#include "target.h"

/* Offset of member MEMBER in a struct of type TYPE.  */
#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)

#define DRAIN_INPUT()	(msg_recv_serial((union msg_t*)0))

extern int stop_soon_quietly;	/* for wait_for_inferior */

static void mm_resume ();
static void mm_fetch_registers ();
static int fetch_register ();
static void mm_store_registers ();
static int store_register ();
static int regnum_to_srnum ();
static void mm_close ();
static char *msg_str ();
static char *error_msg_str ();
static int expect_msg ();
static void init_target_mm ();
static int mm_memory_space ();

#define FREEZE_MODE     (read_register(CPS_REGNUM) && 0x400)
#define USE_SHADOW_PC	((processor_type == a29k_freeze_mode) && FREEZE_MODE)

/* FIXME: Replace with `set remotedebug'.  */
#define LLOG_FILE "minimon.log"
#if defined (LOG_FILE)
FILE *log_file;
#endif

/*  
 * 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).
 */
#define BUFER_SIZE  512
/* 
 * Size of data area in message buffer on the TARGET (remote system).
 */
#define MAXDATA_T  (target_config.max_msg_size - \
			offsetof(struct write_r_msg_t,data[0]))
/*               
 * Size of data area in message buffer on the HOST (gdb). 
 */
#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 
 */
#define MAXDATA	   (MAXDATA_H < MAXDATA_T ? MAXDATA_H : MAXDATA_T)

static char out_buf[BUFER_SIZE];
static char in_buf[BUFER_SIZE];

int msg_recv_serial ();
int msg_send_serial ();

#define MAX_RETRIES 5000
extern struct target_ops mm_ops;	/* Forward declaration */
struct config_msg_t target_config;	/* HIF needs this */
union msg_t *out_msg_buf = (union msg_t *) out_buf;
union msg_t *in_msg_buf = (union msg_t *) in_buf;

static int timeout = 5;

/* 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
   starts.  */
int mm_desc = -1;

/* stream which is fdopen'd from mm_desc.  Only valid when
   mm_desc != -1.  */
FILE *mm_stream;

/* Called when SIGALRM signal sent due to alarm() timeout.  */
#ifndef HAVE_TERMIO

#ifndef __STDC__
#ifndef volatile
#define volatile
/**/
# endif
#endif
volatile int n_alarms;

static void
mm_timer ()
{
#if 0
  if (kiodebug)
    printf ("mm_timer called\n");
#endif
  n_alarms++;
}
#endif	/* HAVE_TERMIO */

/* malloc'd name of the program on the remote system.  */
static char *prog_name = NULL;


/* Number of SIGTRAPs we need to simulate.  That is, the next
   NEED_ARTIFICIAL_TRAP calls to mm_wait should just return
   SIGTRAP without actually waiting for anything.  */

/**************************************************** REMOTE_CREATE_INFERIOR */
/* This is called not only when we first attach, but also when the
   user types "run" after having attached.  */
static void
mm_create_inferior (execfile, args, env)
     char *execfile;
     char *args;
     char **env;
{
#define MAX_TOKENS 25
#define BUFFER_SIZE 256
  int token_count;
  int result;
  char *token[MAX_TOKENS];
  char cmd_line[BUFFER_SIZE];

  if (args && *args)
    error ("Can't pass arguments to remote mm process (yet).");

  if (execfile == 0 /* || exec_bfd == 0 */ )
    error ("No executable file specified");

  if (!mm_stream)
    {
      printf ("Minimon not open yet.\n");
      return;
    }

  /* On ultra3 (NYU) we assume the kernel is already running so there is
     no file to download.
     FIXME: Fixed required here -> load your program, possibly with mm_load().
   */
  printf_filtered ("\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.  */
  init_wait_for_inferior ();
  clear_proceed_status ();
  stop_soon_quietly = 1;
  proceed (-1, TARGET_SIGNAL_DEFAULT, 0);
  normal_stop ();
}
/**************************************************** REMOTE_MOURN_INFERIOR */
static void
mm_mourn ()
{
  pop_target ();		/* Pop back to no-child state */
  generic_mourn_inferior ();
}

/********************************************************************** damn_b
*/
/* Translate baud rates from integers to damn B_codes.  Unix should
   have outgrown this crap years ago, but even POSIX wouldn't buck it.  */

#ifndef B19200
#define B19200 EXTA
#endif
#ifndef B38400
#define B38400 EXTB
#endif

static struct
{
  int rate, damn_b;
}
baudtab[] =
{
  {
    0, B0
  }
  ,
  {
    50, B50
  }
  ,
  {
    75, B75
  }
  ,
  {
    110, B110
  }
  ,
  {
    134, B134
  }
  ,
  {
    150, B150
  }
  ,
  {
    200, B200
  }
  ,
  {
    300, B300
  }
  ,
  {
    600, B600
  }
  ,
  {
    1200, B1200
  }
  ,
  {
    1800, B1800
  }
  ,
  {
    2400, B2400
  }
  ,
  {
    4800, B4800
  }
  ,
  {
    9600, B9600
  }
  ,
  {
    19200, B19200
  }
  ,
  {
    38400, B38400
  }
  ,
  {
    -1, -1
  }
  ,
};

static int
damn_b (rate)
     int rate;
{
  int i;

  for (i = 0; baudtab[i].rate != -1; i++)
    if (rate == baudtab[i].rate)
      return baudtab[i].damn_b;
  return B38400;		/* Random */
}


/***************************************************************** REMOTE_OPEN
** Open a connection to remote minimon.
   NAME is the filename used for communication, then a space,
   then the baud rate.
   'target adapt /dev/ttya 9600 [prognam]' for example.
 */

static char *dev_name;
int baudrate = 9600;
static void
mm_open (name, from_tty)
     char *name;
     int from_tty;
{
  TERMINAL sg;
  unsigned int prl;
  char *p;

  /* Find the first whitespace character, it separates dev_name from
     prog_name.  */
  for (p = name;
       p && *p && !isspace (*p); p++)
    ;
  if (p == 0 || *p == '\0')
  erroid:
    error ("Usage : <command> <serial-device> <baud-rate> [progname]");
  dev_name = (char *) xmalloc (p - name + 1);
  strncpy (dev_name, name, p - name);
  dev_name[p - name] = '\0';

  /* Skip over the whitespace after dev_name */
  for (; isspace (*p); p++)
    /*EMPTY */ ;

  if (1 != sscanf (p, "%d ", &baudrate))
    goto erroid;

  /* Skip the number and then the spaces */
  for (; isdigit (*p); p++)
    /*EMPTY */ ;
  for (; isspace (*p); p++)
    /*EMPTY */ ;

  if (prog_name != NULL)
    free (prog_name);
  prog_name = savestring (p, strlen (p));


  if (mm_desc >= 0)
    close (mm_desc);

  mm_desc = open (dev_name, O_RDWR);
  if (mm_desc < 0)
    perror_with_name (dev_name);
  ioctl (mm_desc, TIOCGETP, &sg);
#ifdef HAVE_TERMIO
  sg.c_cc[VMIN] = 0;		/* read with timeout.  */
  sg.c_cc[VTIME] = timeout * 10;
  sg.c_lflag &= ~(ICANON | ECHO);
  sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
#else
  sg.sg_ispeed = damn_b (baudrate);
  sg.sg_ospeed = damn_b (baudrate);
  sg.sg_flags |= RAW;
  sg.sg_flags |= ANYP;
  sg.sg_flags &= ~ECHO;
#endif


  ioctl (mm_desc, TIOCSETP, &sg);
  mm_stream = fdopen (mm_desc, "r+");

  push_target (&mm_ops);

#ifndef HAVE_TERMIO
#ifndef NO_SIGINTERRUPT
  /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
     the read.  */
  if (siginterrupt (SIGALRM, 1) != 0)
    perror ("mm_open: error in siginterrupt");
#endif

  /* Set up read timeout timer.  */
  if ((void (*)) signal (SIGALRM, mm_timer) == (void (*)) -1)
    perror ("mm_open: error in signal");
#endif

#if defined (LOG_FILE)
  log_file = fopen (LOG_FILE, "w");
  if (log_file == NULL)
    perror_with_name (LOG_FILE);
#endif
  /*
     ** Initialize target configuration structure (global)
   */
  DRAIN_INPUT ();
  out_msg_buf->config_req_msg.code = CONFIG_REQ;
  out_msg_buf->config_req_msg.length = 4 * 0;
  msg_send_serial (out_msg_buf);	/* send config request message */

  expect_msg (CONFIG, in_msg_buf, 1);

  a29k_get_processor_type ();

  /* Print out some stuff, letting the user now what's going on */
  printf_filtered ("Connected to MiniMon via %s.\n", dev_name);
  /* FIXME: can this restriction be removed? */
  printf_filtered ("Remote debugging using virtual addresses works only\n");
  printf_filtered ("\twhen virtual addresses map 1:1 to physical addresses.\n")
    ;
  if (processor_type != a29k_freeze_mode)
    {
      fprintf_filtered (gdb_stderr,
			"Freeze-mode debugging not available, and can only be done on an A29050.\n");
    }

  target_config.code = CONFIG;
  target_config.length = 0;
  target_config.processor_id = in_msg_buf->config_msg.processor_id;
  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_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_size = in_msg_buf->config_msg.D_mem_size;
  target_config.ROM_start = in_msg_buf->config_msg.ROM_start;
  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_bkpts = in_msg_buf->config_msg.max_bkpts;
  target_config.coprocessor = in_msg_buf->config_msg.coprocessor;
  target_config.reserved = in_msg_buf->config_msg.reserved;
  if (from_tty)
    {
      printf ("Connected to MiniMON :\n");
      printf ("    Debugcore version            %d.%d\n",
	      0x0f & (target_config.version >> 4),
	      0x0f & (target_config.version));
      printf ("    Configuration version        %d.%d\n",
	      0x0f & (target_config.version >> 12),
	      0x0f & (target_config.version >> 8));
      printf ("    Message system version       %d.%d\n",
	      0x0f & (target_config.version >> 20),
	      0x0f & (target_config.version >> 16));
      printf ("    Communication driver version %d.%d\n",
	      0x0f & (target_config.version >> 28),
	      0x0f & (target_config.version >> 24));
    }

  /* Leave the target running... 
   * The above message stopped the target in the dbg core (MiniMon),  
   * so restart the target out of MiniMon, 
   */
  out_msg_buf->go_msg.code = GO;
  out_msg_buf->go_msg.length = 0;
  msg_send_serial (out_msg_buf);
  /* No message to expect after a GO */
}

/**************************************************************** REMOTE_CLOSE
** Close the open connection to the minimon debugger.
   Use this when you want to detach and do something else
   with your gdb.  */
static void
mm_close (quitting)		/*FIXME: how is quitting used */
     int quitting;
{
  if (mm_desc < 0)
    error ("Can't close remote connection: not debugging remotely.");

  /* We should never get here if there isn't something valid in
     mm_desc and mm_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
     mm_desc.  */
  DRAIN_INPUT ();
  fclose (mm_stream);
  /* close (mm_desc); */

  /* Do not try to close mm_desc again, later in the program.  */
  mm_stream = NULL;
  mm_desc = -1;

#if defined (LOG_FILE)
  if (ferror (log_file))
    printf ("Error writing log file.\n");
  if (fclose (log_file) != 0)
    printf ("Error closing log file.\n");
#endif

  printf ("Ending remote debugging\n");
}

/************************************************************* REMOTE_ATACH */
/* Attach to a program that is already loaded and running 
 * Upon exiting the process's execution is stopped.
 */
static void
mm_attach (args, from_tty)
     char *args;
     int from_tty;
{

  if (!mm_stream)
    error ("MiniMon not opened yet, use the 'target minimon' command.\n");

  if (from_tty)
    printf ("Attaching to remote program %s...\n", prog_name);

  /* 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 
   *  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.length = 0;
  msg_send_serial (out_msg_buf);
  sleep (2);			/* At the worst it will stop, receive a message, continue */

  /* Send the mm a break. */
  out_msg_buf->break_msg.code = BREAK;
  out_msg_buf->break_msg.length = 0;
  msg_send_serial (out_msg_buf);
}
/********************************************************** REMOTE_DETACH */
/* Terminate the open connection to the remote debugger.
   Use this when you want to detach and do something else
   with your gdb.  Leave remote process running (with no breakpoints set). */
static void
mm_detach (args, from_tty)
     char *args;
     int from_tty;
{
  remove_breakpoints ();	/* Just in case there were any left in */
  out_msg_buf->go_msg.code = GO;
  out_msg_buf->go_msg.length = 0;
  msg_send_serial (out_msg_buf);
  pop_target ();		/* calls mm_close to do the real work */
}


/*************************************************************** REMOTE_RESUME
** Tell the remote machine to resume.  */

static void
mm_resume (pid, step, sig)
     int pid, step;
     enum target_signal sig;
{
  if (sig != TARGET_SIGNAL_0)
    warning ("Can't send signals to a remote MiniMon system.");

  if (step)
    {
      out_msg_buf->step_msg.code = STEP;
      out_msg_buf->step_msg.length = 1 * 4;
      out_msg_buf->step_msg.count = 1;	/* step 1 instruction */
      msg_send_serial (out_msg_buf);
    }
  else
    {
      out_msg_buf->go_msg.code = GO;
      out_msg_buf->go_msg.length = 0;
      msg_send_serial (out_msg_buf);
    }
}

/***************************************************************** REMOTE_WAIT
** Wait until the remote machine stops, then return,
   storing status in STATUS just as `wait' would.  */

static int
mm_wait (status)
     struct target_waitstatus *status;
{
  int i, result;
  int old_timeout = timeout;
  int old_immediate_quit = immediate_quit;

  status->kind = TARGET_WAITKIND_EXITED;
  status->value.integer = 0;

/* wait for message to arrive. It should be:
   - A HIF service request.
   - A HIF exit service request.
   - A CHANNEL0_ACK.
   - A CHANNEL1 request.
   - a debugcore HALT message.
   HIF services must be responded too, and while-looping continued.
   If the target stops executing, mm_wait() should return.
 */
  timeout = 0;			/* Wait indefinetly for a message */
  immediate_quit = 1;		/* Helps ability to QUIT */
  while (1)
    {
      while (msg_recv_serial (in_msg_buf))
	{
	  QUIT;			/* Let user quit if they want */
	}
      switch (in_msg_buf->halt_msg.code)
	{
	case HIF_CALL:
	  i = in_msg_buf->hif_call_rtn_msg.service_number;
	  result = service_HIF (in_msg_buf);
	  if (i == 1)		/* EXIT */
	    goto exit;
	  if (result)
	    printf ("Warning: failure during HIF service %d\n", i);
	  break;
	case CHANNEL0_ACK:
	  service_HIF (in_msg_buf);
	  break;
	case CHANNEL1:
	  i = in_msg_buf->channel1_msg.length;
	  in_msg_buf->channel1_msg.data[i] = '\0';
	  printf ("%s", in_msg_buf->channel1_msg.data);
	  gdb_flush (gdb_stdout);
	  /* Send CHANNEL1_ACK message */
	  out_msg_buf->channel1_ack_msg.code = CHANNEL1_ACK;
	  out_msg_buf->channel1_ack_msg.length = 0;
	  result = msg_send_serial (out_msg_buf);
	  break;
	case HALT:
	  goto halted;
	default:
	  goto halted;
	}
    }
halted:
  /* FIXME, these printfs should not be here.  This is a source level 
     debugger, guys!  */
  if (in_msg_buf->halt_msg.trap_number == 0)
    {
      printf ("Am290*0 received vector number %d (break point)\n",
	      in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
    }
  else if (in_msg_buf->halt_msg.trap_number == 1)
    {
      printf ("Am290*0 received vector number %d\n",
	      in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_BUS;
    }
  else if (in_msg_buf->halt_msg.trap_number == 3
	   || in_msg_buf->halt_msg.trap_number == 4)
    {
      printf ("Am290*0 received vector number %d\n",
	      in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_FPE;
    }
  else if (in_msg_buf->halt_msg.trap_number == 5)
    {
      printf ("Am290*0 received vector number %d\n",
	      in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_ILL;
    }
  else if (in_msg_buf->halt_msg.trap_number >= 6
	   && in_msg_buf->halt_msg.trap_number <= 11)
    {
      printf ("Am290*0 received vector number %d\n",
	      in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_SEGV;
    }
  else if (in_msg_buf->halt_msg.trap_number == 12
	   || in_msg_buf->halt_msg.trap_number == 13)
    {
      printf ("Am290*0 received vector number %d\n",
	      in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_ILL;
    }
  else if (in_msg_buf->halt_msg.trap_number == 14)
    {
      printf ("Am290*0 received vector number %d\n",
	      in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_ALRM;
    }
  else if (in_msg_buf->halt_msg.trap_number == 15)
    {
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
    }
  else if (in_msg_buf->halt_msg.trap_number >= 16
	   && in_msg_buf->halt_msg.trap_number <= 21)
    {
      printf ("Am290*0 received vector number %d\n",
	      in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_INT;
    }
  else if (in_msg_buf->halt_msg.trap_number == 22)
    {
      printf ("Am290*0 received vector number %d\n",
	      in_msg_buf->halt_msg.trap_number);
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_ILL;
    }				/* BREAK message was sent */
  else if (in_msg_buf->halt_msg.trap_number == 75)
    {
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
    }
  else
  exit:
    {
      status->kind = TARGET_WAITKIND_EXITED;
      status->value.integer = 0;
    }

  timeout = old_timeout;	/* Restore original timeout value */
  immediate_quit = old_immediate_quit;
  return 0;
}

/******************************************************* REMOTE_FETCH_REGISTERS
 * Read a remote register 'regno'. 
 * If regno==-1 then read all the registers.
 */
static void
mm_fetch_registers (regno)
     int regno;
{
  INT32 *data_p;

  if (regno >= 0)
    {
      fetch_register (regno);
      return;
    }

/* Gr1/rsp */
  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.address = 1;
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);
  supply_register (GR1_REGNUM, data_p);

#if defined(GR64_REGNUM)	/* Read gr64-127 */
/* Global Registers gr64-gr95 */
  out_msg_buf->read_req_msg.code = READ_REQ;
  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.memory_space = GLOBAL_REG;
  out_msg_buf->read_req_msg.address = 64;
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);

  for (regno = GR64_REGNUM; regno < GR64_REGNUM + 32; regno++)
    {
      supply_register (regno, data_p++);
    }
#endif /*  GR64_REGNUM */

/* Global Registers gr96-gr127 */
  out_msg_buf->read_req_msg.code = READ_REQ;
  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.memory_space = GLOBAL_REG;
  out_msg_buf->read_req_msg.address = 96;
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);

  for (regno = GR96_REGNUM; regno < GR96_REGNUM + 32; regno++)
    {
      supply_register (regno, data_p++);
    }

/* Local Registers */
  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.address = 0;
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);

  for (regno = LR0_REGNUM; regno < LR0_REGNUM + 128; regno++)
    {
      supply_register (regno, data_p++);
    }

/* Protected Special Registers */
  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.address = 0;
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);

  for (regno = 0; regno <= 14; regno++)
    {
      supply_register (SR_REGNUM (regno), data_p++);
    }
  if (USE_SHADOW_PC)
    {				/* Let regno_to_srnum() handle the register number */
      fetch_register (NPC_REGNUM);
      fetch_register (PC_REGNUM);
      fetch_register (PC2_REGNUM);
    }

/* Unprotected Special Registers */
  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.address = 128;
  msg_send_serial (out_msg_buf);
  expect_msg (READ_ACK, in_msg_buf, 1);
  data_p = &(in_msg_buf->read_r_ack_msg.data[0]);

  for (regno = 128; regno <= 135; regno++)
    {
      supply_register (SR_REGNUM (regno), data_p++);
    }

  /* There doesn't seem to be any way to get these.  */
  {
    int val = -1;
    supply_register (FPE_REGNUM, &val);
    supply_register (INTE_REGNUM, &val);
    supply_register (FPS_REGNUM, &val);
    supply_register (EXO_REGNUM, &val);
  }
}


/****************************************************** REMOTE_STORE_REGISTERS
 * Store register regno into the target.  
 * If regno==-1 then store all the registers.
 * Result is 0 for success, -1 for failure.
 */

static void
mm_store_registers (regno)
     int regno;
{
  int result;

  if (regno >= 0)
    {
      store_register (regno);
      return;
    }

  result = 0;

  out_msg_buf->write_r_msg.code = WRITE_REQ;

/* Gr1/rsp */
  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.memory_space = GLOBAL_REG;
  out_msg_buf->write_r_msg.address = 1;
  out_msg_buf->write_r_msg.data[0] = read_register (GR1_REGNUM);

  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
      result = -1;
    }

#if defined(GR64_REGNUM)
/* Global registers gr64-gr95 */
  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.address = 64;

  for (regno = GR64_REGNUM; regno < GR64_REGNUM + 32; regno++)
    {
      out_msg_buf->write_r_msg.data[regno - GR64_REGNUM] = read_register (regno);
    }
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
      result = -1;
    }
#endif /* GR64_REGNUM */

/* Global registers gr96-gr127 */
  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.address = 96;
  for (regno = GR96_REGNUM; regno < GR96_REGNUM + 32; regno++)
    {
      out_msg_buf->write_r_msg.data[regno - GR96_REGNUM] = read_register (regno);
    }
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
      result = -1;
    }

/* Local Registers */
  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.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.address = 0;

  for (regno = LR0_REGNUM; regno < LR0_REGNUM + 128; regno++)
    {
      out_msg_buf->write_r_msg.data[regno - LR0_REGNUM] = read_register (regno);
    }
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
      result = -1;
    }

/* Protected Special Registers */
  /* VAB through TMR */
  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.length = 3 * 4 + out_msg_buf->write_r_msg.byte_count;
  out_msg_buf->write_r_msg.address = 0;
  for (regno = 0; regno <= 9; regno++)	/* VAB through TMR */
    out_msg_buf->write_r_msg.data[regno] = read_register (SR_REGNUM (regno));
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
      result = -1;
    }

  /* PC0, PC1, PC2 possibly as shadow registers */
  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;
  for (regno = 10; regno <= 12; regno++)	/* LRU and MMU */
    out_msg_buf->write_r_msg.data[regno - 10] = read_register (SR_REGNUM (regno));
  if (USE_SHADOW_PC)
    out_msg_buf->write_r_msg.address = 20;	/* SPC0 */
  else
    out_msg_buf->write_r_msg.address = 10;	/* PC0 */
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
      result = -1;
    }

  /* LRU and MMU */
  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.address = 13;
  for (regno = 13; regno <= 14; regno++)	/* LRU and MMU */
    out_msg_buf->write_r_msg.data[regno - 13] = read_register (SR_REGNUM (regno));
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
      result = -1;
    }

/* Unprotected Special Registers */
  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.address = 128;
  for (regno = 128; regno <= 135; regno++)
    out_msg_buf->write_r_msg.data[regno - 128] = read_register (SR_REGNUM (regno));
  msg_send_serial (out_msg_buf);
  if (!expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
      result = -1;
    }

  registers_changed ();
}

/*************************************************** REMOTE_PREPARE_TO_STORE */
/* Get ready to modify the registers array.  On machines which store
   individual registers, this doesn't need to do anything.  On machines
   which store all the registers in one fell swoop, this makes sure
   that registers contains all the registers from the program being
   debugged.  */

static void
mm_prepare_to_store ()
{
  /* Do nothing, since we can store individual regs */
}

/******************************************************* REMOTE_XFER_MEMORY */
static CORE_ADDR
translate_addr (addr)
     CORE_ADDR addr;
{
#if defined(KERNEL_DEBUGGING)
  /* Check for a virtual address in the kernel */
  /* Assume physical address of ublock is in  paddr_u register */
  /* FIXME: doesn't work for user virtual addresses */
  if (addr >= UVADDR)
    {
      /* PADDR_U register holds the physical address of the ublock */
      CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM);
      return (i + addr - (CORE_ADDR) UVADDR);
    }
  else
    {
      return (addr);
    }
#else
  return (addr);
#endif
}

/******************************************************* REMOTE_FILES_INFO */
static void
mm_files_info ()
{
  printf ("\tAttached to %s at %d baud and running program %s.\n",
	  dev_name, baudrate, prog_name);
}

/************************************************* REMOTE_INSERT_BREAKPOINT */
static int
mm_insert_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     char *contents_cache;
{
  out_msg_buf->bkpt_set_msg.code = BKPT_SET;
  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.bkpt_addr = (ADDR32) addr;
  out_msg_buf->bkpt_set_msg.pass_count = 1;
  out_msg_buf->bkpt_set_msg.bkpt_type = -1;	/* use illop for 29000 */
  msg_send_serial (out_msg_buf);
  if (expect_msg (BKPT_SET_ACK, in_msg_buf, 1))
    {
      return 0;			/* Success */
    }
  else
    {
      return 1;			/* Failure */
    }
}

/************************************************* REMOTE_DELETE_BREAKPOINT */
static int
mm_remove_breakpoint (addr, contents_cache)
     CORE_ADDR addr;
     char *contents_cache;
{
  out_msg_buf->bkpt_rm_msg.code = BKPT_RM;
  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.bkpt_addr = (ADDR32) addr;
  msg_send_serial (out_msg_buf);
  if (expect_msg (BKPT_RM_ACK, in_msg_buf, 1))
    {
      return 0;			/* Success */
    }
  else
    {
      return 1;			/* Failure */
    }
}


/******************************************************* REMOTE_KILL */
static void
mm_kill (arg, from_tty)
     char *arg;
     int from_tty;
{
  char buf[4];

#if defined(KERNEL_DEBUGGING)
  /* We don't ever kill the kernel */
  if (from_tty)
    {
      printf ("Kernel not killed, but left in current state.\n");
      printf ("Use detach to leave kernel running.\n");
    }
#else
  out_msg_buf->break_msg.code = BREAK;
  out_msg_buf->bkpt_set_msg.length = 4 * 0;
  expect_msg (HALT, in_msg_buf, from_tty);
  if (from_tty)
    {
      printf ("Target has been stopped.");
      printf ("Would you like to do a hardware reset (y/n) [n] ");
      fgets (buf, 3, stdin);
      if (buf[0] == 'y')
	{
	  out_msg_buf->reset_msg.code = RESET;
	  out_msg_buf->bkpt_set_msg.length = 4 * 0;
	  expect_msg (RESET_ACK, in_msg_buf, from_tty);
	  printf ("Target has been reset.");
	}
    }
  pop_target ();
#endif
}



/***************************************************************************/
/* 
 * Load a program into the target.
 */
static void
mm_load (arg_string, from_tty)
     char *arg_string;
     int from_tty;
{
  dont_repeat ();

#if defined(KERNEL_DEBUGGING)
  printf ("The kernel had better be loaded already!  Loading not done.\n");
#else
  if (arg_string == 0)
    error ("The load command takes a file name");

  arg_string = tilde_expand (arg_string);
  make_cleanup (free, arg_string);
  QUIT;
  immediate_quit++;
  error ("File loading is not yet supported for MiniMon.");
  /* FIXME, code to load your file here... */
  /* You may need to do an init_target_mm() */
  /* init_target_mm(?,?,?,?,?,?,?,?); */
  immediate_quit--;
  /* symbol_file_add (arg_string, from_tty, text_addr, 0, 0); */
#endif

}

/************************************************ REMOTE_WRITE_INFERIOR_MEMORY
** Copy LEN bytes of data from debugger memory at MYADDR
   to inferior's memory at MEMADDR.  Returns number of bytes written.  */
static int
mm_write_inferior_memory (memaddr, myaddr, len)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
{
  int i, nwritten;

  out_msg_buf->write_req_msg.code = WRITE_REQ;
  out_msg_buf->write_req_msg.memory_space = mm_memory_space (memaddr);

  nwritten = 0;
  while (nwritten < len)
    {
      int num_to_write = len - nwritten;
      if (num_to_write > MAXDATA)
	num_to_write = MAXDATA;
      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.byte_count = num_to_write;
      out_msg_buf->write_req_msg.length = 3 * 4 + num_to_write;
      out_msg_buf->write_req_msg.address = memaddr + nwritten;
      msg_send_serial (out_msg_buf);

      if (expect_msg (WRITE_ACK, in_msg_buf, 1))
	{
	  nwritten += in_msg_buf->write_ack_msg.byte_count;
	}
      else
	{
	  break;
	}
    }
  return (nwritten);
}

/************************************************* REMOTE_READ_INFERIOR_MEMORY
** Read LEN bytes from inferior memory at MEMADDR.  Put the result
   at debugger address MYADDR.  Returns number of bytes read.  */
static int
mm_read_inferior_memory (memaddr, myaddr, len)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
{
  int i, nread;

  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.memory_space = mm_memory_space (memaddr);

  nread = 0;
  while (nread < len)
    {
      int num_to_read = (len - nread);
      if (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.length = 3 * 4 + num_to_read;
      out_msg_buf->read_req_msg.address = memaddr + nread;
      msg_send_serial (out_msg_buf);

      if (expect_msg (READ_ACK, in_msg_buf, 1))
	{
	  for (i = 0; i < in_msg_buf->read_ack_msg.byte_count; i++)
	    myaddr[i + nread] = in_msg_buf->read_ack_msg.data[i];
	  nread += in_msg_buf->read_ack_msg.byte_count;
	}
      else
	{
	  break;
	}
    }
  return (nread);
}

/* FIXME!  Merge these two.  */
static int
mm_xfer_inferior_memory (memaddr, myaddr, len, write)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
     int write;
{

  memaddr = translate_addr (memaddr);

  if (write)
    return mm_write_inferior_memory (memaddr, myaddr, len);
  else
    return mm_read_inferior_memory (memaddr, myaddr, len);
}


/********************************************************** MSG_SEND_SERIAL
** This function is used to send a message over the
** serial line.
**
** If the message is successfully sent, a zero is
** returned.  If the message was not sendable, a -1
** is returned.  This function blocks.  That is, it
** does not return until the message is completely
** sent, or until an error is encountered.
**
*/

int
msg_send_serial (msg_ptr)
     union msg_t *msg_ptr;
{
  INT32 message_size;
  int byte_count;
  int result;
  char c;

  /* Send message header */
  byte_count = 0;
  message_size = msg_ptr->generic_msg.length + (2 * sizeof (INT32));
  do
    {
      c = *((char *) msg_ptr + byte_count);
      result = write (mm_desc, &c, 1);
      if (result == 1)
	{
	  byte_count = byte_count + 1;
	}
    }
  while ((byte_count < message_size));

  return (0);
}				/* end msg_send_serial() */

/********************************************************** MSG_RECV_SERIAL
** This function is used to receive a message over a
** serial line.
**
** If the message is waiting in the buffer, a zero is
** returned and the buffer pointed to by msg_ptr is filled
** in.  If no message was available, a -1 is returned.
** If timeout==0, wait indefinetly for a character.
**
*/

int
msg_recv_serial (msg_ptr)
     union msg_t *msg_ptr;
{
  static INT32 length = 0;
  static INT32 byte_count = 0;
  int result;
  char c;
  if (msg_ptr == 0)		/* re-sync request */
    {
      length = 0;
      byte_count = 0;
#ifdef HAVE_TERMIO
      /* The timeout here is the prevailing timeout set with VTIME */
      ->"timeout==0 semantics not supported"
	read (mm_desc, in_buf, BUFER_SIZE);
#else
      alarm (1);
      read (mm_desc, in_buf, BUFER_SIZE);
      alarm (0);
#endif
      return (0);
    }
  /* Receive message */
#ifdef HAVE_TERMIO
/* Timeout==0, help support the mm_wait() routine */
  ->"timeout==0 semantics not supported (and its nice if they are)"
    result = read (mm_desc, &c, 1);
#else
  alarm (timeout);
  result = read (mm_desc, &c, 1);
  alarm (0);
#endif
  if (result < 0)
    {
      if (errno == EINTR)
	{
	  error ("Timeout reading from remote system.");
	}
      else
	perror_with_name ("remote");
    }
  else if (result == 1)
    {
      *((char *) msg_ptr + byte_count) = c;
      byte_count = byte_count + 1;
    }

  /* Message header received.  Save message length. */
  if (byte_count == (2 * sizeof (INT32)))
    length = msg_ptr->generic_msg.length;

  if (byte_count >= (length + (2 * sizeof (INT32))))
    {
      /* Message received */
      byte_count = 0;
      return (0);
    }
  else
    return (-1);

}				/* end msg_recv_serial() */

/********************************************************************* KBD_RAW
** This function is used to put the keyboard in "raw"
** mode for BSD Unix.  The original status is saved
** so that it may be restored later.
*/
TERMINAL kbd_tbuf;

int
kbd_raw ()
{
  int result;
  TERMINAL tbuf;

  /* Get keyboard termio (to save to restore original modes) */
#ifdef HAVE_TERMIO
  result = ioctl (0, TCGETA, &kbd_tbuf);
#else
  result = ioctl (0, TIOCGETP, &kbd_tbuf);
#endif
  if (result == -1)
    return (errno);

  /* Get keyboard TERMINAL (for modification) */
#ifdef HAVE_TERMIO
  result = ioctl (0, TCGETA, &tbuf);
#else
  result = ioctl (0, TIOCGETP, &tbuf);
#endif
  if (result == -1)
    return (errno);

  /* Set up new parameters */
#ifdef HAVE_TERMIO
  tbuf.c_iflag = tbuf.c_iflag &
    ~(INLCR | ICRNL | IUCLC | ISTRIP | IXON | BRKINT);
  tbuf.c_lflag = tbuf.c_lflag & ~(ICANON | ISIG | ECHO);
  tbuf.c_cc[4] = 0;		/* MIN */
  tbuf.c_cc[5] = 0;		/* TIME */
#else
  /* FIXME: not sure if this is correct (matches HAVE_TERMIO). */
  tbuf.sg_flags |= RAW;
  tbuf.sg_flags |= ANYP;
  tbuf.sg_flags &= ~ECHO;
#endif

  /* Set keyboard termio to new mode (RAW) */
#ifdef HAVE_TERMIO
  result = ioctl (0, TCSETAF, &tbuf);
#else
  result = ioctl (0, TIOCSETP, &tbuf);
#endif
  if (result == -1)
    return (errno);

  return (0);
}				/* end kbd_raw() */



/***************************************************************** KBD_RESTORE
** This function is used to put the keyboard back in the
** mode it was in before kbk_raw was called.  Note that
** kbk_raw() must have been called at least once before
** kbd_restore() is called.
*/

int
kbd_restore ()
{
  int result;

  /* Set keyboard termio to original mode */
#ifdef HAVE_TERMIO
  result = ioctl (0, TCSETAF, &kbd_tbuf);
#else
  result = ioctl (0, TIOCGETP, &kbd_tbuf);
#endif

  if (result == -1)
    return (errno);

  return (0);
}				/* end kbd_cooked() */


/*****************************************************************************/
/* Fetch a single register indicatated by 'regno'. 
 * Returns 0/-1 on success/failure.  
 */
static int
fetch_register (regno)
     int regno;
{
  int result;
  out_msg_buf->read_req_msg.code = READ_REQ;
  out_msg_buf->read_req_msg.length = 4 * 3;
  out_msg_buf->read_req_msg.byte_count = 4;

  if (regno == GR1_REGNUM)
    {
      out_msg_buf->read_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->read_req_msg.address = 1;
    }
  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.address = (regno - GR96_REGNUM) + 96;
    }
#if defined(GR64_REGNUM)
  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.address = (regno - GR64_REGNUM) + 64;
    }
#endif /* GR64_REGNUM */
  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.address = (regno - LR0_REGNUM);
    }
  else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
    {
      int val = -1;
      supply_register (160 + (regno - FPE_REGNUM), &val);
      return 0;			/* Pretend Success */
    }
  else
    {
      out_msg_buf->read_req_msg.memory_space = SPECIAL_REG;
      out_msg_buf->read_req_msg.address = regnum_to_srnum (regno);
    }

  msg_send_serial (out_msg_buf);

  if (expect_msg (READ_ACK, in_msg_buf, 1))
    {
      supply_register (regno, &(in_msg_buf->read_r_ack_msg.data[0]));
      result = 0;
    }
  else
    {
      result = -1;
    }
  return result;
}
/*****************************************************************************/
/* Store a single register indicated by 'regno'. 
 * Returns 0/-1 on success/failure.  
 */
static int
store_register (regno)
     int regno;
{
  int result;

  out_msg_buf->write_req_msg.code = WRITE_REQ;
  out_msg_buf->write_req_msg.length = 4 * 4;
  out_msg_buf->write_req_msg.byte_count = 4;
  out_msg_buf->write_r_msg.data[0] = read_register (regno);

  if (regno == GR1_REGNUM)
    {
      out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->write_req_msg.address = 1;
      /* Setting GR1 changes the numbers of all the locals, so invalidate the 
       * register cache.  Do this *after* calling read_register, because we want 
       * read_register to return the value that write_register has just stuffed 
       * into the registers array, not the value of the register fetched from 
       * the inferior.  
       */
      registers_changed ();
    }
#if defined(GR64_REGNUM)
  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
    {
      out_msg_buf->write_req_msg.memory_space = GLOBAL_REG;
      out_msg_buf->write_req_msg.address = (regno - GR64_REGNUM) + 64;
    }
#endif /* GR64_REGNUM */
  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.address = (regno - GR96_REGNUM) + 96;
    }
  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.address = (regno - LR0_REGNUM);
    }
  else if (regno >= FPE_REGNUM && regno <= EXO_REGNUM)
    {
      return 0;			/* Pretend Success */
    }
  else
    /* An unprotected or protected special register */
    {
      out_msg_buf->write_req_msg.memory_space = SPECIAL_REG;
      out_msg_buf->write_req_msg.address = regnum_to_srnum (regno);
    }

  msg_send_serial (out_msg_buf);

  if (expect_msg (WRITE_ACK, in_msg_buf, 1))
    {
      result = 0;
    }
  else
    {
      result = -1;
    }
  return result;
}
/****************************************************************************/
/* 
 * Convert a gdb special register number to a 29000 special register number.
 */
static int
regnum_to_srnum (regno)
     int regno;
{
  switch (regno)
    {
    case VAB_REGNUM:
      return (0);
    case OPS_REGNUM:
      return (1);
    case CPS_REGNUM:
      return (2);
    case CFG_REGNUM:
      return (3);
    case CHA_REGNUM:
      return (4);
    case CHD_REGNUM:
      return (5);
    case CHC_REGNUM:
      return (6);
    case RBP_REGNUM:
      return (7);
    case TMC_REGNUM:
      return (8);
    case TMR_REGNUM:
      return (9);
    case NPC_REGNUM:
      return (USE_SHADOW_PC ? (20) : (10));
    case PC_REGNUM:
      return (USE_SHADOW_PC ? (21) : (11));
    case PC2_REGNUM:
      return (USE_SHADOW_PC ? (22) : (12));
    case MMU_REGNUM:
      return (13);
    case LRU_REGNUM:
      return (14);
    case IPC_REGNUM:
      return (128);
    case IPA_REGNUM:
      return (129);
    case IPB_REGNUM:
      return (130);
    case Q_REGNUM:
      return (131);
    case ALU_REGNUM:
      return (132);
    case BP_REGNUM:
      return (133);
    case FC_REGNUM:
      return (134);
    case CR_REGNUM:
      return (135);
    case FPE_REGNUM:
      return (160);
    case INTE_REGNUM:
      return (161);
    case FPS_REGNUM:
      return (162);
    case EXO_REGNUM:
      return (164);
    default:
      return (255);		/* Failure ? */
    }
}
/****************************************************************************/
/* 
 * Initialize the target debugger (minimon only).
 */
static void
init_target_mm (tstart, tend, dstart, dend, entry, ms_size, rs_size, arg_start)
     ADDR32 tstart, tend, dstart, dend, entry;
     INT32 ms_size, rs_size;
     ADDR32 arg_start;
{
  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.text_start = tstart;
  out_msg_buf->init_msg.text_end = tend;
  out_msg_buf->init_msg.data_start = dstart;
  out_msg_buf->init_msg.data_end = dend;
  out_msg_buf->init_msg.entry_point = entry;
  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.arg_start = arg_start;
  msg_send_serial (out_msg_buf);
  expect_msg (INIT_ACK, in_msg_buf, 1);
}
/****************************************************************************/
/* 
 * Return a pointer to a string representing the given message code.
 * Not all messages are represented here, only the ones that we expect
 * to be called with.
 */
static char *
msg_str (code)
     INT32 code;
{
  static char cbuf[32];

  switch (code)
    {
    case BKPT_SET_ACK:
      sprintf (cbuf, "%s (%d)", "BKPT_SET_ACK", code);
      break;
    case BKPT_RM_ACK:
      sprintf (cbuf, "%s (%d)", "BKPT_RM_ACK", code);
      break;
    case INIT_ACK:
      sprintf (cbuf, "%s (%d)", "INIT_ACK", code);
      break;
    case READ_ACK:
      sprintf (cbuf, "%s (%d)", "READ_ACK", code);
      break;
    case WRITE_ACK:
      sprintf (cbuf, "%s (%d)", "WRITE_ACK", code);
      break;
    case ERROR:
      sprintf (cbuf, "%s (%d)", "ERROR", code);
      break;
    case HALT:
      sprintf (cbuf, "%s (%d)", "HALT", code);
      break;
    default:
      sprintf (cbuf, "UNKNOWN (%d)", code);
      break;
    }
  return (cbuf);
}
/****************************************************************************/
/*
 * Selected (not all of them) error codes that we might get.
 */
static char *
error_msg_str (code)
     INT32 code;
{
  static char cbuf[50];

  switch (code)
    {
    case EMFAIL:
      return ("EMFAIL: unrecoverable error");
    case EMBADADDR:
      return ("EMBADADDR: Illegal address");
    case EMBADREG:
      return ("EMBADREG: Illegal register ");
    case EMACCESS:
      return ("EMACCESS: Could not access memory");
    case EMBADMSG:
      return ("EMBADMSG: Unknown message type");
    case EMMSG2BIG:
      return ("EMMSG2BIG: Message to large");
    case EMNOSEND:
      return ("EMNOSEND: Could not send message");
    case EMNORECV:
      return ("EMNORECV: Could not recv message");
    case EMRESET:
      return ("EMRESET: Could not RESET target");
    case EMCONFIG:
      return ("EMCONFIG: Could not get target CONFIG");
    case EMSTATUS:
      return ("EMSTATUS: Could not get target STATUS");
    case EMREAD:
      return ("EMREAD: Could not READ target memory");
    case EMWRITE:
      return ("EMWRITE: Could not WRITE target memory");
    case EMBKPTSET:
      return ("EMBKPTSET: Could not set breakpoint");
    case EMBKPTRM:
      return ("EMBKPTRM: Could not remove breakpoint");
    case EMBKPTSTAT:
      return ("EMBKPTSTAT: Could not get breakpoint status");
    case EMBKPTNONE:
      return ("EMBKPTNONE: All breakpoints in use");
    case EMBKPTUSED:
      return ("EMBKPTUSED: Breakpoints already in use");
    case EMINIT:
      return ("EMINIT: Could not init target memory");
    case EMGO:
      return ("EMGO: Could not start execution");
    case EMSTEP:
      return ("EMSTEP: Could not single step");
    case EMBREAK:
      return ("EMBREAK: Could not BREAK");
    case EMCOMMERR:
      return ("EMCOMMERR: Communication error");
    default:
      sprintf (cbuf, "error number %d", code);
      break;
    }				/* end switch */

  return (cbuf);
}
/****************************************************************************/
/* 
 *  Receive a message and expect it to be of type msgcode.
 *  Returns 0/1 on failure/success.
 */
static int
expect_msg (msgcode, msg_buf, from_tty)
     INT32 msgcode;		/* Msg code we expect */
     union msg_t *msg_buf;	/* Where to put  the message received */
     int from_tty;		/* Print message on error if non-zero */
{
  int retries = 0;
  while (msg_recv_serial (msg_buf) && (retries++ < MAX_RETRIES));
  if (retries >= MAX_RETRIES)
    {
      printf ("Expected msg %s, ", msg_str (msgcode));
      printf ("no message received!\n");
      return (0);		/* Failure */
    }

  if (msg_buf->generic_msg.code != msgcode)
    {
      if (from_tty)
	{
	  printf ("Expected msg %s, ", msg_str (msgcode));
	  printf ("got msg %s\n", msg_str (msg_buf->generic_msg.code));
	  if (msg_buf->generic_msg.code == ERROR)
	    printf ("%s\n", error_msg_str (msg_buf->error_msg.error_code));
	}
      return (0);		/* Failure */
    }
  return (1);			/* Success */
}
/****************************************************************************/
/*
 * Determine the MiniMon memory space qualifier based on the addr. 
 * FIXME: Can't distinguis I_ROM/D_ROM.  
 * FIXME: Doesn't know anything about I_CACHE/D_CACHE.
 */
static int
mm_memory_space (addr)
     CORE_ADDR *addr;
{
  ADDR32 tstart = target_config.I_mem_start;
  ADDR32 tend = tstart + target_config.I_mem_size;
  ADDR32 dstart = target_config.D_mem_start;
  ADDR32 dend = tstart + target_config.D_mem_size;
  ADDR32 rstart = target_config.ROM_start;
  ADDR32 rend = tstart + target_config.ROM_size;

  if (((ADDR32) addr >= tstart) && ((ADDR32) addr < tend))
    {
      return I_MEM;
    }
  else if (((ADDR32) addr >= dstart) && ((ADDR32) addr < dend))
    {
      return D_MEM;
    }
  else if (((ADDR32) addr >= rstart) && ((ADDR32) addr < rend))
    {
      /* FIXME: how do we determine between D_ROM and I_ROM */
      return D_ROM;
    }
  else				/* FIXME: what do me do now? */
    return D_MEM;		/* Hmmm! */
}

/****************************************************************************/
/* 
 *  Define the target subroutine names
 */
struct target_ops mm_ops;

static void
init_mm_ops (void)
{
  mm_ops.to_shortname = "minimon";
  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_open = mm_open;
  mm_ops.to_close = mm_close;
  mm_ops.to_attach = mm_attach;
  mm_ops.to_post_attach = NULL;
  mm_ops.to_require_attach = NULL;
  mm_ops.to_detach = mm_detach;
  mm_ops.to_require_detach = NULL;
  mm_ops.to_resume = mm_resume;
  mm_ops.to_wait = mm_wait;
  mm_ops.to_post_wait = NULL;
  mm_ops.to_fetch_registers = mm_fetch_registers;
  mm_ops.to_store_registers = mm_store_registers;
  mm_ops.to_prepare_to_store = mm_prepare_to_store;
  mm_ops.to_xfer_memory = mm_xfer_inferior_memory;
  mm_ops.to_files_info = mm_files_info;
  mm_ops.to_insert_breakpoint = mm_insert_breakpoint;
  mm_ops.to_remove_breakpoint = mm_remove_breakpoint;
  mm_ops.to_terminal_init = 0;
  mm_ops.to_terminal_inferior = 0;
  mm_ops.to_terminal_ours_for_output = 0;
  mm_ops.to_terminal_ours = 0;
  mm_ops.to_terminal_info = 0;
  mm_ops.to_kill = mm_kill;
  mm_ops.to_load = mm_load;
  mm_ops.to_lookup_symbol = 0;
  mm_ops.to_create_inferior = mm_create_inferior;
  mm_ops.to_post_startup_inferior = NULL;
  mm_ops.to_acknowledge_created_inferior = NULL;
  mm_ops.to_clone_and_follow_inferior = NULL;
  mm_ops.to_post_follow_inferior_by_clone = NULL;
  mm_ops.to_insert_fork_catchpoint = NULL;
  mm_ops.to_remove_fork_catchpoint = NULL;
  mm_ops.to_insert_vfork_catchpoint = NULL;
  mm_ops.to_remove_vfork_catchpoint = NULL;
  mm_ops.to_has_forked = NULL;
  mm_ops.to_has_vforked = NULL;
  mm_ops.to_can_follow_vfork_prior_to_exec = NULL;
  mm_ops.to_post_follow_vfork = NULL;
  mm_ops.to_insert_exec_catchpoint = NULL;
  mm_ops.to_remove_exec_catchpoint = NULL;
  mm_ops.to_has_execd = NULL;
  mm_ops.to_reported_exec_events_per_exec_call = NULL;
  mm_ops.to_has_exited = NULL;
  mm_ops.to_mourn_inferior = mm_mourn;
  mm_ops.to_can_run = 0;
  mm_ops.to_notice_signals = 0;
  mm_ops.to_thread_alive = 0;
  mm_ops.to_stop = 0;
  mm_ops.to_pid_to_exec_file = NULL;
  mm_ops.to_core_file_to_sym_file = NULL;
  mm_ops.to_stratum = process_stratum;
  mm_ops.DONT_USE = 0;
  mm_ops.to_has_all_memory = 1;
  mm_ops.to_has_memory = 1;
  mm_ops.to_has_stack = 1;
  mm_ops.to_has_registers = 1;
  mm_ops.to_has_execution = 1;
  mm_ops.to_sections = 0;
  mm_ops.to_sections_end = 0;
  mm_ops.to_magic = OPS_MAGIC;
};

void
_initialize_remote_mm ()
{
  init_mm_ops ();
  add_target (&mm_ops);
}

#ifdef NO_HIF_SUPPORT
service_HIF (msg)
     union msg_t *msg;
{
  return (0);			/* Emulate a failure */
}
#endif
