linux/arch/x86/include/asm/sigcontext.h
<<
>>
Prefs
   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 */
  23struct _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 */
  56struct _fpreg {
  57        unsigned short significand[4];
  58        unsigned short exponent;
  59};
  60
  61struct _fpxreg {
  62        unsigned short significand[4];
  63        unsigned short exponent;
  64        unsigned short padding[3];
  65};
  66
  67struct _xmmreg {
  68        unsigned long element[4];
  69};
  70
  71struct _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__
 102struct 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 */
 138struct 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. */
 169struct _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__
 190struct 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 */
 232struct 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
 266struct _xsave_hdr {
 267        __u64 xstate_bv;
 268        __u64 reserved1[2];
 269        __u64 reserved2[5];
 270};
 271
 272struct _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 */
 283struct _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 */
 291