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