162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
262306a36Sopenharmony_ci#ifndef _UAPI_ASM_X86_SIGCONTEXT_H
362306a36Sopenharmony_ci#define _UAPI_ASM_X86_SIGCONTEXT_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci * Linux signal context definitions. The sigcontext includes a complex
762306a36Sopenharmony_ci * hierarchy of CPU and FPU state, available to user-space (on the stack) when
862306a36Sopenharmony_ci * a signal handler is executed.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * As over the years this ABI grew from its very simple roots towards
1162306a36Sopenharmony_ci * supporting more and more CPU state organically, some of the details (which
1262306a36Sopenharmony_ci * were rather clever hacks back in the days) became a bit quirky by today.
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * The current ABI includes flexible provisions for future extensions, so we
1562306a36Sopenharmony_ci * won't have to grow new quirks for quite some time. Promise!
1662306a36Sopenharmony_ci */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <linux/compiler.h>
1962306a36Sopenharmony_ci#include <linux/types.h>
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define FP_XSTATE_MAGIC1		0x46505853U
2262306a36Sopenharmony_ci#define FP_XSTATE_MAGIC2		0x46505845U
2362306a36Sopenharmony_ci#define FP_XSTATE_MAGIC2_SIZE		sizeof(FP_XSTATE_MAGIC2)
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/*
2662306a36Sopenharmony_ci * Bytes 464..511 in the current 512-byte layout of the FXSAVE/FXRSTOR frame
2762306a36Sopenharmony_ci * are reserved for SW usage. On CPUs supporting XSAVE/XRSTOR, these bytes are
2862306a36Sopenharmony_ci * used to extend the fpstate pointer in the sigcontext, which now includes the
2962306a36Sopenharmony_ci * extended state information along with fpstate information.
3062306a36Sopenharmony_ci *
3162306a36Sopenharmony_ci * If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then there's a
3262306a36Sopenharmony_ci * sw_reserved.extended_size bytes large extended context area present. (The
3362306a36Sopenharmony_ci * last 32-bit word of this extended area (at the
3462306a36Sopenharmony_ci * fpstate+extended_size-FP_XSTATE_MAGIC2_SIZE address) is set to
3562306a36Sopenharmony_ci * FP_XSTATE_MAGIC2 so that you can sanity check your size calculations.)
3662306a36Sopenharmony_ci *
3762306a36Sopenharmony_ci * This extended area typically grows with newer CPUs that have larger and
3862306a36Sopenharmony_ci * larger XSAVE areas.
3962306a36Sopenharmony_ci */
4062306a36Sopenharmony_cistruct _fpx_sw_bytes {
4162306a36Sopenharmony_ci	/*
4262306a36Sopenharmony_ci	 * If set to FP_XSTATE_MAGIC1 then this is an xstate context.
4362306a36Sopenharmony_ci	 * 0 if a legacy frame.
4462306a36Sopenharmony_ci	 */
4562306a36Sopenharmony_ci	__u32				magic1;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	/*
4862306a36Sopenharmony_ci	 * Total size of the fpstate area:
4962306a36Sopenharmony_ci	 *
5062306a36Sopenharmony_ci	 *  - if magic1 == 0 then it's sizeof(struct _fpstate)
5162306a36Sopenharmony_ci	 *  - if magic1 == FP_XSTATE_MAGIC1 then it's sizeof(struct _xstate)
5262306a36Sopenharmony_ci	 *    plus extensions (if any)
5362306a36Sopenharmony_ci	 */
5462306a36Sopenharmony_ci	__u32				extended_size;
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	/*
5762306a36Sopenharmony_ci	 * Feature bit mask (including FP/SSE/extended state) that is present
5862306a36Sopenharmony_ci	 * in the memory layout:
5962306a36Sopenharmony_ci	 */
6062306a36Sopenharmony_ci	__u64				xfeatures;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	/*
6362306a36Sopenharmony_ci	 * Actual XSAVE state size, based on the xfeatures saved in the layout.
6462306a36Sopenharmony_ci	 * 'extended_size' is greater than 'xstate_size':
6562306a36Sopenharmony_ci	 */
6662306a36Sopenharmony_ci	__u32				xstate_size;
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	/* For future use: */
6962306a36Sopenharmony_ci	__u32				padding[7];
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci/*
7362306a36Sopenharmony_ci * As documented in the iBCS2 standard:
7462306a36Sopenharmony_ci *
7562306a36Sopenharmony_ci * The first part of "struct _fpstate" is just the normal i387 hardware setup,
7662306a36Sopenharmony_ci * the extra "status" word is used to save the coprocessor status word before
7762306a36Sopenharmony_ci * entering the handler.
7862306a36Sopenharmony_ci *
7962306a36Sopenharmony_ci * The FPU state data structure has had to grow to accommodate the extended FPU
8062306a36Sopenharmony_ci * state required by the Streaming SIMD Extensions.  There is no documented
8162306a36Sopenharmony_ci * standard to accomplish this at the moment.
8262306a36Sopenharmony_ci */
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci/* 10-byte legacy floating point register: */
8562306a36Sopenharmony_cistruct _fpreg {
8662306a36Sopenharmony_ci	__u16				significand[4];
8762306a36Sopenharmony_ci	__u16				exponent;
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/* 16-byte floating point register: */
9162306a36Sopenharmony_cistruct _fpxreg {
9262306a36Sopenharmony_ci	__u16				significand[4];
9362306a36Sopenharmony_ci	__u16				exponent;
9462306a36Sopenharmony_ci	__u16				padding[3];
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci/* 16-byte XMM register: */
9862306a36Sopenharmony_cistruct _xmmreg {
9962306a36Sopenharmony_ci	__u32				element[4];
10062306a36Sopenharmony_ci};
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci#define X86_FXSR_MAGIC			0x0000
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/*
10562306a36Sopenharmony_ci * The 32-bit FPU frame:
10662306a36Sopenharmony_ci */
10762306a36Sopenharmony_cistruct _fpstate_32 {
10862306a36Sopenharmony_ci	/* Legacy FPU environment: */
10962306a36Sopenharmony_ci	__u32				cw;
11062306a36Sopenharmony_ci	__u32				sw;
11162306a36Sopenharmony_ci	__u32				tag;
11262306a36Sopenharmony_ci	__u32				ipoff;
11362306a36Sopenharmony_ci	__u32				cssel;
11462306a36Sopenharmony_ci	__u32				dataoff;
11562306a36Sopenharmony_ci	__u32				datasel;
11662306a36Sopenharmony_ci	struct _fpreg			_st[8];
11762306a36Sopenharmony_ci	__u16				status;
11862306a36Sopenharmony_ci	__u16				magic;		/* 0xffff: regular FPU data only */
11962306a36Sopenharmony_ci							/* 0x0000: FXSR FPU data */
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	/* FXSR FPU environment */
12262306a36Sopenharmony_ci	__u32				_fxsr_env[6];	/* FXSR FPU env is ignored */
12362306a36Sopenharmony_ci	__u32				mxcsr;
12462306a36Sopenharmony_ci	__u32				reserved;
12562306a36Sopenharmony_ci	struct _fpxreg			_fxsr_st[8];	/* FXSR FPU reg data is ignored */
12662306a36Sopenharmony_ci	struct _xmmreg			_xmm[8];	/* First 8 XMM registers */
12762306a36Sopenharmony_ci	union {
12862306a36Sopenharmony_ci		__u32			padding1[44];	/* Second 8 XMM registers plus padding */
12962306a36Sopenharmony_ci		__u32			padding[44];	/* Alias name for old user-space */
13062306a36Sopenharmony_ci	};
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	union {
13362306a36Sopenharmony_ci		__u32			padding2[12];
13462306a36Sopenharmony_ci		struct _fpx_sw_bytes	sw_reserved;	/* Potential extended state is encoded here */
13562306a36Sopenharmony_ci	};
13662306a36Sopenharmony_ci};
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci/*
13962306a36Sopenharmony_ci * The 64-bit FPU frame. (FXSAVE format and later)
14062306a36Sopenharmony_ci *
14162306a36Sopenharmony_ci * Note1: If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then the structure is
14262306a36Sopenharmony_ci *        larger: 'struct _xstate'. Note that 'struct _xstate' embeds
14362306a36Sopenharmony_ci *        'struct _fpstate' so that you can always assume the _fpstate portion
14462306a36Sopenharmony_ci *        exists so that you can check the magic value.
14562306a36Sopenharmony_ci *
14662306a36Sopenharmony_ci * Note2: Reserved fields may someday contain valuable data. Always
14762306a36Sopenharmony_ci *	  save/restore them when you change signal frames.
14862306a36Sopenharmony_ci */
14962306a36Sopenharmony_cistruct _fpstate_64 {
15062306a36Sopenharmony_ci	__u16				cwd;
15162306a36Sopenharmony_ci	__u16				swd;
15262306a36Sopenharmony_ci	/* Note this is not the same as the 32-bit/x87/FSAVE twd: */
15362306a36Sopenharmony_ci	__u16				twd;
15462306a36Sopenharmony_ci	__u16				fop;
15562306a36Sopenharmony_ci	__u64				rip;
15662306a36Sopenharmony_ci	__u64				rdp;
15762306a36Sopenharmony_ci	__u32				mxcsr;
15862306a36Sopenharmony_ci	__u32				mxcsr_mask;
15962306a36Sopenharmony_ci	__u32				st_space[32];	/*  8x  FP registers, 16 bytes each */
16062306a36Sopenharmony_ci	__u32				xmm_space[64];	/* 16x XMM registers, 16 bytes each */
16162306a36Sopenharmony_ci	__u32				reserved2[12];
16262306a36Sopenharmony_ci	union {
16362306a36Sopenharmony_ci		__u32			reserved3[12];
16462306a36Sopenharmony_ci		struct _fpx_sw_bytes	sw_reserved;	/* Potential extended state is encoded here */
16562306a36Sopenharmony_ci	};
16662306a36Sopenharmony_ci};
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci#ifdef __i386__
16962306a36Sopenharmony_ci# define _fpstate _fpstate_32
17062306a36Sopenharmony_ci#else
17162306a36Sopenharmony_ci# define _fpstate _fpstate_64
17262306a36Sopenharmony_ci#endif
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_cistruct _header {
17562306a36Sopenharmony_ci	__u64				xfeatures;
17662306a36Sopenharmony_ci	__u64				reserved1[2];
17762306a36Sopenharmony_ci	__u64				reserved2[5];
17862306a36Sopenharmony_ci};
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_cistruct _ymmh_state {
18162306a36Sopenharmony_ci	/* 16x YMM registers, 16 bytes each: */
18262306a36Sopenharmony_ci	__u32				ymmh_space[64];
18362306a36Sopenharmony_ci};
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci/*
18662306a36Sopenharmony_ci * Extended state pointed to by sigcontext::fpstate.
18762306a36Sopenharmony_ci *
18862306a36Sopenharmony_ci * In addition to the fpstate, information encoded in _xstate::xstate_hdr
18962306a36Sopenharmony_ci * indicates the presence of other extended state information supported
19062306a36Sopenharmony_ci * by the CPU and kernel:
19162306a36Sopenharmony_ci */
19262306a36Sopenharmony_cistruct _xstate {
19362306a36Sopenharmony_ci	struct _fpstate			fpstate;
19462306a36Sopenharmony_ci	struct _header			xstate_hdr;
19562306a36Sopenharmony_ci	struct _ymmh_state		ymmh;
19662306a36Sopenharmony_ci	/* New processor state extensions go here: */
19762306a36Sopenharmony_ci};
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci/*
20062306a36Sopenharmony_ci * The 32-bit signal frame:
20162306a36Sopenharmony_ci */
20262306a36Sopenharmony_cistruct sigcontext_32 {
20362306a36Sopenharmony_ci	__u16				gs, __gsh;
20462306a36Sopenharmony_ci	__u16				fs, __fsh;
20562306a36Sopenharmony_ci	__u16				es, __esh;
20662306a36Sopenharmony_ci	__u16				ds, __dsh;
20762306a36Sopenharmony_ci	__u32				di;
20862306a36Sopenharmony_ci	__u32				si;
20962306a36Sopenharmony_ci	__u32				bp;
21062306a36Sopenharmony_ci	__u32				sp;
21162306a36Sopenharmony_ci	__u32				bx;
21262306a36Sopenharmony_ci	__u32				dx;
21362306a36Sopenharmony_ci	__u32				cx;
21462306a36Sopenharmony_ci	__u32				ax;
21562306a36Sopenharmony_ci	__u32				trapno;
21662306a36Sopenharmony_ci	__u32				err;
21762306a36Sopenharmony_ci	__u32				ip;
21862306a36Sopenharmony_ci	__u16				cs, __csh;
21962306a36Sopenharmony_ci	__u32				flags;
22062306a36Sopenharmony_ci	__u32				sp_at_signal;
22162306a36Sopenharmony_ci	__u16				ss, __ssh;
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	/*
22462306a36Sopenharmony_ci	 * fpstate is really (struct _fpstate *) or (struct _xstate *)
22562306a36Sopenharmony_ci	 * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
22662306a36Sopenharmony_ci	 * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
22762306a36Sopenharmony_ci	 * of extended memory layout. See comments at the definition of
22862306a36Sopenharmony_ci	 * (struct _fpx_sw_bytes)
22962306a36Sopenharmony_ci	 */
23062306a36Sopenharmony_ci	__u32				fpstate; /* Zero when no FPU/extended context */
23162306a36Sopenharmony_ci	__u32				oldmask;
23262306a36Sopenharmony_ci	__u32				cr2;
23362306a36Sopenharmony_ci};
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci/*
23662306a36Sopenharmony_ci * The 64-bit signal frame:
23762306a36Sopenharmony_ci */
23862306a36Sopenharmony_cistruct sigcontext_64 {
23962306a36Sopenharmony_ci	__u64				r8;
24062306a36Sopenharmony_ci	__u64				r9;
24162306a36Sopenharmony_ci	__u64				r10;
24262306a36Sopenharmony_ci	__u64				r11;
24362306a36Sopenharmony_ci	__u64				r12;
24462306a36Sopenharmony_ci	__u64				r13;
24562306a36Sopenharmony_ci	__u64				r14;
24662306a36Sopenharmony_ci	__u64				r15;
24762306a36Sopenharmony_ci	__u64				di;
24862306a36Sopenharmony_ci	__u64				si;
24962306a36Sopenharmony_ci	__u64				bp;
25062306a36Sopenharmony_ci	__u64				bx;
25162306a36Sopenharmony_ci	__u64				dx;
25262306a36Sopenharmony_ci	__u64				ax;
25362306a36Sopenharmony_ci	__u64				cx;
25462306a36Sopenharmony_ci	__u64				sp;
25562306a36Sopenharmony_ci	__u64				ip;
25662306a36Sopenharmony_ci	__u64				flags;
25762306a36Sopenharmony_ci	__u16				cs;
25862306a36Sopenharmony_ci	__u16				gs;
25962306a36Sopenharmony_ci	__u16				fs;
26062306a36Sopenharmony_ci	__u16				ss;
26162306a36Sopenharmony_ci	__u64				err;
26262306a36Sopenharmony_ci	__u64				trapno;
26362306a36Sopenharmony_ci	__u64				oldmask;
26462306a36Sopenharmony_ci	__u64				cr2;
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci	/*
26762306a36Sopenharmony_ci	 * fpstate is really (struct _fpstate *) or (struct _xstate *)
26862306a36Sopenharmony_ci	 * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved
26962306a36Sopenharmony_ci	 * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end
27062306a36Sopenharmony_ci	 * of extended memory layout. See comments at the definition of
27162306a36Sopenharmony_ci	 * (struct _fpx_sw_bytes)
27262306a36Sopenharmony_ci	 */
27362306a36Sopenharmony_ci	__u64				fpstate; /* Zero when no FPU/extended context */
27462306a36Sopenharmony_ci	__u64				reserved1[8];
27562306a36Sopenharmony_ci};
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci/*
27862306a36Sopenharmony_ci * Create the real 'struct sigcontext' type:
27962306a36Sopenharmony_ci */
28062306a36Sopenharmony_ci#ifdef __KERNEL__
28162306a36Sopenharmony_ci# ifdef __i386__
28262306a36Sopenharmony_ci#  define sigcontext sigcontext_32
28362306a36Sopenharmony_ci# else
28462306a36Sopenharmony_ci#  define sigcontext sigcontext_64
28562306a36Sopenharmony_ci# endif
28662306a36Sopenharmony_ci#endif
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci/*
28962306a36Sopenharmony_ci * The old user-space sigcontext definition, just in case user-space still
29062306a36Sopenharmony_ci * relies on it. The kernel definition (in asm/sigcontext.h) has unified
29162306a36Sopenharmony_ci * field names but otherwise the same layout.
29262306a36Sopenharmony_ci */
29362306a36Sopenharmony_ci#ifndef __KERNEL__
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci#define _fpstate_ia32			_fpstate_32
29662306a36Sopenharmony_ci#define sigcontext_ia32			sigcontext_32
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci# ifdef __i386__
30062306a36Sopenharmony_cistruct sigcontext {
30162306a36Sopenharmony_ci	__u16				gs, __gsh;
30262306a36Sopenharmony_ci	__u16				fs, __fsh;
30362306a36Sopenharmony_ci	__u16				es, __esh;
30462306a36Sopenharmony_ci	__u16				ds, __dsh;
30562306a36Sopenharmony_ci	__u32				edi;
30662306a36Sopenharmony_ci	__u32				esi;
30762306a36Sopenharmony_ci	__u32				ebp;
30862306a36Sopenharmony_ci	__u32				esp;
30962306a36Sopenharmony_ci	__u32				ebx;
31062306a36Sopenharmony_ci	__u32				edx;
31162306a36Sopenharmony_ci	__u32				ecx;
31262306a36Sopenharmony_ci	__u32				eax;
31362306a36Sopenharmony_ci	__u32				trapno;
31462306a36Sopenharmony_ci	__u32				err;
31562306a36Sopenharmony_ci	__u32				eip;
31662306a36Sopenharmony_ci	__u16				cs, __csh;
31762306a36Sopenharmony_ci	__u32				eflags;
31862306a36Sopenharmony_ci	__u32				esp_at_signal;
31962306a36Sopenharmony_ci	__u16				ss, __ssh;
32062306a36Sopenharmony_ci	struct _fpstate __user		*fpstate;
32162306a36Sopenharmony_ci	__u32				oldmask;
32262306a36Sopenharmony_ci	__u32				cr2;
32362306a36Sopenharmony_ci};
32462306a36Sopenharmony_ci# else /* __x86_64__: */
32562306a36Sopenharmony_cistruct sigcontext {
32662306a36Sopenharmony_ci	__u64				r8;
32762306a36Sopenharmony_ci	__u64				r9;
32862306a36Sopenharmony_ci	__u64				r10;
32962306a36Sopenharmony_ci	__u64				r11;
33062306a36Sopenharmony_ci	__u64				r12;
33162306a36Sopenharmony_ci	__u64				r13;
33262306a36Sopenharmony_ci	__u64				r14;
33362306a36Sopenharmony_ci	__u64				r15;
33462306a36Sopenharmony_ci	__u64				rdi;
33562306a36Sopenharmony_ci	__u64				rsi;
33662306a36Sopenharmony_ci	__u64				rbp;
33762306a36Sopenharmony_ci	__u64				rbx;
33862306a36Sopenharmony_ci	__u64				rdx;
33962306a36Sopenharmony_ci	__u64				rax;
34062306a36Sopenharmony_ci	__u64				rcx;
34162306a36Sopenharmony_ci	__u64				rsp;
34262306a36Sopenharmony_ci	__u64				rip;
34362306a36Sopenharmony_ci	__u64				eflags;		/* RFLAGS */
34462306a36Sopenharmony_ci	__u16				cs;
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci	/*
34762306a36Sopenharmony_ci	 * Prior to 2.5.64 ("[PATCH] x86-64 updates for 2.5.64-bk3"),
34862306a36Sopenharmony_ci	 * Linux saved and restored fs and gs in these slots.  This
34962306a36Sopenharmony_ci	 * was counterproductive, as fsbase and gsbase were never
35062306a36Sopenharmony_ci	 * saved, so arch_prctl was presumably unreliable.
35162306a36Sopenharmony_ci	 *
35262306a36Sopenharmony_ci	 * These slots should never be reused without extreme caution:
35362306a36Sopenharmony_ci	 *
35462306a36Sopenharmony_ci	 *  - Some DOSEMU versions stash fs and gs in these slots manually,
35562306a36Sopenharmony_ci	 *    thus overwriting anything the kernel expects to be preserved
35662306a36Sopenharmony_ci	 *    in these slots.
35762306a36Sopenharmony_ci	 *
35862306a36Sopenharmony_ci	 *  - If these slots are ever needed for any other purpose,
35962306a36Sopenharmony_ci	 *    there is some risk that very old 64-bit binaries could get
36062306a36Sopenharmony_ci	 *    confused.  I doubt that many such binaries still work,
36162306a36Sopenharmony_ci	 *    though, since the same patch in 2.5.64 also removed the
36262306a36Sopenharmony_ci	 *    64-bit set_thread_area syscall, so it appears that there
36362306a36Sopenharmony_ci	 *    is no TLS API beyond modify_ldt that works in both pre-
36462306a36Sopenharmony_ci	 *    and post-2.5.64 kernels.
36562306a36Sopenharmony_ci	 *
36662306a36Sopenharmony_ci	 * If the kernel ever adds explicit fs, gs, fsbase, and gsbase
36762306a36Sopenharmony_ci	 * save/restore, it will most likely need to be opt-in and use
36862306a36Sopenharmony_ci	 * different context slots.
36962306a36Sopenharmony_ci	 */
37062306a36Sopenharmony_ci	__u16				gs;
37162306a36Sopenharmony_ci	__u16				fs;
37262306a36Sopenharmony_ci	union {
37362306a36Sopenharmony_ci		__u16			ss;	/* If UC_SIGCONTEXT_SS */
37462306a36Sopenharmony_ci		__u16			__pad0;	/* Alias name for old (!UC_SIGCONTEXT_SS) user-space */
37562306a36Sopenharmony_ci	};
37662306a36Sopenharmony_ci	__u64				err;
37762306a36Sopenharmony_ci	__u64				trapno;
37862306a36Sopenharmony_ci	__u64				oldmask;
37962306a36Sopenharmony_ci	__u64				cr2;
38062306a36Sopenharmony_ci	struct _fpstate __user		*fpstate;	/* Zero when no FPU context */
38162306a36Sopenharmony_ci#  ifdef __ILP32__
38262306a36Sopenharmony_ci	__u32				__fpstate_pad;
38362306a36Sopenharmony_ci#  endif
38462306a36Sopenharmony_ci	__u64				reserved1[8];
38562306a36Sopenharmony_ci};
38662306a36Sopenharmony_ci# endif /* __x86_64__ */
38762306a36Sopenharmony_ci#endif /* !__KERNEL__ */
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci#endif /* _UAPI_ASM_X86_SIGCONTEXT_H */
390