From: Fenghua Yu <[email protected]>

Since cpu caps are not enabled yet during early booting time, alternative
can not be used in functions to access xsave area. Therefore, we define
two new functions xrstor_state_booting and xsave_state_booting to access
xsave area during early booting time.

Because xsave_state_booting() can be called by run-time function __save_fpu(),
it's not defined as __init and will stay in memory during running time. But
it's a small function and the memory cost is small.

Signed-off-by: Fenghua Yu <[email protected]>
---
 arch/x86/include/asm/xsave.h | 60 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h
index a8f31d0..0de695d 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);
                        : [err] "=r" (err)
 
 /*
+ * This function is called only during boot time when x86 caps are not set
+ * up and alternative can not be used yet.
+ */
+static void xsave_state_booting(struct xsave_struct *fx, u64 mask)
+{
+       u32 lmask = mask;
+       u32 hmask = mask >> 32;
+       int err = 0;
+
+       WARN_ON(system_state != SYSTEM_BOOTING);
+
+       if (boot_cpu_has(X86_FEATURE_XSAVES))
+               asm volatile("1:"XSAVES"\n\t"
+                       "2:\n\t"
+                       : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
+                       :   "memory");
+       else
+               asm volatile("1:"XSAVE"\n\t"
+                       "2:\n\t"
+                       : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
+                       :   "memory");
+
+       asm volatile(xstate_fault
+                    : "0" (0)
+                    : "memory");
+
+       return err;
+}
+
+/*
+ * This function is called only during boot time when x86 caps are not set
+ * up and alternative can not be used yet.
+ */
+static inline int xrstor_state_booting(struct xsave_struct *fx, u64 mask)
+{
+       u32 lmask = mask;
+       u32 hmask = mask >> 32;
+       int err = 0;
+
+       WARN_ON(system_state != SYSTEM_BOOTING);
+
+       if (boot_cpu_has(X86_FEATURE_XSAVES))
+               asm volatile("1:"XRSTORS"\n\t"
+                       "2:\n\t"
+                       : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
+                       :   "memory");
+       else
+               asm volatile("1:"XRSTOR"\n\t"
+                       "2:\n\t"
+                       : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
+                       :   "memory");
+
+       asm volatile(xstate_fault
+                    : "0" (0)
+                    : "memory");
+
+       return err;
+}
+
+/*
  * Save processor xstate to xsave area.
  */
 static inline void xsave_state(struct xsave_struct *fx, u64 mask)
-- 
1.8.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to