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.  */
33typedef long int greg_t;
34
35/* Number of general registers.  */
36#define NGREG	23
37
38/* Container for all general registers.  */
39typedef greg_t gregset_t[NGREG];
40
41#ifdef __USE_GNU
42/* Number of each register in the `gregset_t' array.  */
43enum
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
94struct _libc_fpxreg
95{
96  unsigned short int significand[4];
97  unsigned short int exponent;
98  unsigned short int padding[3];
99};
100
101struct _libc_xmmreg
102{
103  __uint32_t	element[4];
104};
105
106struct _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.  */
123typedef struct _libc_fpstate *fpregset_t;
124
125/* Context to describe whole processor state.  */
126typedef 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.  */
135typedef 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.  */
148typedef int greg_t;
149
150/* Number of general registers.  */
151#define NGREG	19
152
153/* Container for all general registers.  */
154typedef greg_t gregset_t[NGREG];
155
156#ifdef __USE_GNU
157/* Number of each register is the `gregset_t' array.  */
158enum
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.  */
202struct _libc_fpreg
203{
204  unsigned short int significand[4];
205  unsigned short int exponent;
206};
207
208struct _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.  */
222typedef struct _libc_fpstate *fpregset_t;
223
224/* Context to describe whole processor state.  */
225typedef 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.  */
236typedef 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