Subversion Repositories Kolibri OS

Rev

Rev 5270 | Rev 6934 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5270 serge 1
#ifndef _UAPI_ASM_X86_SIGCONTEXT_H
2
#define _UAPI_ASM_X86_SIGCONTEXT_H
3
 
6082 serge 4
/*
5
 * Linux signal context definitions. The sigcontext includes a complex
6
 * hierarchy of CPU and FPU state, available to user-space (on the stack) when
7
 * a signal handler is executed.
8
 *
9
 * As over the years this ABI grew from its very simple roots towards
10
 * supporting more and more CPU state organically, some of the details (which
11
 * were rather clever hacks back in the days) became a bit quirky by today.
12
 *
13
 * The current ABI includes flexible provisions for future extensions, so we
14
 * won't have to grow new quirks for quite some time. Promise!
15
 */
16
 
5270 serge 17
#include 
18
#include 
19
 
6082 serge 20
#define FP_XSTATE_MAGIC1		0x46505853U
21
#define FP_XSTATE_MAGIC2		0x46505845U
22
#define FP_XSTATE_MAGIC2_SIZE		sizeof(FP_XSTATE_MAGIC2)
5270 serge 23
 
24
/*
6082 serge 25
 * Bytes 464..511 in the current 512-byte layout of the FXSAVE/FXRSTOR frame
26
 * are reserved for SW usage. On CPUs supporting XSAVE/XRSTOR, these bytes are
27
 * used to extend the fpstate pointer in the sigcontext, which now includes the
28
 * extended state information along with fpstate information.
5270 serge 29
 *
6082 serge 30
 * If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then there's a
31
 * sw_reserved.extended_size bytes large extended context area present. (The
32
 * last 32-bit word of this extended area (at the
33
 * fpstate+extended_size-FP_XSTATE_MAGIC2_SIZE address) is set to
34
 * FP_XSTATE_MAGIC2 so that you can sanity check your size calculations.)
35
 *
36
 * This extended area typically grows with newer CPUs that have larger and
37
 * larger XSAVE areas.
5270 serge 38
 */
39
struct _fpx_sw_bytes {
6082 serge 40
	/*
41
	 * If set to FP_XSTATE_MAGIC1 then this is an xstate context.
42
	 * 0 if a legacy frame.
43
	 */
44
	__u32				magic1;
45
 
46
	/*
47
	 * Total size of the fpstate area:
48
	 *
49
	 *  - if magic1 == 0 then it's sizeof(struct _fpstate)
50
	 *  - if magic1 == FP_XSTATE_MAGIC1 then it's sizeof(struct _xstate)
51
	 *    plus extensions (if any)
52
	 */
53
	__u32				extended_size;
54
 
55
	/*
56
	 * Feature bit mask (including FP/SSE/extended state) that is present
57
	 * in the memory layout:
58
	 */
59
	__u64				xfeatures;
60
 
61
	/*
62
	 * Actual XSAVE state size, based on the xfeatures saved in the layout.
63
	 * 'extended_size' is greater than 'xstate_size':
64
	 */
65
	__u32				xstate_size;
66
 
67
	/* For future use: */
68
	__u32				padding[7];
5270 serge 69
};
70
 
71
/*
6082 serge 72
 * As documented in the iBCS2 standard:
5270 serge 73
 *
6082 serge 74
 * The first part of "struct _fpstate" is just the normal i387 hardware setup,
75
 * the extra "status" word is used to save the coprocessor status word before
76
 * entering the handler.
5270 serge 77
 *
6082 serge 78
 * The FPU state data structure has had to grow to accommodate the extended FPU
79
 * state required by the Streaming SIMD Extensions.  There is no documented
80
 * standard to accomplish this at the moment.
5270 serge 81
 */
6082 serge 82
 
83
/* 10-byte legacy floating point register: */
5270 serge 84
struct _fpreg {
6082 serge 85
	__u16				significand[4];
86
	__u16				exponent;
5270 serge 87
};
88
 
6082 serge 89
/* 16-byte floating point register: */
5270 serge 90
struct _fpxreg {
6082 serge 91
	__u16				significand[4];
92
	__u16				exponent;
93
	__u16				padding[3];
5270 serge 94
};
95
 
6082 serge 96
/* 16-byte XMM register: */
5270 serge 97
struct _xmmreg {
6082 serge 98
	__u32				element[4];
5270 serge 99
};
100
 
6082 serge 101
#define X86_FXSR_MAGIC			0x0000
5270 serge 102
 
6082 serge 103
/*
104
 * The 32-bit FPU frame:
105
 */
106
struct _fpstate_32 {
107
	/* Legacy FPU environment: */
108
	__u32				cw;
109
	__u32				sw;
110
	__u32				tag;
111
	__u32				ipoff;
112
	__u32				cssel;
113
	__u32				dataoff;
114
	__u32				datasel;
115
	struct _fpreg			_st[8];
116
	__u16				status;
117
	__u16				magic;		/* 0xffff: regular FPU data only */
118
							/* 0x0000: FXSR FPU data */
119
 
5270 serge 120
	/* FXSR FPU environment */
6082 serge 121
	__u32				_fxsr_env[6];	/* FXSR FPU env is ignored */
122
	__u32				mxcsr;
123
	__u32				reserved;
124
	struct _fpxreg			_fxsr_st[8];	/* FXSR FPU reg data is ignored */
125
	struct _xmmreg			_xmm[8];	/* First 8 XMM registers */
126
	union {
127
		__u32			padding1[44];	/* Second 8 XMM registers plus padding */
128
		__u32			padding[44];	/* Alias name for old user-space */
129
	};
5270 serge 130
 
131
	union {
6082 serge 132
		__u32			padding2[12];
133
		struct _fpx_sw_bytes	sw_reserved;	/* Potential extended state is encoded here */
5270 serge 134
	};
135
};
136
 
137
/*
6082 serge 138
 * The 64-bit FPU frame. (FXSAVE format and later)
139
 *
140
 * Note1: If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then the structure is
141
 *        larger: 'struct _xstate'. Note that 'struct _xstate' embedds
142
 *        'struct _fpstate' so that you can always assume the _fpstate portion
143
 *        exists so that you can check the magic value.
144
 *
145
 * Note2: Reserved fields may someday contain valuable data. Always
146
 *	  save/restore them when you change signal frames.
5270 serge 147
 */
6082 serge 148
struct _fpstate_64 {
149
	__u16				cwd;
150
	__u16				swd;
151
	/* Note this is not the same as the 32-bit/x87/FSAVE twd: */
152
	__u16				twd;
153
	__u16				fop;
154
	__u64				rip;
155
	__u64				rdp;
156
	__u32				mxcsr;
157
	__u32				mxcsr_mask;
158
	__u32				st_space[32];	/*  8x  FP registers, 16 bytes each */
159
	__u32				xmm_space[64];	/* 16x XMM registers, 16 bytes each */
160
	__u32				reserved2[12];
161
	union {
162
		__u32			reserved3[12];
163
		struct _fpx_sw_bytes	sw_reserved;	/* Potential extended state is encoded here */
164
	};
5270 serge 165
};
166
 
6082 serge 167
#ifdef __i386__
168
# define _fpstate _fpstate_32
169
#else
170
# define _fpstate _fpstate_64
171
#endif
5270 serge 172
 
6082 serge 173
struct _header {
174
	__u64				xfeatures;
175
	__u64				reserved1[2];
176
	__u64				reserved2[5];
5270 serge 177
};
178
 
6082 serge 179
struct _ymmh_state {
180
	/* 16x YMM registers, 16 bytes each: */
181
	__u32				ymmh_space[64];
182
};
183
 
5270 serge 184
/*
6082 serge 185
 * Extended state pointed to by sigcontext::fpstate.
186
 *
187
 * In addition to the fpstate, information encoded in _xstate::xstate_hdr
188
 * indicates the presence of other extended state information supported
189
 * by the CPU and kernel:
5270 serge 190
 */
6082 serge 191
struct _xstate {
192
	struct _fpstate			fpstate;
193
	struct _header			xstate_hdr;
194
	struct _ymmh_state		ymmh;
195
	/* New processor state extensions go here: */
5270 serge 196
};
197
 
6082 serge 198
/*
199
 * The 32-bit signal frame:
200
 */
201
struct sigcontext_32 {
202
	__u16				gs, __gsh;
203
	__u16				fs, __fsh;
204
	__u16				es, __esh;
205
	__u16				ds, __dsh;
206
	__u32				di;
207
	__u32				si;
208
	__u32				bp;
209
	__u32				sp;
210
	__u32				bx;
211
	__u32				dx;
212
	__u32				cx;
213
	__u32				ax;
214
	__u32				trapno;
215
	__u32				err;
216
	__u32				ip;
217
	__u16				cs, __csh;
218
	__u32				flags;
219
	__u32				sp_at_signal;
220
	__u16				ss, __ssh;
5270 serge 221
 
6082 serge 222
	/*
223
	 * fpstate is really (struct _fpstate *) or (struct _xstate *)
224
	 * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
225
	 * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
226
	 * of extended memory layout. See comments at the definition of
227
	 * (struct _fpx_sw_bytes)
228
	 */
229
	__u32				fpstate; /* Zero when no FPU/extended context */
230
	__u32				oldmask;
231
	__u32				cr2;
5270 serge 232
};
233
 
6082 serge 234
/*
235
 * The 64-bit signal frame:
236
 */
237
struct sigcontext_64 {
238
	__u64				r8;
239
	__u64				r9;
240
	__u64				r10;
241
	__u64				r11;
242
	__u64				r12;
243
	__u64				r13;
244
	__u64				r14;
245
	__u64				r15;
246
	__u64				di;
247
	__u64				si;
248
	__u64				bp;
249
	__u64				bx;
250
	__u64				dx;
251
	__u64				ax;
252
	__u64				cx;
253
	__u64				sp;
254
	__u64				ip;
255
	__u64				flags;
256
	__u16				cs;
257
	__u16				gs;
258
	__u16				fs;
259
	__u16				__pad0;
260
	__u64				err;
261
	__u64				trapno;
262
	__u64				oldmask;
263
	__u64				cr2;
264
 
265
	/*
266
	 * fpstate is really (struct _fpstate *) or (struct _xstate *)
267
	 * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
268
	 * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
269
	 * of extended memory layout. See comments at the definition of
270
	 * (struct _fpx_sw_bytes)
271
	 */
272
	__u64				fpstate; /* Zero when no FPU/extended context */
273
	__u64				reserved1[8];
5270 serge 274
};
275
 
276
/*
6082 serge 277
 * Create the real 'struct sigcontext' type:
5270 serge 278
 */
6082 serge 279
#ifdef __KERNEL__
280
# ifdef __i386__
281
#  define sigcontext sigcontext_32
282
# else
283
#  define sigcontext sigcontext_64
284
# endif
285
#endif
286
 
287
/*
288
 * The old user-space sigcontext definition, just in case user-space still
289
 * relies on it. The kernel definition (in asm/sigcontext.h) has unified
290
 * field names but otherwise the same layout.
291
 */
292
#ifndef __KERNEL__
293
 
294
#define _fpstate_ia32			_fpstate_32
295
#define sigcontext_ia32			sigcontext_32
296
 
297
 
298
# ifdef __i386__
299
struct sigcontext {
300
	__u16				gs, __gsh;
301
	__u16				fs, __fsh;
302
	__u16				es, __esh;
303
	__u16				ds, __dsh;
304
	__u32				edi;
305
	__u32				esi;
306
	__u32				ebp;
307
	__u32				esp;
308
	__u32				ebx;
309
	__u32				edx;
310
	__u32				ecx;
311
	__u32				eax;
312
	__u32				trapno;
313
	__u32				err;
314
	__u32				eip;
315
	__u16				cs, __csh;
316
	__u32				eflags;
317
	__u32				esp_at_signal;
318
	__u16				ss, __ssh;
319
	struct _fpstate __user		*fpstate;
320
	__u32				oldmask;
321
	__u32				cr2;
5270 serge 322
};
6082 serge 323
# else /* __x86_64__: */
324
struct sigcontext {
325
	__u64				r8;
326
	__u64				r9;
327
	__u64				r10;
328
	__u64				r11;
329
	__u64				r12;
330
	__u64				r13;
331
	__u64				r14;
332
	__u64				r15;
333
	__u64				rdi;
334
	__u64				rsi;
335
	__u64				rbp;
336
	__u64				rbx;
337
	__u64				rdx;
338
	__u64				rax;
339
	__u64				rcx;
340
	__u64				rsp;
341
	__u64				rip;
342
	__u64				eflags;		/* RFLAGS */
343
	__u16				cs;
344
	__u16				gs;
345
	__u16				fs;
346
	__u16				__pad0;
347
	__u64				err;
348
	__u64				trapno;
349
	__u64				oldmask;
350
	__u64				cr2;
351
	struct _fpstate __user		*fpstate;	/* Zero when no FPU context */
352
#  ifdef __ILP32__
353
	__u32				__fpstate_pad;
354
#  endif
355
	__u64				reserved1[8];
356
};
357
# endif /* __x86_64__ */
358
#endif /* !__KERNEL__ */
5270 serge 359
 
360
#endif /* _UAPI_ASM_X86_SIGCONTEXT_H */