xref: /OK3568_Linux_fs/kernel/arch/x86/include/uapi/asm/ucontext.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2*4882a593Smuzhiyun #ifndef _ASM_X86_UCONTEXT_H
3*4882a593Smuzhiyun #define _ASM_X86_UCONTEXT_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun /*
6*4882a593Smuzhiyun  * Indicates the presence of extended state information in the memory
7*4882a593Smuzhiyun  * layout pointed by the fpstate pointer in the ucontext's sigcontext
8*4882a593Smuzhiyun  * struct (uc_mcontext).
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun #define UC_FP_XSTATE	0x1
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifdef __x86_64__
13*4882a593Smuzhiyun /*
14*4882a593Smuzhiyun  * UC_SIGCONTEXT_SS will be set when delivering 64-bit or x32 signals on
15*4882a593Smuzhiyun  * kernels that save SS in the sigcontext.  All kernels that set
16*4882a593Smuzhiyun  * UC_SIGCONTEXT_SS will correctly restore at least the low 32 bits of esp
17*4882a593Smuzhiyun  * regardless of SS (i.e. they implement espfix).
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  * Kernels that set UC_SIGCONTEXT_SS will also set UC_STRICT_RESTORE_SS
20*4882a593Smuzhiyun  * when delivering a signal that came from 64-bit code.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * Sigreturn restores SS as follows:
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  * if (saved SS is valid || UC_STRICT_RESTORE_SS is set ||
25*4882a593Smuzhiyun  *     saved CS is not 64-bit)
26*4882a593Smuzhiyun  *         new SS = saved SS  (will fail IRET and signal if invalid)
27*4882a593Smuzhiyun  * else
28*4882a593Smuzhiyun  *         new SS = a flat 32-bit data segment
29*4882a593Smuzhiyun  *
30*4882a593Smuzhiyun  * This behavior serves three purposes:
31*4882a593Smuzhiyun  *
32*4882a593Smuzhiyun  * - Legacy programs that construct a 64-bit sigcontext from scratch
33*4882a593Smuzhiyun  *   with zero or garbage in the SS slot (e.g. old CRIU) and call
34*4882a593Smuzhiyun  *   sigreturn will still work.
35*4882a593Smuzhiyun  *
36*4882a593Smuzhiyun  * - Old DOSEMU versions sometimes catch a signal from a segmented
37*4882a593Smuzhiyun  *   context, delete the old SS segment (with modify_ldt), and change
38*4882a593Smuzhiyun  *   the saved CS to a 64-bit segment.  These DOSEMU versions expect
39*4882a593Smuzhiyun  *   sigreturn to send them back to 64-bit mode without killing them,
40*4882a593Smuzhiyun  *   despite the fact that the SS selector when the signal was raised is
41*4882a593Smuzhiyun  *   no longer valid.  UC_STRICT_RESTORE_SS will be clear, so the kernel
42*4882a593Smuzhiyun  *   will fix up SS for these DOSEMU versions.
43*4882a593Smuzhiyun  *
44*4882a593Smuzhiyun  * - Old and new programs that catch a signal and return without
45*4882a593Smuzhiyun  *   modifying the saved context will end up in exactly the state they
46*4882a593Smuzhiyun  *   started in, even if they were running in a segmented context when
47*4882a593Smuzhiyun  *   the signal was raised..  Old kernels would lose track of the
48*4882a593Smuzhiyun  *   previous SS value.
49*4882a593Smuzhiyun  */
50*4882a593Smuzhiyun #define UC_SIGCONTEXT_SS	0x2
51*4882a593Smuzhiyun #define UC_STRICT_RESTORE_SS	0x4
52*4882a593Smuzhiyun #endif
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #include <asm-generic/ucontext.h>
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #endif /* _ASM_X86_UCONTEXT_H */
57