mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 06:34:11 +08:00
9a036b93a3
As far as I can tell, these fields have been set to zero on save and ignored on restore since Linux was imported into git. Rename them '__pad1' and '__pad2' to avoid confusion. This may also allow us to recycle them some day. This also adds a comment clarifying the history of those fields. I'm intentionally avoiding calling either of them '__pad0': the field formerly known as '__pad0' is now 'ss'. Signed-off-by: Andy Lutomirski <luto@amacapital.net> Reviewed-by: Oleg Nesterov <oleg@redhat.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Borislav Petkov <bp@alien8.de> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/844f8490e938780c03355be4c9b69eb4c494bf4e.1426193719.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
237 lines
5.9 KiB
C
237 lines
5.9 KiB
C
#ifndef _UAPI_ASM_X86_SIGCONTEXT_H
|
|
#define _UAPI_ASM_X86_SIGCONTEXT_H
|
|
|
|
#include <linux/compiler.h>
|
|
#include <linux/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__
|
|
/*
|
|
* As documented in the iBCS2 standard..
|
|
*
|
|
* The first part of "struct _fpstate" is just the normal i387
|
|
* hardware setup, the extra "status" word is used to save the
|
|
* coprocessor status word before entering the handler.
|
|
*
|
|
* Pentium III FXSR, SSE support
|
|
* Gareth Hughes <gareth@valinux.com>, May 2000
|
|
*
|
|
* The FPU state data structure has had to grow to accommodate the
|
|
* extended FPU state required by the Streaming SIMD Extensions.
|
|
* There is no documented standard to accomplish this at the moment.
|
|
*/
|
|
struct _fpreg {
|
|
unsigned short significand[4];
|
|
unsigned short exponent;
|
|
};
|
|
|
|
struct _fpxreg {
|
|
unsigned short significand[4];
|
|
unsigned short exponent;
|
|
unsigned short padding[3];
|
|
};
|
|
|
|
struct _xmmreg {
|
|
unsigned long element[4];
|
|
};
|
|
|
|
struct _fpstate {
|
|
/* Regular FPU environment */
|
|
unsigned long cw;
|
|
unsigned long sw;
|
|
unsigned long tag;
|
|
unsigned long ipoff;
|
|
unsigned long cssel;
|
|
unsigned long dataoff;
|
|
unsigned long datasel;
|
|
struct _fpreg _st[8];
|
|
unsigned short status;
|
|
unsigned short magic; /* 0xffff = regular FPU data only */
|
|
|
|
/* FXSR FPU environment */
|
|
unsigned long _fxsr_env[6]; /* FXSR FPU env is ignored */
|
|
unsigned long mxcsr;
|
|
unsigned long reserved;
|
|
struct _fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */
|
|
struct _xmmreg _xmm[8];
|
|
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
|
|
|
|
#ifndef __KERNEL__
|
|
/*
|
|
* User-space might still rely on the old definition:
|
|
*/
|
|
struct sigcontext {
|
|
unsigned short gs, __gsh;
|
|
unsigned short fs, __fsh;
|
|
unsigned short es, __esh;
|
|
unsigned short ds, __dsh;
|
|
unsigned long edi;
|
|
unsigned long esi;
|
|
unsigned long ebp;
|
|
unsigned long esp;
|
|
unsigned long ebx;
|
|
unsigned long edx;
|
|
unsigned long ecx;
|
|
unsigned long eax;
|
|
unsigned long trapno;
|
|
unsigned long err;
|
|
unsigned long eip;
|
|
unsigned short cs, __csh;
|
|
unsigned long eflags;
|
|
unsigned long esp_at_signal;
|
|
unsigned short ss, __ssh;
|
|
struct _fpstate __user *fpstate;
|
|
unsigned long oldmask;
|
|
unsigned long cr2;
|
|
};
|
|
#endif /* !__KERNEL__ */
|
|
|
|
#else /* __i386__ */
|
|
|
|
/* FXSAVE frame */
|
|
/* Note: reserved1/2 may someday contain valuable data. Always save/restore
|
|
them when you change signal frames. */
|
|
struct _fpstate {
|
|
__u16 cwd;
|
|
__u16 swd;
|
|
__u16 twd; /* Note this is not the same as the
|
|
32bit/x87/FSAVE twd */
|
|
__u16 fop;
|
|
__u64 rip;
|
|
__u64 rdp;
|
|
__u32 mxcsr;
|
|
__u32 mxcsr_mask;
|
|
__u32 st_space[32]; /* 8*16 bytes for each FP-reg */
|
|
__u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg */
|
|
__u32 reserved2[12];
|
|
union {
|
|
__u32 reserved3[12];
|
|
struct _fpx_sw_bytes sw_reserved; /* represents the extended
|
|
* state information */
|
|
};
|
|
};
|
|
|
|
#ifndef __KERNEL__
|
|
/*
|
|
* User-space might still rely on the old definition:
|
|
*/
|
|
struct sigcontext {
|
|
__u64 r8;
|
|
__u64 r9;
|
|
__u64 r10;
|
|
__u64 r11;
|
|
__u64 r12;
|
|
__u64 r13;
|
|
__u64 r14;
|
|
__u64 r15;
|
|
__u64 rdi;
|
|
__u64 rsi;
|
|
__u64 rbp;
|
|
__u64 rbx;
|
|
__u64 rdx;
|
|
__u64 rax;
|
|
__u64 rcx;
|
|
__u64 rsp;
|
|
__u64 rip;
|
|
__u64 eflags; /* RFLAGS */
|
|
__u16 cs;
|
|
|
|
/*
|
|
* Prior to 2.5.64 ("[PATCH] x86-64 updates for 2.5.64-bk3"),
|
|
* Linux saved and restored fs and gs in these slots. This
|
|
* was counterproductive, as fsbase and gsbase were never
|
|
* saved, so arch_prctl was presumably unreliable.
|
|
*
|
|
* If these slots are ever needed for any other purpose, there
|
|
* is some risk that very old 64-bit binaries could get
|
|
* confused. I doubt that many such binaries still work,
|
|
* though, since the same patch in 2.5.64 also removed the
|
|
* 64-bit set_thread_area syscall, so it appears that there is
|
|
* no TLS API that works in both pre- and post-2.5.64 kernels.
|
|
*/
|
|
__u16 __pad2; /* Was gs. */
|
|
__u16 __pad1; /* Was fs. */
|
|
|
|
__u16 ss;
|
|
__u64 err;
|
|
__u64 trapno;
|
|
__u64 oldmask;
|
|
__u64 cr2;
|
|
struct _fpstate __user *fpstate; /* zero when no FPU context */
|
|
#ifdef __ILP32__
|
|
__u32 __fpstate_pad;
|
|
#endif
|
|
__u64 reserved1[8];
|
|
};
|
|
#endif /* !__KERNEL__ */
|
|
|
|
#endif /* !__i386__ */
|
|
|
|
struct _xsave_hdr {
|
|
__u64 xstate_bv;
|
|
__u64 reserved1[2];
|
|
__u64 reserved2[5];
|
|
};
|
|
|
|
struct _ymmh_state {
|
|
/* 16 * 16 bytes for each YMMH-reg */
|
|
__u32 ymmh_space[64];
|
|
};
|
|
|
|
/*
|
|
* 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;
|
|
struct _ymmh_state ymmh;
|
|
/* new processor state extensions go here */
|
|
};
|
|
|
|
#endif /* _UAPI_ASM_X86_SIGCONTEXT_H */
|