mcontext.h revision 21227944c2bcc086121a5428f3f9d2496ba646f5
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
* Copyright 2015 Nexenta Systems, Inc. All rights reserved.
*/
/*
* Essential struct definitions for mcontext_t needed by ucontext.h
* These were formerly in regset.h, which now includes this file.
*/
#ifndef _SYS_MCONTEXT_H
#define _SYS_MCONTEXT_H
#include <sys/feature_tests.h>
#if !defined(_ASM)
#include <sys/int_types.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*
* 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 */
#ifndef _ASM
typedef long greg_t;
#else
typedef int greg_t;
#endif
#if defined(_SYSCALL32)
#endif /* _SYSCALL32 */
#if defined(_SYSCALL32)
#define _NGREG32 19
#define _NGREG64 21
#endif /* _SYSCALL32 */
/*
* Floating point definitions.
*/
/*
* 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 {
double whole;
} FQu;
};
#if defined(_SYSCALL32)
struct fpq32 {
};
struct fq32 {
double whole;
} 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.
*/
#if defined(__sparcv9)
struct _fpu {
union { /* FPU floating point regs */
} fpu_fr;
};
#else /* __sparcv9 */
struct _fpu {
union { /* FPU floating point regs */
} fpu_fr;
};
#endif /* __sparcv9 */
typedef struct _fpu fpregset_t;
#if defined(_SYSCALL32)
struct fpu32 {
union { /* FPU floating point regs */
} fpu_fr;
};
typedef struct fpu32 fpregset32_t;
#endif /* _SYSCALL32 */
/*
* 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 */
} fpu_fr;
} 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 */
} xrs_t;
#if defined(_SYSCALL32)
typedef struct {
} 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.
*/
#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 {
#if defined(__sparcv9)
#else /* __sparcv9 */
long filler[19];
#endif /* __sparcv9 */
} mcontext_t;
#if defined(_SYSCALL32)
typedef struct {
} mcontext32_t;
#endif /* _SYSCALL32 */
#endif /* _ASM */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_MCONTEXT_H */