e293be
diff -up ./arch/x86/include/asm/mshyperv.h.retp ./arch/x86/include/asm/mshyperv.h
e293be
--- ./arch/x86/include/asm/mshyperv.h.retp	2018-03-22 06:40:12.000000000 +0900
e293be
+++ ./arch/x86/include/asm/mshyperv.h	2018-04-21 01:29:24.000000000 +0900
e293be
@@ -200,13 +200,13 @@ static inline u64 hv_do_hypercall(u64 co
e293be
 	if (!hv_hypercall_pg)
e293be
 		return U64_MAX;
e293be
 
e293be
-	__asm__ __volatile__(CALL_NOSPEC
e293be
+	__asm__ __volatile__(CALL_NOSPEC_FULL
e293be
 			     : "=A" (hv_status),
e293be
 			       "+c" (input_address_lo), "+r" (__sp)
e293be
 			     : "A" (control),
e293be
 			       "b" (input_address_hi),
e293be
 			       "D"(output_address_hi), "S"(output_address_lo),
e293be
-			       THUNK_TARGET(hv_hypercall_pg)
e293be
+			       THUNK_TARGET_FULL(hv_hypercall_pg)
e293be
 			     : "cc", "memory");
e293be
 #endif /* !x86_64 */
e293be
 	return hv_status;
e293be
diff -up ./arch/x86/include/asm/nospec-branch.h.retp ./arch/x86/include/asm/nospec-branch.h
e293be
--- ./arch/x86/include/asm/nospec-branch.h.retp	2018-03-22 06:40:12.000000000 +0900
e293be
+++ ./arch/x86/include/asm/nospec-branch.h	2018-04-21 01:27:33.000000000 +0900
e293be
@@ -160,6 +160,67 @@
e293be
 	"call __x86_indirect_thunk_%V[thunk_target]\n"
e293be
 #define THUNK_TARGET(addr) [thunk_target] "r" (addr)
e293be
 
e293be
+#elif defined(CONFIG_X86_32) && defined(CONFIG_RETPOLINE)
e293be
+/*
e293be
+ * Redefinition of STATIC_JUMP in arch/x86/include/asm/jump_label.h
e293be
+ * as inline asm code.
e293be
+ */
e293be
+# define STATIC_JUMP(target, key) \
e293be
+	"911: .byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"	\
e293be
+	".pushsection __jump_table, \"aw\" \n\t"		\
e293be
+	_ASM_ALIGN "\n\t"					\
e293be
+	_ASM_PTR "911b, " target ", " #key "\n\t" /*jump_entry*/\
e293be
+	".popsection\n"
e293be
+/*
e293be
+ * For i386 we use the original ret-equivalent retpoline, because
e293be
+ * otherwise we'll run out of registers. We don't care about CET
e293be
+ * here, anyway.
e293be
+ */
e293be
+# define CALL_NOSPEC STATIC_JUMP("912f", retp_enabled_key)	\
e293be
+	"	call *%[thunk_target]\n"			\
e293be
+	"	jmp    913f\n"					\
e293be
+	"912:	\n"						\
e293be
+	"       jmp    904f;\n"					\
e293be
+	"       .align 16\n"					\
e293be
+	"901:	call   903f;\n"					\
e293be
+	"902:	pause;\n"					\
e293be
+	"    	lfence;\n"					\
e293be
+	"       jmp    902b;\n"					\
e293be
+	"       .align 16\n"					\
e293be
+	"903:	addl   $4, %%esp;\n"				\
e293be
+	"       pushl  %[thunk_target];\n"			\
e293be
+	"       ret;\n"						\
e293be
+	"       .align 16\n"					\
e293be
+	"904:	call   901b;\n"					\
e293be
+	"913:	\n"					
e293be
+
e293be
+# define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
e293be
+/*
e293be
+ * CALL_NOSPEC doesn't work if [thunk_target] was *(%esp),
e293be
+ * when all registers except %ebp is used up, as in
e293be
+ * drivers/hv/hv.c:hv_do_hypercall().
e293be
+ */
e293be
+# define CALL_NOSPEC_FULL STATIC_JUMP("912f", retp_enabled_key)	\
e293be
+	"	call *%[thunk_target]\n"			\
e293be
+	"	jmp    913f\n"					\
e293be
+	"912:	\n"						\
e293be
+	"	pushl  %[thunk_target];\n"			\
e293be
+	"       jmp    904f;\n"					\
e293be
+	"       .align 16\n"					\
e293be
+	"901:	call   903f;\n"					\
e293be
+	"902:	pause;\n"					\
e293be
+	"    	lfence;\n"					\
e293be
+	"       jmp    902b;\n"					\
e293be
+	"       .align 16\n"					\
e293be
+	"903:	addl   $4, %%esp;\n"				\
e293be
+	"       pushl  4(%%esp);\n"				\
e293be
+	"       ret;\n"						\
e293be
+	"       .align 16\n"					\
e293be
+	"904:	call   901b;\n"					\
e293be
+	"	addl   $4, %%esp;\n"				\
e293be
+	"913:	\n"					
e293be
+
e293be
+# define THUNK_TARGET_FULL(addr) [thunk_target] "rm" (addr)
e293be
 #else /* No retpoline for C / inline asm */
e293be
 # define CALL_NOSPEC "call *%[thunk_target]\n"
e293be
 # define THUNK_TARGET(addr) [thunk_target] "rm" (addr)
e293be
diff -up ./arch/x86/kernel/i386_ksyms_32.c.retp ./arch/x86/kernel/i386_ksyms_32.c
e293be
--- ./arch/x86/kernel/i386_ksyms_32.c.retp	2018-03-22 06:40:12.000000000 +0900
e293be
+++ ./arch/x86/kernel/i386_ksyms_32.c	2018-04-21 01:26:08.000000000 +0900
e293be
@@ -4,6 +4,7 @@
e293be
 #include <asm/pgtable.h>
e293be
 #include <asm/desc.h>
e293be
 #include <asm/ftrace.h>
e293be
+#include <asm/asm.h>
e293be
 
e293be
 #ifdef CONFIG_FUNCTION_TRACER
e293be
 /* mcount is defined in assembly */
e293be
@@ -37,3 +38,17 @@ EXPORT_SYMBOL(strstr);
e293be
 
e293be
 EXPORT_SYMBOL(csum_partial);
e293be
 EXPORT_SYMBOL(empty_zero_page);
e293be
+
e293be
+#ifdef CONFIG_RETPOLINE
e293be
+#define EXPORT_THUNK(reg)						\
e293be
+	extern void __x86_indirect_thunk_ ## reg(void);			\
e293be
+	EXPORT_SYMBOL(__x86_indirect_thunk_ ## reg)
e293be
+
e293be
+EXPORT_THUNK(eax);
e293be
+EXPORT_THUNK(ebx);
e293be
+EXPORT_THUNK(ecx);
e293be
+EXPORT_THUNK(edx);
e293be
+EXPORT_THUNK(esi);
e293be
+EXPORT_THUNK(edi);
e293be
+EXPORT_THUNK(ebp);
e293be
+#endif /* CONFIG_RETPOLINE */
e293be
diff -up ./drivers/hv/hv.c.retp ./drivers/hv/hv.c