(root)/
glibc-2.38/
sysdeps/
unix/
sysv/
linux/
ia64/
sys/
ucontext.h
       1  /* Copyright (C) 1998-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #ifndef _SYS_UCONTEXT_H
      19  #define _SYS_UCONTEXT_H	1
      20  
      21  #include <features.h>
      22  
      23  #include <bits/types/sigset_t.h>
      24  #include <bits/types/stack_t.h>
      25  
      26  
      27  #ifdef __USE_MISC
      28  # define __ctx(fld) fld
      29  #else
      30  # define __ctx(fld) __ ## fld
      31  #endif
      32  
      33  /*
      34   * These are here mostly for backwards compatibility with older Unices.
      35   * IA-64 Linux does not distinguish between "mcontext_t" and
      36   * "ucontext_t" as all the necessary info is inside the former.
      37   */
      38  
      39  struct __ia64_fpreg_mcontext
      40    {
      41      union
      42        {
      43  	unsigned long __ctx(bits)[2];
      44        } __ctx(u);
      45    } __attribute__ ((__aligned__ (16)));
      46  
      47  typedef struct
      48    {
      49      unsigned long int __ctx(sc_flags);
      50      unsigned long int __ctx(sc_nat);
      51      stack_t __ctx(sc_stack);
      52      unsigned long int __ctx(sc_ip);
      53      unsigned long int __ctx(sc_cfm);
      54      unsigned long int __ctx(sc_um);
      55      unsigned long int __ctx(sc_ar_rsc);
      56      unsigned long int __ctx(sc_ar_bsp);
      57      unsigned long int __ctx(sc_ar_rnat);
      58      unsigned long int __ctx(sc_ar_ccv);
      59      unsigned long int __ctx(sc_ar_unat);
      60      unsigned long int __ctx(sc_ar_fpsr);
      61      unsigned long int __ctx(sc_ar_pfs);
      62      unsigned long int __ctx(sc_ar_lc);
      63      unsigned long int __ctx(sc_pr);
      64      unsigned long int __ctx(sc_br)[8];
      65      unsigned long int __ctx(sc_gr)[32];
      66      struct __ia64_fpreg_mcontext __ctx(sc_fr)[128];
      67      unsigned long int __ctx(sc_rbs_base);
      68      unsigned long int __ctx(sc_loadrs);
      69      unsigned long int __ctx(sc_ar25);
      70      unsigned long int __ctx(sc_ar26);
      71      unsigned long int __ctx(sc_rsvd)[12];
      72      unsigned long int __ctx(sc_mask);
      73    } mcontext_t;
      74  
      75  #if __GNUC_PREREQ (3, 5)
      76  # define _SC_GR0_OFFSET	\
      77  	__builtin_offsetof (mcontext_t, __ctx(sc_gr)[0])
      78  #elif defined __GNUC__
      79  # define _SC_GR0_OFFSET	\
      80  	(((char *) &((mcontext_t *) 0)->__ctx(sc_gr)[0]) - (char *) 0)
      81  #else
      82  # define _SC_GR0_OFFSET	0xc8	/* pray that this is correct... */
      83  #endif
      84  
      85  typedef struct ucontext_t
      86    {
      87      union
      88        {
      89  	mcontext_t _mc;
      90  	struct
      91  	  {
      92  	    unsigned long _pad[_SC_GR0_OFFSET/8];
      93  	    struct ucontext_t *_link;	/* this should overlay sc_gr[0] */
      94  	  }
      95  	_uc;
      96        }
      97      _u;
      98    }
      99  ucontext_t;
     100  
     101  #define uc_mcontext	_u._mc
     102  #define uc_sigmask	_u._mc.__ctx(sc_mask)
     103  #define uc_stack	_u._mc.__ctx(sc_stack)
     104  #define uc_link		_u._uc._link
     105  
     106  #endif /* sys/ucontext.h */