Commit 08970fc4e0385790a7b093adfaa4165a189f9eb0
1 parent
9ea2b82ed6
Exists in
master
and in
7 other branches
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 | } |