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