aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/xsave.h60
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 */
72static 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 */
102static 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 */
71static inline int xsave_state(struct xsave_struct *fx, u64 mask) 131static inline int xsave_state(struct xsave_struct *fx, u64 mask)