/* Functions specific to running gdb native on an ns32k running NetBSD
   Copyright 1989, 1992, 1993, 1994, 1996, 1998, 1999, 2000, 2001
   Free Software Foundation, Inc.

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

#include <sys/types.h>
#include <sys/ptrace.h>
#include <machine/reg.h>
#include <machine/frame.h>
#include <machine/pcb.h>

#include "defs.h"
#include "inferior.h"
#include "target.h"
#include "gdbcore.h"
#include "regcache.h"

#define RF(dst, src) \
	memcpy(&deprecated_registers[DEPRECATED_REGISTER_BYTE(dst)], &src, sizeof(src))

#define RS(src, dst) \
	memcpy(&dst, &deprecated_registers[DEPRECATED_REGISTER_BYTE(src)], sizeof(dst))

void
fetch_inferior_registers (int regno)
{
  struct reg inferior_registers;
  struct fpreg inferior_fpregisters;

  ptrace (PT_GETREGS, PIDGET (inferior_ptid),
	  (PTRACE_ARG3_TYPE) & inferior_registers, 0);
  ptrace (PT_GETFPREGS, PIDGET (inferior_ptid),
	  (PTRACE_ARG3_TYPE) & inferior_fpregisters, 0);

  RF (R0_REGNUM + 0, inferior_registers.r_r0);
  RF (R0_REGNUM + 1, inferior_registers.r_r1);
  RF (R0_REGNUM + 2, inferior_registers.r_r2);
  RF (R0_REGNUM + 3, inferior_registers.r_r3);
  RF (R0_REGNUM + 4, inferior_registers.r_r4);
  RF (R0_REGNUM + 5, inferior_registers.r_r5);
  RF (R0_REGNUM + 6, inferior_registers.r_r6);
  RF (R0_REGNUM + 7, inferior_registers.r_r7);

  RF (SP_REGNUM, inferior_registers.r_sp);
  RF (DEPRECATED_FP_REGNUM, inferior_registers.r_fp);
  RF (PC_REGNUM, inferior_registers.r_pc);
  RF (PS_REGNUM, inferior_registers.r_psr);

  RF (FPS_REGNUM, inferior_fpregisters.r_fsr);
  RF (FP0_REGNUM + 0, inferior_fpregisters.r_freg[0]);
  RF (FP0_REGNUM + 2, inferior_fpregisters.r_freg[2]);
  RF (FP0_REGNUM + 4, inferior_fpregisters.r_freg[4]);
  RF (FP0_REGNUM + 6, inferior_fpregisters.r_freg[6]);
  RF (LP0_REGNUM + 1, inferior_fpregisters.r_freg[1]);
  RF (LP0_REGNUM + 3, inferior_fpregisters.r_freg[3]);
  RF (LP0_REGNUM + 5, inferior_fpregisters.r_freg[5]);
  RF (LP0_REGNUM + 7, inferior_fpregisters.r_freg[7]);
  deprecated_registers_fetched ();
}

void
store_inferior_registers (int regno)
{
  struct reg inferior_registers;
  struct fpreg inferior_fpregisters;

  RS (R0_REGNUM + 0, inferior_registers.r_r0);
  RS (R0_REGNUM + 1, inferior_registers.r_r1);
  RS (R0_REGNUM + 2, inferior_registers.r_r2);
  RS (R0_REGNUM + 3, inferior_registers.r_r3);
  RS (R0_REGNUM + 4, inferior_registers.r_r4);
  RS (R0_REGNUM + 5, inferior_registers.r_r5);
  RS (R0_REGNUM + 6, inferior_registers.r_r6);
  RS (R0_REGNUM + 7, inferior_registers.r_r7);

  RS (SP_REGNUM, inferior_registers.r_sp);
  RS (DEPRECATED_FP_REGNUM, inferior_registers.r_fp);
  RS (PC_REGNUM, inferior_registers.r_pc);
  RS (PS_REGNUM, inferior_registers.r_psr);

  RS (FPS_REGNUM, inferior_fpregisters.r_fsr);
  RS (FP0_REGNUM + 0, inferior_fpregisters.r_freg[0]);
  RS (FP0_REGNUM + 2, inferior_fpregisters.r_freg[2]);
  RS (FP0_REGNUM + 4, inferior_fpregisters.r_freg[4]);
  RS (FP0_REGNUM + 6, inferior_fpregisters.r_freg[6]);
  RS (LP0_REGNUM + 1, inferior_fpregisters.r_freg[1]);
  RS (LP0_REGNUM + 3, inferior_fpregisters.r_freg[3]);
  RS (LP0_REGNUM + 5, inferior_fpregisters.r_freg[5]);
  RS (LP0_REGNUM + 7, inferior_fpregisters.r_freg[7]);

  ptrace (PT_SETREGS, PIDGET (inferior_ptid),
	  (PTRACE_ARG3_TYPE) & inferior_registers, 0);
  ptrace (PT_SETFPREGS, PIDGET (inferior_ptid),
	  (PTRACE_ARG3_TYPE) & inferior_fpregisters, 0);
}


/* XXX - Add this to machine/regs.h instead? */
struct coreregs
{
  struct reg intreg;
  struct fpreg freg;
};

/* Get registers from a core file.  REG_ADDR is unused.  */
static void
fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
		      unsigned int reg_addr)
{
  struct coreregs *core_reg;

  core_reg = (struct coreregs *) core_reg_sect;

  /*
   * We have *all* registers
   * in the first core section.
   * Ignore which.
   */

  if (core_reg_size < sizeof (*core_reg))
    {
      fprintf_unfiltered (gdb_stderr, "Couldn't read regs from core file\n");
      return;
    }

  /* Integer registers */
  RF (R0_REGNUM + 0, core_reg->intreg.r_r0);
  RF (R0_REGNUM + 1, core_reg->intreg.r_r1);
  RF (R0_REGNUM + 2, core_reg->intreg.r_r2);
  RF (R0_REGNUM + 3, core_reg->intreg.r_r3);
  RF (R0_REGNUM + 4, core_reg->intreg.r_r4);
  RF (R0_REGNUM + 5, core_reg->intreg.r_r5);
  RF (R0_REGNUM + 6, core_reg->intreg.r_r6);
  RF (R0_REGNUM + 7, core_reg->intreg.r_r7);

  RF (SP_REGNUM, core_reg->intreg.r_sp);
  RF (DEPRECATED_FP_REGNUM, core_reg->intreg.r_fp);
  RF (PC_REGNUM, core_reg->intreg.r_pc);
  RF (PS_REGNUM, core_reg->intreg.r_psr);

  /* Floating point registers */
  RF (FPS_REGNUM, core_reg->freg.r_fsr);
  RF (FP0_REGNUM + 0, core_reg->freg.r_freg[0]);
  RF (FP0_REGNUM + 2, core_reg->freg.r_freg[2]);
  RF (FP0_REGNUM + 4, core_reg->freg.r_freg[4]);
  RF (FP0_REGNUM + 6, core_reg->freg.r_freg[6]);
  RF (LP0_REGNUM + 1, core_reg->freg.r_freg[1]);
  RF (LP0_REGNUM + 3, core_reg->freg.r_freg[3]);
  RF (LP0_REGNUM + 5, core_reg->freg.r_freg[5]);
  RF (LP0_REGNUM + 7, core_reg->freg.r_freg[7]);
  deprecated_registers_fetched ();
}

/* Register that we are able to handle ns32knbsd core file formats.
   FIXME: is this really bfd_target_unknown_flavour? */

static struct core_fns nat_core_fns =
{
  bfd_target_unknown_flavour,		/* core_flavour */
  default_check_format,			/* check_format */
  default_core_sniffer,			/* core_sniffer */
  fetch_core_registers,			/* core_read_registers */
  NULL					/* next */
};

void
_initialize_ns32knbsd_nat (void)
{
  add_core_fns (&nat_core_fns);
}


/*
 * kernel_u_size() is not helpful on NetBSD because
 * the "u" struct is NOT in the core dump file.
 */

#ifdef	FETCH_KCORE_REGISTERS
/*
 * Get registers from a kernel crash dump or live kernel.
 * Called by kcore-nbsd.c:get_kcore_registers().
 */
void
fetch_kcore_registers (struct pcb *pcb)
{
  struct switchframe sf;
  struct reg intreg;
  int dummy;

  /* Integer registers */
  if (target_read_memory ((CORE_ADDR) pcb->pcb_ksp, (char *) &sf, sizeof sf))
    error ("Cannot read integer registers.");

  /* We use the psr at kernel entry */
  if (target_read_memory ((CORE_ADDR) pcb->pcb_onstack, (char *) &intreg, sizeof intreg))
    error ("Cannot read processor status register.");

  dummy = 0;
  RF (R0_REGNUM + 0, dummy);
  RF (R0_REGNUM + 1, dummy);
  RF (R0_REGNUM + 2, dummy);
  RF (R0_REGNUM + 3, sf.sf_r3);
  RF (R0_REGNUM + 4, sf.sf_r4);
  RF (R0_REGNUM + 5, sf.sf_r5);
  RF (R0_REGNUM + 6, sf.sf_r6);
  RF (R0_REGNUM + 7, sf.sf_r7);

  dummy = pcb->pcb_kfp + 8;
  RF (SP_REGNUM, dummy);
  RF (DEPRECATED_FP_REGNUM, sf.sf_fp);
  RF (PC_REGNUM, sf.sf_pc);
  RF (PS_REGNUM, intreg.r_psr);

  /* Floating point registers */
  RF (FPS_REGNUM, pcb->pcb_fsr);
  RF (FP0_REGNUM + 0, pcb->pcb_freg[0]);
  RF (FP0_REGNUM + 2, pcb->pcb_freg[2]);
  RF (FP0_REGNUM + 4, pcb->pcb_freg[4]);
  RF (FP0_REGNUM + 6, pcb->pcb_freg[6]);
  RF (LP0_REGNUM + 1, pcb->pcb_freg[1]);
  RF (LP0_REGNUM + 3, pcb->pcb_freg[3]);
  RF (LP0_REGNUM + 5, pcb->pcb_freg[5]);
  RF (LP0_REGNUM + 7, pcb->pcb_freg[7]);
  deprecated_registers_fetched ();
}
#endif /* FETCH_KCORE_REGISTERS */

void
clear_regs (void)
{
  double zero = 0.0;
  int null = 0;

  /* Integer registers */
  RF (R0_REGNUM + 0, null);
  RF (R0_REGNUM + 1, null);
  RF (R0_REGNUM + 2, null);
  RF (R0_REGNUM + 3, null);
  RF (R0_REGNUM + 4, null);
  RF (R0_REGNUM + 5, null);
  RF (R0_REGNUM + 6, null);
  RF (R0_REGNUM + 7, null);

  RF (SP_REGNUM, null);
  RF (DEPRECATED_FP_REGNUM, null);
  RF (PC_REGNUM, null);
  RF (PS_REGNUM, null);

  /* Floating point registers */
  RF (FPS_REGNUM, zero);
  RF (FP0_REGNUM + 0, zero);
  RF (FP0_REGNUM + 2, zero);
  RF (FP0_REGNUM + 4, zero);
  RF (FP0_REGNUM + 6, zero);
  RF (LP0_REGNUM + 0, zero);
  RF (LP0_REGNUM + 1, zero);
  RF (LP0_REGNUM + 2, zero);
  RF (LP0_REGNUM + 3, zero);
  return;
}

/* Return number of args passed to a frame.
   Can return -1, meaning no way to tell. */

int
frame_num_args (struct frame_info *fi)
{
  CORE_ADDR enter_addr;
  CORE_ADDR argp;
  int inst;
  int args;
  int i;

  if (read_memory_integer (fi->frame, 4) == 0 && fi->pc < 0x10000)
    {
      /* main is always called with three args */
      return (3);
    }
  enter_addr = ns32k_get_enter_addr (fi->pc);
  if (enter_addr = 0)
    return (-1);
  argp = (enter_addr == 1
	  ? DEPRECATED_SAVED_PC_AFTER_CALL (fi)
	  : DEPRECATED_FRAME_SAVED_PC (fi));
  for (i = 0; i < 16; i++)
    {
      /*
       * After a bsr gcc may emit the following instructions
       * to remove the arguments from the stack:
       *   cmpqd 0,tos        - to remove 4 bytes from the stack
       *   cmpd tos,tos       - to remove 8 bytes from the stack
       *   adjsp[bwd] -n      - to remove n bytes from the stack
       * Gcc sometimes delays emitting these instructions and
       * may even throw a branch between our feet.
       */
      inst = read_memory_integer (argp, 4);
      args = read_memory_integer (argp + 2, 4);
      if ((inst & 0xff) == 0xea)
	{			/* br */
	  args = ((inst >> 8) & 0xffffff) | (args << 24);
	  if (args & 0x80)
	    {
	      if (args & 0x40)
		{
		  args = ntohl (args);
		}
	      else
		{
		  args = ntohs (args & 0xffff);
		  if (args & 0x2000)
		    args |= 0xc000;
		}
	    }
	  else
	    {
	      args = args & 0xff;
	      if (args & 0x40)
		args |= 0x80;
	    }
	  argp += args;
	  continue;
	}
      if ((inst & 0xffff) == 0xb81f)	/* cmpqd 0,tos */
	return (1);
      else if ((inst & 0xffff) == 0xbdc7)	/* cmpd tos,tos */
	return (2);
      else if ((inst & 0xfffc) == 0xa57c)
	{			/* adjsp[bwd] */
	  switch (inst & 3)
	    {
	    case 0:
	      args = ((args & 0xff) + 0x80);
	      break;
	    case 1:
	      args = ((ntohs (args) & 0xffff) + 0x8000);
	      break;
	    case 3:
	      args = -ntohl (args);
	      break;
	    default:
	      return (-1);
	    }
	  if (args / 4 > 10 || (args & 3) != 0)
	    continue;
	  return (args / 4);
	}
      argp += 1;
    }
  return (-1);
}
