1#ifndef _ASM_X86_SIGCONTEXT_H
2#define _ASM_X86_SIGCONTEXT_H
3
4#include <linux/compiler.h>
5#include <asm/types.h>
6
7#ifdef __i386__
8/*
9 * As documented in the iBCS2 standard..
10 *
11 * The first part of "struct _fpstate" is just the normal i387
12 * hardware setup, the extra "status" word is used to save the
13 * coprocessor status word before entering the handler.
14 *
15 * Pentium III FXSR, SSE support
16 *	Gareth Hughes <gareth@valinux.com>, May 2000
17 *
18 * The FPU state data structure has had to grow to accommodate the
19 * extended FPU state required by the Streaming SIMD Extensions.
20 * There is no documented standard to accomplish this at the moment.
21 */
22struct _fpreg {
23	unsigned short significand[4];
24	unsigned short exponent;
25};
26
27struct _fpxreg {
28	unsigned short significand[4];
29	unsigned short exponent;
30	unsigned short padding[3];
31};
32
33struct _xmmreg {
34	unsigned long element[4];
35};
36
37struct _fpstate {
38	/* Regular FPU environment */
39	unsigned long	cw;
40	unsigned long	sw;
41	unsigned long	tag;
42	unsigned long	ipoff;
43	unsigned long	cssel;
44	unsigned long	dataoff;
45	unsigned long	datasel;
46	struct _fpreg	_st[8];
47	unsigned short	status;
48	unsigned short	magic;		/* 0xffff = regular FPU data only */
49
50	/* FXSR FPU environment */
51	unsigned long	_fxsr_env[6];	/* FXSR FPU env is ignored */
52	unsigned long	mxcsr;
53	unsigned long	reserved;
54	struct _fpxreg	_fxsr_st[8];	/* FXSR FPU reg data is ignored */
55	struct _xmmreg	_xmm[8];
56	unsigned long	padding[56];
57};
58
59#define X86_FXSR_MAGIC		0x0000
60
61struct sigcontext {
62	unsigned short gs, __gsh;
63	unsigned short fs, __fsh;
64	unsigned short es, __esh;
65	unsigned short ds, __dsh;
66	unsigned long edi;
67	unsigned long esi;
68	unsigned long ebp;
69	unsigned long esp;
70	unsigned long ebx;
71	unsigned long edx;
72	unsigned long ecx;
73	unsigned long eax;
74	unsigned long trapno;
75	unsigned long err;
76	unsigned long eip;
77	unsigned short cs, __csh;
78	unsigned long eflags;
79	unsigned long esp_at_signal;
80	unsigned short ss, __ssh;
81	struct _fpstate __user * fpstate;
82	unsigned long oldmask;
83	unsigned long cr2;
84};
85
86#else /* __i386__ */
87
88/* FXSAVE frame */
89/* Note: reserved1/2 may someday contain valuable data. Always save/restore
90   them when you change signal frames. */
91struct _fpstate {
92	__u16	cwd;
93	__u16	swd;
94	__u16	twd;	/* Note this is not the same as the 32bit/x87/FSAVE twd */
95	__u16	fop;
96	__u64	rip;
97	__u64	rdp;
98	__u32	mxcsr;
99	__u32	mxcsr_mask;
100	__u32	st_space[32];	/* 8*16 bytes for each FP-reg */
101	__u32	xmm_space[64];	/* 16*16 bytes for each XMM-reg  */
102	__u32	reserved2[24];
103};
104
105struct sigcontext {
106	unsigned long r8;
107	unsigned long r9;
108	unsigned long r10;
109	unsigned long r11;
110	unsigned long r12;
111	unsigned long r13;
112	unsigned long r14;
113	unsigned long r15;
114	unsigned long rdi;
115	unsigned long rsi;
116	unsigned long rbp;
117	unsigned long rbx;
118	unsigned long rdx;
119	unsigned long rax;
120	unsigned long rcx;
121	unsigned long rsp;
122	unsigned long rip;
123	unsigned long eflags;		/* RFLAGS */
124	unsigned short cs;
125	unsigned short gs;
126	unsigned short fs;
127	unsigned short __pad0;
128	unsigned long err;
129	unsigned long trapno;
130	unsigned long oldmask;
131	unsigned long cr2;
132	struct _fpstate __user *fpstate;	/* zero when no FPU context */
133	unsigned long reserved1[8];
134};
135
136#endif /* !__i386__ */
137
138#endif
139