Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 112777
b: refs/heads/master
c: 9dc89c0
h: refs/heads/master
i:
  112775: ff3618a
v: v3
  • Loading branch information
Suresh Siddha authored and Ingo Molnar committed Jul 30, 2008
1 parent 01e284c commit 3916808
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ab5137015fed9b948fe835a2d99a4cfbd50a0c40
refs/heads/master: 9dc89c0f96a6ce6a1b7f9a47dd8bf6f17e2002c9
52 changes: 52 additions & 0 deletions trunk/include/asm-x86/xsave.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,58 @@ static inline int xrstor_checking(struct xsave_struct *fx)
return err;
}

static inline int xsave_check(struct xsave_struct __user *buf)
{
int err;
__asm__ __volatile__("1: .byte " REX_PREFIX "0x0f,0xae,0x27\n"
"2:\n"
".section .fixup,\"ax\"\n"
"3: movl $-1,%[err]\n"
" jmp 2b\n"
".previous\n"
".section __ex_table,\"a\"\n"
_ASM_ALIGN "\n"
_ASM_PTR "1b,3b\n"
".previous"
: [err] "=r" (err)
: "D" (buf), "a" (-1), "d" (-1), "0" (0)
: "memory");
if (unlikely(err) && __clear_user(buf, xstate_size))
err = -EFAULT;
/* No need to clear here because the caller clears USED_MATH */
return err;
}

static inline int xrestore_user(struct xsave_struct __user *buf,
unsigned int lmask,
unsigned int hmask)
{
int err;
struct xsave_struct *xstate = ((__force struct xsave_struct *)buf);

__asm__ __volatile__("1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n"
"2:\n"
".section .fixup,\"ax\"\n"
"3: movl $-1,%[err]\n"
" jmp 2b\n"
".previous\n"
".section __ex_table,\"a\"\n"
_ASM_ALIGN "\n"
_ASM_PTR "1b,3b\n"
".previous"
: [err] "=r" (err)
: "D" (xstate), "a" (lmask), "d" (hmask), "0" (0)
: "memory"); /* memory required? */
return err;
}

static inline void xrstor_state(struct xsave_struct *fx, int lmask, int hmask)
{
asm volatile(".byte " REX_PREFIX "0x0f,0xae,0x2f\n\t"
: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
: "memory");
}

static inline void xsave(struct task_struct *tsk)
{
/* This, however, we can work around by forcing the compiler to select
Expand Down

0 comments on commit 3916808

Please sign in to comment.