diff options
-rw-r--r-- | arch/x86/include/asm/xsave.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h index 0d1523146545..aa3ff0cca9a1 100644 --- a/arch/x86/include/asm/xsave.h +++ b/arch/x86/include/asm/xsave.h | |||
@@ -66,6 +66,66 @@ extern int init_fpu(struct task_struct *child); | |||
66 | : [err] "=r" (err) | 66 | : [err] "=r" (err) |
67 | 67 | ||
68 | /* | 68 | /* |
69 | * This function is called only during boot time when x86 caps are not set | ||
70 | * up and alternative can not be used yet. | ||
71 | */ | ||
72 | static int xsave_state_booting(struct xsave_struct *fx, u64 mask) | ||
73 | { | ||
74 | u32 lmask = mask; | ||
75 | u32 hmask = mask >> 32; | ||
76 | int err = 0; | ||
77 | |||
78 | WARN_ON(system_state != SYSTEM_BOOTING); | ||
79 | |||
80 | if (boot_cpu_has(X86_FEATURE_XSAVES)) | ||
81 | asm volatile("1:"XSAVES"\n\t" | ||
82 | "2:\n\t" | ||
83 | : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | ||
84 | : "memory"); | ||
85 | else | ||
86 | asm volatile("1:"XSAVE"\n\t" | ||
87 | "2:\n\t" | ||
88 | : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | ||
89 | : "memory"); | ||
90 | |||
91 | asm volatile(xstate_fault | ||
92 | : "0" (0) | ||
93 | : "memory"); | ||
94 | |||
95 | return err; | ||
96 | } | ||
97 | |||
98 | /* | ||
99 | * This function is called only during boot time when x86 caps are not set | ||
100 | * up and alternative can not be used yet. | ||
101 | */ | ||
102 | static inline int xrstor_state_booting(struct xsave_struct *fx, u64 mask) | ||
103 | { | ||
104 | u32 lmask = mask; | ||
105 | u32 hmask = mask >> 32; | ||
106 | int err = 0; | ||
107 | |||
108 | WARN_ON(system_state != SYSTEM_BOOTING); | ||
109 | |||
110 | if (boot_cpu_has(X86_FEATURE_XSAVES)) | ||
111 | asm volatile("1:"XRSTORS"\n\t" | ||
112 | "2:\n\t" | ||
113 | : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | ||
114 | : "memory"); | ||
115 | else | ||
116 | asm volatile("1:"XRSTOR"\n\t" | ||
117 | "2:\n\t" | ||
118 | : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | ||
119 | : "memory"); | ||
120 | |||
121 | asm volatile(xstate_fault | ||
122 | : "0" (0) | ||
123 | : "memory"); | ||
124 | |||
125 | return err; | ||
126 | } | ||
127 | |||
128 | /* | ||
69 | * Save processor xstate to xsave area. | 129 | * Save processor xstate to xsave area. |
70 | */ | 130 | */ |
71 | static inline int xsave_state(struct xsave_struct *fx, u64 mask) | 131 | static inline int xsave_state(struct xsave_struct *fx, u64 mask) |