• Peter Zijlstra's avatar
    objtool: Fix sibling call detection · 54262aa2
    Peter Zijlstra authored
    It turned out that we failed to detect some sibling calls;
    specifically those without relocation records; like:
    
      $ ./objdump-func.sh defconfig-build/mm/kasan/generic.o __asan_loadN
      0000 0000000000000840 <__asan_loadN>:
      0000  840:      48 8b 0c 24             mov    (%rsp),%rcx
      0004  844:      31 d2                   xor    %edx,%edx
      0006  846:      e9 45 fe ff ff          jmpq   690 <check_memory_region>
    
    So extend the cross-function jump to also consider those that are not
    between known (or newly detected) parent/child functions, as
    sibling-cals when they jump to the start of the function.
    
    The second part of that condition is to deal with random jumps to the
    middle of other function, as can be found in
    arch/x86/lib/copy_user_64.S for example.
    
    This then (with later patches applied) makes the above recognise the
    sibling call:
    
      mm/kasan/generic.o: warning: objtool: __asan_loadN()+0x6: call to check_memory_region() with UACCESS enabled
    
    Also make sure to set insn->call_dest for sibling calls so we can know
    who we're calling. This is useful information when printing validation
    warnings later.
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    54262aa2
check.c 53.7 KB