/*      $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_ */