aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2015-07-23 15:14:40 -0400
committerIngo Molnar <mingo@kernel.org>2015-08-23 07:25:38 -0400
commit47edb65178cb7056c2eea0b6c41a7d8c84547192 (patch)
tree95da137a20496910117c2474018e2ac798bee6a7
parentb466bdb614823aaaa7188e85516177d2850f4782 (diff)
x86/asm/msr: Make wrmsrl() a function
As of cf991de2f614 ("x86/asm/msr: Make wrmsrl_safe() a function"), wrmsrl_safe is a function, but wrmsrl is still a macro. The wrmsrl macro performs invalid shifts if the value argument is 32 bits. This makes it unnecessarily awkward to write code that puts an unsigned long into an MSR. To make this work, syscall_init needs tweaking to stop passing a function pointer to wrmsrl. Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Willy Tarreau <w@1wt.eu> Link: http://lkml.kernel.org/r/690f0c629a1085d054e2d1ef3da073cfb3f7db92.1437678821.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/include/asm/msr.h6
-rw-r--r--arch/x86/include/asm/paravirt.h6
-rw-r--r--arch/x86/kernel/cpu/common.c6
3 files changed, 12 insertions, 6 deletions
diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h
index 54e9f088919d..77d8b284e4a7 100644
--- a/arch/x86/include/asm/msr.h
+++ b/arch/x86/include/asm/msr.h
@@ -188,8 +188,10 @@ static inline void wrmsr(unsigned msr, unsigned low, unsigned high)
188#define rdmsrl(msr, val) \ 188#define rdmsrl(msr, val) \
189 ((val) = native_read_msr((msr))) 189 ((val) = native_read_msr((msr)))
190 190
191#define wrmsrl(msr, val) \ 191static inline void wrmsrl(unsigned msr, u64 val)
192 native_write_msr((msr), (u32)((u64)(val)), (u32)((u64)(val) >> 32)) 192{
193 native_write_msr(msr, (u32)val, (u32)(val >> 32));
194}
193 195
194/* wrmsr with exception handling */ 196/* wrmsr with exception handling */
195static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high) 197static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index c2be0375bcad..10d0596433f8 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -153,7 +153,11 @@ do { \
153 val = paravirt_read_msr(msr, &_err); \ 153 val = paravirt_read_msr(msr, &_err); \
154} while (0) 154} while (0)
155 155
156#define wrmsrl(msr, val) wrmsr(msr, (u32)((u64)(val)), ((u64)(val))>>32) 156static inline void wrmsrl(unsigned msr, u64 val)
157{
158 wrmsr(msr, (u32)val, (u32)(val>>32));
159}
160
157#define wrmsr_safe(msr, a, b) paravirt_write_msr(msr, a, b) 161#define wrmsr_safe(msr, a, b) paravirt_write_msr(msr, a, b)
158 162
159/* rdmsr with exception handling */ 163/* rdmsr with exception handling */
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index cb9e5df42dd2..b128808853a2 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1185,10 +1185,10 @@ void syscall_init(void)
1185 * set CS/DS but only a 32bit target. LSTAR sets the 64bit rip. 1185 * set CS/DS but only a 32bit target. LSTAR sets the 64bit rip.
1186 */ 1186 */
1187 wrmsrl(MSR_STAR, ((u64)__USER32_CS)<<48 | ((u64)__KERNEL_CS)<<32); 1187 wrmsrl(MSR_STAR, ((u64)__USER32_CS)<<48 | ((u64)__KERNEL_CS)<<32);
1188 wrmsrl(MSR_LSTAR, entry_SYSCALL_64); 1188 wrmsrl(MSR_LSTAR, (unsigned long)entry_SYSCALL_64);
1189 1189
1190#ifdef CONFIG_IA32_EMULATION 1190#ifdef CONFIG_IA32_EMULATION
1191 wrmsrl(MSR_CSTAR, entry_SYSCALL_compat); 1191 wrmsrl(MSR_CSTAR, (unsigned long)entry_SYSCALL_compat);
1192 /* 1192 /*
1193 * This only works on Intel CPUs. 1193 * This only works on Intel CPUs.
1194 * On AMD CPUs these MSRs are 32-bit, CPU truncates MSR_IA32_SYSENTER_EIP. 1194 * On AMD CPUs these MSRs are 32-bit, CPU truncates MSR_IA32_SYSENTER_EIP.
@@ -1199,7 +1199,7 @@ void syscall_init(void)
1199 wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL); 1199 wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL);
1200 wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)entry_SYSENTER_compat); 1200 wrmsrl_safe(MSR_IA32_SYSENTER_EIP, (u64)entry_SYSENTER_compat);
1201#else 1201#else
1202 wrmsrl(MSR_CSTAR, ignore_sysret); 1202 wrmsrl(MSR_CSTAR, (unsigned long)ignore_sysret);
1203 wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)GDT_ENTRY_INVALID_SEG); 1203 wrmsrl_safe(MSR_IA32_SYSENTER_CS, (u64)GDT_ENTRY_INVALID_SEG);
1204 wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL); 1204 wrmsrl_safe(MSR_IA32_SYSENTER_ESP, 0ULL);
1205 wrmsrl_safe(MSR_IA32_SYSENTER_EIP, 0ULL); 1205 wrmsrl_safe(MSR_IA32_SYSENTER_EIP, 0ULL);