| 1 | /* Copyright (C) 2002-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 _BITS_SIGCONTEXT_H  |
| 19 | #define _BITS_SIGCONTEXT_H 1  |
| 20 |   |
| 21 | #if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H  |
| 22 | # error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."  |
| 23 | #endif  |
| 24 |   |
| 25 | #include <bits/types.h>  |
| 26 |   |
| 27 | #define FP_XSTATE_MAGIC1 0x46505853U  |
| 28 | #define FP_XSTATE_MAGIC2 0x46505845U  |
| 29 | #define FP_XSTATE_MAGIC2_SIZE sizeof (FP_XSTATE_MAGIC2)  |
| 30 |   |
| 31 | struct _fpx_sw_bytes  |
| 32 | {  |
| 33 | __uint32_t magic1;  |
| 34 | __uint32_t extended_size;  |
| 35 | __uint64_t xstate_bv;  |
| 36 | __uint32_t xstate_size;  |
| 37 | __uint32_t __glibc_reserved1[7];  |
| 38 | };  |
| 39 |   |
| 40 | struct _fpreg  |
| 41 | {  |
| 42 | unsigned short significand[4];  |
| 43 | unsigned short exponent;  |
| 44 | };  |
| 45 |   |
| 46 | struct _fpxreg  |
| 47 | {  |
| 48 | unsigned short significand[4];  |
| 49 | unsigned short exponent;  |
| 50 | unsigned short __glibc_reserved1[3];  |
| 51 | };  |
| 52 |   |
| 53 | struct _xmmreg  |
| 54 | {  |
| 55 | __uint32_t element[4];  |
| 56 | };  |
| 57 |   |
| 58 |   |
| 59 |   |
| 60 | #ifndef __x86_64__  |
| 61 |   |
| 62 | struct _fpstate  |
| 63 | {  |
| 64 | /* Regular FPU environment. */  |
| 65 | __uint32_t cw;  |
| 66 | __uint32_t sw;  |
| 67 | __uint32_t tag;  |
| 68 | __uint32_t ipoff;  |
| 69 | __uint32_t cssel;  |
| 70 | __uint32_t dataoff;  |
| 71 | __uint32_t datasel;  |
| 72 | struct _fpreg _st[8];  |
| 73 | unsigned short status;  |
| 74 | unsigned short magic;  |
| 75 |   |
| 76 | /* FXSR FPU environment. */  |
| 77 | __uint32_t _fxsr_env[6];  |
| 78 | __uint32_t mxcsr;  |
| 79 | __uint32_t __glibc_reserved1;  |
| 80 | struct _fpxreg _fxsr_st[8];  |
| 81 | struct _xmmreg _xmm[8];  |
| 82 | __uint32_t __glibc_reserved2[56];  |
| 83 | };  |
| 84 |   |
| 85 | #ifndef sigcontext_struct  |
| 86 | /* Kernel headers before 2.1.1 define a struct sigcontext_struct, but  |
| 87 | we need sigcontext. Some packages have come to rely on  |
| 88 | sigcontext_struct being defined on 32-bit x86, so define this for  |
| 89 | their benefit. */  |
| 90 | # define sigcontext_struct sigcontext  |
| 91 | #endif  |
| 92 |   |
| 93 | #define X86_FXSR_MAGIC 0x0000  |
| 94 |   |
| 95 | struct sigcontext  |
| 96 | {  |
| 97 | unsigned short gs, __gsh;  |
| 98 | unsigned short fs, __fsh;  |
| 99 | unsigned short es, __esh;  |
| 100 | unsigned short ds, __dsh;  |
| 101 | unsigned long edi;  |
| 102 | unsigned long esi;  |
| 103 | unsigned long ebp;  |
| 104 | unsigned long esp;  |
| 105 | unsigned long ebx;  |
| 106 | unsigned long edx;  |
| 107 | unsigned long ecx;  |
| 108 | unsigned long eax;  |
| 109 | unsigned long trapno;  |
| 110 | unsigned long err;  |
| 111 | unsigned long eip;  |
| 112 | unsigned short cs, __csh;  |
| 113 | unsigned long eflags;  |
| 114 | unsigned long esp_at_signal;  |
| 115 | unsigned short ss, __ssh;  |
| 116 | struct _fpstate * fpstate;  |
| 117 | unsigned long oldmask;  |
| 118 | unsigned long cr2;  |
| 119 | };  |
| 120 |   |
| 121 | #else /* __x86_64__ */  |
| 122 |   |
| 123 | struct _fpstate  |
| 124 | {  |
| 125 | /* FPU environment matching the 64-bit FXSAVE layout. */  |
| 126 | __uint16_t cwd;  |
| 127 | __uint16_t swd;  |
| 128 | __uint16_t ftw;  |
| 129 | __uint16_t fop;  |
| 130 | __uint64_t rip;  |
| 131 | __uint64_t rdp;  |
| 132 | __uint32_t mxcsr;  |
| 133 | __uint32_t mxcr_mask;  |
| 134 | struct _fpxreg _st[8];  |
| 135 | struct _xmmreg _xmm[16];  |
| 136 | __uint32_t __glibc_reserved1[24];  |
| 137 | };  |
| 138 |   |
| 139 | struct sigcontext  |
| 140 | {  |
| 141 | __uint64_t r8;  |
| 142 | __uint64_t r9;  |
| 143 | __uint64_t r10;  |
| 144 | __uint64_t r11;  |
| 145 | __uint64_t r12;  |
| 146 | __uint64_t r13;  |
| 147 | __uint64_t r14;  |
| 148 | __uint64_t r15;  |
| 149 | __uint64_t rdi;  |
| 150 | __uint64_t rsi;  |
| 151 | __uint64_t rbp;  |
| 152 | __uint64_t rbx;  |
| 153 | __uint64_t rdx;  |
| 154 | __uint64_t rax;  |
| 155 | __uint64_t rcx;  |
| 156 | __uint64_t rsp;  |
| 157 | __uint64_t rip;  |
| 158 | __uint64_t eflags;  |
| 159 | unsigned short cs;  |
| 160 | unsigned short gs;  |
| 161 | unsigned short fs;  |
| 162 | unsigned short __pad0;  |
| 163 | __uint64_t err;  |
| 164 | __uint64_t trapno;  |
| 165 | __uint64_t oldmask;  |
| 166 | __uint64_t cr2;  |
| 167 | __extension__ union  |
| 168 | {  |
| 169 | struct _fpstate * fpstate;  |
| 170 | __uint64_t __fpstate_word;  |
| 171 | };  |
| 172 | __uint64_t __reserved1 [8];  |
| 173 | };  |
| 174 |   |
| 175 | #endif /* __x86_64__ */  |
| 176 |   |
| 177 | struct _xsave_hdr  |
| 178 | {  |
| 179 | __uint64_t xstate_bv;  |
| 180 | __uint64_t __glibc_reserved1[2];  |
| 181 | __uint64_t __glibc_reserved2[5];  |
| 182 | };  |
| 183 |   |
| 184 | struct _ymmh_state  |
| 185 | {  |
| 186 | __uint32_t ymmh_space[64];  |
| 187 | };  |
| 188 |   |
| 189 | struct _xstate  |
| 190 | {  |
| 191 | struct _fpstate fpstate;  |
| 192 | struct _xsave_hdr xstate_hdr;  |
| 193 | struct _ymmh_state ymmh;  |
| 194 | };  |
| 195 |   |
| 196 | #endif /* _BITS_SIGCONTEXT_H */  |
| 197 | |