summaryrefslogtreecommitdiffstats
path: root/arch/x86/include/asm
diff options
context:
space:
mode:
authorIngo Molnar2015-05-25 11:59:35 +0200
committerIngo Molnar2015-05-25 12:49:38 +0200
commit685c9616248c4f0d57e0d81d3236c80bdce1af46 (patch)
tree0d18add6677728299f34cd781206cb51d5591d45 /arch/x86/include/asm
parentx86/fpu: Improve xstate_fault() handling (diff)
downloadkernel-qcow2-linux-685c9616248c4f0d57e0d81d3236c80bdce1af46.tar.gz
kernel-qcow2-linux-685c9616248c4f0d57e0d81d3236c80bdce1af46.tar.xz
kernel-qcow2-linux-685c9616248c4f0d57e0d81d3236c80bdce1af46.zip
x86/fpu: Improve the initialization logic of 'err' around xstate_fault() constraints
There's a confusing aspect of how xstate_fault() constraints are handled by the FPU register/memory copying functions in fpu/internal.h: they use "0" (0) to signal that the asm code will not always set 'err' to a valid value. But 'err' is already initialized to 0 in C code, which is duplicated by the asm() constraint. Should the initialization value ever be changed, it might become subtly inconsistent with the not too clear asm() constraint. Use 'err' as the value of the input variable instead, to clarify this all. Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-kernel@vger.kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/x86/include/asm')
-rw-r--r--arch/x86/include/asm/fpu/internal.h12
1 files changed, 6 insertions, 6 deletions
diff --git a/arch/x86/include/asm/fpu/internal.h b/arch/x86/include/asm/fpu/internal.h
index 5370500d479e..1352d380bd46 100644
--- a/arch/x86/include/asm/fpu/internal.h
+++ b/arch/x86/include/asm/fpu/internal.h
@@ -316,7 +316,7 @@ static inline int copy_xregs_to_kernel(struct xregs_state *xstate)
"memory");
asm volatile("2:\n\t"
xstate_fault(err)
- : "0" (0)
+ : "0" (err)
: "memory");
return err;
@@ -327,9 +327,9 @@ static inline int copy_xregs_to_kernel(struct xregs_state *xstate)
*/
static inline int copy_kernel_to_xregs(struct xregs_state *xstate, u64 mask)
{
- int err = 0;
u32 lmask = mask;
u32 hmask = mask >> 32;
+ int err = 0;
/*
* Use xrstors to restore context if it is enabled. xrstors supports
@@ -344,7 +344,7 @@ static inline int copy_kernel_to_xregs(struct xregs_state *xstate, u64 mask)
asm volatile("2:\n"
xstate_fault(err)
- : "0" (0)
+ : "0" (err)
: "memory");
return err;
@@ -376,7 +376,7 @@ static inline int copy_xregs_to_user(struct xregs_state __user *buf)
"1:"XSAVE"\n"
"2: " ASM_CLAC "\n"
xstate_fault(err)
- : "D" (buf), "a" (-1), "d" (-1), "0" (0)
+ : "D" (buf), "a" (-1), "d" (-1), "0" (err)
: "memory");
return err;
}
@@ -386,16 +386,16 @@ static inline int copy_xregs_to_user(struct xregs_state __user *buf)
*/
static inline int copy_user_to_xregs(struct xregs_state __user *buf, u64 mask)
{
- int err = 0;
struct xregs_state *xstate = ((__force struct xregs_state *)buf);
u32 lmask = mask;
u32 hmask = mask >> 32;
+ int err = 0;
__asm__ __volatile__(ASM_STAC "\n"
"1:"XRSTOR"\n"
"2: " ASM_CLAC "\n"
xstate_fault(err)
- : "D" (xstate), "a" (lmask), "d" (hmask), "0" (0)
+ : "D" (xstate), "a" (lmask), "d" (hmask), "0" (err)
: "memory"); /* memory required? */
return err;
}