1 #ifndef _UAPI_ASM_X86_SIGCONTEXT_H 2 #define _UAPI_ASM_X86_SIGCONTEXT_H 3 4 /* 5 * Linux signal context definitions. The sigcontext includes a complex 6 * hierarchy of CPU and FPU state, available to user-space (on the stack) when 7 * a signal handler is executed. 8 * 9 * As over the years this ABI grew from its very simple roots towards 10 * supporting more and more CPU state organically, some of the details (which 11 * were rather clever hacks back in the days) became a bit quirky by today. 12 * 13 * The current ABI includes flexible provisions for future extensions, so we 14 * won't have to grow new quirks for quite some time. Promise! 15 */ 16 17 #include <linux/compiler.h> 18 #include <linux/types.h> 19 20 #define FP_XSTATE_MAGIC1 0x46505853U 21 #define FP_XSTATE_MAGIC2 0x46505845U 22 #define FP_XSTATE_MAGIC2_SIZE sizeof(FP_XSTATE_MAGIC2) 23 24 /* 25 * Bytes 464..511 in the current 512-byte layout of the FXSAVE/FXRSTOR frame 26 * are reserved for SW usage. On CPUs supporting XSAVE/XRSTOR, these bytes are 27 * used to extend the fpstate pointer in the sigcontext, which now includes the 28 * extended state information along with fpstate information. 29 * 30 * If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then there's a 31 * sw_reserved.extended_size bytes large extended context area present. (The 32 * last 32-bit word of this extended area (at the 33 * fpstate+extended_size-FP_XSTATE_MAGIC2_SIZE address) is set to 34 * FP_XSTATE_MAGIC2 so that you can sanity check your size calculations.) 35 * 36 * This extended area typically grows with newer CPUs that have larger and 37 * larger XSAVE areas. 38 */ 39 struct _fpx_sw_bytes { 40 /* 41 * If set to FP_XSTATE_MAGIC1 then this is an xstate context. 42 * 0 if a legacy frame. 43 */ 44 __u32 magic1; 45 46 /* 47 * Total size of the fpstate area: 48 * 49 * - if magic1 == 0 then it's sizeof(struct _fpstate) 50 * - if magic1 == FP_XSTATE_MAGIC1 then it's sizeof(struct _xstate) 51 * plus extensions (if any) 52 */ 53 __u32 extended_size; 54 55 /* 56 * Feature bit mask (including FP/SSE/extended state) that is present 57 * in the memory layout: 58 */ 59 __u64 xfeatures; 60 61 /* 62 * Actual XSAVE state size, based on the xfeatures saved in the layout. 63 * 'extended_size' is greater than 'xstate_size': 64 */ 65 __u32 xstate_size; 66 67 /* For future use: */ 68 __u32 padding[7]; 69 }; 70 71 /* 72 * As documented in the iBCS2 standard: 73 * 74 * The first part of "struct _fpstate" is just the normal i387 hardware setup, 75 * the extra "status" word is used to save the coprocessor status word before 76 * entering the handler. 77 * 78 * The FPU state data structure has had to grow to accommodate the extended FPU 79 * state required by the Streaming SIMD Extensions. There is no documented 80 * standard to accomplish this at the moment. 81 */ 82 83 /* 10-byte legacy floating point register: */ 84 struct _fpreg { 85 __u16 significand[4]; 86 __u16 exponent; 87 }; 88 89 /* 16-byte floating point register: */ 90 struct _fpxreg { 91 __u16 significand[4]; 92 __u16 exponent; 93 __u16 padding[3]; 94 }; 95 96 /* 16-byte XMM register: */ 97 struct _xmmreg { 98 __u32 element[4]; 99 }; 100 101 #define X86_FXSR_MAGIC 0x0000 102 103 /* 104 * The 32-bit FPU frame: 105 */ 106 struct _fpstate_32 { 107 /* Legacy FPU environment: */ 108 __u32 cw; 109 __u32 sw; 110 __u32 tag; 111 __u32 ipoff; 112 __u32 cssel; 113 __u32 dataoff; 114 __u32 datasel; 115 struct _fpreg _st[8]; 116 __u16 status; 117 __u16 magic; /* 0xffff: regular FPU data only */ 118 /* 0x0000: FXSR FPU data */ 119 120 /* FXSR FPU environment */ 121 __u32 _fxsr_env[6]; /* FXSR FPU env is ignored */ 122 __u32 mxcsr; 123 __u32 reserved; 124 struct _fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */ 125 struct _xmmreg _xmm[8]; /* First 8 XMM registers */ 126 union { 127 __u32 padding1[44]; /* Second 8 XMM registers plus padding */ 128 __u32 padding[44]; /* Alias name for old user-space */ 129 }; 130 131 union { 132 __u32 padding2[12]; 133 struct _fpx_sw_bytes sw_reserved; /* Potential extended state is encoded here */ 134 }; 135 }; 136 137 /* 138 * The 64-bit FPU frame. (FXSAVE format and later) 139 * 140 * Note1: If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then the structure is 141 * larger: 'struct _xstate'. Note that 'struct _xstate' embedds 142 * 'struct _fpstate' so that you can always assume the _fpstate portion 143 * exists so that you can check the magic value. 144 * 145 * Note2: Reserved fields may someday contain valuable data. Always 146 * save/restore them when you change signal frames. 147 */ 148 struct _fpstate_64 { 149 __u16 cwd; 150 __u16 swd; 151 /* Note this is not the same as the 32-bit/x87/FSAVE twd: */ 152 __u16 twd; 153 __u16 fop; 154 __u64 rip; 155 __u64 rdp; 156 __u32 mxcsr; 157 __u32 mxcsr_mask; 158 __u32 st_space[32]; /* 8x FP registers, 16 bytes each */ 159 __u32 xmm_space[64]; /* 16x XMM registers, 16 bytes each */ 160 __u32 reserved2[12]; 161 union { 162 __u32 reserved3[12]; 163 struct _fpx_sw_bytes sw_reserved; /* Potential extended state is encoded here */ 164 }; 165 }; 166 167 #ifdef __i386__ 168 # define _fpstate _fpstate_32 169 #else 170 # define _fpstate _fpstate_64 171 #endif 172 173 struct _header { 174 __u64 xfeatures; 175 __u64 reserved1[2]; 176 __u64 reserved2[5]; 177 }; 178 179 struct _ymmh_state { 180 /* 16x YMM registers, 16 bytes each: */ 181 __u32 ymmh_space[64]; 182 }; 183 184 /* 185 * Extended state pointed to by sigcontext::fpstate. 186 * 187 * In addition to the fpstate, information encoded in _xstate::xstate_hdr 188 * indicates the presence of other extended state information supported 189 * by the CPU and kernel: 190 */ 191 struct _xstate { 192 struct _fpstate fpstate; 193 struct _header xstate_hdr; 194 struct _ymmh_state ymmh; 195 /* New processor state extensions go here: */ 196 }; 197 198 /* 199 * The 32-bit signal frame: 200 */ 201 struct sigcontext_32 { 202 __u16 gs, __gsh; 203 __u16 fs, __fsh; 204 __u16 es, __esh; 205 __u16 ds, __dsh; 206 __u32 di; 207 __u32 si; 208 __u32 bp; 209 __u32 sp; 210 __u32 bx; 211 __u32 dx; 212 __u32 cx; 213 __u32 ax; 214 __u32 trapno; 215 __u32 err; 216 __u32 ip; 217 __u16 cs, __csh; 218 __u32 flags; 219 __u32 sp_at_signal; 220 __u16 ss, __ssh; 221 222 /* 223 * fpstate is really (struct _fpstate *) or (struct _xstate *) 224 * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved 225 * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end 226 * of extended memory layout. See comments at the definition of 227 * (struct _fpx_sw_bytes) 228 */ 229 __u32 fpstate; /* Zero when no FPU/extended context */ 230 __u32 oldmask; 231 __u32 cr2; 232 }; 233 234 /* 235 * The 64-bit signal frame: 236 */ 237 struct sigcontext_64 { 238 __u64 r8; 239 __u64 r9; 240 __u64 r10; 241 __u64 r11; 242 __u64 r12; 243 __u64 r13; 244 __u64 r14; 245 __u64 r15; 246 __u64 di; 247 __u64 si; 248 __u64 bp; 249 __u64 bx; 250 __u64 dx; 251 __u64 ax; 252 __u64 cx; 253 __u64 sp; 254 __u64 ip; 255 __u64 flags; 256 __u16 cs; 257 __u16 gs; 258 __u16 fs; 259 __u16 ss; 260 __u64 err; 261 __u64 trapno; 262 __u64 oldmask; 263 __u64 cr2; 264 265 /* 266 * fpstate is really (struct _fpstate *) or (struct _xstate *) 267 * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved 268 * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end 269 * of extended memory layout. See comments at the definition of 270 * (struct _fpx_sw_bytes) 271 */ 272 __u64 fpstate; /* Zero when no FPU/extended context */ 273 __u64 reserved1[8]; 274 }; 275 276 /* 277 * Create the real 'struct sigcontext' type: 278 */ 279 #ifdef __KERNEL__ 280 # ifdef __i386__ 281 # define sigcontext sigcontext_32 282 # else 283 # define sigcontext sigcontext_64 284 # endif 285 #endif 286 287 /* 288 * The old user-space sigcontext definition, just in case user-space still 289 * relies on it. The kernel definition (in asm/sigcontext.h) has unified 290 * field names but otherwise the same layout. 291 */ 292 #ifndef __KERNEL__ 293 294 #define _fpstate_ia32 _fpstate_32 295 #define sigcontext_ia32 sigcontext_32 296 297 298 # ifdef __i386__ 299 struct sigcontext { 300 __u16 gs, __gsh; 301 __u16 fs, __fsh; 302 __u16 es, __esh; 303 __u16 ds, __dsh; 304 __u32 edi; 305 __u32 esi; 306 __u32 ebp; 307 __u32 esp; 308 __u32 ebx; 309 __u32 edx; 310 __u32 ecx; 311 __u32 eax; 312 __u32 trapno; 313 __u32 err; 314 __u32 eip; 315 __u16 cs, __csh; 316 __u32 eflags; 317 __u32 esp_at_signal; 318 __u16 ss, __ssh; 319 struct _fpstate __user *fpstate; 320 __u32 oldmask; 321 __u32 cr2; 322 }; 323 # else /* __x86_64__: */ 324 struct sigcontext { 325 __u64 r8; 326 __u64 r9; 327 __u64 r10; 328 __u64 r11; 329 __u64 r12; 330 __u64 r13; 331 __u64 r14; 332 __u64 r15; 333 __u64 rdi; 334 __u64 rsi; 335 __u64 rbp; 336 __u64 rbx; 337 __u64 rdx; 338 __u64 rax; 339 __u64 rcx; 340 __u64 rsp; 341 __u64 rip; 342 __u64 eflags; /* RFLAGS */ 343 __u16 cs; 344 345 /* 346 * Prior to 2.5.64 ("[PATCH] x86-64 updates for 2.5.64-bk3"), 347 * Linux saved and restored fs and gs in these slots. This 348 * was counterproductive, as fsbase and gsbase were never 349 * saved, so arch_prctl was presumably unreliable. 350 * 351 * These slots should never be reused without extreme caution: 352 * 353 * - Some DOSEMU versions stash fs and gs in these slots manually, 354 * thus overwriting anything the kernel expects to be preserved 355 * in these slots. 356 * 357 * - If these slots are ever needed for any other purpose, 358 * there is some risk that very old 64-bit binaries could get 359 * confused. I doubt that many such binaries still work, 360 * though, since the same patch in 2.5.64 also removed the 361 * 64-bit set_thread_area syscall, so it appears that there 362 * is no TLS API beyond modify_ldt that works in both pre- 363 * and post-2.5.64 kernels. 364 * 365 * If the kernel ever adds explicit fs, gs, fsbase, and gsbase 366 * save/restore, it will most likely need to be opt-in and use 367 * different context slots. 368 */ 369 __u16 gs; 370 __u16 fs; 371 union { 372 __u16 ss; /* If UC_SIGCONTEXT_SS */ 373 __u16 __pad0; /* Alias name for old (!UC_SIGCONTEXT_SS) user-space */ 374 }; 375 __u64 err; 376 __u64 trapno; 377 __u64 oldmask; 378 __u64 cr2; 379 struct _fpstate __user *fpstate; /* Zero when no FPU context */ 380 # ifdef __ILP32__ 381 __u32 __fpstate_pad; 382 # endif 383 __u64 reserved1[8]; 384 }; 385 # endif /* __x86_64__ */ 386 #endif /* !__KERNEL__ */ 387 388 #endif /* _UAPI_ASM_X86_SIGCONTEXT_H */ 389