1 /* Copyright (C) 1998-2022 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 */ 107