Skip to content
  • Josh Poimboeuf's avatar
    x86/unwind: Add new unwind interface and implementations · 7c7900f8
    Josh Poimboeuf authored
    The x86 stack dump code is a bit of a mess.  dump_trace() uses
    callbacks, and each user of it seems to have slightly different
    requirements, so there are several slightly different callbacks floating
    around.
    
    Also there are some upcoming features which will need more changes to
    the stack dump code, including the printing of stack pt_regs, reliable
    stack detection for live patching, and a DWARF unwinder.  Each of those
    features would at least need more callbacks and/or callback interfaces,
    resulting in a much bigger mess than what we have today.
    
    Before doing all that, we should try to clean things up and replace
    dump_trace() with something cleaner and more flexible.
    
    The new unwinder is a simple state machine which was heavily inspired by
    a suggestion from Andy Lutomirski:
    
      https://lkml.kernel.org/r/CALCETrUbNTqaM2LRyXGRx=kVLRPeY5A3Pc6k4TtQxF320rUT=w@mail.gmail.com
    
    It's also similar to the libunwind API:
    
      http://www.nongnu.org/libunwind/man/libunwind(3).html
    
    
    
    Some if its advantages:
    
    - Simplicity: no more callback sprawl and less code duplication.
    
    - Flexibility: it allows the caller to stop and inspect the stack state
      at each step in the unwinding process.
    
    - Modularity: the unwinder code, console stack dump code, and stack
      metadata analysis code are all better separated so that changing one
      of them shouldn't have much of an impact on any of the others.
    
    Two implementations are added which conform to the new unwind interface:
    
    - The frame pointer unwinder which is used for CONFIG_FRAME_POINTER=y.
    
    - The "guess" unwinder which is used for CONFIG_FRAME_POINTER=n.  This
      isn't an "unwinder" per se.  All it does is scan the stack for kernel
      text addresses.  But with no frame pointers, guesses are better than
      nothing in most cases.
    
    Suggested-by: default avatarAndy Lutomirski <luto@amacapital.net>
    Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Byungchul Park <byungchul.park@lge.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Nilay Vaish <nilayvaish@gmail.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/6dc2f909c47533d213d0505f0a113e64585bec82.1474045023.git.jpoimboe@redhat.com
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    7c7900f8