• Ingo Molnar's avatar
    [PATCH] x86_64: stack unwinder crash fix · 0796bdb7
    Ingo Molnar authored
    the new dwarf2 unwinder crashes while trying to dump the stack:
    
      Leftover inexact backtrace:
    
      Unable to handle kernel paging request at ffffffff82800000 RIP:
       [<ffffffff8026cf26>] dump_trace+0x35b/0x3d2
      PGD 203027 PUD 205027 PMD 0
      Oops: 0000 [2] PREEMPT SMP
      CPU 0
      Modules linked in:
      Pid: 30, comm: khelper Not tainted 2.6.19-rc6-rt1 #11
      RIP: 0010:[<ffffffff8026cf26>]  [<ffffffff8026cf26>] dump_trace+0x35b/0x3d2
      RSP: 0000:ffff81003fb9d848  EFLAGS: 00010006
      RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
      RDX: 0000000000000000 RSI: ffffffff805b3520 RDI: 0000000000000000
      RBP: ffffffff827ffff9 R08: ffffffff80aad000 R09: 0000000000000005
      R10: ffffffff80aae000 R11: ffffffff8037961b R12: ffff81003fb9d858
      R13: 0000000000000000 R14: ffffffff80598460 R15: ffffffff80ab1fc0
      FS:  0000000000000000(0000) GS:ffffffff806c4200(0000) knlGS:0000000000000000
      CS:  0010 DS: 0018 ES: 0018 CR0: 000000008005003b
      CR2: ffffffff82800000 CR3: 0000000000201000 CR4: 00000000000006e0
    
    this crash happened because it did not sanitize the dwarf2 data it
    got, and got an unaligned stack pointer - which happily walked past
    the process stack (and eventually reached the end of kernel memory
    and pagefaulted there) due to this naive iteration condition:
    
            HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0);
    
    note that i386 is alot more conservative when it comes to trusting
    stack pointers:
    
      static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
      {
             return  p > (void *)tinfo &&
                     p < (void *)tinfo + THREAD_SIZE - 3;
      }
    
    but the x86_64 code did not take this bit of i386 code.
    
    The fix is to align the stack pointer.
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    Cc: Andi Kleen <ak@suse.de>
    Cc: Jan Beulich <jbeulich@novell.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Andrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    0796bdb7
traps.c 30.3 KB