/* Target machine definitions for GDB on a Sequent Symmetry under ptx
   with Weitek 1167 and i387 support.
   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 2000
   Free Software Foundation, Inc.
   Symmetry version by Jay Vosburgh (fubar@sequent.com).

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

#ifndef TM_PTX_H
#define TM_PTX_H 1

/* I don't know if this will work for cross-debugging, even if you do get
   a copy of the right include file.  */

#include <sys/reg.h>

#ifdef SEQUENT_PTX4
#include "i386/tm-i386v4.h"
#else /* !SEQUENT_PTX4 */
#include "i386/tm-i386.h"
#endif

/* Amount PC must be decremented by after a breakpoint.  This is often the
   number of bytes in BREAKPOINT but not always (such as now). */

#undef DECR_PC_AFTER_BREAK
#define DECR_PC_AFTER_BREAK 0

#if 0
-- -this code can 't be used unless we know we are running native,
since it uses host specific ptrace calls.
/* code for 80387 fpu.  Functions are from i386-dep.c, copied into
 * symm-dep.c.
 */
#define FLOAT_INFO { i386_float_info(); }
#endif

/* Number of machine registers */

#undef  NUM_REGS
#define NUM_REGS 49

/* Initializer for an array of names of registers.  There should be at least
   NUM_REGS strings in this initializer.  Any excess ones are simply ignored.
   The order of the first 8 registers must match the compiler's numbering
   scheme (which is the same as the 386 scheme) and also regmap in the various
   *-nat.c files. */

#undef REGISTER_NAME
#define REGISTER_NAMES { "eax",  "ecx",    "edx",  "ebx",  \
			 "esp",  "ebp",    "esi",  "edi",  \
			 "eip",  "eflags", "st0",  "st1",  \
			 "st2",  "st3",    "st4",  "st5",  \
			 "st6",  "st7",    "fp1",  "fp2",  \
			 "fp3",  "fp4",    "fp5",  "fp6",  \
			 "fp7",  "fp8",    "fp9",  "fp10", \
			 "fp11", "fp12",   "fp13", "fp14", \
			 "fp15", "fp16",   "fp17", "fp18", \
			 "fp19", "fp20",   "fp21", "fp22", \
			 "fp23", "fp24",   "fp25", "fp26", \
			 "fp27", "fp28",   "fp29", "fp30", \
			 "fp31" }

/* Register numbers of various important registers.
   Note that some of these values are "real" register numbers,
   and correspond to the general registers of the machine,
   and some are "phony" register numbers which are too large
   to be actual register numbers as far as the user is concerned
   but do serve to get the desired values when passed to read_register.  */

#define EAX_REGNUM	0
#define ECX_REGNUM	1
#define EDX_REGNUM	2
#define EBX_REGNUM	3

#define ESP_REGNUM	4
#define EBP_REGNUM	5

#define ESI_REGNUM	6
#define EDI_REGNUM	7

#define EIP_REGNUM	8
#define EFLAGS_REGNUM	9

#define ST0_REGNUM	10
#define ST1_REGNUM	11
#define ST2_REGNUM	12
#define ST3_REGNUM	13

#define ST4_REGNUM	14
#define ST5_REGNUM	15
#define ST6_REGNUM	16
#define ST7_REGNUM	17

#define FP1_REGNUM 18		/* first 1167 register */
/* Get %fp2 - %fp31 by addition, since they are contiguous */

#undef  SP_REGNUM
#define SP_REGNUM ESP_REGNUM	/* Contains address of top of stack */
#undef  FP_REGNUM
#define FP_REGNUM EBP_REGNUM	/* Contains address of executing stack frame */
#undef  PC_REGNUM
#define PC_REGNUM EIP_REGNUM	/* Contains program counter */
#undef  PS_REGNUM
#define PS_REGNUM EFLAGS_REGNUM	/* Contains processor status */

/*
 * For ptx, this is a little bit bizarre, since the register block
 * is below the u area in memory.  This means that blockend here ends
 * up being negative (for the call from coredep.c) since the value in
 * u.u_ar0 will be less than KERNEL_U_ADDR (and coredep.c passes us
 * u.u_ar0 - KERNEL_U_ADDR in blockend).  Since we also define
 * FETCH_INFERIOR_REGISTERS (and supply our own functions for that),
 * the core file case will be the only use of this function.
 */

#define REGISTER_U_ADDR(addr, blockend, regno) \
{ (addr) = ptx_register_u_addr((blockend), (regno)); }

extern int ptx_register_u_addr (int, int);

/* Total amount of space needed to store our copies of the machine's
   register state, the array `registers'.  10 i*86 registers, 8 i387
   registers, and 31 Weitek 1167 registers */

#undef  REGISTER_BYTES
#define REGISTER_BYTES ((10 * 4) + (8 * 10) + (31 * 4))

/* Largest value REGISTER_RAW_SIZE can have.  */

#undef  MAX_REGISTER_RAW_SIZE
#define MAX_REGISTER_RAW_SIZE 10

/* Nonzero if register N requires conversion
   from raw format to virtual format.  */

#undef REGISTER_CONVERTIBLE
#define REGISTER_CONVERTIBLE(N) \
((N < ST0_REGNUM) ? 0 : \
 (N < FP1_REGNUM) ? 1 : \
 0)

/* Convert data from raw format for register REGNUM
   to virtual format for register REGNUM.  */
extern const struct floatformat floatformat_i387_ext;	/* from floatformat.h */

#undef REGISTER_CONVERT_TO_VIRTUAL
#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO)	\
((REGNUM < ST0_REGNUM) ?  (void)memcpy ((TO), (FROM), 4) : \
 (REGNUM < FP1_REGNUM) ? (void)floatformat_to_double(&floatformat_i387_ext, \
						       (FROM),(TO)) : \
 (void)memcpy ((TO), (FROM), 4))

/* Convert data from virtual format for register REGNUM
   to raw format for register REGNUM.  */

#undef REGISTER_CONVERT_TO_RAW
#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO)	\
((REGNUM < ST0_REGNUM) ?  (void)memcpy ((TO), (FROM), 4) : \
 (REGNUM < FP1_REGNUM) ? (void)floatformat_from_double(&floatformat_i387_ext, \
						       (FROM),(TO)) : \
 (void)memcpy ((TO), (FROM), 4))

/* Return the GDB type object for the "standard" data type
   of data in register N.  */
/*
 * Note: the 1167 registers (the last line, builtin_type_float) are
 * generally used in pairs, with each pair being treated as a double.
 * It it also possible to use them singly as floats.  I'm not sure how
 * in gdb to treat the register pair pseudo-doubles. -fubar
 */
#undef REGISTER_VIRTUAL_TYPE
#define REGISTER_VIRTUAL_TYPE(N) \
((N < ST0_REGNUM) ? builtin_type_int : \
 (N < FP1_REGNUM) ? builtin_type_double : \
 builtin_type_float)

/* Extract from an array REGBUF containing the (raw) register state
   a function return value of type TYPE, and copy that, in virtual format,
   into VALBUF.  */

#undef  DEPRECATED_EXTRACT_RETURN_VALUE
#define DEPRECATED_EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
  symmetry_extract_return_value(TYPE, REGBUF, VALBUF)

/*
   #undef  FRAME_FIND_SAVED_REGS
   #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
   { ptx_frame_find_saved_regs((frame_info), &(frame_saved_regs)); }
 */

#endif /* ifndef TM_PTX_H */
