diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-11-04 00:05:40 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-11-04 00:05:40 -0500 |
| commit | 4302d506d5f3419109abdd0d6e400ed6e8148209 (patch) | |
| tree | ec8763fead6955c35eef5b284aa924fd660c4f06 /arch/x86/include/uapi/asm | |
| parent | ce4d72fac16a9540452957b526443b6080030bff (diff) | |
| parent | 0e2815de552a638295cfdaf0865e575573bf263e (diff) | |
Merge branch 'x86-headers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 sigcontext header cleanups from Ingo Molnar:
"This series reorganizes and cleans up various aspects of the main
sigcontext UAPI headers, such as unifying the data structures and
updating/adding lots of comments to explain all the ABI details and
quirks. The headers can now also be built in user-space standalone"
* 'x86-headers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86/headers: Clean up too long lines
x86/headers: Remove <asm/sigcontext.h> references on the kernel side
x86/headers: Remove direct sigcontext32.h uses
x86/headers: Convert sigcontext_ia32 uses to sigcontext_32
x86/headers: Unify 'struct sigcontext_ia32' and 'struct sigcontext_32'
x86/headers: Make sigcontext pointers bit independent
x86/headers: Move the 'struct sigcontext' definitions into the UAPI header
x86/headers: Clean up the kernel's struct sigcontext types to be ABI-clean
x86/headers: Convert uses of _fpstate_ia32 to _fpstate_32
x86/headers: Unify 'struct _fpstate_ia32' and i386 struct _fpstate
x86/headers: Unify register type definitions between 32-bit compat and i386
x86/headers: Use ABI types consistently in sigcontext*.h
x86/headers: Separate out legacy user-space structure definitions
x86/headers: Clean up and better document uapi/asm/sigcontext.h
x86/headers: Clean up uapi/asm/sigcontext32.h
x86/headers: Fix (old) header file dependency bug in uapi/asm/sigcontext32.h
Diffstat (limited to 'arch/x86/include/uapi/asm')
| -rw-r--r-- | arch/x86/include/uapi/asm/sigcontext.h | 475 | ||||
| -rw-r--r-- | arch/x86/include/uapi/asm/sigcontext32.h | 73 |
2 files changed, 309 insertions, 239 deletions
diff --git a/arch/x86/include/uapi/asm/sigcontext.h b/arch/x86/include/uapi/asm/sigcontext.h index 40836a9a7250..d485232f1e9f 100644 --- a/arch/x86/include/uapi/asm/sigcontext.h +++ b/arch/x86/include/uapi/asm/sigcontext.h | |||
| @@ -1,221 +1,360 @@ | |||
| 1 | #ifndef _UAPI_ASM_X86_SIGCONTEXT_H | 1 | #ifndef _UAPI_ASM_X86_SIGCONTEXT_H |
| 2 | #define _UAPI_ASM_X86_SIGCONTEXT_H | 2 | #define _UAPI_ASM_X86_SIGCONTEXT_H |
| 3 | 3 | ||
| 4 | /* | ||
| 5 | * Linux signal context definitions. The sigcontext includes a complex | ||
| 6 | * hierarchy of CPU and FPU state, available to user-space (on the stack) when | ||
| 7 | * a signal handler is executed. | ||
| 8 | * | ||
| 9 | * As over the years this ABI grew from its very simple roots towards | ||
| 10 | * supporting more and more CPU state organically, some of the details (which | ||
| 11 | * were rather clever hacks back in the days) became a bit quirky by today. | ||
| 12 | * | ||
| 13 | * The current ABI includes flexible provisions for future extensions, so we | ||
| 14 | * won't have to grow new quirks for quite some time. Promise! | ||
| 15 | */ | ||
| 16 | |||
| 4 | #include <linux/compiler.h> | 17 | #include <linux/compiler.h> |
| 5 | #include <linux/types.h> | 18 | #include <linux/types.h> |
| 6 | 19 | ||
| 7 | #define FP_XSTATE_MAGIC1 0x46505853U | 20 | #define FP_XSTATE_MAGIC1 0x46505853U |
| 8 | #define FP_XSTATE_MAGIC2 0x46505845U | 21 | #define FP_XSTATE_MAGIC2 0x46505845U |
| 9 | #define FP_XSTATE_MAGIC2_SIZE sizeof(FP_XSTATE_MAGIC2) | 22 | #define FP_XSTATE_MAGIC2_SIZE sizeof(FP_XSTATE_MAGIC2) |
| 10 | 23 | ||
| 11 | /* | 24 | /* |
| 12 | * bytes 464..511 in the current 512byte layout of fxsave/fxrstor frame | 25 | * Bytes 464..511 in the current 512-byte layout of the FXSAVE/FXRSTOR frame |
| 13 | * are reserved for SW usage. On cpu's supporting xsave/xrstor, these bytes | 26 | * are reserved for SW usage. On CPUs supporting XSAVE/XRSTOR, these bytes are |
| 14 | * are used to extended the fpstate pointer in the sigcontext, which now | 27 | * used to extend the fpstate pointer in the sigcontext, which now includes the |
| 15 | * includes the extended state information along with fpstate information. | 28 | * extended state information along with fpstate information. |
| 29 | * | ||
| 30 | * If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then there's a | ||
| 31 | * sw_reserved.extended_size bytes large extended context area present. (The | ||
| 32 | * last 32-bit word of this extended area (at the | ||
| 33 | * fpstate+extended_size-FP_XSTATE_MAGIC2_SIZE address) is set to | ||
| 34 | * FP_XSTATE_MAGIC2 so that you can sanity check your size calculations.) | ||
| 16 | * | 35 | * |
| 17 | * Presence of FP_XSTATE_MAGIC1 at the beginning of this SW reserved | 36 | * This extended area typically grows with newer CPUs that have larger and |
| 18 | * area and FP_XSTATE_MAGIC2 at the end of memory layout | 37 | * larger XSAVE areas. |
| 19 | * (extended_size - FP_XSTATE_MAGIC2_SIZE) indicates the presence of the | ||
| 20 | * extended state information in the memory layout pointed by the fpstate | ||
| 21 | * pointer in sigcontext. | ||
| 22 | */ | 38 | */ |
| 23 | struct _fpx_sw_bytes { | 39 | struct _fpx_sw_bytes { |
| 24 | __u32 magic1; /* FP_XSTATE_MAGIC1 */ | 40 | /* |
| 25 | __u32 extended_size; /* total size of the layout referred by | 41 | * If set to FP_XSTATE_MAGIC1 then this is an xstate context. |
| 26 | * fpstate pointer in the sigcontext. | 42 | * 0 if a legacy frame. |
| 27 | */ | 43 | */ |
| 28 | __u64 xfeatures; | 44 | __u32 magic1; |
| 29 | /* feature bit mask (including fp/sse/extended | 45 | |
| 30 | * state) that is present in the memory | 46 | /* |
| 31 | * layout. | 47 | * Total size of the fpstate area: |
| 32 | */ | 48 | * |
| 33 | __u32 xstate_size; /* actual xsave state size, based on the | 49 | * - if magic1 == 0 then it's sizeof(struct _fpstate) |
| 34 | * features saved in the layout. | 50 | * - if magic1 == FP_XSTATE_MAGIC1 then it's sizeof(struct _xstate) |
| 35 | * 'extended_size' will be greater than | 51 | * plus extensions (if any) |
| 36 | * 'xstate_size'. | 52 | */ |
| 37 | */ | 53 | __u32 extended_size; |
| 38 | __u32 padding[7]; /* for future use. */ | 54 | |
| 55 | /* | ||
| 56 | * Feature bit mask (including FP/SSE/extended state) that is present | ||
| 57 | * in the memory layout: | ||
| 58 | */ | ||
| 59 | __u64 xfeatures; | ||
| 60 | |||
| 61 | /* | ||
| 62 | * Actual XSAVE state size, based on the xfeatures saved in the layout. | ||
| 63 | * 'extended_size' is greater than 'xstate_size': | ||
| 64 | */ | ||
| 65 | __u32 xstate_size; | ||
| 66 | |||
| 67 | /* For future use: */ | ||
| 68 | __u32 padding[7]; | ||
| 39 | }; | 69 | }; |
| 40 | 70 | ||
| 41 | #ifdef __i386__ | ||
| 42 | /* | 71 | /* |
| 43 | * As documented in the iBCS2 standard.. | 72 | * As documented in the iBCS2 standard: |
| 44 | * | ||
| 45 | * The first part of "struct _fpstate" is just the normal i387 | ||
| 46 | * hardware setup, the extra "status" word is used to save the | ||
| 47 | * coprocessor status word before entering the handler. | ||
| 48 | * | 73 | * |
| 49 | * Pentium III FXSR, SSE support | 74 | * The first part of "struct _fpstate" is just the normal i387 hardware setup, |
| 50 | * Gareth Hughes <gareth@valinux.com>, May 2000 | 75 | * the extra "status" word is used to save the coprocessor status word before |
| 76 | * entering the handler. | ||
| 51 | * | 77 | * |
| 52 | * The FPU state data structure has had to grow to accommodate the | 78 | * The FPU state data structure has had to grow to accommodate the extended FPU |
| 53 | * extended FPU state required by the Streaming SIMD Extensions. | 79 | * state required by the Streaming SIMD Extensions. There is no documented |
| 54 | * There is no documented standard to accomplish this at the moment. | 80 | * standard to accomplish this at the moment. |
| 55 | */ | 81 | */ |
| 82 | |||
| 83 | /* 10-byte legacy floating point register: */ | ||
| 56 | struct _fpreg { | 84 | struct _fpreg { |
| 57 | unsigned short significand[4]; | 85 | __u16 significand[4]; |
| 58 | unsigned short exponent; | 86 | __u16 exponent; |
| 59 | }; | 87 | }; |
| 60 | 88 | ||
| 89 | /* 16-byte floating point register: */ | ||
| 61 | struct _fpxreg { | 90 | struct _fpxreg { |
| 62 | unsigned short significand[4]; | 91 | __u16 significand[4]; |
| 63 | unsigned short exponent; | 92 | __u16 exponent; |
| 64 | unsigned short padding[3]; | 93 | __u16 padding[3]; |
| 65 | }; | 94 | }; |
| 66 | 95 | ||
| 96 | /* 16-byte XMM register: */ | ||
| 67 | struct _xmmreg { | 97 | struct _xmmreg { |
| 68 | unsigned long element[4]; | 98 | __u32 element[4]; |
| 69 | }; | 99 | }; |
| 70 | 100 | ||
| 71 | struct _fpstate { | 101 | #define X86_FXSR_MAGIC 0x0000 |
| 72 | /* Regular FPU environment */ | 102 | |
| 73 | unsigned long cw; | 103 | /* |
| 74 | unsigned long sw; | 104 | * The 32-bit FPU frame: |
| 75 | unsigned long tag; | 105 | */ |
| 76 | unsigned long ipoff; | 106 | struct _fpstate_32 { |
| 77 | unsigned long cssel; | 107 | /* Legacy FPU environment: */ |
| 78 | unsigned long dataoff; | 108 | __u32 cw; |
| 79 | unsigned long datasel; | 109 | __u32 sw; |
| 80 | struct _fpreg _st[8]; | 110 | __u32 tag; |
| 81 | unsigned short status; | 111 | __u32 ipoff; |
| 82 | unsigned short magic; /* 0xffff = regular FPU data only */ | 112 | __u32 cssel; |
| 113 | __u32 dataoff; | ||
| 114 | __u32 datasel; | ||
| 115 | struct _fpreg _st[8]; | ||
| 116 | __u16 status; | ||
| 117 | __u16 magic; /* 0xffff: regular FPU data only */ | ||
| 118 | /* 0x0000: FXSR FPU data */ | ||
| 83 | 119 | ||
| 84 | /* FXSR FPU environment */ | 120 | /* FXSR FPU environment */ |
| 85 | unsigned long _fxsr_env[6]; /* FXSR FPU env is ignored */ | 121 | __u32 _fxsr_env[6]; /* FXSR FPU env is ignored */ |
| 86 | unsigned long mxcsr; | 122 | __u32 mxcsr; |
| 87 | unsigned long reserved; | 123 | __u32 reserved; |
| 88 | struct _fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */ | 124 | struct _fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */ |
| 89 | struct _xmmreg _xmm[8]; | 125 | struct _xmmreg _xmm[8]; /* First 8 XMM registers */ |
| 90 | unsigned long padding1[44]; | 126 | union { |
| 127 | __u32 padding1[44]; /* Second 8 XMM registers plus padding */ | ||
| 128 | __u32 padding[44]; /* Alias name for old user-space */ | ||
| 129 | }; | ||
| 91 | 130 | ||
| 92 | union { | 131 | union { |
| 93 | unsigned long padding2[12]; | 132 | __u32 padding2[12]; |
| 94 | struct _fpx_sw_bytes sw_reserved; /* represents the extended | 133 | struct _fpx_sw_bytes sw_reserved; /* Potential extended state is encoded here */ |
| 95 | * state info */ | ||
| 96 | }; | 134 | }; |
| 97 | }; | 135 | }; |
| 98 | 136 | ||
| 99 | #define X86_FXSR_MAGIC 0x0000 | ||
| 100 | |||
| 101 | #ifndef __KERNEL__ | ||
| 102 | /* | 137 | /* |
| 103 | * User-space might still rely on the old definition: | 138 | * The 64-bit FPU frame. (FXSAVE format and later) |
| 139 | * | ||
| 140 | * Note1: If sw_reserved.magic1 == FP_XSTATE_MAGIC1 then the structure is | ||
| 141 | * larger: 'struct _xstate'. Note that 'struct _xstate' embedds | ||
| 142 | * 'struct _fpstate' so that you can always assume the _fpstate portion | ||
| 143 | * exists so that you can check the magic value. | ||
| 144 | * | ||
| 145 | * Note2: Reserved fields may someday contain valuable data. Always | ||
| 146 | * save/restore them when you change signal frames. | ||
| 104 | */ | 147 | */ |
| 105 | struct sigcontext { | 148 | struct _fpstate_64 { |
| 106 | unsigned short gs, __gsh; | 149 | __u16 cwd; |
| 107 | unsigned short fs, __fsh; | 150 | __u16 swd; |
| 108 | unsigned short es, __esh; | 151 | /* Note this is not the same as the 32-bit/x87/FSAVE twd: */ |
| 109 | unsigned short ds, __dsh; | 152 | __u16 twd; |
| 110 | unsigned long edi; | 153 | __u16 fop; |
| 111 | unsigned long esi; | 154 | __u64 rip; |
| 112 | unsigned long ebp; | 155 | __u64 rdp; |
| 113 | unsigned long esp; | 156 | __u32 mxcsr; |
| 114 | unsigned long ebx; | 157 | __u32 mxcsr_mask; |
| 115 | unsigned long edx; | 158 | __u32 st_space[32]; /* 8x FP registers, 16 bytes each */ |
| 116 | unsigned long ecx; | 159 | __u32 xmm_space[64]; /* 16x XMM registers, 16 bytes each */ |
| 117 | unsigned long eax; | 160 | __u32 reserved2[12]; |
| 118 | unsigned long trapno; | ||
| 119 | unsigned long err; | ||
| 120 | unsigned long eip; | ||
| 121 | unsigned short cs, __csh; | ||
| 122 | unsigned long eflags; | ||
| 123 | unsigned long esp_at_signal; | ||
| 124 | unsigned short ss, __ssh; | ||
| 125 | struct _fpstate __user *fpstate; | ||
| 126 | unsigned long oldmask; | ||
| 127 | unsigned long cr2; | ||
| 128 | }; | ||
| 129 | #endif /* !__KERNEL__ */ | ||
| 130 | |||
| 131 | #else /* __i386__ */ | ||
| 132 | |||
| 133 | /* FXSAVE frame */ | ||
| 134 | /* Note: reserved1/2 may someday contain valuable data. Always save/restore | ||
| 135 | them when you change signal frames. */ | ||
| 136 | struct _fpstate { | ||
| 137 | __u16 cwd; | ||
| 138 | __u16 swd; | ||
| 139 | __u16 twd; /* Note this is not the same as the | ||
| 140 | 32bit/x87/FSAVE twd */ | ||
| 141 | __u16 fop; | ||
| 142 | __u64 rip; | ||
| 143 | __u64 rdp; | ||
| 144 | __u32 mxcsr; | ||
| 145 | __u32 mxcsr_mask; | ||
| 146 | __u32 st_space[32]; /* 8*16 bytes for each FP-reg */ | ||
| 147 | __u32 xmm_space[64]; /* 16*16 bytes for each XMM-reg */ | ||
| 148 | __u32 reserved2[12]; | ||
| 149 | union { | 161 | union { |
| 150 | __u32 reserved3[12]; | 162 | __u32 reserved3[12]; |
| 151 | struct _fpx_sw_bytes sw_reserved; /* represents the extended | 163 | struct _fpx_sw_bytes sw_reserved; /* Potential extended state is encoded here */ |
| 152 | * state information */ | ||
| 153 | }; | 164 | }; |
| 154 | }; | 165 | }; |
| 155 | 166 | ||
| 156 | #ifndef __KERNEL__ | 167 | #ifdef __i386__ |
| 157 | /* | 168 | # define _fpstate _fpstate_32 |
| 158 | * User-space might still rely on the old definition: | 169 | #else |
| 159 | */ | 170 | # define _fpstate _fpstate_64 |
| 160 | struct sigcontext { | ||
| 161 | __u64 r8; | ||
| 162 | __u64 r9; | ||
| 163 | __u64 r10; | ||
| 164 | __u64 r11; | ||
| 165 | __u64 r12; | ||
| 166 | __u64 r13; | ||
| 167 | __u64 r14; | ||
| 168 | __u64 r15; | ||
| 169 | __u64 rdi; | ||
| 170 | __u64 rsi; | ||
| 171 | __u64 rbp; | ||
| 172 | __u64 rbx; | ||
| 173 | __u64 rdx; | ||
| 174 | __u64 rax; | ||
| 175 | __u64 rcx; | ||
| 176 | __u64 rsp; | ||
| 177 | __u64 rip; | ||
| 178 | __u64 eflags; /* RFLAGS */ | ||
| 179 | __u16 cs; | ||
| 180 | __u16 gs; | ||
| 181 | __u16 fs; | ||
| 182 | __u16 __pad0; | ||
| 183 | __u64 err; | ||
| 184 | __u64 trapno; | ||
| 185 | __u64 oldmask; | ||
| 186 | __u64 cr2; | ||
| 187 | struct _fpstate __user *fpstate; /* zero when no FPU context */ | ||
| 188 | #ifdef __ILP32__ | ||
| 189 | __u32 __fpstate_pad; | ||
| 190 | #endif | 171 | #endif |
| 191 | __u64 reserved1[8]; | ||
| 192 | }; | ||
| 193 | #endif /* !__KERNEL__ */ | ||
| 194 | |||
| 195 | #endif /* !__i386__ */ | ||
| 196 | 172 | ||
| 197 | struct _header { | 173 | struct _header { |
| 198 | __u64 xfeatures; | 174 | __u64 xfeatures; |
| 199 | __u64 reserved1[2]; | 175 | __u64 reserved1[2]; |
| 200 | __u64 reserved2[5]; | 176 | __u64 reserved2[5]; |
| 201 | }; | 177 | }; |
| 202 | 178 | ||
| 203 | struct _ymmh_state { | 179 | struct _ymmh_state { |
| 204 | /* 16 * 16 bytes for each YMMH-reg */ | 180 | /* 16x YMM registers, 16 bytes each: */ |
| 205 | __u32 ymmh_space[64]; | 181 | __u32 ymmh_space[64]; |
| 206 | }; | 182 | }; |
| 207 | 183 | ||
| 208 | /* | 184 | /* |
| 209 | * Extended state pointed by the fpstate pointer in the sigcontext. | 185 | * Extended state pointed to by sigcontext::fpstate. |
| 210 | * In addition to the fpstate, information encoded in the xstate_hdr | 186 | * |
| 211 | * indicates the presence of other extended state information | 187 | * In addition to the fpstate, information encoded in _xstate::xstate_hdr |
| 212 | * supported by the processor and OS. | 188 | * indicates the presence of other extended state information supported |
| 189 | * by the CPU and kernel: | ||
| 213 | */ | 190 | */ |
| 214 | struct _xstate { | 191 | struct _xstate { |
| 215 | struct _fpstate fpstate; | 192 | struct _fpstate fpstate; |
| 216 | struct _header xstate_hdr; | 193 | struct _header xstate_hdr; |
| 217 | struct _ymmh_state ymmh; | 194 | struct _ymmh_state ymmh; |
| 218 | /* new processor state extensions go here */ | 195 | /* New processor state extensions go here: */ |
| 196 | }; | ||
| 197 | |||
| 198 | /* | ||
| 199 | * The 32-bit signal frame: | ||
| 200 | */ | ||
| 201 | struct sigcontext_32 { | ||
| 202 | __u16 gs, __gsh; | ||
| 203 | __u16 fs, __fsh; | ||
| 204 | __u16 es, __esh; | ||
| 205 | __u16 ds, __dsh; | ||
| 206 | __u32 di; | ||
| 207 | __u32 si; | ||
| 208 | __u32 bp; | ||
| 209 | __u32 sp; | ||
| 210 | __u32 bx; | ||
| 211 | __u32 dx; | ||
| 212 | __u32 cx; | ||
| 213 | __u32 ax; | ||
| 214 | __u32 trapno; | ||
| 215 | __u32 err; | ||
| 216 | __u32 ip; | ||
| 217 | __u16 cs, __csh; | ||
| 218 | __u32 flags; | ||
| 219 | __u32 sp_at_signal; | ||
| 220 | __u16 ss, __ssh; | ||
| 221 | |||
| 222 | /* | ||
| 223 | * fpstate is really (struct _fpstate *) or (struct _xstate *) | ||
| 224 | * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved | ||
| 225 | * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end | ||
| 226 | * of extended memory layout. See comments at the definition of | ||
| 227 | * (struct _fpx_sw_bytes) | ||
| 228 | */ | ||
| 229 | __u32 fpstate; /* Zero when no FPU/extended context */ | ||
| 230 | __u32 oldmask; | ||
| 231 | __u32 cr2; | ||
| 232 | }; | ||
| 233 | |||
| 234 | /* | ||
| 235 | * The 64-bit signal frame: | ||
| 236 | */ | ||
| 237 | struct sigcontext_64 { | ||
| 238 | __u64 r8; | ||
| 239 | __u64 r9; | ||
| 240 | __u64 r10; | ||
| 241 | __u64 r11; | ||
| 242 | __u64 r12; | ||
| 243 | __u64 r13; | ||
| 244 | __u64 r14; | ||
| 245 | __u64 r15; | ||
| 246 | __u64 di; | ||
| 247 | __u64 si; | ||
| 248 | __u64 bp; | ||
| 249 | __u64 bx; | ||
| 250 | __u64 dx; | ||
| 251 | __u64 ax; | ||
| 252 | __u64 cx; | ||
| 253 | __u64 sp; | ||
| 254 | __u64 ip; | ||
| 255 | __u64 flags; | ||
| 256 | __u16 cs; | ||
| 257 | __u16 gs; | ||
| 258 | __u16 fs; | ||
| 259 | __u16 __pad0; | ||
| 260 | __u64 err; | ||
| 261 | __u64 trapno; | ||
| 262 | __u64 oldmask; | ||
| 263 | __u64 cr2; | ||
| 264 | |||
| 265 | /* | ||
| 266 | * fpstate is really (struct _fpstate *) or (struct _xstate *) | ||
| 267 | * depending on the FP_XSTATE_MAGIC1 encoded in the SW reserved | ||
| 268 | * bytes of (struct _fpstate) and FP_XSTATE_MAGIC2 present at the end | ||
| 269 | * of extended memory layout. See comments at the definition of | ||
| 270 | * (struct _fpx_sw_bytes) | ||
| 271 | */ | ||
| 272 | __u64 fpstate; /* Zero when no FPU/extended context */ | ||
| 273 | __u64 reserved1[8]; | ||
| 274 | }; | ||
| 275 | |||
| 276 | /* | ||
| 277 | * Create the real 'struct sigcontext' type: | ||
| 278 | */ | ||
| 279 | #ifdef __KERNEL__ | ||
| 280 | # ifdef __i386__ | ||
| 281 | # define sigcontext sigcontext_32 | ||
| 282 | # else | ||
| 283 | # define sigcontext sigcontext_64 | ||
| 284 | # endif | ||
| 285 | #endif | ||
| 286 | |||
| 287 | /* | ||
| 288 | * The old user-space sigcontext definition, just in case user-space still | ||
| 289 | * relies on it. The kernel definition (in asm/sigcontext.h) has unified | ||
| 290 | * field names but otherwise the same layout. | ||
| 291 | */ | ||
| 292 | #ifndef __KERNEL__ | ||
| 293 | |||
| 294 | #define _fpstate_ia32 _fpstate_32 | ||
| 295 | #define sigcontext_ia32 sigcontext_32 | ||
| 296 | |||
| 297 | |||
| 298 | # ifdef __i386__ | ||
| 299 | struct sigcontext { | ||
| 300 | __u16 gs, __gsh; | ||
| 301 | __u16 fs, __fsh; | ||
| 302 | __u16 es, __esh; | ||
| 303 | __u16 ds, __dsh; | ||
| 304 | __u32 edi; | ||
| 305 | __u32 esi; | ||
| 306 | __u32 ebp; | ||
| 307 | __u32 esp; | ||
| 308 | __u32 ebx; | ||
| 309 | __u32 edx; | ||
| 310 | __u32 ecx; | ||
| 311 | __u32 eax; | ||
| 312 | __u32 trapno; | ||
| 313 | __u32 err; | ||
| 314 | __u32 eip; | ||
| 315 | __u16 cs, __csh; | ||
| 316 | __u32 eflags; | ||
| 317 | __u32 esp_at_signal; | ||
| 318 | __u16 ss, __ssh; | ||
| 319 | struct _fpstate __user *fpstate; | ||
| 320 | __u32 oldmask; | ||
| 321 | __u32 cr2; | ||
| 219 | }; | 322 | }; |
| 323 | # else /* __x86_64__: */ | ||
| 324 | struct sigcontext { | ||
| 325 | __u64 r8; | ||
| 326 | __u64 r9; | ||
| 327 | __u64 r10; | ||
| 328 | __u64 r11; | ||
| 329 | __u64 r12; | ||
| 330 | __u64 r13; | ||
| 331 | __u64 r14; | ||
| 332 | __u64 r15; | ||
| 333 | __u64 rdi; | ||
| 334 | __u64 rsi; | ||
| 335 | __u64 rbp; | ||
| 336 | __u64 rbx; | ||
| 337 | __u64 rdx; | ||
| 338 | __u64 rax; | ||
| 339 | __u64 rcx; | ||
| 340 | __u64 rsp; | ||
| 341 | __u64 rip; | ||
| 342 | __u64 eflags; /* RFLAGS */ | ||
| 343 | __u16 cs; | ||
| 344 | __u16 gs; | ||
| 345 | __u16 fs; | ||
| 346 | __u16 __pad0; | ||
| 347 | __u64 err; | ||
| 348 | __u64 trapno; | ||
| 349 | __u64 oldmask; | ||
| 350 | __u64 cr2; | ||
| 351 | struct _fpstate __user *fpstate; /* Zero when no FPU context */ | ||
| 352 | # ifdef __ILP32__ | ||
| 353 | __u32 __fpstate_pad; | ||
| 354 | # endif | ||
| 355 | __u64 reserved1[8]; | ||
| 356 | }; | ||
| 357 | # endif /* __x86_64__ */ | ||
| 358 | #endif /* !__KERNEL__ */ | ||
| 220 | 359 | ||
| 221 | #endif /* _UAPI_ASM_X86_SIGCONTEXT_H */ | 360 | #endif /* _UAPI_ASM_X86_SIGCONTEXT_H */ |
diff --git a/arch/x86/include/uapi/asm/sigcontext32.h b/arch/x86/include/uapi/asm/sigcontext32.h index ad1478c4ae12..a92b0f0dc09e 100644 --- a/arch/x86/include/uapi/asm/sigcontext32.h +++ b/arch/x86/include/uapi/asm/sigcontext32.h | |||
| @@ -1,77 +1,8 @@ | |||
| 1 | #ifndef _ASM_X86_SIGCONTEXT32_H | 1 | #ifndef _ASM_X86_SIGCONTEXT32_H |
| 2 | #define _ASM_X86_SIGCONTEXT32_H | 2 | #define _ASM_X86_SIGCONTEXT32_H |
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | /* This is a legacy file - all the type definitions are in sigcontext.h: */ |
| 5 | 5 | ||
| 6 | /* signal context for 32bit programs. */ | 6 | #include <asm/sigcontext.h> |
| 7 | |||
| 8 | #define X86_FXSR_MAGIC 0x0000 | ||
| 9 | |||
| 10 | struct _fpreg { | ||
| 11 | unsigned short significand[4]; | ||
| 12 | unsigned short exponent; | ||
| 13 | }; | ||
| 14 | |||
| 15 | struct _fpxreg { | ||
| 16 | unsigned short significand[4]; | ||
| 17 | unsigned short exponent; | ||
| 18 | unsigned short padding[3]; | ||
| 19 | }; | ||
| 20 | |||
| 21 | struct _xmmreg { | ||
| 22 | __u32 element[4]; | ||
| 23 | }; | ||
| 24 | |||
| 25 | /* FSAVE frame with extensions */ | ||
| 26 | struct _fpstate_ia32 { | ||
| 27 | /* Regular FPU environment */ | ||
| 28 | __u32 cw; | ||
| 29 | __u32 sw; | ||
| 30 | __u32 tag; /* not compatible to 64bit twd */ | ||
| 31 | __u32 ipoff; | ||
| 32 | __u32 cssel; | ||
| 33 | __u32 dataoff; | ||
| 34 | __u32 datasel; | ||
| 35 | struct _fpreg _st[8]; | ||
| 36 | unsigned short status; | ||
| 37 | unsigned short magic; /* 0xffff = regular FPU data only */ | ||
| 38 | |||
| 39 | /* FXSR FPU environment */ | ||
| 40 | __u32 _fxsr_env[6]; | ||
| 41 | __u32 mxcsr; | ||
| 42 | __u32 reserved; | ||
| 43 | struct _fpxreg _fxsr_st[8]; | ||
| 44 | struct _xmmreg _xmm[8]; /* It's actually 16 */ | ||
| 45 | __u32 padding[44]; | ||
| 46 | union { | ||
| 47 | __u32 padding2[12]; | ||
| 48 | struct _fpx_sw_bytes sw_reserved; | ||
| 49 | }; | ||
| 50 | }; | ||
| 51 | |||
| 52 | struct sigcontext_ia32 { | ||
| 53 | unsigned short gs, __gsh; | ||
| 54 | unsigned short fs, __fsh; | ||
| 55 | unsigned short es, __esh; | ||
| 56 | unsigned short ds, __dsh; | ||
| 57 | unsigned int di; | ||
| 58 | unsigned int si; | ||
| 59 | unsigned int bp; | ||
| 60 | unsigned int sp; | ||
| 61 | unsigned int bx; | ||
| 62 | unsigned int dx; | ||
| 63 | unsigned int cx; | ||
| 64 | unsigned int ax; | ||
| 65 | unsigned int trapno; | ||
| 66 | unsigned int err; | ||
| 67 | unsigned int ip; | ||
| 68 | unsigned short cs, __csh; | ||
| 69 | unsigned int flags; | ||
| 70 | unsigned int sp_at_signal; | ||
| 71 | unsigned short ss, __ssh; | ||
| 72 | unsigned int fpstate; /* really (struct _fpstate_ia32 *) */ | ||
| 73 | unsigned int oldmask; | ||
| 74 | unsigned int cr2; | ||
| 75 | }; | ||
| 76 | 7 | ||
| 77 | #endif /* _ASM_X86_SIGCONTEXT32_H */ | 8 | #endif /* _ASM_X86_SIGCONTEXT32_H */ |
