root/sys/arch/sparc64/include/mcontext.h
/*      $NetBSD: mcontext.h,v 1.11 2024/05/18 00:37:41 thorpej Exp $    */

#ifndef _SPARC64_MCONTEXT_H_
#define _SPARC64_MCONTEXT_H_

#include <sparc/mcontext.h>

#define _NGREG32        19      /* %psr, pc, npc, %g1-7, %o0-7 */
typedef int     __greg32_t;
typedef __greg32_t      __gregset32_t[_NGREG32];

typedef unsigned int    netbsd32___greg32p_t;
typedef unsigned int    netbsd32___fqp_t;
typedef unsigned int    netbsd32___gwindows32p_t;

#define _REG32_PSR      0
#define _REG32_PC       1
#define _REG32_nPC      2
#define _REG32_Y        3
#define _REG32_G1       4
#define _REG32_G2       5
#define _REG32_G3       6
#define _REG32_G4       7
#define _REG32_G5       8
#define _REG32_G6       9
#define _REG32_G7       10
#define _REG32_O0       11
#define _REG32_O1       12
#define _REG32_O2       13
#define _REG32_O3       14
#define _REG32_O4       15
#define _REG32_O5       16
#define _REG32_O6       17
#define _REG32_O7       18

/* Layout of a register window. */
typedef struct {
        __greg32_t      __rw_local[8];  /* %l0-7 */
        __greg32_t      __rw_in[8];     /* %i0-7 */
} __rwindow32_t;

/* Description of available register windows. */
typedef struct {
        int             __wbcnt;
        netbsd32___greg32p_t    __spbuf[_SPARC_MAXREGWINDOW];
        __rwindow32_t   __wbuf[_SPARC_MAXREGWINDOW];
} __gwindows32_t;

/* FPU state description */
typedef struct {
        union {
                unsigned int    __fpu_regs[32];
                double          __fpu_dregs[16];
        } __fpu_fr;                             /* FPR contents */
        netbsd32___fqp_t        __fpu_q;        /* pointer to FPU insn queue */
        unsigned int    __fpu_fsr;              /* %fsr */
        unsigned char   __fpu_qcnt;             /* # entries in __fpu_q */
        unsigned char   __fpu_q_entrysize;      /* size of a __fpu_q entry */
        unsigned char   __fpu_en;               /* this context valid? */
} __fpregset32_t;

/* `Extra Register State'(?) */
typedef struct {
        unsigned int    __xrs_id;       /* See below */
        unsigned int    __xrs_ptr;      /* points into filler area */
} __xrs32_t;

typedef struct {
        __gregset32_t   __gregs;        /* GPR state */
        netbsd32___gwindows32p_t __gwins;/* may point to register windows */
        __fpregset32_t  __fpregs;       /* FPU state, if any */
        __xrs32_t       __xrs;          /* may indicate extra reg state */
} mcontext32_t;

#define _UC_SETSTACK    _UC_MD_BIT16
#define _UC_CLRSTACK    _UC_MD_BIT17
#define _UC_TLSBASE     _UC_MD_BIT19

#define _UC_MACHINE32_PAD       43      /* compat_netbsd32 variant */
#define _UC_MACHINE32_SP(uc)    ((uc)->uc_mcontext.__gregs[_REG_O6])
#define _UC_MACHINE32_FP(uc)    (((__greg32_t *)_UC_MACHINE32_SP(uc))[15])

#endif /* _SPARC64_MCONTEXT_H_ */