| 1 | /*	$NetBSD: mcontext.h,v 1.11 2024/05/18 00:37:41 thorpej Exp $	*/ |
| 2 | |
| 3 | #ifndef _SPARC64_MCONTEXT_H_ |
| 4 | #define	_SPARC64_MCONTEXT_H_ |
| 5 | |
| 6 | #include <sparc/mcontext.h> |
| 7 | |
| 8 | #define	_NGREG32	19	/* %psr, pc, npc, %g1-7, %o0-7 */ |
| 9 | typedef	int	__greg32_t; |
| 10 | typedef	__greg32_t	__gregset32_t[_NGREG32]; |
| 11 | |
| 12 | typedef unsigned int	netbsd32___greg32p_t; |
| 13 | typedef unsigned int	netbsd32___fqp_t; |
| 14 | typedef unsigned int	netbsd32___gwindows32p_t; |
| 15 | |
| 16 | #define	_REG32_PSR	0 |
| 17 | #define	_REG32_PC	1 |
| 18 | #define	_REG32_nPC	2 |
| 19 | #define	_REG32_Y	3 |
| 20 | #define	_REG32_G1	4 |
| 21 | #define	_REG32_G2	5 |
| 22 | #define	_REG32_G3	6 |
| 23 | #define	_REG32_G4	7 |
| 24 | #define	_REG32_G5	8 |
| 25 | #define	_REG32_G6	9 |
| 26 | #define	_REG32_G7	10 |
| 27 | #define	_REG32_O0	11 |
| 28 | #define	_REG32_O1	12 |
| 29 | #define	_REG32_O2	13 |
| 30 | #define	_REG32_O3	14 |
| 31 | #define	_REG32_O4	15 |
| 32 | #define	_REG32_O5	16 |
| 33 | #define	_REG32_O6	17 |
| 34 | #define	_REG32_O7	18 |
| 35 | |
| 36 | /* Layout of a register window. */ |
| 37 | typedef struct { |
| 38 | 	__greg32_t	__rw_local[8];	/* %l0-7 */ |
| 39 | 	__greg32_t	__rw_in[8];	/* %i0-7 */ |
| 40 | } __rwindow32_t; |
| 41 | |
| 42 | /* Description of available register windows. */ |
| 43 | typedef struct { |
| 44 | 	int		__wbcnt; |
| 45 | 	netbsd32___greg32p_t	__spbuf[_SPARC_MAXREGWINDOW]; |
| 46 | 	__rwindow32_t	__wbuf[_SPARC_MAXREGWINDOW]; |
| 47 | } __gwindows32_t; |
| 48 | |
| 49 | /* FPU state description */ |
| 50 | typedef struct { |
| 51 | 	union { |
| 52 | 		unsigned int	__fpu_regs[32]; |
| 53 | 		double		__fpu_dregs[16]; |
| 54 | 	} __fpu_fr;				/* FPR contents */ |
| 55 | 	netbsd32___fqp_t	__fpu_q;	/* pointer to FPU insn queue */ |
| 56 | 	unsigned int	__fpu_fsr;		/* %fsr */ |
| 57 | 	unsigned char	__fpu_qcnt;		/* # entries in __fpu_q */ |
| 58 | 	unsigned char	__fpu_q_entrysize; 	/* size of a __fpu_q entry */ |
| 59 | 	unsigned char	__fpu_en;		/* this context valid? */ |
| 60 | } __fpregset32_t; |
| 61 | |
| 62 | /* `Extra Register State'(?) */ |
| 63 | typedef struct { |
| 64 | 	unsigned int	__xrs_id;	/* See below */ |
| 65 | 	unsigned int	__xrs_ptr;	/* points into filler area */ |
| 66 | } __xrs32_t; |
| 67 | |
| 68 | typedef struct { |
| 69 | 	__gregset32_t	__gregs;	/* GPR state */ |
| 70 | 	netbsd32___gwindows32p_t __gwins;/* may point to register windows */ |
| 71 | 	__fpregset32_t	__fpregs;	/* FPU state, if any */ |
| 72 | 	__xrs32_t	__xrs;		/* may indicate extra reg state */ |
| 73 | } mcontext32_t; |
| 74 | |
| 75 | #define	_UC_SETSTACK	_UC_MD_BIT16 |
| 76 | #define	_UC_CLRSTACK	_UC_MD_BIT17 |
| 77 | #define	_UC_TLSBASE	_UC_MD_BIT19 |
| 78 | |
| 79 | #define	_UC_MACHINE32_PAD	43	/* compat_netbsd32 variant */ |
| 80 | #define	_UC_MACHINE32_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_O6]) |
| 81 | #define	_UC_MACHINE32_FP(uc)	(((__greg32_t *)_UC_MACHINE32_SP(uc))[15]) |
| 82 | |
| 83 | #endif /* _SPARC64_MCONTEXT_H_ */ |