• Josh Poimboeuf's avatar
    x86/unwind: Adjust last frame check for aligned function stacks · 8023e0e2
    Josh Poimboeuf authored
    Somehow, CONFIG_PARAVIRT=n convinces gcc to change the
    x86_64_start_kernel() prologue from:
    
      0000000000000129 <x86_64_start_kernel>:
       129:	55                   	push   %rbp
       12a:	48 89 e5             	mov    %rsp,%rbp
    
    to:
    
      0000000000000124 <x86_64_start_kernel>:
       124:	4c 8d 54 24 08       	lea    0x8(%rsp),%r10
       129:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp
       12d:	41 ff 72 f8          	pushq  -0x8(%r10)
       131:	55                   	push   %rbp
       132:	48 89 e5             	mov    %rsp,%rbp
    
    This is an unusual pattern which aligns rsp (though in this case it's
    already aligned) and saves the start_cpu() return address again on the
    stack before storing the frame pointer.
    
    The unwinder assumes the last stack frame header is at a certain offset,
    but the above code breaks that assumption, resulting in the following
    warning:
    
      WARNING: kernel stack frame pointer at ffffffff82e03f40 in swapper:0 has bad value           (null)
    
    Fix it by checking for the last task stack frame at the aligned offset
    in addition to the normal unaligned offset.
    
    Fixes: acb4608a ("x86/unwind: Create stack frames for saved syscall registers")
    Reported-by: default avatarBorislav Petkov <bp@alien8.de>
    Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Link: http://lkml.kernel.org/r/9d7b4eb8cf55a7d6002cb738f25c23e7429c99a0.1481904011.git.jpoimboe@redhat.comSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    8023e0e2
unwind_frame.c 6.42 KB