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) |
