x86-64, asm: Use fxsaveq/fxrestorq in more places

Checkin d7acb92fea932ad2e7846480aeacddc2c03c8485 made use of fxsaveq
in fpu_fxsave() if the assembler supports it; this adds
fxsaveq/fxrstorq to fxrstor_checking() and fxsave_user() as well.

Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
LKML-Reference: <AANLkTi=RKyHLNTq6iomZOXkc6Zw1j9iAgsq8388XmzwN@mail.gmail.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>

+24
+24
arch/x86/include/asm/i387.h
··· 93 93 int err; 94 94 95 95 /* See comment in fxsave() below. */ 96 + #ifdef CONFIG_AS_FXSAVEQ 97 + asm volatile("1: fxrstorq %[fx]\n\t" 98 + "2:\n" 99 + ".section .fixup,\"ax\"\n" 100 + "3: movl $-1,%[err]\n" 101 + " jmp 2b\n" 102 + ".previous\n" 103 + _ASM_EXTABLE(1b, 3b) 104 + : [err] "=r" (err) 105 + : [fx] "m" (*fx), "0" (0)); 106 + #else 96 107 asm volatile("1: rex64/fxrstor (%[fx])\n\t" 97 108 "2:\n" 98 109 ".section .fixup,\"ax\"\n" ··· 113 102 _ASM_EXTABLE(1b, 3b) 114 103 : [err] "=r" (err) 115 104 : [fx] "R" (fx), "m" (*fx), "0" (0)); 105 + #endif 116 106 return err; 117 107 } 118 108 ··· 131 119 return -EFAULT; 132 120 133 121 /* See comment in fxsave() below. */ 122 + #ifdef CONFIG_AS_FXSAVEQ 123 + asm volatile("1: fxsaveq %[fx]\n\t" 124 + "2:\n" 125 + ".section .fixup,\"ax\"\n" 126 + "3: movl $-1,%[err]\n" 127 + " jmp 2b\n" 128 + ".previous\n" 129 + _ASM_EXTABLE(1b, 3b) 130 + : [err] "=r" (err), [fx] "=m" (*fx) 131 + : "0" (0)); 132 + #else 134 133 asm volatile("1: rex64/fxsave (%[fx])\n\t" 135 134 "2:\n" 136 135 ".section .fixup,\"ax\"\n" ··· 151 128 _ASM_EXTABLE(1b, 3b) 152 129 : [err] "=r" (err), "=m" (*fx) 153 130 : [fx] "R" (fx), "0" (0)); 131 + #endif 154 132 if (unlikely(err) && 155 133 __clear_user(fx, sizeof(struct i387_fxsave_struct))) 156 134 err = -EFAULT;