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