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