~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/include/asm/fpu/xstate.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef __ASM_X86_XSAVE_H
  3 #define __ASM_X86_XSAVE_H
  4 
  5 #include <linux/uaccess.h>
  6 #include <linux/types.h>
  7 
  8 #include <asm/processor.h>
  9 #include <asm/fpu/api.h>
 10 #include <asm/user.h>
 11 
 12 /* Bit 63 of XCR0 is reserved for future expansion */
 13 #define XFEATURE_MASK_EXTEND    (~(XFEATURE_MASK_FPSSE | (1ULL << 63)))
 14 
 15 #define XSTATE_CPUID            0x0000000d
 16 
 17 #define TILE_CPUID              0x0000001d
 18 
 19 #define FXSAVE_SIZE     512
 20 
 21 #define XSAVE_HDR_SIZE      64
 22 #define XSAVE_HDR_OFFSET    FXSAVE_SIZE
 23 
 24 #define XSAVE_YMM_SIZE      256
 25 #define XSAVE_YMM_OFFSET    (XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET)
 26 
 27 #define XSAVE_ALIGNMENT     64
 28 
 29 /* All currently supported user features */
 30 #define XFEATURE_MASK_USER_SUPPORTED (XFEATURE_MASK_FP | \
 31                                       XFEATURE_MASK_SSE | \
 32                                       XFEATURE_MASK_YMM | \
 33                                       XFEATURE_MASK_OPMASK | \
 34                                       XFEATURE_MASK_ZMM_Hi256 | \
 35                                       XFEATURE_MASK_Hi16_ZMM     | \
 36                                       XFEATURE_MASK_PKRU | \
 37                                       XFEATURE_MASK_BNDREGS | \
 38                                       XFEATURE_MASK_BNDCSR | \
 39                                       XFEATURE_MASK_XTILE)
 40 
 41 /*
 42  * Features which are restored when returning to user space.
 43  * PKRU is not restored on return to user space because PKRU
 44  * is switched eagerly in switch_to() and flush_thread()
 45  */
 46 #define XFEATURE_MASK_USER_RESTORE      \
 47         (XFEATURE_MASK_USER_SUPPORTED & ~XFEATURE_MASK_PKRU)
 48 
 49 /* Features which are dynamically enabled for a process on request */
 50 #define XFEATURE_MASK_USER_DYNAMIC      XFEATURE_MASK_XTILE_DATA
 51 
 52 /* All currently supported supervisor features */
 53 #define XFEATURE_MASK_SUPERVISOR_SUPPORTED (XFEATURE_MASK_PASID | \
 54                                             XFEATURE_MASK_CET_USER)
 55 
 56 /*
 57  * A supervisor state component may not always contain valuable information,
 58  * and its size may be huge. Saving/restoring such supervisor state components
 59  * at each context switch can cause high CPU and space overhead, which should
 60  * be avoided. Such supervisor state components should only be saved/restored
 61  * on demand. The on-demand supervisor features are set in this mask.
 62  *
 63  * Unlike the existing supported supervisor features, an independent supervisor
 64  * feature does not allocate a buffer in task->fpu, and the corresponding
 65  * supervisor state component cannot be saved/restored at each context switch.
 66  *
 67  * To support an independent supervisor feature, a developer should follow the
 68  * dos and don'ts as below:
 69  * - Do dynamically allocate a buffer for the supervisor state component.
 70  * - Do manually invoke the XSAVES/XRSTORS instruction to save/restore the
 71  *   state component to/from the buffer.
 72  * - Don't set the bit corresponding to the independent supervisor feature in
 73  *   IA32_XSS at run time, since it has been set at boot time.
 74  */
 75 #define XFEATURE_MASK_INDEPENDENT (XFEATURE_MASK_LBR)
 76 
 77 /*
 78  * Unsupported supervisor features. When a supervisor feature in this mask is
 79  * supported in the future, move it to the supported supervisor feature mask.
 80  */
 81 #define XFEATURE_MASK_SUPERVISOR_UNSUPPORTED (XFEATURE_MASK_PT | \
 82                                               XFEATURE_MASK_CET_KERNEL)
 83 
 84 /* All supervisor states including supported and unsupported states. */
 85 #define XFEATURE_MASK_SUPERVISOR_ALL (XFEATURE_MASK_SUPERVISOR_SUPPORTED | \
 86                                       XFEATURE_MASK_INDEPENDENT | \
 87                                       XFEATURE_MASK_SUPERVISOR_UNSUPPORTED)
 88 
 89 /*
 90  * The feature mask required to restore FPU state:
 91  * - All user states which are not eagerly switched in switch_to()/exec()
 92  * - The suporvisor states
 93  */
 94 #define XFEATURE_MASK_FPSTATE   (XFEATURE_MASK_USER_RESTORE | \
 95                                  XFEATURE_MASK_SUPERVISOR_SUPPORTED)
 96 
 97 /*
 98  * Features in this mask have space allocated in the signal frame, but may not
 99  * have that space initialized when the feature is in its init state.
100  */
101 #define XFEATURE_MASK_SIGFRAME_INITOPT  (XFEATURE_MASK_XTILE | \
102                                          XFEATURE_MASK_USER_DYNAMIC)
103 
104 extern u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
105 
106 extern void __init update_regset_xstate_info(unsigned int size,
107                                              u64 xstate_mask);
108 
109 int xfeature_size(int xfeature_nr);
110 
111 void xsaves(struct xregs_state *xsave, u64 mask);
112 void xrstors(struct xregs_state *xsave, u64 mask);
113 
114 int xfd_enable_feature(u64 xfd_err);
115 
116 #ifdef CONFIG_X86_64
117 DECLARE_STATIC_KEY_FALSE(__fpu_state_size_dynamic);
118 #endif
119 
120 #ifdef CONFIG_X86_64
121 DECLARE_STATIC_KEY_FALSE(__fpu_state_size_dynamic);
122 
123 static __always_inline __pure bool fpu_state_size_dynamic(void)
124 {
125         return static_branch_unlikely(&__fpu_state_size_dynamic);
126 }
127 #else
128 static __always_inline __pure bool fpu_state_size_dynamic(void)
129 {
130         return false;
131 }
132 #endif
133 
134 #endif
135 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php