1#ifndef _ASMi386_SIGCONTEXT_H
2#define _ASMi386_SIGCONTEXT_H
3
4#include <linux/compiler.h>
5
6/*
7 * As documented in the iBCS2 standard..
8 *
9 * The first part of "struct _fpstate" is just the normal i387
10 * hardware setup, the extra "status" word is used to save the
11 * coprocessor status word before entering the handler.
12 *
13 * Pentium III FXSR, SSE support
14 *	Gareth Hughes <gareth@valinux.com>, May 2000
15 *
16 * The FPU state data structure has had to grow to accommodate the
17 * extended FPU state required by the Streaming SIMD Extensions.
18 * There is no documented standard to accomplish this at the moment.
19 */
20struct _fpreg {
21	unsigned short significand[4];
22	unsigned short exponent;
23};
24
25struct _fpxreg {
26	unsigned short significand[4];
27	unsigned short exponent;
28	unsigned short padding[3];
29};
30
31struct _xmmreg {
32	unsigned long element[4];
33};
34
35struct _fpstate {
36	/* Regular FPU environment */
37	unsigned long 	cw;
38	unsigned long	sw;
39	unsigned long	tag;
40	unsigned long	ipoff;
41	unsigned long	cssel;
42	unsigned long	dataoff;
43	unsigned long	datasel;
44	struct _fpreg	_st[8];
45	unsigned short	status;
46	unsigned short	magic;		/* 0xffff = regular FPU data only */
47
48	/* FXSR FPU environment */
49	unsigned long	_fxsr_env[6];	/* FXSR FPU env is ignored */
50	unsigned long	mxcsr;
51	unsigned long	reserved;
52	struct _fpxreg	_fxsr_st[8];	/* FXSR FPU reg data is ignored */
53	struct _xmmreg	_xmm[8];
54	unsigned long	padding[56];
55};
56
57#define X86_FXSR_MAGIC		0x0000
58
59struct sigcontext {
60	unsigned short gs, __gsh;
61	unsigned short fs, __fsh;
62	unsigned short es, __esh;
63	unsigned short ds, __dsh;
64	unsigned long edi;
65	unsigned long esi;
66	unsigned long ebp;
67	unsigned long esp;
68	unsigned long ebx;
69	unsigned long edx;
70	unsigned long ecx;
71	unsigned long eax;
72	unsigned long trapno;
73	unsigned long err;
74	unsigned long eip;
75	unsigned short cs, __csh;
76	unsigned long eflags;
77	unsigned long esp_at_signal;
78	unsigned short ss, __ssh;
79	struct _fpstate __user * fpstate;
80	unsigned long oldmask;
81	unsigned long cr2;
82};
83
84
85#endif
86