Merge tag 'mlx5-updates-2018-05-17' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / arch / x86 / include / asm / nospec-branch.h
index f928ad9b143fedea1085dedc508658fa745b4ceb..2f700a1db851ea3ad907a81a8b595dcba213d773 100644 (file)
@@ -291,16 +291,20 @@ do {                                                                      \
  *    lfence
  *    jmp spec_trap
  *  do_rop:
- *    mov %rax,(%rsp)
+ *    mov %rax,(%rsp) for x86_64
+ *    mov %edx,(%esp) for x86_32
  *    retq
  *
  * Without retpolines configured:
  *
- *    jmp *%rax
+ *    jmp *%rax for x86_64
+ *    jmp *%edx for x86_32
  */
 #ifdef CONFIG_RETPOLINE
-# define RETPOLINE_RAX_BPF_JIT_SIZE    17
-# define RETPOLINE_RAX_BPF_JIT()                               \
+# ifdef CONFIG_X86_64
+#  define RETPOLINE_RAX_BPF_JIT_SIZE   17
+#  define RETPOLINE_RAX_BPF_JIT()                              \
+do {                                                           \
        EMIT1_off32(0xE8, 7);    /* callq do_rop */             \
        /* spec_trap: */                                        \
        EMIT2(0xF3, 0x90);       /* pause */                    \
@@ -308,11 +312,30 @@ do {                                                                      \
        EMIT2(0xEB, 0xF9);       /* jmp spec_trap */            \
        /* do_rop: */                                           \
        EMIT4(0x48, 0x89, 0x04, 0x24); /* mov %rax,(%rsp) */    \
-       EMIT1(0xC3);             /* retq */
-#else
-# define RETPOLINE_RAX_BPF_JIT_SIZE    2
-# define RETPOLINE_RAX_BPF_JIT()                               \
-       EMIT2(0xFF, 0xE0);       /* jmp *%rax */
+       EMIT1(0xC3);             /* retq */                     \
+} while (0)
+# else /* !CONFIG_X86_64 */
+#  define RETPOLINE_EDX_BPF_JIT()                              \
+do {                                                           \
+       EMIT1_off32(0xE8, 7);    /* call do_rop */              \
+       /* spec_trap: */                                        \
+       EMIT2(0xF3, 0x90);       /* pause */                    \
+       EMIT3(0x0F, 0xAE, 0xE8); /* lfence */                   \
+       EMIT2(0xEB, 0xF9);       /* jmp spec_trap */            \
+       /* do_rop: */                                           \
+       EMIT3(0x89, 0x14, 0x24); /* mov %edx,(%esp) */          \
+       EMIT1(0xC3);             /* ret */                      \
+} while (0)
+# endif
+#else /* !CONFIG_RETPOLINE */
+# ifdef CONFIG_X86_64
+#  define RETPOLINE_RAX_BPF_JIT_SIZE   2
+#  define RETPOLINE_RAX_BPF_JIT()                              \
+       EMIT2(0xFF, 0xE0);       /* jmp *%rax */
+# else /* !CONFIG_X86_64 */
+#  define RETPOLINE_EDX_BPF_JIT()                              \
+       EMIT2(0xFF, 0xE2)        /* jmp *%edx */
+# endif
 #endif
 
 #endif /* _ASM_X86_NOSPEC_BRANCH_H_ */