/* Copyright (C) 1998-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see . */ #ifndef _SYS_UCONTEXT_H #define _SYS_UCONTEXT_H 1 #include #include #include #include #ifdef __USE_MISC # define __ctx(fld) fld #else # define __ctx(fld) __ ## fld #endif #if __WORDSIZE == 64 #define __MC_NGREG 19 #ifdef __USE_MISC # define MC_TSTATE 0 # define MC_PC 1 # define MC_NPC 2 # define MC_Y 3 # define MC_G1 4 # define MC_G2 5 # define MC_G3 6 # define MC_G4 7 # define MC_G5 8 # define MC_G6 9 # define MC_G7 10 # define MC_O0 11 # define MC_O1 12 # define MC_O2 13 # define MC_O3 14 # define MC_O4 15 # define MC_O5 16 # define MC_O6 17 # define MC_O7 18 # define MC_NGREG __MC_NGREG #endif typedef unsigned long mc_greg_t; typedef mc_greg_t mc_gregset_t[__MC_NGREG]; #ifdef __USE_MISC # define MC_MAXFPQ 16 #endif struct __mc_fq { unsigned long *__ctx(mcfq_addr); unsigned int __ctx(mcfq_insn); }; typedef struct { union { unsigned int __ctx(sregs)[32]; unsigned long __ctx(dregs)[32]; long double __ctx(qregs)[16]; } __ctx(mcfpu_fregs); unsigned long __ctx(mcfpu_fsr); unsigned long __ctx(mcfpu_fprs); unsigned long __ctx(mcfpu_gsr); struct __mc_fq *__ctx(mcfpu_fq); unsigned char __ctx(mcfpu_qcnt); unsigned char __ctx(mcfpu_qentsz); unsigned char __ctx(mcfpu_enab); } mc_fpu_t; typedef struct { mc_gregset_t __ctx(mc_gregs); mc_greg_t __ctx(mc_fp); mc_greg_t __ctx(mc_i7); mc_fpu_t __ctx(mc_fpregs); } mcontext_t; typedef struct ucontext_t { struct ucontext_t *uc_link; unsigned long __ctx(uc_flags); unsigned long __uc_sigmask; mcontext_t uc_mcontext; stack_t uc_stack; sigset_t uc_sigmask; } ucontext_t; #endif /* __WORDISIZE == 64 */ /* * 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]. */ #ifdef __USE_MISC # define REG_PSR (0) # define REG_PC (1) # define REG_nPC (2) # define REG_Y (3) # define REG_G1 (4) # define REG_G2 (5) # define REG_G3 (6) # define REG_G4 (7) # define REG_G5 (8) # define REG_G6 (9) # define REG_G7 (10) # define REG_O0 (11) # define REG_O1 (12) # define REG_O2 (13) # define REG_O3 (14) # define REG_O4 (15) # define REG_O5 (16) # define REG_O6 (17) # define REG_O7 (18) #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 ABI defines it absolutely to be 21 (resp. 19). */ #if __WORDSIZE == 64 # define __NGREG 21 # ifdef __USE_MISC # define REG_ASI (19) # define REG_FPRS (20) # define NGREG __NGREG # endif typedef long greg_t; #else /* __WORDSIZE == 32 */ # define __NGREG 19 # ifdef __USE_MISC # define NGREG __NGREG # endif typedef int greg_t; #endif /* __WORDSIZE == 32 */ typedef greg_t gregset_t[__NGREG]; /* * The following structures define how a register window can appear on the * stack. This structure is available (when required) through the `gwins' * field of an mcontext (nested within ucontext). SPARC_MAXWINDOW is the * maximum number of outstanding regiters window defined in the SPARC * architecture (*not* implementation). */ # define __SPARC_MAXREGWINDOW 31 /* max windows in SPARC arch. */ #ifdef __USE_MISC # define SPARC_MAXREGWINDOW __SPARC_MAXREGWINDOW #endif struct __rwindow { greg_t __ctx(rw_local)[8]; /* locals */ greg_t __ctx(rw_in)[8]; /* ins */ }; #ifdef __USE_MISC # define rw_fp __ctx(rw_in)[6] /* frame pointer */ # define rw_rtn __ctx(rw_in)[7] /* return address */ #endif typedef struct { int __ctx(wbcnt); int *__ctx(spbuf)[__SPARC_MAXREGWINDOW]; struct __rwindow __ctx(wbuf)[__SPARC_MAXREGWINDOW]; } gwindows_t; /* * Floating point definitions. */ #ifdef __USE_MISC # define MAXFPQ 16 /* max # of fpu queue entries currently supported */ #endif /* * 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 long *__ctx(fpq_addr); /* address */ unsigned long __ctx(fpq_instr); /* instruction */ }; struct __fq { union /* FPU inst/addr queue */ { double __ctx(whole); struct __fpq __ctx(fpq); } __ctx(FQu); }; #ifdef __USE_MISC # define FPU_REGS_TYPE unsigned # define FPU_DREGS_TYPE unsigned long long # define V7_FPU_FSR_TYPE unsigned # define V9_FPU_FSR_TYPE unsigned long long # define V9_FPU_FPRS_TYPE unsigned #endif #if __WORDSIZE == 64 typedef struct { union { /* FPU floating point regs */ unsigned __ctx(fpu_regs)[32]; /* 32 singles */ double __ctx(fpu_dregs)[32]; /* 32 doubles */ long double __ctx(fpu_qregs)[16]; /* 16 quads */ } __ctx(fpu_fr); struct __fq *__ctx(fpu_q); /* ptr to array of FQ entries */ unsigned long __ctx(fpu_fsr); /* FPU status register */ unsigned char __ctx(fpu_qcnt); /* # of entries in saved FQ */ unsigned char __ctx(fpu_q_entrysize); /* # of bytes per FQ entry */ unsigned char __ctx(fpu_en); /* flag signifying fpu in use */ } fpregset_t; #else /* __WORDSIZE == 32 */ typedef struct { union { /* FPU floating point regs */ __extension__ unsigned long long __ctx(fpu_regs)[32]; /* 32 singles */ double __ctx(fpu_dregs)[16]; /* 16 doubles */ } __ctx(fpu_fr); struct __fq *__ctx(fpu_q); /* ptr to array of FQ entries */ unsigned __ctx(fpu_fsr); /* FPU status register */ unsigned char __ctx(fpu_qcnt); /* # of entries in saved FQ */ unsigned char __ctx(fpu_q_entrysize); /* # of bytes per FQ entry */ unsigned char __ctx(fpu_en); /* flag signifying fpu in use */ } fpregset_t; /* * 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 __ctx(xrs_id); /* indicates xrs_ptr validity */ void * __ctx(xrs_ptr); /* ptr to extra reg state */ } xrs_t; #ifdef __USE_MISC # define XRS_ID 0x78727300 /* the string "xrs" */ #endif typedef struct { gregset_t __ctx(gregs); /* general register set */ gwindows_t *__ctx(gwins); /* POSSIBLE pointer to register windows */ fpregset_t __ctx(fpregs); /* floating point register set */ xrs_t __ctx(xrs); /* POSSIBLE extra register state association */ long __glibc_reserved1[19]; } mcontext_t; /* Userlevel context. */ typedef struct ucontext_t { unsigned long __ctx(uc_flags); struct ucontext_t *uc_link; sigset_t uc_sigmask; stack_t uc_stack; mcontext_t uc_mcontext; } ucontext_t; #endif /* __WORDSIZE == 32 */ #endif /* sys/ucontext.h */