/* Parameters for Hewlett-Packard 9000/300 native support under bsd.
   Copyright 1986, 1987, 1989, 1991, 1992, 1993
   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.  */

/* Detect whether this is 4.3 or 4.4.  */

#include <errno.h>
#include <sys/param.h>
#ifdef	BSD4_4

/* BSD 4.4 alpha or better */

/* We can attach to processes using ptrace.  */

#define	ATTACH_DETACH
#define	PTRACE_ATTACH	10
#define	PTRACE_DETACH	11

/* The third argument of ptrace is declared as this type.  */

#define	PTRACE_ARG3_TYPE	caddr_t

/* U_REGS_OFFSET is the offset of the registers within the u area for
   ptrace purposes.  */
#define U_REGS_OFFSET \
  ptrace (PT_READ_U, PIDGET (inferior_ptid), \
	  (PTRACE_ARG3_TYPE) \
	   (offsetof (struct user, u_kproc.kp_proc.p_md.md_regs)), 0) \
    - USRSTACK

/* No user structure in 4.4, registers are relative to kernel stack
   which is fixed.  */
#define KERNEL_U_ADDR	0xFFF00000

/* FIXME: Is ONE_PROCESS_WRITETEXT still true now that the kernel has
   copy-on-write?  It not, move it to the 4.3-specific section below
   (now it is in xm-hp300bsd.h).  */

#else

/* This is BSD 4.3 or something like it.  */

/* Get kernel u area address at run-time using BSD style nlist ().  */
#define KERNEL_U_ADDR_BSD

#endif

/* This was once broken for 4.4, but probably because we had the wrong
   KERNEL_U_ADDR.  */

/* This is a piece of magic that is given a register number REGNO
   and as BLOCKEND the address in the system of the end of the user structure
   and stores in ADDR the address in the kernel or core dump
   of that register.  */

#define REGISTER_U_ADDR(addr, blockend, regno)				\
{									\
  if (regno < PS_REGNUM)						\
    addr = (int) &((struct frame *)(blockend))->f_regs[regno];		\
  else if (regno == PS_REGNUM)						\
    addr = (int) &((struct frame *)(blockend))->f_stackadj;		\
  else if (regno == PC_REGNUM)						\
    addr = (int) &((struct frame *)(blockend))->f_pc;			\
  else if (regno < FPC_REGNUM)						\
    addr = (int)							\
      &((struct user *)0)->u_pcb.pcb_fpregs.fpf_regs[((regno)-FP0_REGNUM)*3];\
  else if (regno == FPC_REGNUM)						\
    addr = (int) &((struct user *)0)->u_pcb.pcb_fpregs.fpf_fpcr;	\
  else if (regno == FPS_REGNUM)						\
    addr = (int) &((struct user *)0)->u_pcb.pcb_fpregs.fpf_fpsr;	\
  else									\
    addr = (int) &((struct user *)0)->u_pcb.pcb_fpregs.fpf_fpiar;	\
}
