diff options
author | David Woodhouse <dwmw@amazon.co.uk> | 2018-01-11 16:46:30 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2018-01-11 18:14:30 -0500 |
commit | e70e5892b28c18f517f29ab6e83bd57705104b31 (patch) | |
tree | afb7a5d9d717c5d9897a5b8e1a0b5d312ab88bc2 | |
parent | 9351803bd803cdbeb9b5a7850b7b6f464806e3db (diff) |
x86/retpoline/hyperv: Convert assembler indirect jumps
Convert all indirect jumps in hyperv inline asm code to use non-speculative
sequences when CONFIG_RETPOLINE is enabled.
Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Arjan van de Ven <arjan@linux.intel.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Cc: gnomes@lxorguk.ukuu.org.uk
Cc: Rik van Riel <riel@redhat.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: thomas.lendacky@amd.com
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Jiri Kosina <jikos@kernel.org>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Kees Cook <keescook@google.com>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Greg Kroah-Hartman <gregkh@linux-foundation.org>
Cc: Paul Turner <pjt@google.com>
Link: https://lkml.kernel.org/r/1515707194-20531-9-git-send-email-dwmw@amazon.co.uk
-rw-r--r-- | arch/x86/include/asm/mshyperv.h | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h index 581bb54dd464..5119e4b555cc 100644 --- a/arch/x86/include/asm/mshyperv.h +++ b/arch/x86/include/asm/mshyperv.h | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/nmi.h> | 7 | #include <linux/nmi.h> |
8 | #include <asm/io.h> | 8 | #include <asm/io.h> |
9 | #include <asm/hyperv.h> | 9 | #include <asm/hyperv.h> |
10 | #include <asm/nospec-branch.h> | ||
10 | 11 | ||
11 | /* | 12 | /* |
12 | * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent | 13 | * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent |
@@ -186,10 +187,11 @@ static inline u64 hv_do_hypercall(u64 control, void *input, void *output) | |||
186 | return U64_MAX; | 187 | return U64_MAX; |
187 | 188 | ||
188 | __asm__ __volatile__("mov %4, %%r8\n" | 189 | __asm__ __volatile__("mov %4, %%r8\n" |
189 | "call *%5" | 190 | CALL_NOSPEC |
190 | : "=a" (hv_status), ASM_CALL_CONSTRAINT, | 191 | : "=a" (hv_status), ASM_CALL_CONSTRAINT, |
191 | "+c" (control), "+d" (input_address) | 192 | "+c" (control), "+d" (input_address) |
192 | : "r" (output_address), "m" (hv_hypercall_pg) | 193 | : "r" (output_address), |
194 | THUNK_TARGET(hv_hypercall_pg) | ||
193 | : "cc", "memory", "r8", "r9", "r10", "r11"); | 195 | : "cc", "memory", "r8", "r9", "r10", "r11"); |
194 | #else | 196 | #else |
195 | u32 input_address_hi = upper_32_bits(input_address); | 197 | u32 input_address_hi = upper_32_bits(input_address); |
@@ -200,13 +202,13 @@ static inline u64 hv_do_hypercall(u64 control, void *input, void *output) | |||
200 | if (!hv_hypercall_pg) | 202 | if (!hv_hypercall_pg) |
201 | return U64_MAX; | 203 | return U64_MAX; |
202 | 204 | ||
203 | __asm__ __volatile__("call *%7" | 205 | __asm__ __volatile__(CALL_NOSPEC |
204 | : "=A" (hv_status), | 206 | : "=A" (hv_status), |
205 | "+c" (input_address_lo), ASM_CALL_CONSTRAINT | 207 | "+c" (input_address_lo), ASM_CALL_CONSTRAINT |
206 | : "A" (control), | 208 | : "A" (control), |
207 | "b" (input_address_hi), | 209 | "b" (input_address_hi), |
208 | "D"(output_address_hi), "S"(output_address_lo), | 210 | "D"(output_address_hi), "S"(output_address_lo), |
209 | "m" (hv_hypercall_pg) | 211 | THUNK_TARGET(hv_hypercall_pg) |
210 | : "cc", "memory"); | 212 | : "cc", "memory"); |
211 | #endif /* !x86_64 */ | 213 | #endif /* !x86_64 */ |
212 | return hv_status; | 214 | return hv_status; |
@@ -227,10 +229,10 @@ static inline u64 hv_do_fast_hypercall8(u16 code, u64 input1) | |||
227 | 229 | ||
228 | #ifdef CONFIG_X86_64 | 230 | #ifdef CONFIG_X86_64 |
229 | { | 231 | { |
230 | __asm__ __volatile__("call *%4" | 232 | __asm__ __volatile__(CALL_NOSPEC |
231 | : "=a" (hv_status), ASM_CALL_CONSTRAINT, | 233 | : "=a" (hv_status), ASM_CALL_CONSTRAINT, |
232 | "+c" (control), "+d" (input1) | 234 | "+c" (control), "+d" (input1) |
233 | : "m" (hv_hypercall_pg) | 235 | : THUNK_TARGET(hv_hypercall_pg) |
234 | : "cc", "r8", "r9", "r10", "r11"); | 236 | : "cc", "r8", "r9", "r10", "r11"); |
235 | } | 237 | } |
236 | #else | 238 | #else |
@@ -238,13 +240,13 @@ static inline u64 hv_do_fast_hypercall8(u16 code, u64 input1) | |||
238 | u32 input1_hi = upper_32_bits(input1); | 240 | u32 input1_hi = upper_32_bits(input1); |
239 | u32 input1_lo = lower_32_bits(input1); | 241 | u32 input1_lo = lower_32_bits(input1); |
240 | 242 | ||
241 | __asm__ __volatile__ ("call *%5" | 243 | __asm__ __volatile__ (CALL_NOSPEC |
242 | : "=A"(hv_status), | 244 | : "=A"(hv_status), |
243 | "+c"(input1_lo), | 245 | "+c"(input1_lo), |
244 | ASM_CALL_CONSTRAINT | 246 | ASM_CALL_CONSTRAINT |
245 | : "A" (control), | 247 | : "A" (control), |
246 | "b" (input1_hi), | 248 | "b" (input1_hi), |
247 | "m" (hv_hypercall_pg) | 249 | THUNK_TARGET(hv_hypercall_pg) |
248 | : "cc", "edi", "esi"); | 250 | : "cc", "edi", "esi"); |
249 | } | 251 | } |
250 | #endif | 252 | #endif |