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 0bcdb12..f5e2eb1 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 6ac7ff3..b33abdd 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