x86: msr: fix bogus return values from rdmsr_safe/wrmsr_safe

Impact: bogus error codes (+other?) on x86-64

The rdmsr_safe/wrmsr_safe routines have macros for the handling of the
edx:eax arguments. Those macros take a variable number of assembly
arguments. This is rather inherently incompatible with using
%digit-style escapes in the inline assembly; replace those with
%[name]-style escapes.

This fixes miscompilation on x86-64, which at the very least caused
bogus return values. It is possible that this could also corrupt the
return value; I am not sure.

Signed-off-by: H. Peter Anvin <hpa@zytor.com>

+8 -8
+8 -8
include/asm-x86/msr.h
··· 52 { 53 DECLARE_ARGS(val, low, high); 54 55 - asm volatile("2: rdmsr ; xor %0,%0\n" 56 "1:\n\t" 57 ".section .fixup,\"ax\"\n\t" 58 - "3: mov %3,%0 ; jmp 1b\n\t" 59 ".previous\n\t" 60 _ASM_EXTABLE(2b, 3b) 61 - : "=r" (*err), EAX_EDX_RET(val, low, high) 62 - : "c" (msr), "i" (-EFAULT)); 63 return EAX_EDX_VAL(val, low, high); 64 } 65 ··· 73 unsigned low, unsigned high) 74 { 75 int err; 76 - asm volatile("2: wrmsr ; xor %0,%0\n" 77 "1:\n\t" 78 ".section .fixup,\"ax\"\n\t" 79 - "3: mov %4,%0 ; jmp 1b\n\t" 80 ".previous\n\t" 81 _ASM_EXTABLE(2b, 3b) 82 - : "=a" (err) 83 : "c" (msr), "0" (low), "d" (high), 84 - "i" (-EFAULT) 85 : "memory"); 86 return err; 87 }
··· 52 { 53 DECLARE_ARGS(val, low, high); 54 55 + asm volatile("2: rdmsr ; xor %[err],%[err]\n" 56 "1:\n\t" 57 ".section .fixup,\"ax\"\n\t" 58 + "3: mov %[fault],%[err] ; jmp 1b\n\t" 59 ".previous\n\t" 60 _ASM_EXTABLE(2b, 3b) 61 + : [err] "=r" (*err), EAX_EDX_RET(val, low, high) 62 + : "c" (msr), [fault] "i" (-EFAULT)); 63 return EAX_EDX_VAL(val, low, high); 64 } 65 ··· 73 unsigned low, unsigned high) 74 { 75 int err; 76 + asm volatile("2: wrmsr ; xor %[err],%[err]\n" 77 "1:\n\t" 78 ".section .fixup,\"ax\"\n\t" 79 + "3: mov %[fault],%[err] ; jmp 1b\n\t" 80 ".previous\n\t" 81 _ASM_EXTABLE(2b, 3b) 82 + : [err] "=a" (err) 83 : "c" (msr), "0" (low), "d" (high), 84 + [fault] "i" (-EFAULT) 85 : "memory"); 86 return err; 87 }