/* 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 "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
