]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/vmwgfx: Add unwind hints around RBP clobber
authorJosh Poimboeuf <jpoimboe@kernel.org>
Mon, 5 Jun 2023 16:12:22 +0000 (09:12 -0700)
committerJosh Poimboeuf <jpoimboe@kernel.org>
Wed, 7 Jun 2023 17:03:12 +0000 (10:03 -0700)
VMware high-bandwidth hypercalls take the RBP register as input.  This
breaks basic frame pointer convention, as RBP should never be clobbered.

So frame pointer unwinding is broken for the instructions surrounding
the hypercalls.  Fortunately this doesn't break live patching with
CONFIG_FRAME_POINTER, as it only unwinds from blocking tasks, and stack
traces from preempted tasks are already marked unreliable anyway.

However, for live patching with ORC, this could actually be a
theoretical problem if vmw_port_hb_{in,out}() were still compiled with a
frame pointer due to having an aligned stack.  In practice that hasn't
seemed to be an issue since the objtool warnings have only been seen
with CONFIG_FRAME_POINTER.

Add unwind hint annotations to tell the ORC unwinder to mark stack
traces as unreliable.

Fixes the following warnings:

  vmlinux.o: warning: objtool: vmw_port_hb_in+0x1df: return with modified stack frame
  vmlinux.o: warning: objtool: vmw_port_hb_out+0x1dd: return with modified stack frame

Fixes: 89da76fde68d ("drm/vmwgfx: Add VMWare host messaging capability")
Reported-by: kernel test robot <lkp@intel.com>
Link: https://lore.kernel.org/oe-kbuild-all/202305160135.97q0Elax-lkp@intel.com/
Link: https://lore.kernel.org/r/4c795f2d87bc0391cf6543bcb224fa540b55ce4b.1685981486.git.jpoimboe@kernel.org
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
arch/x86/include/asm/unwind_hints.h
drivers/gpu/drm/vmwgfx/vmwgfx_msg_x86.h

index 01cb9692b160a0ae0e935f3117e618433035a93f..85cc57cb65392e197ef8e6cc79d812890004c386 100644 (file)
 
 #else
 
+#define UNWIND_HINT_UNDEFINED \
+       UNWIND_HINT(UNWIND_HINT_TYPE_UNDEFINED, 0, 0, 0)
+
 #define UNWIND_HINT_FUNC \
        UNWIND_HINT(UNWIND_HINT_TYPE_FUNC, ORC_REG_SP, 8, 0)
 
+#define UNWIND_HINT_SAVE \
+       UNWIND_HINT(UNWIND_HINT_TYPE_SAVE, 0, 0, 0)
+
+#define UNWIND_HINT_RESTORE \
+       UNWIND_HINT(UNWIND_HINT_TYPE_RESTORE, 0, 0, 0)
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* _ASM_X86_UNWIND_HINTS_H */
index 0b74ca2dfb7bd2fd55160836784f2172f551553f..23899d743a9035af7da6ddcc15a218004a25703c 100644 (file)
                         flags, magic, bp,              \
                         eax, ebx, ecx, edx, si, di)    \
 ({                                                     \
-        asm volatile ("push %%rbp;"                    \
+        asm volatile (                                 \
+               UNWIND_HINT_SAVE                        \
+               "push %%rbp;"                           \
+               UNWIND_HINT_UNDEFINED                   \
                 "mov %12, %%rbp;"                      \
                 VMWARE_HYPERCALL_HB_OUT                        \
-                "pop %%rbp;" :                         \
+                "pop %%rbp;"                           \
+               UNWIND_HINT_RESTORE :                   \
                 "=a"(eax),                             \
                 "=b"(ebx),                             \
                 "=c"(ecx),                             \
                        flags, magic, bp,               \
                        eax, ebx, ecx, edx, si, di)     \
 ({                                                     \
-        asm volatile ("push %%rbp;"                    \
+        asm volatile (                                 \
+               UNWIND_HINT_SAVE                        \
+               "push %%rbp;"                           \
+               UNWIND_HINT_UNDEFINED                   \
                 "mov %12, %%rbp;"                      \
                 VMWARE_HYPERCALL_HB_IN                 \
-                "pop %%rbp" :                          \
+                "pop %%rbp;"                           \
+               UNWIND_HINT_RESTORE :                   \
                 "=a"(eax),                             \
                 "=b"(ebx),                             \
                 "=c"(ecx),                             \