1    	/* Copyright (C) 2001-2015 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