diff options
author | Borislav Petkov <bp@suse.de> | 2013-04-08 11:57:45 -0400 |
---|---|---|
committer | Borislav Petkov <bp@suse.de> | 2013-04-16 05:50:51 -0400 |
commit | 682469a5db6fade318a72406935b5000186e5643 (patch) | |
tree | 0578a2dd19ecf2f3349905ddb5b69991fe3e6d72 | |
parent | 55a36b65ee7107d6bb557c96fd202c4e90164542 (diff) |
x86, AMD: Correct {rd,wr}msr_amd_safe warnings
The idea with those routines is to slowly phase them out and not call
them on anything else besides K8. They even have a check for that which,
when called too early, fails. Let me explain:
It gets the cpuinfo_x86 pointer from the per_cpu array and when this
happens for cpu0, before its boot_cpu_data has been copied back to the
per_cpu array in smp_store_boot_cpu_info(), we get an empty struct and
thus the check fails.
Use boot_cpu_data directly instead.
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/1365436666-9837-4-git-send-email-bp@alien8.de
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
-rw-r--r-- | arch/x86/kernel/cpu/amd.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 9a2a71669c5d..cea02d703bca 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
@@ -20,11 +20,11 @@ | |||
20 | 20 | ||
21 | static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p) | 21 | static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p) |
22 | { | 22 | { |
23 | struct cpuinfo_x86 *c = &cpu_data(smp_processor_id()); | ||
24 | u32 gprs[8] = { 0 }; | 23 | u32 gprs[8] = { 0 }; |
25 | int err; | 24 | int err; |
26 | 25 | ||
27 | WARN_ONCE((c->x86 != 0xf), "%s should only be used on K8!\n", __func__); | 26 | WARN_ONCE((boot_cpu_data.x86 != 0xf), |
27 | "%s should only be used on K8!\n", __func__); | ||
28 | 28 | ||
29 | gprs[1] = msr; | 29 | gprs[1] = msr; |
30 | gprs[7] = 0x9c5a203a; | 30 | gprs[7] = 0x9c5a203a; |
@@ -38,10 +38,10 @@ static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p) | |||
38 | 38 | ||
39 | static inline int wrmsrl_amd_safe(unsigned msr, unsigned long long val) | 39 | static inline int wrmsrl_amd_safe(unsigned msr, unsigned long long val) |
40 | { | 40 | { |
41 | struct cpuinfo_x86 *c = &cpu_data(smp_processor_id()); | ||
42 | u32 gprs[8] = { 0 }; | 41 | u32 gprs[8] = { 0 }; |
43 | 42 | ||
44 | WARN_ONCE((c->x86 != 0xf), "%s should only be used on K8!\n", __func__); | 43 | WARN_ONCE((boot_cpu_data.x86 != 0xf), |
44 | "%s should only be used on K8!\n", __func__); | ||
45 | 45 | ||
46 | gprs[0] = (u32)val; | 46 | gprs[0] = (u32)val; |
47 | gprs[1] = msr; | 47 | gprs[1] = msr; |