x86, xsave: struct _fpstate extensions to include extended state information
Bytes 464..511 in the current 512byte layout of fxsave/fxrstor frame, are reserved for SW usage. On cpu's supporting xsave/xrstor, these bytes are used to extended the fpstate pointer in the sigcontext, which now includes the extended state information along with fpstate information. Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: H. Peter Anvin <hpa@zytor.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
9dc89c0f96
commit
bdd8caba5e
@ -322,7 +322,12 @@ struct i387_fxsave_struct {
|
|||||||
/* 16*16 bytes for each XMM-reg = 256 bytes: */
|
/* 16*16 bytes for each XMM-reg = 256 bytes: */
|
||||||
u32 xmm_space[64];
|
u32 xmm_space[64];
|
||||||
|
|
||||||
u32 padding[24];
|
u32 padding[12];
|
||||||
|
|
||||||
|
union {
|
||||||
|
u32 padding1[12];
|
||||||
|
u32 sw_reserved[12];
|
||||||
|
};
|
||||||
|
|
||||||
} __attribute__((aligned(16)));
|
} __attribute__((aligned(16)));
|
||||||
|
|
||||||
|
@ -4,6 +4,40 @@
|
|||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
|
|
||||||
|
#define FP_XSTATE_MAGIC1 0x46505853U
|
||||||
|
#define FP_XSTATE_MAGIC2 0x46505845U
|
||||||
|
#define FP_XSTATE_MAGIC2_SIZE sizeof(FP_XSTATE_MAGIC2)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bytes 464..511 in the current 512byte layout of fxsave/fxrstor frame
|
||||||
|
* are reserved for SW usage. On cpu's supporting xsave/xrstor, these bytes
|
||||||
|
* are used to extended the fpstate pointer in the sigcontext, which now
|
||||||
|
* includes the extended state information along with fpstate information.
|
||||||
|
*
|
||||||
|
* Presence of FP_XSTATE_MAGIC1 at the beginning of this SW reserved
|
||||||
|
* area and FP_XSTATE_MAGIC2 at the end of memory layout
|
||||||
|
* (extended_size - FP_XSTATE_MAGIC2_SIZE) indicates the presence of the
|
||||||
|
* extended state information in the memory layout pointed by the fpstate
|
||||||
|
* pointer in sigcontext.
|
||||||
|
*/
|
||||||
|
struct _fpx_sw_bytes {
|
||||||
|
__u32 magic1; /* FP_XSTATE_MAGIC1 */
|
||||||
|
__u32 extended_size; /* total size of the layout referred by
|
||||||
|
* fpstate pointer in the sigcontext.
|
||||||
|
*/
|
||||||
|
__u64 xstate_bv;
|
||||||
|
/* feature bit mask (including fp/sse/extended
|
||||||
|
* state) that is present in the memory
|
||||||
|
* layout.
|
||||||
|
*/
|
||||||
|
__u32 xstate_size; /* actual xsave state size, based on the
|
||||||
|
* features saved in the layout.
|
||||||
|
* 'extended_size' will be greater than
|
||||||
|
* 'xstate_size'.
|
||||||
|
*/
|
||||||
|
__u32 padding[7]; /* for future use. */
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
/*
|
/*
|
||||||
* As documented in the iBCS2 standard..
|
* As documented in the iBCS2 standard..
|
||||||
@ -53,7 +87,13 @@ struct _fpstate {
|
|||||||
unsigned long reserved;
|
unsigned long reserved;
|
||||||
struct _fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */
|
struct _fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */
|
||||||
struct _xmmreg _xmm[8];
|
struct _xmmreg _xmm[8];
|
||||||
unsigned long padding[56];
|
unsigned long padding1[44];
|
||||||
|
|
||||||
|
union {
|
||||||
|
unsigned long padding2[12];
|
||||||
|
struct _fpx_sw_bytes sw_reserved; /* represents the extended
|
||||||
|
* state info */
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
#define X86_FXSR_MAGIC 0x0000
|
#define X86_FXSR_MAGIC 0x0000
|
||||||
@ -79,7 +119,15 @@ struct sigcontext {
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned long sp_at_signal;
|
unsigned long sp_at_signal;
|
||||||
unsigned short ss, __ssh;
|
unsigned short ss, __ssh;
|
||||||
struct _fpstate __user *fpstate;
|
|
||||||
|
/*
|
||||||
|
* fpstate is really (struct _fpstate *) or (struct _xstate *)
|
||||||
|
* depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
|
||||||
|
* bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
|
||||||
|
* of extended memory layout. See comments at the defintion of
|
||||||
|
* (struct _fpx_sw_bytes)
|
||||||
|
*/
|
||||||
|
void __user *fpstate; /* zero when no FPU/extended context */
|
||||||
unsigned long oldmask;
|
unsigned long oldmask;
|
||||||
unsigned long cr2;
|
unsigned long cr2;
|
||||||
};
|
};
|
||||||
@ -130,7 +178,12 @@ struct _fpstate {
|
|||||||
__u32 mxcsr_mask;
|
__u32 mxcsr_mask;
|
||||||
__u32 st_space[32]; /* 8*16 bytes for each FP-reg */
|
__u32 st_space[32]; /* 8*16 bytes for each FP-reg */
|
||||||
__u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg */
|
__u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg */
|
||||||
__u32 reserved2[24];
|
__u32 reserved2[12];
|
||||||
|
union {
|
||||||
|
__u32 reserved3[12];
|
||||||
|
struct _fpx_sw_bytes sw_reserved; /* represents the extended
|
||||||
|
* state information */
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
@ -161,7 +214,15 @@ struct sigcontext {
|
|||||||
unsigned long trapno;
|
unsigned long trapno;
|
||||||
unsigned long oldmask;
|
unsigned long oldmask;
|
||||||
unsigned long cr2;
|
unsigned long cr2;
|
||||||
struct _fpstate __user *fpstate; /* zero when no FPU context */
|
|
||||||
|
/*
|
||||||
|
* fpstate is really (struct _fpstate *) or (struct _xstate *)
|
||||||
|
* depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
|
||||||
|
* bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
|
||||||
|
* of extended memory layout. See comments at the defintion of
|
||||||
|
* (struct _fpx_sw_bytes)
|
||||||
|
*/
|
||||||
|
void __user *fpstate; /* zero when no FPU/extended context */
|
||||||
unsigned long reserved1[8];
|
unsigned long reserved1[8];
|
||||||
};
|
};
|
||||||
#else /* __KERNEL__ */
|
#else /* __KERNEL__ */
|
||||||
@ -202,4 +263,22 @@ struct sigcontext {
|
|||||||
|
|
||||||
#endif /* !__i386__ */
|
#endif /* !__i386__ */
|
||||||
|
|
||||||
|
struct _xsave_hdr {
|
||||||
|
u64 xstate_bv;
|
||||||
|
u64 reserved1[2];
|
||||||
|
u64 reserved2[5];
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Extended state pointed by the fpstate pointer in the sigcontext.
|
||||||
|
* In addition to the fpstate, information encoded in the xstate_hdr
|
||||||
|
* indicates the presence of other extended state information
|
||||||
|
* supported by the processor and OS.
|
||||||
|
*/
|
||||||
|
struct _xstate {
|
||||||
|
struct _fpstate fpstate;
|
||||||
|
struct _xsave_hdr xstate_hdr;
|
||||||
|
/* new processor state extensions go here */
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* ASM_X86__SIGCONTEXT_H */
|
#endif /* ASM_X86__SIGCONTEXT_H */
|
||||||
|
@ -40,7 +40,11 @@ struct _fpstate_ia32 {
|
|||||||
__u32 reserved;
|
__u32 reserved;
|
||||||
struct _fpxreg _fxsr_st[8];
|
struct _fpxreg _fxsr_st[8];
|
||||||
struct _xmmreg _xmm[8]; /* It's actually 16 */
|
struct _xmmreg _xmm[8]; /* It's actually 16 */
|
||||||
__u32 padding[56];
|
__u32 padding[44];
|
||||||
|
union {
|
||||||
|
__u32 padding2[12];
|
||||||
|
struct _fpx_sw_bytes sw_reserved;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sigcontext_ia32 {
|
struct sigcontext_ia32 {
|
||||||
|
Loading…
Reference in New Issue
Block a user