1 /* Copyright (C) 1997-2021 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 /* System V/i386 ABI compliant context switching support. */ 19 20 #ifndef _SYS_UCONTEXT_H 21 #define _SYS_UCONTEXT_H 1 22 23 #include <features.h> 24 25 #include <bits/types/sigset_t.h> 26 #include <bits/types/stack_t.h> 27 28 29 /* Type for general register. */ 30 typedef int greg_t; 31 32 /* Number of general registers. */ 33 #define __NGREG 19 34 #ifdef __USE_MISC 35 # define NGREG __NGREG 36 #endif 37 38 /* Container for all general registers. */ 39 typedef greg_t gregset_t[__NGREG]; 40 41 #ifdef __USE_MISC 42 /* Number of each register is the `gregset_t' array. */ 43 enum 44 { 45 REG_GS = 0, 46 # define REG_GS REG_GS 47 REG_FS, 48 # define REG_FS REG_FS 49 REG_ES, 50 # define REG_ES REG_ES 51 REG_DS, 52 # define REG_DS REG_DS 53 REG_EDI, 54 # define REG_EDI REG_EDI 55 REG_ESI, 56 # define REG_ESI REG_ESI 57 REG_EBP, 58 # define REG_EBP REG_EBP 59 REG_ESP, 60 # define REG_ESP REG_ESP 61 REG_EBX, 62 # define REG_EBX REG_EBX 63 REG_EDX, 64 # define REG_EDX REG_EDX 65 REG_ECX, 66 # define REG_ECX REG_ECX 67 REG_EAX, 68 # define REG_EAX REG_EAX 69 REG_TRAPNO, 70 # define REG_TRAPNO REG_TRAPNO 71 REG_ERR, 72 # define REG_ERR REG_ERR 73 REG_EIP, 74 # define REG_EIP REG_EIP 75 REG_CS, 76 # define REG_CS REG_CS 77 REG_EFL, 78 # define REG_EFL REG_EFL 79 REG_UESP, 80 # define REG_UESP REG_UESP 81 REG_SS 82 # define REG_SS REG_SS 83 }; 84 #endif 85 86 #ifdef __USE_MISC 87 # define __ctx(fld) fld 88 # define __ctxt(tag) tag 89 #else 90 # define __ctx(fld) __ ## fld 91 # define __ctxt(tag) /* Empty. */ 92 #endif 93 94 /* Structure to describe FPU registers. */ 95 typedef struct 96 { 97 union 98 { __ctxt(fpchip_state)99 struct __ctxt(fpchip_state) 100 { 101 int __ctx(state)[27]; 102 int __ctx(status); 103 } __ctx(fpchip_state); 104 __ctxt(fp_emul_space)105 struct __ctxt(fp_emul_space) 106 { 107 char __ctx(fp_emul)[246]; 108 char __ctx(fp_epad)[2]; 109 } __ctx(fp_emul_space); 110 111 int __ctx(f_fpregs)[62]; 112 } __ctx(fp_reg_set); 113 114 long int __ctx(f_wregs)[33]; 115 } fpregset_t; 116 117 /* Context to describe whole processor state. */ 118 typedef struct 119 { 120 gregset_t __ctx(gregs); 121 fpregset_t __ctx(fpregs); 122 } mcontext_t; 123 124 /* Userlevel context. */ 125 typedef struct ucontext_t 126 { 127 unsigned long int __ctx(uc_flags); 128 struct ucontext_t *uc_link; 129 sigset_t uc_sigmask; 130 stack_t uc_stack; 131 mcontext_t uc_mcontext; 132 long int __glibc_reserved1[5]; 133 } ucontext_t; 134 135 #undef __ctx 136 #undef __ctxt 137 138 #endif /* sys/ucontext.h */ 139