diff options
author | Suresh Siddha <suresh.b.siddha@intel.com> | 2008-07-29 13:29:23 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-30 13:49:26 -0400 |
commit | 9dc89c0f96a6ce6a1b7f9a47dd8bf6f17e2002c9 (patch) | |
tree | c5f2c57c241d040585d307acd13375fbd3f74dfe /include/asm-x86/xsave.h | |
parent | ab5137015fed9b948fe835a2d99a4cfbd50a0c40 (diff) |
x86, xsave: xsave/xrstor specific routines
Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/asm-x86/xsave.h')
-rw-r--r-- | include/asm-x86/xsave.h | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/include/asm-x86/xsave.h b/include/asm-x86/xsave.h index e835a917ee19..b716511aede2 100644 --- a/include/asm-x86/xsave.h +++ b/include/asm-x86/xsave.h | |||
@@ -48,6 +48,58 @@ static inline int xrstor_checking(struct xsave_struct *fx) | |||
48 | return err; | 48 | return err; |
49 | } | 49 | } |
50 | 50 | ||
51 | static inline int xsave_check(struct xsave_struct __user *buf) | ||
52 | { | ||
53 | int err; | ||
54 | __asm__ __volatile__("1: .byte " REX_PREFIX "0x0f,0xae,0x27\n" | ||
55 | "2:\n" | ||
56 | ".section .fixup,\"ax\"\n" | ||
57 | "3: movl $-1,%[err]\n" | ||
58 | " jmp 2b\n" | ||
59 | ".previous\n" | ||
60 | ".section __ex_table,\"a\"\n" | ||
61 | _ASM_ALIGN "\n" | ||
62 | _ASM_PTR "1b,3b\n" | ||
63 | ".previous" | ||
64 | : [err] "=r" (err) | ||
65 | : "D" (buf), "a" (-1), "d" (-1), "0" (0) | ||
66 | : "memory"); | ||
67 | if (unlikely(err) && __clear_user(buf, xstate_size)) | ||
68 | err = -EFAULT; | ||
69 | /* No need to clear here because the caller clears USED_MATH */ | ||
70 | return err; | ||
71 | } | ||
72 | |||
73 | static inline int xrestore_user(struct xsave_struct __user *buf, | ||
74 | unsigned int lmask, | ||
75 | unsigned int hmask) | ||
76 | { | ||
77 | int err; | ||
78 | struct xsave_struct *xstate = ((__force struct xsave_struct *)buf); | ||
79 | |||
80 | __asm__ __volatile__("1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n" | ||
81 | "2:\n" | ||
82 | ".section .fixup,\"ax\"\n" | ||
83 | "3: movl $-1,%[err]\n" | ||
84 | " jmp 2b\n" | ||
85 | ".previous\n" | ||
86 | ".section __ex_table,\"a\"\n" | ||
87 | _ASM_ALIGN "\n" | ||
88 | _ASM_PTR "1b,3b\n" | ||
89 | ".previous" | ||
90 | : [err] "=r" (err) | ||
91 | : "D" (xstate), "a" (lmask), "d" (hmask), "0" (0) | ||
92 | : "memory"); /* memory required? */ | ||
93 | return err; | ||
94 | } | ||
95 | |||
96 | static inline void xrstor_state(struct xsave_struct *fx, int lmask, int hmask) | ||
97 | { | ||
98 | asm volatile(".byte " REX_PREFIX "0x0f,0xae,0x2f\n\t" | ||
99 | : : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask) | ||
100 | : "memory"); | ||
101 | } | ||
102 | |||
51 | static inline void xsave(struct task_struct *tsk) | 103 | static inline void xsave(struct task_struct *tsk) |
52 | { | 104 | { |
53 | /* This, however, we can work around by forcing the compiler to select | 105 | /* This, however, we can work around by forcing the compiler to select |