~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/x86/include/asm/sigcontext.h

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef _ASM_X86_SIGCONTEXT_H
 
2
#define _ASM_X86_SIGCONTEXT_H
 
3
 
 
4
#include <linux/compiler.h>
 
5
#include <linux/types.h>
 
6
 
 
7
#define FP_XSTATE_MAGIC1        0x46505853U
 
8
#define FP_XSTATE_MAGIC2        0x46505845U
 
9
#define FP_XSTATE_MAGIC2_SIZE   sizeof(FP_XSTATE_MAGIC2)
 
10
 
 
11
/*
 
12
 * bytes 464..511 in the current 512byte layout of fxsave/fxrstor frame
 
13
 * are reserved for SW usage. On cpu's supporting xsave/xrstor, these bytes
 
14
 * are used to extended the fpstate pointer in the sigcontext, which now
 
15
 * includes the extended state information along with fpstate information.
 
16
 *
 
17
 * Presence of FP_XSTATE_MAGIC1 at the beginning of this SW reserved
 
18
 * area and FP_XSTATE_MAGIC2 at the end of memory layout
 
19
 * (extended_size - FP_XSTATE_MAGIC2_SIZE) indicates the presence of the
 
20
 * extended state information in the memory layout pointed by the fpstate
 
21
 * pointer in sigcontext.
 
22
 */
 
23
struct _fpx_sw_bytes {
 
24
        __u32 magic1;           /* FP_XSTATE_MAGIC1 */
 
25
        __u32 extended_size;    /* total size of the layout referred by
 
26
                                 * fpstate pointer in the sigcontext.
 
27
                                 */
 
28
        __u64 xstate_bv;
 
29
                                /* feature bit mask (including fp/sse/extended
 
30
                                 * state) that is present in the memory
 
31
                                 * layout.
 
32
                                 */
 
33
        __u32 xstate_size;      /* actual xsave state size, based on the
 
34
                                 * features saved in the layout.
 
35
                                 * 'extended_size' will be greater than
 
36
                                 * 'xstate_size'.
 
37
                                 */
 
38
        __u32 padding[7];       /*  for future use. */
 
39
};
 
40
 
 
41
#ifdef __i386__
 
42
/*
 
43
 * As documented in the iBCS2 standard..
 
44
 *
 
45
 * The first part of "struct _fpstate" is just the normal i387
 
46
 * hardware setup, the extra "status" word is used to save the
 
47
 * coprocessor status word before entering the handler.
 
48
 *
 
49
 * Pentium III FXSR, SSE support
 
50
 *      Gareth Hughes <gareth@valinux.com>, May 2000
 
51
 *
 
52
 * The FPU state data structure has had to grow to accommodate the
 
53
 * extended FPU state required by the Streaming SIMD Extensions.
 
54
 * There is no documented standard to accomplish this at the moment.
 
55
 */
 
56
struct _fpreg {
 
57
        unsigned short significand[4];
 
58
        unsigned short exponent;
 
59
};
 
60
 
 
61
struct _fpxreg {
 
62
        unsigned short significand[4];
 
63
        unsigned short exponent;
 
64
        unsigned short padding[3];
 
65
};
 
66
 
 
67
struct _xmmreg {
 
68
        unsigned long element[4];
 
69
};
 
70
 
 
71
struct _fpstate {
 
72
        /* Regular FPU environment */
 
73
        unsigned long   cw;
 
74
        unsigned long   sw;
 
75
        unsigned long   tag;
 
76
        unsigned long   ipoff;
 
77
        unsigned long   cssel;
 
78
        unsigned long   dataoff;
 
79
        unsigned long   datasel;
 
80
        struct _fpreg   _st[8];
 
81
        unsigned short  status;
 
82
        unsigned short  magic;          /* 0xffff = regular FPU data only */
 
83
 
 
84
        /* FXSR FPU environment */
 
85
        unsigned long   _fxsr_env[6];   /* FXSR FPU env is ignored */
 
86
        unsigned long   mxcsr;
 
87
        unsigned long   reserved;
 
88
        struct _fpxreg  _fxsr_st[8];    /* FXSR FPU reg data is ignored */
 
89
        struct _xmmreg  _xmm[8];
 
90
        unsigned long   padding1[44];
 
91
 
 
92
        union {
 
93
                unsigned long   padding2[12];
 
94
                struct _fpx_sw_bytes sw_reserved; /* represents the extended
 
95
                                                   * state info */
 
96
        };
 
97
};
 
98
 
 
99
#define X86_FXSR_MAGIC          0x0000
 
100
 
 
101
#ifdef __KERNEL__
 
102
struct sigcontext {
 
103
        unsigned short gs, __gsh;
 
104
        unsigned short fs, __fsh;
 
105
        unsigned short es, __esh;
 
106
        unsigned short ds, __dsh;
 
107
        unsigned long di;
 
108
        unsigned long si;
 
109
        unsigned long bp;
 
110
        unsigned long sp;
 
111
        unsigned long bx;
 
112
        unsigned long dx;
 
113
        unsigned long cx;
 
114
        unsigned long ax;
 
115
        unsigned long trapno;
 
116
        unsigned long err;
 
117
        unsigned long ip;
 
118
        unsigned short cs, __csh;
 
119
        unsigned long flags;
 
120
        unsigned long sp_at_signal;
 
121
        unsigned short ss, __ssh;
 
122
 
 
123
        /*
 
124
         * fpstate is really (struct _fpstate *) or (struct _xstate *)
 
125
         * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
 
126
         * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
 
127
         * of extended memory layout. See comments at the definition of
 
128
         * (struct _fpx_sw_bytes)
 
129
         */
 
130
        void __user *fpstate;           /* zero when no FPU/extended context */
 
131
        unsigned long oldmask;
 
132
        unsigned long cr2;
 
133
};
 
134
#else /* __KERNEL__ */
 
135
/*
 
136
 * User-space might still rely on the old definition:
 
137
 */
 
138
struct sigcontext {
 
139
        unsigned short gs, __gsh;
 
140
        unsigned short fs, __fsh;
 
141
        unsigned short es, __esh;
 
142
        unsigned short ds, __dsh;
 
143
        unsigned long edi;
 
144
        unsigned long esi;
 
145
        unsigned long ebp;
 
146
        unsigned long esp;
 
147
        unsigned long ebx;
 
148
        unsigned long edx;
 
149
        unsigned long ecx;
 
150
        unsigned long eax;
 
151
        unsigned long trapno;
 
152
        unsigned long err;
 
153
        unsigned long eip;
 
154
        unsigned short cs, __csh;
 
155
        unsigned long eflags;
 
156
        unsigned long esp_at_signal;
 
157
        unsigned short ss, __ssh;
 
158
        struct _fpstate __user *fpstate;
 
159
        unsigned long oldmask;
 
160
        unsigned long cr2;
 
161
};
 
162
#endif /* !__KERNEL__ */
 
163
 
 
164
#else /* __i386__ */
 
165
 
 
166
/* FXSAVE frame */
 
167
/* Note: reserved1/2 may someday contain valuable data. Always save/restore
 
168
   them when you change signal frames. */
 
169
struct _fpstate {
 
170
        __u16   cwd;
 
171
        __u16   swd;
 
172
        __u16   twd;            /* Note this is not the same as the
 
173
                                   32bit/x87/FSAVE twd */
 
174
        __u16   fop;
 
175
        __u64   rip;
 
176
        __u64   rdp;
 
177
        __u32   mxcsr;
 
178
        __u32   mxcsr_mask;
 
179
        __u32   st_space[32];   /* 8*16 bytes for each FP-reg */
 
180
        __u32   xmm_space[64];  /* 16*16 bytes for each XMM-reg  */
 
181
        __u32   reserved2[12];
 
182
        union {
 
183
                __u32   reserved3[12];
 
184
                struct _fpx_sw_bytes sw_reserved; /* represents the extended
 
185
                                                   * state information */
 
186
        };
 
187
};
 
188
 
 
189
#ifdef __KERNEL__
 
190
struct sigcontext {
 
191
        unsigned long r8;
 
192
        unsigned long r9;
 
193
        unsigned long r10;
 
194
        unsigned long r11;
 
195
        unsigned long r12;
 
196
        unsigned long r13;
 
197
        unsigned long r14;
 
198
        unsigned long r15;
 
199
        unsigned long di;
 
200
        unsigned long si;
 
201
        unsigned long bp;
 
202
        unsigned long bx;
 
203
        unsigned long dx;
 
204
        unsigned long ax;
 
205
        unsigned long cx;
 
206
        unsigned long sp;
 
207
        unsigned long ip;
 
208
        unsigned long flags;
 
209
        unsigned short cs;
 
210
        unsigned short gs;
 
211
        unsigned short fs;
 
212
        unsigned short __pad0;
 
213
        unsigned long err;
 
214
        unsigned long trapno;
 
215
        unsigned long oldmask;
 
216
        unsigned long cr2;
 
217
 
 
218
        /*
 
219
         * fpstate is really (struct _fpstate *) or (struct _xstate *)
 
220
         * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
 
221
         * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
 
222
         * of extended memory layout. See comments at the definition of
 
223
         * (struct _fpx_sw_bytes)
 
224
         */
 
225
        void __user *fpstate;           /* zero when no FPU/extended context */
 
226
        unsigned long reserved1[8];
 
227
};
 
228
#else /* __KERNEL__ */
 
229
/*
 
230
 * User-space might still rely on the old definition:
 
231
 */
 
232
struct sigcontext {
 
233
        unsigned long r8;
 
234
        unsigned long r9;
 
235
        unsigned long r10;
 
236
        unsigned long r11;
 
237
        unsigned long r12;
 
238
        unsigned long r13;
 
239
        unsigned long r14;
 
240
        unsigned long r15;
 
241
        unsigned long rdi;
 
242
        unsigned long rsi;
 
243
        unsigned long rbp;
 
244
        unsigned long rbx;
 
245
        unsigned long rdx;
 
246
        unsigned long rax;
 
247
        unsigned long rcx;
 
248
        unsigned long rsp;
 
249
        unsigned long rip;
 
250
        unsigned long eflags;           /* RFLAGS */
 
251
        unsigned short cs;
 
252
        unsigned short gs;
 
253
        unsigned short fs;
 
254
        unsigned short __pad0;
 
255
        unsigned long err;
 
256
        unsigned long trapno;
 
257
        unsigned long oldmask;
 
258
        unsigned long cr2;
 
259
        struct _fpstate __user *fpstate;        /* zero when no FPU context */
 
260
        unsigned long reserved1[8];
 
261
};
 
262
#endif /* !__KERNEL__ */
 
263
 
 
264
#endif /* !__i386__ */
 
265
 
 
266
struct _xsave_hdr {
 
267
        __u64 xstate_bv;
 
268
        __u64 reserved1[2];
 
269
        __u64 reserved2[5];
 
270
};
 
271
 
 
272
struct _ymmh_state {
 
273
        /* 16 * 16 bytes for each YMMH-reg */
 
274
        __u32 ymmh_space[64];
 
275
};
 
276
 
 
277
/*
 
278
 * Extended state pointed by the fpstate pointer in the sigcontext.
 
279
 * In addition to the fpstate, information encoded in the xstate_hdr
 
280
 * indicates the presence of other extended state information
 
281
 * supported by the processor and OS.
 
282
 */
 
283
struct _xstate {
 
284
        struct _fpstate fpstate;
 
285
        struct _xsave_hdr xstate_hdr;
 
286
        struct _ymmh_state ymmh;
 
287
        /* new processor state extensions go here */
 
288
};
 
289
 
 
290
#endif /* _ASM_X86_SIGCONTEXT_H */