Commit 08970fc4e0385790a7b093adfaa4165a189f9eb0

Authored by H. Peter Anvin
1 parent 9ea2b82ed6

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>

Showing 1 changed file with 8 additions and 8 deletions Side-by-side Diff

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