~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/include/uapi/asm/sigcontext.h

Version: ~ [ linux-5.4-rc7 ] ~ [ linux-5.3.11 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.84 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.154 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.201 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.201 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.77 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #ifndef _UAPI_ASM_X86_SIGCONTEXT_H
  2 #define _UAPI_ASM_X86_SIGCONTEXT_H
  3 
  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 
 17 #include <linux/compiler.h>
 18 #include <linux/types.h>
 19 
 20 #define FP_XSTATE_MAGIC1                0x46505853U
 21 #define FP_XSTATE_MAGIC2                0x46505845U
 22 #define FP_XSTATE_MAGIC2_SIZE           sizeof(FP_XSTATE_MAGIC2)
 23 
 24 /*
 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.
 29  *
 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.
 38  */
 39 struct _fpx_sw_bytes {
 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];
 69 };
 70 
 71 /*
 72  * As documented in the iBCS2 standard:
 73  *
 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.
 77  *
 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.
 81  */
 82 
 83 /* 10-byte legacy floating point register: */
 84 struct _fpreg {
 85         __u16                           significand[4];
 86         __u16                           exponent;
 87 };
 88 
 89 /* 16-byte floating point register: */
 90 struct _fpxreg {
 91         __u16                           significand[4];
 92         __u16                           exponent;
 93         __u16                           padding[3];
 94 };
 95 
 96 /* 16-byte XMM register: */
 97 struct _xmmreg {
 98         __u32                           element[4];
 99 };
100 
101 #define X86_FXSR_MAGIC                  0x0000
102 
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 
120         /* FXSR FPU environment */
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         };
130 
131         union {
132                 __u32                   padding2[12];
133                 struct _fpx_sw_bytes    sw_reserved;    /* Potential extended state is encoded here */
134         };
135 };
136 
137 /*
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.
147  */
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         };
165 };
166 
167 #ifdef __i386__
168 # define _fpstate _fpstate_32
169 #else
170 # define _fpstate _fpstate_64
171 #endif
172 
173 struct _header {
174         __u64                           xfeatures;
175         __u64                           reserved1[2];
176         __u64                           reserved2[5];
177 };
178 
179 struct _ymmh_state {
180         /* 16x YMM registers, 16 bytes each: */
181         __u32                           ymmh_space[64];
182 };
183 
184 /*
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:
190  */
191 struct _xstate {
192         struct _fpstate                 fpstate;
193         struct _header                  xstate_hdr;
194         struct _ymmh_state              ymmh;
195         /* New processor state extensions go here: */
196 };
197 
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;
221 
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;
232 };
233 
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                           ss;
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];
274 };
275 
276 /*
277  * Create the real 'struct sigcontext' type:
278  */
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;
322 };
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 
345         /*
346          * Prior to 2.5.64 ("[PATCH] x86-64 updates for 2.5.64-bk3"),
347          * Linux saved and restored fs and gs in these slots.  This
348          * was counterproductive, as fsbase and gsbase were never
349          * saved, so arch_prctl was presumably unreliable.
350          *
351          * These slots should never be reused without extreme caution:
352          *
353          *  - Some DOSEMU versions stash fs and gs in these slots manually,
354          *    thus overwriting anything the kernel expects to be preserved
355          *    in these slots.
356          *
357          *  - If these slots are ever needed for any other purpose,
358          *    there is some risk that very old 64-bit binaries could get
359          *    confused.  I doubt that many such binaries still work,
360          *    though, since the same patch in 2.5.64 also removed the
361          *    64-bit set_thread_area syscall, so it appears that there
362          *    is no TLS API beyond modify_ldt that works in both pre-
363          *    and post-2.5.64 kernels.
364          *
365          * If the kernel ever adds explicit fs, gs, fsbase, and gsbase
366          * save/restore, it will most likely need to be opt-in and use
367          * different context slots.
368          */
369         __u16                           gs;
370         __u16                           fs;
371         union {
372                 __u16                   ss;     /* If UC_SIGCONTEXT_SS */
373                 __u16                   __pad0; /* Alias name for old (!UC_SIGCONTEXT_SS) user-space */
374         };
375         __u64                           err;
376         __u64                           trapno;
377         __u64                           oldmask;
378         __u64                           cr2;
379         struct _fpstate __user          *fpstate;       /* Zero when no FPU context */
380 #  ifdef __ILP32__
381         __u32                           __fpstate_pad;
382 #  endif
383         __u64                           reserved1[8];
384 };
385 # endif /* __x86_64__ */
386 #endif /* !__KERNEL__ */
387 
388 #endif /* _UAPI_ASM_X86_SIGCONTEXT_H */
389 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp