home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OpenStep 4.2J (Developer)
/
os42jdev.iso
/
NextDeveloper
/
Headers
/
architecture
/
sparc
/
reg.h
< prev
Wrap
C/C++ Source or Header
|
1995-02-21
|
7KB
|
285 lines
/* @(#)reg.h 1.16 92/04/28 SMI */
/*
* Copyright (c) 1985 by Sun Microsystems, Inc.
*/
#ifndef _sparc_reg_h
#define _sparc_reg_h
#ifdef KERNEL
/*
* Location of the users' stored
* registers relative to R0.
* Usage is u.u_ar0[XX].
*/
#define PSR (0)
#define PC (1)
#define nPC (2)
#define SPARC_Y (3)
#define G1 (4)
#define G2 (5)
#define G3 (6)
#define G4 (7)
#define G5 (8)
#define G6 (9)
#define G7 (10)
#define O0 (11)
#define O1 (12)
#define O2 (13)
#define O3 (14)
#define O4 (15)
#define O5 (16)
#define O6 (17)
#define O7 (18)
/* the following defines are for portability */
#define PS PSR
#define SP O6
#define R0 O0
#define R1 O1
#endif KERNEL
/*
* And now for something completely the same...
*/
#ifndef __ASSEMBLER__
struct regs {
int r_psr; /* processor status register */
int r_pc; /* program counter */
int r_npc; /* next program counter */
int r_y; /* the y register */
int r_g1; /* user global regs */
int r_g2;
int r_g3;
int r_g4;
int r_g5;
int r_g6;
int r_g7;
int r_o0;
int r_o1;
int r_o2;
int r_o3;
int r_o4;
int r_o5;
int r_o6;
int r_o7;
};
#define r_ps r_psr /* for portablility */
#define r_r0 r_o0
#define r_sp r_o6
#endif !__ASSEMBLER__
/*
* Floating point definitions.
*/
#define FPU /* we have an external float unit */
#ifndef __ASSEMBLER__
#define FQ_DEPTH 16 /* maximum instuctions in FQ */
/*
* struct fpu_status is the floating point processor state
* struct fpu is the sum total of all possible floating point state
* which includes the state of external floating point hardware,
* fpa registers, etc..., if it exists.
*/
struct fpq {
unsigned long *addr; /* address */
unsigned long instr; /* instruction */
};
struct fq {
union { /* FPU inst/addr queue */
double whole;
struct fpq fpq;
} FQu;
};
#define FPU_REGS_TYPE unsigned
#define FPU_FSR_TYPE unsigned
struct fpu {
union { /* FPU floating point regs */
FPU_REGS_TYPE Fpu_regs[32]; /* 32 singles */
double Fpu_dregs[16]; /* 16 doubles */
} fpu_fr;
FPU_FSR_TYPE Fpu_fsr; /* FPU status register */
unsigned Fpu_flags; /* control flags */
unsigned Fpu_extra; /* extra word */
unsigned Fpu_qcnt; /* count of valid entries in fps_q */
struct fq Fpu_q[FQ_DEPTH]; /* FPU instruction address queue */
};
#define fpu_regs fpu_fr.Fpu_regs
#define fpu_dregs fpu_fr.Fpu_dregs
#define fpu_fsr Fpu_fsr
#define fpu_flags Fpu_flags
#define fpu_extra Fpu_extra
#define fpu_q Fpu_q
#define fpu_qcnt Fpu_qcnt
#endif !__ASSEMBLER__
/*
* Definition of bits in the Sun-4 FSR (Floating-point Status Register)
* ________________________________________________________________________
* | RD | RP | TEM | NS | res | vers | FTT | QNE | PR | FCC | AEXC | CEXC |
* |-----|---- |-----|----|-----|------|-----|-----|----|-----|------|------|
* 31 30 29 28 27 23 22 21 20 19 17 16 14 13 12 11 10 9 5 4 0
*/
#define FSR_CEXC 0x0000001f /* Current Exception */
#define FSR_AEXC 0x000003e0 /* ieee accrued exceptions */
#define FSR_FCC 0x00000c00 /* Floating-point Condition Codes */
#define FSR_PR 0x00001000 /* Partial Remainder */
#define FSR_QNE 0x00002000 /* Queue not empty */
#define FSR_FTT 0x0001c000 /* Floating-point Trap Type */
#define FSR_VERS 0x000e0000 /* version field */
#define FSR_RESV 0x00300000 /* reserved */
#define FSR_NS 0x00400000 /* non-standard fp */
#define FSR_TEM 0x0f800000 /* ieee Trap Enable Mask */
#define FSR_RP 0x30000000 /* Rounding Precision */
#define FSR_RD 0xc0000000 /* Rounding Direction */
#define FSR_VERS_SHIFT (17) /* amount to shift version field */
/*
* Definition of CEXC (Current EXCeption) bit field of fsr
*/
#define FSR_CEXC_NX 0x00000001 /* inexact */
#define FSR_CEXC_DZ 0x00000002 /* divide-by-zero */
#define FSR_CEXC_UF 0x00000004 /* underflow */.
#define FSR_CEXC_OF 0x00000008 /* overflow */
#define FSR_CEXC_NV 0x00000010 /* invalid */
/*
* Definition of AEXC (Accrued EXCeption) bit field of fsr
*/
#define FSR_AEXC_NX (0x1 << 5) /* inexact */
#define FSR_AEXC_DZ (0x2 << 5) /* divide-by-zero */
#define FSR_AEXC_UF (0x4 << 5) /* underflow */.
#define FSR_AEXC_OF (0x8 << 5) /* overflow */
#define FSR_AEXC_NV (0x10 << 5) /* invalid */
/*
* Defintion of FTT (Floating-point Trap Type) field within the FSR
*/
#define FTT_NONE 0 /* no excepitons */
#define FTT_IEEE 1 /* IEEE exception */
#define FTT_UNFIN 2 /* unfinished fpop */
#define FTT_UNIMP 3 /* unimplemented fpop */
#define FTT_SEQ 4 /* sequence error */
#define FTT_ALIGN 5 /* alignment, by software convention */
#define FTT_DFAULT 6 /* data fault, by software convention */
#define FSR_FTT_SHIFT 14 /* shift needed to justfy ftt field */
#define FSR_FTT_IEEE (FTT_IEEE << FSR_FTT_SHIFT)
#define FSR_FTT_UNFIN (FTT_UNFIN << FSR_FTT_SHIFT)
#define FSR_FTT_UNIMP (FTT_UNIMP << FSR_FTT_SHIFT)
#define FSR_FTT_SEQ (FTT_SEQ << FSR_FTT_SHIFT)
#define FSR_FTT_ALIGN (FTT_ALIGN << FSR_FTT_SHIFT)
#define FSR_FTT_DFAULT (FTT_DFAULT << FSR_FTT_SHIFT)
/*
* Values of VERS (version) field within the FSR
* NOTE: these values are overloaded; the cpu type must be used to
* further discriminate amongst these. For that reason, no #defines are
* provided.
*
* Version cpu = 21-22, 51-54 cpu = 23-24, 55-57
* 0 Weitek 1164/5 (FAB 1-4) TI 8847
* 1 Weitek 1164/5 (FAB 5-6) LSI L64814
* 2 TI 8847 TI TMS390C602A
* 3 Weitek 3170 Weitek 3171
* 4 Meiko ?
* 5 ? ?
* 6 ? ?
* 7 No FP Hardware No FP Hardware
*/
/*
* Definition of TEM (Trap Enable Mask) bit field of fsr
*/
#define FSR_TEM_NX (0x1 << 23) /* inexact */
#define FSR_TEM_DZ (0x2 << 23) /* divide-by-zero */
#define FSR_TEM_UF (0x4 << 23) /* underflow */.
#define FSR_TEM_OF (0x8 << 23) /* overflow */
#define FSR_TEM_NV (0x10 << 23) /* invalid */
/*
* Definition of RP (Rounding Precision) field of fsr
*/
#define RP_DBLEXT 0 /* double-extended */
#define RP_SINGLE 1 /* single */
#define RP_DOUBLE 2 /* double */
#define RP_RESERVED 3 /* unused and reserved */
/*
* Defintion of RD (Rounding Direction) field of fsr
*/
#define RD_NEAR 0 /* nearest or even if tie */
#define RD_ZER0 1 /* to zero */
#define RD_POSINF 2 /* positive infinity */
#define RD_NEGINF 3 /* negative infinity */
/*
* Definition of the FP enable flags of the pcb struct
* Normal operation, all flags are zero
*/
#define FP_UNINITIALIZED 1
#define FP_STARTSIG 2
#define FP_DISABLE 4
#define FP_ENABLE 8
#ifndef __ASSEMBLER__
/*
* How a register window looks on the stack.
*/
struct rwindow {
int rw_local[8]; /* locals */
int rw_in[8]; /* ins */
};
#define rw_fp rw_in[6] /* frame pointer */
#define rw_rtn rw_in[7] /* return address */
/*
* Definition of bits in the Sun-4 PSR (Processor Status Register)
* ____________________________________________________________________
* | IMPL | VER | ICC | res | EC | EF | PIL | S | PS | ET | CWP |
* |-----------|-----|------|-----|----|----|-------|---|----|----|-----|
* 31 28 27 24 23 20 19 14 13 12 11 8 7 6 5 4 0
*/
struct p_status {
union {
unsigned int psr;
struct {
unsigned int
impl:4,
ver:4,
icc:4,
reserved:6,
ec:1,
ef:1,
pil:4,
s:1,
ps:1,
et:1,
cwp:5;
} psr_bits;
} PSRREG;
};
#endif !__ASSEMBLER__
#endif /*!_sparc_reg_h*/