• Peter Zijlstra's avatar
    x86: Annotate call_on_stack() · be007595
    Peter Zijlstra authored
    vmlinux.o: warning: objtool: page_fault_oops()+0x13c: unreachable instruction
    
    0000 000000000005b460 <page_fault_oops>:
    ...
    0128    5b588:  49 89 23                mov    %rsp,(%r11)
    012b    5b58b:  4c 89 dc                mov    %r11,%rsp
    012e    5b58e:  4c 89 f2                mov    %r14,%rdx
    0131    5b591:  48 89 ee                mov    %rbp,%rsi
    0134    5b594:  4c 89 e7                mov    %r12,%rdi
    0137    5b597:  e8 00 00 00 00          call   5b59c <page_fault_oops+0x13c>    5b598: R_X86_64_PLT32   handle_stack_overflow-0x4
    013c    5b59c:  5c                      pop    %rsp
    
    vmlinux.o: warning: objtool: sysvec_reboot()+0x6d: unreachable instruction
    
    0000 00000000000033f0 <sysvec_reboot>:
    ...
    005d     344d:  4c 89 dc                mov    %r11,%rsp
    0060     3450:  e8 00 00 00 00          call   3455 <sysvec_reboot+0x65>        3451: R_X86_64_PLT32    irq_enter_rcu-0x4
    0065     3455:  48 89 ef                mov    %rbp,%rdi
    0068     3458:  e8 00 00 00 00          call   345d <sysvec_reboot+0x6d>        3459: R_X86_64_PC32     .text+0x47d0c
    006d     345d:  e8 00 00 00 00          call   3462 <sysvec_reboot+0x72>        345e: R_X86_64_PLT32    irq_exit_rcu-0x4
    0072     3462:  5c                      pop    %rsp
    
    Both cases are due to a call_on_stack() calling a __noreturn function.
    Since that's an inline asm, GCC can't do anything about the
    instructions after the CALL. Therefore put in an explicit
    ASM_REACHABLE annotation to make sure objtool and gcc are consistently
    confused about control flow.
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Link: https://lore.kernel.org/r/20220308154319.468805622@infradead.org
    be007595
irq_stack.h 7.39 KB