1 /* Copyright (C) 2001, 2002 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, write to the Free 16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17 02111-1307 USA. */ 18 19 #ifndef _SYS_UCONTEXT_H 20 #define _SYS_UCONTEXT_H 1 21 22 #include <features.h> 23 #include <signal.h> 24 #include <bits/wordsize.h> 25 26 /* We need the signal context definitions even if they are not used 27 included in <signal.h>. */ 28 #include <bits/sigcontext.h> 29 30 #if __WORDSIZE == 64 31 32 /* Type for general register. */ 33 typedef long int greg_t; 34 35 /* Number of general registers. */ 36 #define NGREG 23 37 38 /* Container for all general registers. */ 39 typedef greg_t gregset_t[NGREG]; 40 41 #ifdef __USE_GNU 42 /* Number of each register in the `gregset_t' array. */ 43 enum 44 { 45 REG_R8 = 0, 46 # define REG_R8 REG_R8 47 REG_R9, 48 # define REG_R9 REG_R9 49 REG_R10, 50 # define REG_R10 REG_R10 51 REG_R11, 52 # define REG_R11 REG_R11 53 REG_R12, 54 # define REG_R12 REG_R12 55 REG_R13, 56 # define REG_R13 REG_R13 57 REG_R14, 58 # define REG_R14 REG_R14 59 REG_R15, 60 # define REG_R15 REG_R15 61 REG_RDI, 62 # define REG_RDI REG_RDI 63 REG_RSI, 64 # define REG_RSI REG_RSI 65 REG_RBP, 66 # define REG_RBP REG_RBP 67 REG_RBX, 68 # define REG_RBX REG_RBX 69 REG_RDX, 70 # define REG_RDX REG_RDX 71 REG_RAX, 72 # define REG_RAX REG_RAX 73 REG_RCX, 74 # define REG_RCX REG_RCX 75 REG_RSP, 76 # define REG_RSP REG_RSP 77 REG_RIP, 78 # define REG_RIP REG_RIP 79 REG_EFL, 80 # define REG_EFL REG_EFL 81 REG_CSGSFS, /* Actually short cs, gs, fs, __pad0. */ 82 # define REG_CSGSFS REG_CSGSFS 83 REG_ERR, 84 # define REG_ERR REG_ERR 85 REG_TRAPNO, 86 # define REG_TRAPNO REG_TRAPNO 87 REG_OLDMASK, 88 # define REG_OLDMASK REG_OLDMASK 89 REG_CR2 90 # define REG_CR2 REG_CR2 91 }; 92 #endif 93 94 struct _libc_fpxreg 95 { 96 unsigned short int significand[4]; 97 unsigned short int exponent; 98 unsigned short int padding[3]; 99 }; 100 101 struct _libc_xmmreg 102 { 103 __uint32_t element[4]; 104 }; 105 106 struct _libc_fpstate 107 { 108 /* 64-bit FXSAVE format. */ 109 __uint16_t cwd; 110 __uint16_t swd; 111 __uint16_t ftw; 112 __uint16_t fop; 113 __uint64_t rip; 114 __uint64_t rdp; 115 __uint32_t mxcsr; 116 __uint32_t mxcr_mask; 117 struct _libc_fpxreg _st[8]; 118 struct _libc_xmmreg _xmm[16]; 119 __uint32_t padding[24]; 120 }; 121 122 /* Structure to describe FPU registers. */ 123 typedef struct _libc_fpstate *fpregset_t; 124 125 /* Context to describe whole processor state. */ 126 typedef struct 127 { 128 gregset_t gregs; 129 /* Note that fpregs is a pointer. */ 130 fpregset_t fpregs; 131 unsigned long __reserved1 [8]; 132 } mcontext_t; 133 134 /* Userlevel context. */ 135 typedef struct ucontext 136 { 137 unsigned long int uc_flags; 138 struct ucontext *uc_link; 139 stack_t uc_stack; 140 mcontext_t uc_mcontext; 141 __sigset_t uc_sigmask; 142 struct _libc_fpstate __fpregs_mem; 143 } ucontext_t; 144 145 #else /* __WORDSIZE == 32 */ 146 147 /* Type for general register. */ 148 typedef int greg_t; 149 150 /* Number of general registers. */ 151 #define NGREG 19 152 153 /* Container for all general registers. */ 154 typedef greg_t gregset_t[NGREG]; 155 156 #ifdef __USE_GNU 157 /* Number of each register is the `gregset_t' array. */ 158 enum 159 { 160 REG_GS = 0, 161 # define REG_GS REG_GS 162 REG_FS, 163 # define REG_FS REG_FS 164 REG_ES, 165 # define REG_ES REG_ES 166 REG_DS, 167 # define REG_DS REG_DS 168 REG_EDI, 169 # define REG_EDI REG_EDI 170 REG_ESI, 171 # define REG_ESI REG_ESI 172 REG_EBP, 173 # define REG_EBP REG_EBP 174 REG_ESP, 175 # define REG_ESP REG_ESP 176 REG_EBX, 177 # define REG_EBX REG_EBX 178 REG_EDX, 179 # define REG_EDX REG_EDX 180 REG_ECX, 181 # define REG_ECX REG_ECX 182 REG_EAX, 183 # define REG_EAX REG_EAX 184 REG_TRAPNO, 185 # define REG_TRAPNO REG_TRAPNO 186 REG_ERR, 187 # define REG_ERR REG_ERR 188 REG_EIP, 189 # define REG_EIP REG_EIP 190 REG_CS, 191 # define REG_CS REG_CS 192 REG_EFL, 193 # define REG_EFL REG_EFL 194 REG_UESP, 195 # define REG_UESP REG_UESP 196 REG_SS 197 # define REG_SS REG_SS 198 }; 199 #endif 200 201 /* Definitions taken from the kernel headers. */ 202 struct _libc_fpreg 203 { 204 unsigned short int significand[4]; 205 unsigned short int exponent; 206 }; 207 208 struct _libc_fpstate 209 { 210 unsigned long int cw; 211 unsigned long int sw; 212 unsigned long int tag; 213 unsigned long int ipoff; 214 unsigned long int cssel; 215 unsigned long int dataoff; 216 unsigned long int datasel; 217 struct _libc_fpreg _st[8]; 218 unsigned long int status; 219 }; 220 221 /* Structure to describe FPU registers. */ 222 typedef struct _libc_fpstate *fpregset_t; 223 224 /* Context to describe whole processor state. */ 225 typedef struct 226 { 227 gregset_t gregs; 228 /* Due to Linux's history we have to use a pointer here. The SysV/i386 229 ABI requires a struct with the values. */ 230 fpregset_t fpregs; 231 unsigned long int oldmask; 232 unsigned long int cr2; 233 } mcontext_t; 234 235 /* Userlevel context. */ 236 typedef struct ucontext 237 { 238 unsigned long int uc_flags; 239 struct ucontext *uc_link; 240 stack_t uc_stack; 241 mcontext_t uc_mcontext; 242 __sigset_t uc_sigmask; 243 struct _libc_fpstate __fpregs_mem; 244 } ucontext_t; 245 246 #endif /* __WORDSIZE == 32 */ 247 248 #endif /* sys/ucontext.h */ 249