1 /* Copyright (C) 1997-2022 Free Software Foundation, Inc. This file is part of the GNU C Library. 2 3 The GNU C Library is free software; you can redistribute it and/or 4 modify it under the terms of the GNU Lesser General Public 5 License as published by the Free Software Foundation; either 6 version 2.1 of the License, or (at your option) any later version. 7 8 The GNU C Library is distributed in the hope that it will be useful, 9 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 Lesser General Public License for more details. 12 13 You should have received a copy of the GNU Lesser General Public 14 License along with the GNU C Library. If not, see 15 <https://www.gnu.org/licenses/>. */ 16 17 /* Don't rely on this, the interface is currently messed up and may need to 18 be broken to be fixed. */ 19 #ifndef _SYS_UCONTEXT_H 20 #define _SYS_UCONTEXT_H 1 21 22 #include <features.h> 23 24 #include <bits/types/sigset_t.h> 25 #include <bits/types/stack_t.h> 26 27 #include <sgidefs.h> 28 29 30 /* Type for general register. Even in o32 we assume 64-bit registers, 31 like the kernel. */ 32 __extension__ typedef unsigned long long int greg_t; 33 34 /* Number of general registers. */ 35 #define __NGREG 32 36 #define __NFPREG 32 37 #ifdef __USE_MISC 38 # define NGREG __NGREG 39 # define NFPREG __NFPREG 40 #endif 41 42 /* Container for all general registers. */ 43 typedef greg_t gregset_t[__NGREG]; 44 45 #ifdef __USE_MISC 46 # define __ctx(fld) fld 47 #else 48 # define __ctx(fld) __ ## fld 49 #endif 50 51 /* Container for all FPU registers. */ 52 typedef struct { 53 union { 54 double __ctx(fp_dregs)[__NFPREG]; 55 struct { 56 float _fp_fregs; 57 unsigned int _fp_pad; 58 } __ctx(fp_fregs)[__NFPREG]; 59 } __ctx(fp_r); 60 } fpregset_t; 61 62 63 /* Context to describe whole processor state. */ 64 #if _MIPS_SIM == _ABIO32 65 /* Earlier versions of glibc for mips had an entirely different 66 definition of mcontext_t, that didn't even resemble the 67 corresponding kernel data structure. Fortunately, makecontext, 68 [gs]etcontext et all were not implemented back then, so this can 69 still be rectified. */ 70 typedef struct 71 { 72 unsigned int __ctx(regmask); 73 unsigned int __ctx(status); 74 greg_t __ctx(pc); 75 gregset_t __ctx(gregs); 76 fpregset_t __ctx(fpregs); 77 unsigned int __ctx(fp_owned); 78 unsigned int __ctx(fpc_csr); 79 unsigned int __ctx(fpc_eir); 80 unsigned int __ctx(used_math); 81 unsigned int __ctx(dsp); 82 greg_t __ctx(mdhi); 83 greg_t __ctx(mdlo); 84 unsigned long __ctx(hi1); 85 unsigned long __ctx(lo1); 86 unsigned long __ctx(hi2); 87 unsigned long __ctx(lo2); 88 unsigned long __ctx(hi3); 89 unsigned long __ctx(lo3); 90 } mcontext_t; 91 #else 92 typedef struct 93 { 94 gregset_t __ctx(gregs); 95 fpregset_t __ctx(fpregs); 96 greg_t __ctx(mdhi); 97 greg_t __ctx(hi1); 98 greg_t __ctx(hi2); 99 greg_t __ctx(hi3); 100 greg_t __ctx(mdlo); 101 greg_t __ctx(lo1); 102 greg_t __ctx(lo2); 103 greg_t __ctx(lo3); 104 greg_t __ctx(pc); 105 unsigned int __ctx(fpc_csr); 106 unsigned int __ctx(used_math); 107 unsigned int __ctx(dsp); 108 unsigned int __glibc_reserved1; 109 } mcontext_t; 110 #endif 111 112 /* Userlevel context. */ 113 typedef struct ucontext_t 114 { 115 unsigned long int __ctx(uc_flags); 116 struct ucontext_t *uc_link; 117 stack_t uc_stack; 118 mcontext_t uc_mcontext; 119 sigset_t uc_sigmask; 120 } ucontext_t; 121 122 #undef __ctx 123 124 #endif /* sys/ucontext.h */ 125