summaryrefslogtreecommitdiff
path: root/usr/src/uts/sparc/sys/regset.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/sparc/sys/regset.h')
-rw-r--r--usr/src/uts/sparc/sys/regset.h427
1 files changed, 10 insertions, 417 deletions
diff --git a/usr/src/uts/sparc/sys/regset.h b/usr/src/uts/sparc/sys/regset.h
index 26e7119a38..cebf5939a3 100644
--- a/usr/src/uts/sparc/sys/regset.h
+++ b/usr/src/uts/sparc/sys/regset.h
@@ -23,6 +23,8 @@
/*
+ * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
+ *
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -30,13 +32,12 @@
#ifndef _SYS_REGSET_H
#define _SYS_REGSET_H
-#pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
-
#include <sys/feature_tests.h>
#if !defined(_ASM)
#include <sys/int_types.h>
#endif
+#include <sys/mcontext.h>
#ifdef __cplusplus
extern "C" {
@@ -46,8 +47,6 @@ extern "C" {
* Location of the users' stored registers relative to R0.
* Usage is as an index into a gregset_t array or as u.u_ar0[XX].
*/
-#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
-
#if defined(__sparcv9)
#define REG_CCR (0)
#if defined(_SYSCALL32)
@@ -87,53 +86,12 @@ extern "C" {
#define REG_SP REG_O6
#define REG_R0 REG_O0
#define REG_R1 REG_O1
-#endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */
-
-/*
- * A gregset_t is defined as an array type for compatibility with the reference
- * source. This is important due to differences in the way the C language
- * treats arrays and structures as parameters.
- *
- * Note that NGREG is really (sizeof (struct regs) / sizeof (greg_t)),
- * but that the SPARC V8 ABI defines it absolutely to be 19.
- */
-#if defined(__sparcv9)
-#define _NGREG 21
-#else /* __sparcv9 */
-#define _NGREG 19
-#endif /* __sparcv9 */
-#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
-#define NGREG _NGREG
-#endif
#ifndef _ASM
-#if defined(_LP64) || defined(_I32LPx)
-typedef long greg_t;
-#else
-typedef int greg_t;
-#endif
-
-#if defined(_SYSCALL32)
-
-typedef int32_t greg32_t;
-typedef int64_t greg64_t;
-
-#endif /* _SYSCALL32 */
-
-typedef greg_t gregset_t[_NGREG];
-
-#if defined(_SYSCALL32)
-
-#define _NGREG32 19
-#define _NGREG64 21
-
-typedef greg32_t gregset32_t[_NGREG32];
-typedef greg64_t gregset64_t[_NGREG64];
-
-#endif /* _SYSCALL32 */
+#define NGREG _NGREG
+#define MAXFPQ _MAXFPQ
-#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
/*
* The following structures define how a register window can appear on the
* stack. This structure is available (when required) through the `gwins'
@@ -143,7 +101,7 @@ typedef greg64_t gregset64_t[_NGREG64];
*/
#define SPARC_MAXREGWINDOW 31 /* max windows in SPARC arch. */
-struct rwindow {
+struct rwindow {
greg_t rw_local[8]; /* locals */
greg_t rw_in[8]; /* ins */
};
@@ -170,7 +128,7 @@ extern void rwindow_32ton(struct rwindow32 *, struct rwindow *);
#define rw_fp rw_in[6] /* frame pointer */
#define rw_rtn rw_in[7] /* return address */
-typedef struct gwindows {
+typedef struct _gwindows {
int wbcnt;
greg_t *spbuf[SPARC_MAXREGWINDOW];
struct rwindow wbuf[SPARC_MAXREGWINDOW];
@@ -192,62 +150,6 @@ typedef struct gwindows64 {
#endif /* _SYSCALL32 */
-
-/*
- * Floating point definitions.
- */
-
-#define MAXFPQ 16 /* max # of fpu queue entries currently supported */
-
-/*
- * struct fq defines the minimal format of a floating point instruction queue
- * entry. The size of entries in the floating point queue are implementation
- * dependent. The union FQu is guarenteed to be the first field in any ABI
- * conformant system implementation. Any additional fields provided by an
- * implementation should not be used applications designed to be ABI conformant.
- */
-
-struct fpq {
- unsigned int *fpq_addr; /* address */
- unsigned int fpq_instr; /* instruction */
-};
-
-struct fq {
- union { /* FPU inst/addr queue */
- double whole;
- struct fpq fpq;
- } FQu;
-};
-
-#if defined(_SYSCALL32)
-
-struct fpq32 {
- caddr32_t fpq_addr; /* address */
- uint32_t fpq_instr; /* instruction */
-};
-
-struct fq32 {
- union { /* FPU inst/addr queue */
- double whole;
- struct fpq32 fpq;
- } FQu;
-};
-
-#endif /* _SYSCALL32 */
-
-/*
- * struct fpu 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.
- *
- * A floating point instuction queue may or may not be associated with
- * the floating point processor state. If a queue does exist, the field
- * fpu_q will point to an array of fpu_qcnt entries where each entry is
- * fpu_q_entrysize long. fpu_q_entry has a lower bound of sizeof (union FQu)
- * and no upper bound. If no floating point queue entries are associated
- * with the processor state, fpu_qcnt will be zeo and fpu_q will be NULL.
- */
-
/*
* The following #define's are obsolete and may be removed in a future release.
* The corresponding integer types should be used instead (i.e. uint64_t).
@@ -258,160 +160,9 @@ struct fq32 {
#define V9_FPU_FSR_TYPE uint64_t
#define V9_FPU_FPRS_TYPE uint32_t
-#if defined(__sparcv9)
-
-struct fpu {
- union { /* FPU floating point regs */
- uint32_t fpu_regs[32]; /* 32 singles */
- double fpu_dregs[32]; /* 32 doubles */
- long double fpu_qregs[16]; /* 16 quads */
- } fpu_fr;
- struct fq *fpu_q; /* ptr to array of FQ entries */
- uint64_t fpu_fsr; /* FPU status register */
- uint8_t fpu_qcnt; /* # of entries in saved FQ */
- uint8_t fpu_q_entrysize; /* # of bytes per FQ entry */
- uint8_t fpu_en; /* flag specifying fpu in use */
-};
-
-#else /* __sparcv9 */
-
-struct fpu {
- union { /* FPU floating point regs */
- uint32_t fpu_regs[32]; /* 32 singles */
- double fpu_dregs[16]; /* 16 doubles */
- } fpu_fr;
- struct fq *fpu_q; /* ptr to array of FQ entries */
- uint32_t fpu_fsr; /* FPU status register */
- uint8_t fpu_qcnt; /* # of entries in saved FQ */
- uint8_t fpu_q_entrysize; /* # of bytes per FQ entry */
- uint8_t fpu_en; /* flag signifying fpu in use */
-};
-
-#endif /* __sparcv9 */
-
-typedef struct fpu fpregset_t;
-
-#if defined(_SYSCALL32)
-
-/* Kernel view of user sparcv7/v8 fpu structure */
-
-struct fpu32 {
- union { /* FPU floating point regs */
- uint32_t fpu_regs[32]; /* 32 singles */
- double fpu_dregs[16]; /* 16 doubles */
- } fpu_fr;
- caddr32_t fpu_q; /* ptr to array of FQ entries */
- uint32_t fpu_fsr; /* FPU status register */
- uint8_t fpu_qcnt; /* # of entries in saved FQ */
- uint8_t fpu_q_entrysize; /* # of bytes per FQ entry */
- uint8_t fpu_en; /* flag signifying fpu in use */
-};
-
-typedef struct fpu32 fpregset32_t;
-
-#endif /* _SYSCALL32 */
+#define XRS_ID _XRS_ID
-#if defined(_KERNEL) || defined(_KMDB)
-/*
- * The ABI uses struct fpu, so we use this to describe the kernel's view of the
- * fpu.
- */
-typedef struct {
- union _fpu_fr { /* V9 FPU floating point regs */
- uint32_t fpu_regs[32]; /* 32 singles */
- uint64_t fpu_dregs[32]; /* 32 doubles */
- long double fpu_qregs[16]; /* 16 quads */
- } fpu_fr;
- uint64_t fpu_fsr; /* FPU status register */
- uint32_t fpu_fprs; /* fprs register */
- struct fq *fpu_q;
- uint8_t fpu_qcnt;
- uint8_t fpu_q_entrysize;
- uint8_t fpu_en; /* flag signifying fpu in use */
-} kfpu_t;
-#endif /* _KERNEL || _KMDB */
-
-/*
- * The following structure is for associating extra register state with
- * the ucontext structure and is kept within the uc_mcontext filler area.
- *
- * If (xrs_id == XRS_ID) then the xrs_ptr field is a valid pointer to
- * extra register state. The exact format of the extra register state
- * pointed to by xrs_ptr is platform-dependent.
- *
- * Note: a platform may or may not manage extra register state.
- */
-typedef struct {
- unsigned int xrs_id; /* indicates xrs_ptr validity */
- caddr_t xrs_ptr; /* ptr to extra reg state */
-} xrs_t;
-
-#define XRS_ID 0x78727300 /* the string "xrs" */
-
-#if defined(_SYSCALL32)
-
-typedef struct {
- uint32_t xrs_id; /* indicates xrs_ptr validity */
- caddr32_t xrs_ptr; /* ptr to extra reg state */
-} xrs32_t;
-
-#endif /* _SYSCALL32 */
-
-#if defined(__sparcv9)
-
-/*
- * Ancillary State Registers
- *
- * The SPARC V9 architecture defines 25 ASRs, numbered from 7 through 31.
- * ASRs 16 through 31 are available to user programs, though the meaning
- * and content of these registers is implementation dependent.
- */
-typedef int64_t asrset_t[16]; /* %asr16 - > %asr31 */
-
-#endif /* __sparcv9 */
-
-/*
- * Structure mcontext defines the complete hardware machine state. If
- * the field `gwins' is non NULL, it points to a save area for register
- * window frames. If `gwins' is NULL, the register windows were saved
- * on the user's stack.
- *
- * The filler of 21 longs is historical (now filler[19] plus the xrs_t
- * field). The value was selected to provide binary compatibility with
- * statically linked ICL binaries. It is in the ABI (do not change). It
- * actually appears in the ABI as a single filler of 44 is in the field
- * uc_filler of struct ucontext. It is split here so that ucontext.h can
- * (hopefully) remain architecture independent.
- *
- * Note that 2 longs of the filler are used to hold extra register state info.
- */
-typedef struct {
- gregset_t gregs; /* general register set */
- gwindows_t *gwins; /* POSSIBLE pointer to register windows */
- fpregset_t fpregs; /* floating point register set */
- xrs_t xrs; /* POSSIBLE extra register state association */
-#if defined(__sparcv9)
- asrset_t asrs; /* ancillary registers */
- long filler[4]; /* room for expansion */
-#else /* __sparcv9 */
- long filler[19];
-#endif /* __sparcv9 */
-} mcontext_t;
-
-#if defined(_SYSCALL32)
-
-typedef struct {
- gregset32_t gregs; /* general register set */
- caddr32_t gwins; /* POSSIBLE pointer to register windows */
- fpregset32_t fpregs; /* floating point register set */
- xrs32_t xrs; /* POSSIBLE extra register state association */
- int32_t filler[19];
-} mcontext32_t;
-
-#endif /* _SYSCALL32 */
-
-#endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */
-#endif /* _ASM */
+#endif /* !_ASM */
/*
* The version of privregs.h that is used on implementations that run
@@ -428,7 +179,7 @@ typedef struct {
* 'struct regs' to match the content of a 32-bit core file, or a ucontext_t.
*
* Note that the ucontext_t actually describes the general registers in
- * terms of the gregset_t data type, as described in this file. Note also
+ * terms of the gregset_t data type, as described in mcontex.h. Note also
* that the core file content is defined by core(4) in terms of data types
* defined by procfs -- see proc(4).
*/
@@ -438,164 +189,6 @@ typedef struct {
#endif /* !_KERNEL && !_XPG4_2 || __EXTENSIONS__ */
#endif /* __sparcv9 */
-/*
- * The following is here for XPG4.2 standards compliance.
- * regset.h is included in ucontext.h for the definition of
- * mcontext_t, all of which breaks XPG4.2 namespace.
- */
-
-#if defined(_XPG4_2) && !defined(__EXTENSIONS__)
-/*
- * The following is here for UNIX 95 compliance (XPG Issue 4, Version 2
- * System Interfaces and Headers. The structures included here are identical
- * to those visible elsewhere in this header except that the structure
- * element names have been changed in accordance with the X/Open namespace
- * rules. Specifically, depending on the name and scope, the names have
- * been prepended with a single or double underscore (_ or __). See the
- * structure definitions in the non-X/Open namespace for more detailed
- * comments describing each of these structures.
- */
-
-#ifndef _ASM
-
-/*
- * The following structures define how a register window can appear on the
- * stack.
- */
-#define _SPARC_MAXREGWINDOW 31 /* max windows in SPARC arch. */
-
-struct __rwindow {
- greg_t __rw_local[8]; /* locals */
- greg_t __rw_in[8]; /* ins */
-};
-
-#define __rw_fp __rw_in[6] /* frame pointer */
-#define __rw_rtn __rw_in[7] /* return address */
-
-struct __gwindows {
- int __wbcnt;
- greg_t *__spbuf[_SPARC_MAXREGWINDOW];
- struct __rwindow __wbuf[_SPARC_MAXREGWINDOW];
-};
-
-typedef struct __gwindows gwindows_t;
-
-/*
- * The fq structure defines the minimal format of a floating point
- * instruction queue entry.
- */
-
-struct __fpq {
- unsigned int *__fpq_addr; /* address */
- unsigned int __fpq_instr; /* instruction */
-};
-
-struct __fq {
- union { /* FPU inst/addr queue */
- double __whole;
- struct __fpq __fpq;
- } _FQu;
-};
-
-/*
- * The fpu structure is the floating point processor state.
- */
-
-/*
- * The following #define's are obsolete and may be removed in a future release.
- * The corresponding integer types should be used instead (i.e. uint64_t).
- */
-#define _FPU_REGS_TYPE uint32_t
-#define _FPU_DREGS_TYPE uint64_t
-#define _V7_FPU_FSR_TYPE uint32_t
-#define _V9_FPU_FSR_TYPE uint64_t
-#define _V9_FPU_FPRS_TYPE uint32_t
-
-#if defined(__sparcv9)
-
-/*
- * SPARC Version 9 floating point
- */
-
-struct __fpu {
- union { /* FPU floating point regs */
- uint32_t __fpu_regs[32]; /* 32 singles */
- double __fpu_dregs[32]; /* 32 doubles */
- long double __fpu_qregs[16]; /* 16 quads */
- } __fpu_fr;
- struct __fq *__fpu_q; /* ptr to array of FQ entries */
- uint64_t __fpu_fsr; /* FPU status register */
- uint8_t __fpu_qcnt; /* # of entries in saved FQ */
- uint8_t __fpu_q_entrysize; /* # of bytes per FQ entry */
- uint8_t __fpu_en; /* flag signifying fpu in use */
-};
-
-#else /* __sparcv9 */
-
-/*
- * SPARC Version 7 and 8 floating point
- */
-
-struct __fpu {
- union { /* FPU floating point regs */
- uint32_t __fpu_regs[32]; /* 32 singles */
- double __fpu_dregs[16]; /* 16 doubles */
- } __fpu_fr;
- struct __fq *__fpu_q; /* ptr to array of FQ entries */
- uint32_t __fpu_fsr; /* FPU status register */
- uint8_t __fpu_qcnt; /* # of entries in saved FQ */
- uint8_t __fpu_q_entrysize; /* # of bytes per FQ entry */
- uint8_t __fpu_en; /* flag signifying fpu in use */
-};
-
-#endif /* __sparcv9 */
-
-typedef struct __fpu fpregset_t;
-
-/*
- * The xrs_t structure is for associating extra register state with
- * the ucontext structure and is kept within the uc_mcontext filler area.
- */
-typedef struct {
- unsigned int __xrs_id; /* indicates xrs_ptr validity */
- caddr_t __xrs_ptr; /* ptr to extra reg state */
-} xrs_t;
-
-#define _XRS_ID 0x78727300 /* the string "xrs" */
-
-#if defined(__sparcv9)
-
-/*
- * Ancillary State Registers
- *
- * The SPARC V9 architecture defines 25 ASRs, numbered from 7 through 31.
- * ASRs 16 through 31 are available to user programs, though the meaning
- * and content of these registers is implementation dependent.
- */
-typedef int64_t asrset_t[16]; /* %asr16 - > %asr31 */
-
-#endif /* __sparcv9 */
-
-/*
- * Structure mcontext defines the complete hardware machine state.
- */
-typedef struct {
- gregset_t __gregs; /* general register set */
- gwindows_t *__gwins; /* POSSIBLE pointer to register windows */
- fpregset_t __fpregs; /* floating point register set */
- xrs_t __xrs; /* POSSIBLE extra register state association */
-#if defined(__sparcv9)
- asrset_t __asrs; /* ancillary registers */
- long __filler[4]; /* room for expansion */
-#else /* __sparcv9 */
- long __filler[19];
-#endif /* __sparcv9 */
-} mcontext_t;
-
-#endif /* _ASM */
-#endif /* defined(_XPG4_2) && !defined(__EXTENSIONS__) */
-
-
#ifdef __cplusplus
}
#endif