/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ #ifndef _UAPI_ASM_X86_SIGCONTEXT_H #define _UAPI_ASM_X86_SIGCONTEXT_H
/* * Linux signal context definitions. The sigcontext includes a complex * hierarchy of CPU and FPU state, available to user-space (on the stack) when * a signal handler is executed. * * As over the years this ABI grew from its very simple roots towards * supporting more and more CPU state organically, some of the details (which * were rather clever hacks back in the days) became a bit quirky by today. * * The current ABI includes flexible provisions for future extensions, so we * won't have to grow new quirks for quite some time. Promise!
*/
/* * Bytes 464..511 in the current 512-byte layout of the FXSAVE/FXRSTOR frame * are reserved for SW usage. On CPUs supporting XSAVE/XRSTOR, these bytes are * used to extend the fpstate pointer in the sigcontext, which now includes the * extended state information along with fpstate information. * * If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then there's a * sw_reserved.extended_size bytes large extended context area present. (The * last 32-bit word of this extended area (at the * fpstate+extended_size-FP_XSTATE_MAGIC2_SIZE address) is set to * FP_XSTATE_MAGIC2 so that you can sanity check your size calculations.) * * This extended area typically grows with newer CPUs that have larger and * larger XSAVE areas.
*/ struct _fpx_sw_bytes { /* * If set to FP_XSTATE_MAGIC1 then this is an xstate context. * 0 if a legacy frame.
*/
__u32 magic1;
/* * Total size of the fpstate area: * * - if magic1 == 0 then it's sizeof(struct _fpstate) * - if magic1 == FP_XSTATE_MAGIC1 then it's sizeof(struct _xstate) * plus extensions (if any)
*/
__u32 extended_size;
/* * Feature bit mask (including FP/SSE/extended state) that is present * in the memory layout:
*/
__u64 xfeatures;
/* * Actual XSAVE state size, based on the xfeatures saved in the layout. * 'extended_size' is greater than 'xstate_size':
*/
__u32 xstate_size;
/* For future use: */
__u32 padding[7];
};
/* * 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. * * 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.
*/
/* FXSR FPU environment */
__u32 _fxsr_env[6]; /* FXSR FPU env is ignored */
__u32 mxcsr;
__u32 reserved; struct _fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */ struct _xmmreg _xmm[8]; /* First 8 XMM registers */ union {
__u32 padding1[44]; /* Second 8 XMM registers plus padding */
__u32 padding[44]; /* Alias name for old user-space */
};
union {
__u32 padding2[12]; struct _fpx_sw_bytes sw_reserved; /* Potential extended state is encoded here */
};
};
/* * The 64-bit FPU frame. (FXSAVE format and later) * * Note1: If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then the structure is * larger: 'struct _xstate'. Note that 'struct _xstate' embeds * 'struct _fpstate' so that you can always assume the _fpstate portion * exists so that you can check the magic value. * * Note2: Reserved fields may someday contain valuable data. Always * save/restore them when you change signal frames.
*/ struct _fpstate_64 {
__u16 cwd;
__u16 swd; /* Note this is not the same as the 32-bit/x87/FSAVE twd: */
__u16 twd;
__u16 fop;
__u64 rip;
__u64 rdp;
__u32 mxcsr;
__u32 mxcsr_mask;
__u32 st_space[32]; /* 8x FP registers, 16 bytes each */
__u32 xmm_space[64]; /* 16x XMM registers, 16 bytes each */
__u32 reserved2[12]; union {
__u32 reserved3[12]; struct _fpx_sw_bytes sw_reserved; /* Potential extended state is encoded here */
};
};
/* * Extended state pointed to by sigcontext::fpstate. * * In addition to the fpstate, information encoded in _xstate::xstate_hdr * indicates the presence of other extended state information supported * by the CPU and kernel:
*/ struct _xstate { struct _fpstate fpstate; struct _header xstate_hdr; struct _ymmh_state ymmh; /* New processor state extensions go here: */
};
/* * 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 definition of * (struct _fpx_sw_bytes)
*/
__u32 fpstate; /* Zero when no FPU/extended context */
__u32 oldmask;
__u32 cr2;
};
/* * 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 definition of * (struct _fpx_sw_bytes)
*/
__u64 fpstate; /* Zero when no FPU/extended context */
__u64 reserved1[8];
};
/* * The old user-space sigcontext definition, just in case user-space still * relies on it. The kernel definition (in asm/sigcontext.h) has unified * field names but otherwise the same layout.
*/ #ifndef __KERNEL__
/* * 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. * * These slots should never be reused without extreme caution: * * - Some DOSEMU versions stash fs and gs in these slots manually, * thus overwriting anything the kernel expects to be preserved * in these slots. * * - 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 beyond modify_ldt that works in both pre- * and post-2.5.64 kernels. * * If the kernel ever adds explicit fs, gs, fsbase, and gsbase * save/restore, it will most likely need to be opt-in and use * different context slots.
*/
__u16 gs;
__u16 fs; union {
__u16 ss; /* If UC_SIGCONTEXT_SS */
__u16 __pad0; /* Alias name for old (!UC_SIGCONTEXT_SS) user-space */
};
__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 /* __x86_64__ */ #endif/* !__KERNEL__ */
#endif/* _UAPI_ASM_X86_SIGCONTEXT_H */
Messung V0.5
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.