ftrace/x86: Tell objtool to ignore nondeterministic ftrace stack layout
authorJosh Poimboeuf <jpoimboe@redhat.com>
Fri, 8 Nov 2019 22:51:00 +0000 (16:51 -0600)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Wed, 13 Nov 2019 14:36:50 +0000 (09:36 -0500)
Objtool complains about the new ftrace direct trampoline code:

  arch/x86/kernel/ftrace_64.o: warning: objtool: ftrace_regs_caller()+0x190: stack state mismatch: cfa1=7+16 cfa2=7+24

Typically, code has a deterministic stack layout, such that at a given
instruction address, the stack frame size is always the same.

That's not the case for the new ftrace_regs_caller() code after it
adjusts the stack for the direct case.  Just plead ignorance and assume
it's always the non-direct path.  Note this creates a tiny window for
ORC to get confused.

Link: http://lkml.kernel.org/r/20191108225100.ea3bhsbdf6oerj6g@treble
Reported-by: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
arch/x86/include/asm/unwind_hints.h
arch/x86/kernel/ftrace_64.S

index 0bcdb127936178cf1d53d0b9bfcf616f585dfc43..f5e2eb12cb71e2d168c1bf525caf609e7dcf1d9a 100644 (file)
        UNWIND_HINT sp_offset=\sp_offset
 .endm
 
+.macro UNWIND_HINT_SAVE
+       UNWIND_HINT type=UNWIND_HINT_TYPE_SAVE
+.endm
+
+.macro UNWIND_HINT_RESTORE
+       UNWIND_HINT type=UNWIND_HINT_TYPE_RESTORE
+.endm
+
 #else /* !__ASSEMBLY__ */
 
 #define UNWIND_HINT(sp_reg, sp_offset, type, end)              \
index 6ac7ff3048864cc896c7018963a400059c4a9028..b33abdd0a2dbb51cec60fc6751371517aa185e03 100644 (file)
@@ -178,6 +178,8 @@ ENTRY(ftrace_regs_caller)
        /* Save the current flags before any operations that can change them */
        pushfq
 
+       UNWIND_HINT_SAVE
+
        /* added 8 bytes to save flags */
        save_mcount_regs 8
        /* save_mcount_regs fills in first two parameters */
@@ -250,8 +252,16 @@ GLOBAL(ftrace_regs_call)
 1:     restore_mcount_regs
 
 
+2:
+       /*
+        * The stack layout is nondetermistic here, depending on which path was
+        * taken.  This confuses objtool and ORC, rightfully so.  For now,
+        * pretend the stack always looks like the non-direct case.
+        */
+       UNWIND_HINT_RESTORE
+
        /* Restore flags */
-2:     popfq
+       popfq
 
        /*
         * As this jmp to ftrace_epilogue can be a short jump