05 Jun, 2018

5 commits

  • commit 0afd0d9e0e7879d666c1df2fa1bea4d8716909fe upstream.

    Objtool has some crude logic for detecting static "noreturn" functions
    (aka "dead ends"). This is necessary for being able to correctly follow
    GCC code flow when such functions are called.

    It's remotely possible for two functions to call each other via sibling
    calls. If they don't have RET instructions, objtool's noreturn
    detection logic goes into a recursive loop:

    drivers/char/ipmi/ipmi_ssif.o: warning: objtool: return_hosed_msg()+0x0: infinite recursion (objtool bug!)
    drivers/char/ipmi/ipmi_ssif.o: warning: objtool: deliver_recv_msg()+0x0: infinite recursion (objtool bug!)

    Instead of reporting an error in this case, consider the functions to be
    non-dead-ends.

    Reported-and-tested-by: Randy Dunlap
    Signed-off-by: Josh Poimboeuf
    Acked-by: Peter Zijlstra (Intel)
    Cc: Arnd Bergmann
    Cc: David Laight
    Cc: Greg KH
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: damian
    Link: http://lkml.kernel.org/r/7cc156408c5781a1f62085d352ced1fe39fe2f91.1525923412.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     
  • commit 7dec80ccbe310fb7e225bf21c48c672bb780ce7b upstream.

    With the following commit:

    fd35c88b7417 ("objtool: Support GCC 8 switch tables")

    I added a "can't find switch jump table" warning, to stop covering up
    silent failures if add_switch_table() can't find anything.

    That warning found yet another bug in the objtool switch table detection
    logic. For cases 1 and 2 (as described in the comments of
    find_switch_table()), the find_symbol_containing() check doesn't adjust
    the offset for RIP-relative switch jumps.

    Incidentally, this bug was already fixed for case 3 with:

    6f5ec2993b1f ("objtool: Detect RIP-relative switch table references")

    However, that commit missed the fix for cases 1 and 2.

    The different cases are now starting to look more and more alike. So
    fix the bug by consolidating them into a single case, by checking the
    original dynamic jump instruction in the case 3 loop.

    This also simplifies the code and makes it more robust against future
    switch table detection issues -- of which I'm sure there will be many...

    Switch table detection has been the most fragile area of objtool, by
    far. I long for the day when we'll have a GCC plugin for annotating
    switch tables. Linus asked me to delay such a plugin due to the
    flakiness of the plugin infrastructure in older versions of GCC, so this
    rickety code is what we're stuck with for now. At least the code is now
    a little simpler than it was.

    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/f400541613d45689086329432f3095119ffbc328.1526674218.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     
  • commit 6f5ec2993b1f39aed12fa6fd56e8dc2272ee8a33 upstream.

    Typically a switch table can be found by detecting a .rodata access
    followed an indirect jump:

    1969: 4a 8b 0c e5 00 00 00 mov 0x0(,%r12,8),%rcx
    1970: 00
    196d: R_X86_64_32S .rodata+0x438
    1971: e9 00 00 00 00 jmpq 1976
    1972: R_X86_64_PC32 __x86_indirect_thunk_rcx-0x4

    Randy Dunlap reported a case (seen with GCC 4.8) where the .rodata
    access uses RIP-relative addressing:

    19bd: 48 8b 3d 00 00 00 00 mov 0x0(%rip),%rdi # 19c4
    19c0: R_X86_64_PC32 .rodata+0x45c
    19c4: e9 00 00 00 00 jmpq 19c9
    19c5: R_X86_64_PC32 __x86_indirect_thunk_rdi-0x4

    In this case the relocation addend needs to be adjusted accordingly in
    order to find the location of the switch table.

    The fix is for case 3 (as described in the comments), but also make the
    existing case 1 & 2 checks more precise by only adjusting the addend for
    R_X86_64_PC32 relocations.

    This fixes the following warnings:

    drivers/video/fbdev/omap2/omapfb/dss/dispc.o: warning: objtool: dispc_runtime_suspend()+0xbb8: sibling call from callable instruction with modified stack frame
    drivers/video/fbdev/omap2/omapfb/dss/dispc.o: warning: objtool: dispc_runtime_resume()+0xcc5: sibling call from callable instruction with modified stack frame

    Reported-by: Randy Dunlap
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/b6098294fd67afb69af8c47c9883d7a68bf0f8ea.1526305958.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     
  • commit fd35c88b74170d9335530d9abf271d5d73eb5401 upstream.

    With GCC 8, some issues were found with the objtool switch table
    detection.

    1) In the .rodata section, immediately after the switch table, there can
    be another object which contains a pointer to the function which had
    the switch statement. In this case objtool wrongly considers the
    function pointer to be part of the switch table. Fix it by:

    a) making sure there are no pointers to the beginning of the
    function; and

    b) making sure there are no gaps in the switch table.

    Only the former was needed, the latter adds additional protection for
    future optimizations.

    2) In find_switch_table(), case 1 and case 2 are missing the check to
    ensure that the .rodata switch table data is anonymous, i.e. that it
    isn't already associated with an ELF symbol. Fix it by adding the
    same find_symbol_containing() check which is used for case 3.

    This fixes the following warnings with GCC 8:

    drivers/block/virtio_blk.o: warning: objtool: virtio_queue_rq()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+72
    net/ipv6/icmp.o: warning: objtool: icmpv6_rcv()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+64
    drivers/usb/core/quirks.o: warning: objtool: quirks_param_set()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+48
    drivers/mtd/nand/raw/nand_hynix.o: warning: objtool: hynix_nand_decode_id()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+24
    drivers/mtd/nand/raw/nand_samsung.o: warning: objtool: samsung_nand_decode_id()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+32
    drivers/gpu/drm/nouveau/nvkm/subdev/top/gk104.o: warning: objtool: gk104_top_oneinit()+0x0: stack state mismatch: cfa1=7+8 cfa2=7+64

    Reported-by: Arnd Bergmann
    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Acked-by: Peter Zijlstra (Intel)
    Cc: David Laight
    Cc: Greg KH
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Randy Dunlap
    Cc: Thomas Gleixner
    Cc: damian
    Link: http://lkml.kernel.org/r/20180510224849.xwi34d6tzheb5wgw@treble
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     
  • commit 13810435b9a7014fb92eb715f77da488f3b65b99 upstream.

    GCC 8 moves a lot of unlikely code out of line to "cold" subfunctions in
    .text.unlikely. Properly detect the new subfunctions and treat them as
    extensions of the original functions.

    This fixes a bunch of warnings like:

    kernel/cgroup/cgroup.o: warning: objtool: parse_cgroup_root_flags()+0x33: sibling call from callable instruction with modified stack frame
    kernel/cgroup/cgroup.o: warning: objtool: cgroup_addrm_files()+0x290: sibling call from callable instruction with modified stack frame
    kernel/cgroup/cgroup.o: warning: objtool: cgroup_apply_control_enable()+0x25b: sibling call from callable instruction with modified stack frame
    kernel/cgroup/cgroup.o: warning: objtool: rebind_subsystems()+0x325: sibling call from callable instruction with modified stack frame

    Reported-and-tested-by: damian
    Reported-by: Arnd Bergmann
    Signed-off-by: Josh Poimboeuf
    Acked-by: Peter Zijlstra (Intel)
    Cc: David Laight
    Cc: Greg KH
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Randy Dunlap
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/0965e7fcfc5f31a276f0c7f298ff770c19b68706.1525923412.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     

12 Apr, 2018

1 commit

  • commit 3c1f05835cbf9fdfe60b81c718d82ceb94b6c55e upstream.

    Since the ORC unwinder was made the default on x86_64, Clang-built
    defconfig kernels have triggered some new objtool warnings:

    drivers/gpu/drm/i915/i915_gpu_error.o: warning: objtool: i915_error_printf()+0x6c: return with modified stack frame
    drivers/gpu/drm/i915/intel_display.o: warning: objtool: pipe_config_err()+0xa6: return with modified stack frame

    The problem is that objtool has never seen clang-built binaries before.

    Shockingly enough, objtool is apparently able to follow the code flow
    mostly fine, except for one instruction sequence. Instead of a LEAVE
    instruction, clang restores RSP and RBP the long way:

    67c: 48 89 ec mov %rbp,%rsp
    67f: 5d pop %rbp

    Teach objtool about this new code sequence.

    Reported-and-test-by: Matthias Kaehlcke
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Matthias Kaehlcke
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/fce88ce81c356eedcae7f00ed349cfaddb3363cc.1521741586.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     

15 Mar, 2018

5 commits

  • commit 63474dc4ac7ed3848a4786b9592dd061901f606d upstream.

    Fix the objtool build when cross-compiling a 64-bit kernel on a 32-bit
    host. This also simplifies read_retpoline_hints() a bit and makes its
    implementation similar to most of the other annotation reading
    functions.

    Reported-by: Sven Joachim
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: b5bc2231b8ad ("objtool: Add retpoline validation")
    Link: http://lkml.kernel.org/r/2ca46c636c23aa9c9d57d53c75de4ee3ddf7a7df.1520380691.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     
  • commit 1402fd8ed7e5bda1b3e7613b70780b0db392d1e6 upstream.

    Continue the switch table detection whack-a-mole. Add a check to
    distinguish KASAN data reads from switch data reads. The switch jump
    tables in .rodata have relocations associated with them.

    This fixes the following warning:

    crypto/asymmetric_keys/x509_cert_parser.o: warning: objtool: x509_note_pkey_algo()+0xa4: sibling call from callable instruction with modified stack frame

    Reported-by: Arnd Bergmann
    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Thomas Gleixner
    Tested-by: Arnd Bergmann
    Cc: Peter Zijlstra
    Link: https://lkml.kernel.org/r/d7c8853022ad47d158cb81e953a40469fc08a95e.1519784382.git.jpoimboe@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     
  • commit ca41b97ed9124fd62323a162de5852f6e28f94b8 upstream.

    David allowed retpolines in .init.text, except for modules, which will
    trip up objtool retpoline validation, fix that.

    Requested-by: David Woodhouse
    Signed-off-by: Peter Zijlstra (Intel)
    Acked-by: Thomas Gleixner
    Acked-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Arjan van de Ven
    Cc: Borislav Petkov
    Cc: Dan Williams
    Cc: Dave Hansen
    Cc: David Woodhouse
    Cc: Greg Kroah-Hartman
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Peter Zijlstra
     
  • commit b5bc2231b8ad4387c9641f235ca0ad8cd300b6df upstream.

    David requested a objtool validation pass for CONFIG_RETPOLINE=y enabled
    builds, where it validates no unannotated indirect jumps or calls are
    left.

    Add an additional .discard.retpoline_safe section to allow annotating
    the few indirect sites that are required and safe.

    Requested-by: David Woodhouse
    Signed-off-by: Peter Zijlstra (Intel)
    Reviewed-by: David Woodhouse
    Acked-by: Thomas Gleixner
    Acked-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Arjan van de Ven
    Cc: Borislav Petkov
    Cc: Dan Williams
    Cc: Dave Hansen
    Cc: Greg Kroah-Hartman
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Peter Zijlstra
     
  • commit 43a4525f80534530077683f6472d8971646b0ace upstream.

    Use the existing global variables instead of passing them around and
    creating duplicate global variables.

    Signed-off-by: Peter Zijlstra (Intel)
    Acked-by: Thomas Gleixner
    Acked-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Arjan van de Ven
    Cc: Borislav Petkov
    Cc: Dan Williams
    Cc: Dave Hansen
    Cc: David Woodhouse
    Cc: Greg Kroah-Hartman
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Peter Zijlstra
     

22 Feb, 2018

1 commit

  • commit fe24e27128252c230a34a6c628da2bf1676781ea upstream.

    Peter Zijlstra's patch for converting WARN() to use UD2 triggered a
    bunch of false "unreachable instruction" warnings, which then triggered
    a seg fault in ignore_unreachable_insn().

    The seg fault happened when it tried to dereference a NULL 'insn->func'
    pointer. Thanks to static_cpu_has(), some functions can jump to a
    non-function area in the .altinstr_aux section. That breaks
    ignore_unreachable_insn()'s assumption that it's always inside the
    original function.

    Make sure ignore_unreachable_insn() only follows jumps within the
    current function.

    Reported-by: Borislav Petkov
    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Peter Zijlstra (Intel)
    Cc: Andy Lutomirski
    Cc: Arjan van de Ven
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: kbuild test robot
    Link: http://lkml.kernel.org/r/bace77a60d5af9b45eddb8f8fb9c776c8de657ef.1518130694.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     

17 Feb, 2018

1 commit

  • commit 99ce7962d52d1948ad6f2785e308d48e76e0a6ef upstream.

    Linus reported that GCC-7.3 generated a switch-table construct that
    confused objtool. It turns out that, in particular due to KASAN, it is
    possible to have unrelated .rodata usage in between the .rodata setup
    for the switch-table and the following indirect jump.

    The simple linear reverse search from the indirect jump would hit upon
    the KASAN .rodata usage first and fail to find a switch_table,
    resulting in a spurious 'sibling call with modified stack frame'
    warning.

    Fix this by creating a 'jump-stack' which we can 'unwind' during
    reversal, thereby skipping over much of the in-between code.

    This is not fool proof by any means, but is sufficient to make the
    known cases work. Future work would be to construct more comprehensive
    flow analysis code.

    Reported-and-tested-by: Linus Torvalds
    Signed-off-by: Peter Zijlstra (Intel)
    Acked-by: Josh Poimboeuf
    Cc: Borislav Petkov
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/20180208130232.GF25235@hirez.programming.kicks-ass.net
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Peter Zijlstra
     

08 Feb, 2018

2 commits

  • commit 17bc33914bcc98ba3c6b426fd1c49587a25c0597

    Now that the previous patch gave objtool the ability to read retpoline
    alternatives, it shows a new warning:

    arch/x86/entry/entry_64.o: warning: objtool: .entry_trampoline: don't know how to handle alternatives at end of section

    This is due to the JMP_NOSPEC in entry_SYSCALL_64_trampoline().

    Previously, objtool ignored this situation because it wasn't needed, and
    it would have required a bit of extra code. Now that this case exists,
    add proper support for it.

    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Dave Hansen
    Cc: David Woodhouse
    Cc: Greg Kroah-Hartman
    Cc: Guenter Roeck
    Cc: H. Peter Anvin
    Cc: Juergen Gross
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/2a30a3c2158af47d891a76e69bb1ef347e0443fd.1517284349.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     
  • commit a845c7cf4b4cb5e9e3b2823867892b27646f3a98

    Currently objtool requires all retpolines to be:

    a) patched in with alternatives; and

    b) annotated with ANNOTATE_NOSPEC_ALTERNATIVE.

    If you forget to do both of the above, objtool segfaults trying to
    dereference a NULL 'insn->call_dest' pointer.

    Avoid that situation and print a more helpful error message:

    quirks.o: warning: objtool: efi_delete_dummy_variable()+0x99: unsupported intra-function call
    quirks.o: warning: objtool: If this is a retpoline, please patch it in with alternatives and annotate it with ANNOTATE_NOSPEC_ALTERNATIVE.

    Future improvements can be made to make objtool smarter with respect to
    retpolines, but this is a good incremental improvement for now.

    Reported-and-tested-by: Guenter Roeck
    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Dave Hansen
    Cc: David Woodhouse
    Cc: Greg Kroah-Hartman
    Cc: H. Peter Anvin
    Cc: Juergen Gross
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/819e50b6d9c2e1a22e34c1a636c0b2057cc8c6e5.1517284349.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     

17 Jan, 2018

2 commits

  • commit 258c76059cece01bebae098e81bacb1af2edad17 upstream.

    Getting objtool to understand retpolines is going to be a bit of a
    challenge. For now, take advantage of the fact that retpolines are
    patched in with alternatives. Just read the original (sane)
    non-alternative instruction, and ignore the patched-in retpoline.

    This allows objtool to understand the control flow *around* the
    retpoline, even if it can't yet follow what's inside. This means the
    ORC unwinder will fail to unwind from inside a retpoline, but will work
    fine otherwise.

    Signed-off-by: Josh Poimboeuf
    Signed-off-by: David Woodhouse
    Signed-off-by: Thomas Gleixner
    Cc: gnomes@lxorguk.ukuu.org.uk
    Cc: Rik van Riel
    Cc: Andi Kleen
    Cc: thomas.lendacky@amd.com
    Cc: Peter Zijlstra
    Cc: Linus Torvalds
    Cc: Jiri Kosina
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: Kees Cook
    Cc: Tim Chen
    Cc: Greg Kroah-Hartman
    Cc: Paul Turner
    Link: https://lkml.kernel.org/r/1515707194-20531-3-git-send-email-dwmw@amazon.co.uk
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     
  • commit 39b735332cb8b33a27c28592d969e4016c86c3ea upstream.

    A direct jump to a retpoline thunk is really an indirect jump in
    disguise. Change the objtool instruction type accordingly.

    Objtool needs to know where indirect branches are so it can detect
    switch statement jump tables.

    This fixes a bunch of warnings with CONFIG_RETPOLINE like:

    arch/x86/events/intel/uncore_nhmex.o: warning: objtool: nhmex_rbox_msr_enable_event()+0x44: sibling call from callable instruction with modified stack frame
    kernel/signal.o: warning: objtool: copy_siginfo_to_user()+0x91: sibling call from callable instruction with modified stack frame
    ...

    Signed-off-by: Josh Poimboeuf
    Signed-off-by: David Woodhouse
    Signed-off-by: Thomas Gleixner
    Cc: gnomes@lxorguk.ukuu.org.uk
    Cc: Rik van Riel
    Cc: Andi Kleen
    Cc: thomas.lendacky@amd.com
    Cc: Peter Zijlstra
    Cc: Linus Torvalds
    Cc: Jiri Kosina
    Cc: Andy Lutomirski
    Cc: Dave Hansen
    Cc: Kees Cook
    Cc: Tim Chen
    Cc: Greg Kroah-Hartman
    Cc: Paul Turner
    Link: https://lkml.kernel.org/r/1515707194-20531-2-git-send-email-dwmw@amazon.co.uk
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     

25 Dec, 2017

1 commit

  • commit 00d96180dc38ef872ac471c2d3e14b067cbd895d upstream.

    If asm code specifies an UNWIND_HINT_EMPTY hint, don't warn if the
    section ends unexpectedly. This can happen with the xen-head.S code
    because the hypercall_page is "text" but it's all zeros.

    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Boris Ostrovsky
    Cc: Jiri Slaby
    Cc: Juergen Gross
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/ddafe199dd8797e40e3c2777373347eba1d65572.1505764066.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     

20 Oct, 2017

1 commit

  • When an error occurs before adding an allocated insn to the list, free
    it before returning.

    Signed-off-by: Kamalesh Babulal
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/336da800bf6070eae11f4e0a3b9ca64c27658114.1508430423.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Kamalesh Babulal
     

23 Sep, 2017

1 commit

  • The kbuild bot reported the following warning with GCC 4.4 and a
    randconfig:

    net/socket.o: warning: objtool: compat_sock_ioctl()+0x1083: stack state mismatch: cfa1=7+160 cfa2=-1+0

    This is caused by another GCC non-optimization, where it backs up and
    restores the stack pointer for no apparent reason:

    2f91: 48 89 e0 mov %rsp,%rax
    2f94: 4c 89 e7 mov %r12,%rdi
    2f97: 4c 89 f6 mov %r14,%rsi
    2f9a: ba 20 00 00 00 mov $0x20,%edx
    2f9f: 48 89 c4 mov %rax,%rsp

    This issue would have been happily ignored before the following commit:

    dd88a0a0c861 ("objtool: Handle GCC stack pointer adjustment bug")

    But now that objtool is paying attention to such stack pointer writes
    to/from a register, it needs to understand them properly. In this case
    that means recognizing that the "mov %rsp, %rax" instruction is
    potentially a backup of the stack pointer.

    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Cc: Alexander Potapenko
    Cc: Andrey Ryabinin
    Cc: Andy Lutomirski
    Cc: Arnd Bergmann
    Cc: Dmitriy Vyukov
    Cc: Linus Torvalds
    Cc: Matthias Kaehlcke
    Cc: Miguel Bernal Marin
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: dd88a0a0c861 ("objtool: Handle GCC stack pointer adjustment bug")
    Link: http://lkml.kernel.org/r/8c7aa8e9a36fbbb6655d9d8e7cea58958c912da8.1505942196.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

30 Aug, 2017

1 commit

  • Arnd Bergmann reported the following warning with GCC 7.1.1:

    fs/fs_pin.o: warning: objtool: pin_kill()+0x139: stack state mismatch: cfa1=7+88 cfa2=7+96

    And the kbuild robot reported the following warnings with GCC 5.4.1:

    fs/fs_pin.o: warning: objtool: pin_kill()+0x182: return with modified stack frame
    fs/quota/dquot.o: warning: objtool: dquot_alloc_inode()+0x140: stack state mismatch: cfa1=7+120 cfa2=7+128
    fs/quota/dquot.o: warning: objtool: dquot_free_inode()+0x11a: stack state mismatch: cfa1=7+112 cfa2=7+120

    Those warnings are caused by an unusual GCC non-optimization where it
    uses an intermediate register to adjust the stack pointer. It does:

    lea 0x8(%rsp), %rcx
    ...
    mov %rcx, %rsp

    Instead of the obvious:

    add $0x8, %rsp

    It makes no sense to use an intermediate register, so I opened a GCC bug
    to track it:

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81813

    But it's not exactly a high-priority bug and it looks like we'll be
    stuck with this issue for a while. So for now we have to track register
    values when they're loaded with stack pointer offsets.

    This is kind of a big workaround for a tiny problem, but c'est la vie.
    I hope to eventually create a GCC plugin to implement a big chunk of
    objtool's functionality. Hopefully at that point we'll be able to
    remove of a lot of these GCC-isms from the objtool code.

    Reported-by: Arnd Bergmann
    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/6a41a96884c725e7f05413bb7df40cfe824b2444.1504028945.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

21 Aug, 2017

1 commit

  • When GCC adds NOP padding between functions, those NOPs aren't
    associated with a function symbol, which breaks objtool's detection of a
    function falling through to another function. Instead it shows
    confusing errors like:

    drivers/mtd/chips/cfi_util.o: warning: objtool: cfi_qry_mode_on()+0x8b: return with modified stack frame
    drivers/mtd/chips/cfi_util.o: warning: objtool: cfi_qry_mode_on()+0x0: stack state mismatch: cfa1=-4-32 cfa2=7+8
    drivers/mtd/chips/cfi_cmdset_0002.o: warning: objtool: fixup_use_fwh_lock()+0x8: unknown stack-related register move
    drivers/mtd/chips/cfi_cmdset_0002.o: warning: objtool: fixup_use_fwh_lock()+0x0: stack state mismatch: cfa1=6+16 cfa2=7+8
    drivers/mtd/chips/cfi_cmdset_0002.o: warning: objtool: do_otp_write()+0xa: unsupported stack pointer realignment
    drivers/mtd/chips/cfi_cmdset_0002.o: warning: objtool: do_otp_write()+0x0: stack state mismatch: cfa1=-4-40 cfa2=7+8

    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/43e7aae9a7a7710cd6df597fa9dc501da4ba0602.1502472193.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

11 Aug, 2017

2 commits

  • When GCC realigns a function's stack, it sometimes uses %r13 as the DRAP
    register, like:

    push %r13
    lea 0x10(%rsp), %r13
    and $0xfffffffffffffff0, %rsp
    pushq -0x8(%r13)
    push %rbp
    mov %rsp, %rbp
    push %r13
    ...
    mov -0x8(%rbp),%r13
    leaveq
    lea -0x10(%r13), %rsp
    pop %r13
    retq

    Since %r13 was pushed onto the stack twice, its two stack locations need
    to be stored separately. The first push of %r13 is its original value,
    and the second push of %r13 is the caller's stack frame address.

    Since %r13 is a callee-saved register, we need to track the stack
    location of its original value separately from the DRAP register.

    This fixes the following false positive warning:

    lib/ubsan.o: warning: objtool: val_to_string.constprop.7()+0x97: leave instruction with modified stack frame

    Reported-by: Arnd Bergmann
    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: baa41469a7b9 ("objtool: Implement stack validation 2.0")
    Link: http://lkml.kernel.org/r/3da23a6d4c5b3c1e21fc2ccc21a73941b97ff20a.1502401017.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • The validate_branch() function should never return a negative value.
    Errors are treated as warnings so that even if something goes wrong,
    objtool does its best to generate ORC data for the rest of the file.

    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Arnd Bergmann
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: baa41469a7b9 ("objtool: Implement stack validation 2.0")
    Link: http://lkml.kernel.org/r/d86671cfde823b50477cd2f6f548dfe54871e24d.1502401017.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

28 Jul, 2017

2 commits

  • When a whitelisted function uses one of the ALTERNATIVE macros, it
    produces false positive warnings like:

    arch/x86/kvm/vmx.o: warning: objtool: .altinstr_replacement+0x0: unreachable instruction
    arch/x86/kvm/svm.o: warning: objtool: .altinstr_replacement+0x6e: unreachable instruction

    There's no easy way to whitelist alternative instructions, so instead
    just skip any 'unreachable' warnings associated with them.

    Reported-by: Arnd Bergmann
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/a5d0a8c60155f03b36a31fac871e12cf75f35fd0.1501188854.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • Arnd reported some false positive warnings with GCC 7:

    drivers/hid/wacom_wac.o: warning: objtool: wacom_bpt3_touch()+0x2a5: stack state mismatch: cfa1=7+8 cfa2=6+16
    drivers/iio/adc/vf610_adc.o: warning: objtool: vf610_adc_calculate_rates() falls through to next function vf610_adc_sample_set()
    drivers/pwm/pwm-hibvt.o: warning: objtool: hibvt_pwm_get_state() falls through to next function hibvt_pwm_remove()
    drivers/pwm/pwm-mediatek.o: warning: objtool: mtk_pwm_config() falls through to next function mtk_pwm_enable()
    drivers/spi/spi-bcm2835.o: warning: objtool: .text: unexpected end of section
    drivers/spi/spi-bcm2835aux.o: warning: objtool: .text: unexpected end of section
    drivers/watchdog/digicolor_wdt.o: warning: objtool: dc_wdt_get_timeleft() falls through to next function dc_wdt_restart()

    When GCC 7 detects a potential divide-by-zero condition, it sometimes
    inserts a UD2 instruction for the case where the divisor is zero,
    instead of letting the hardware trap on the divide instruction.

    Objtool doesn't consider UD2 to be fatal unless it's annotated with
    unreachable(). So it considers the GCC-generated UD2 to be non-fatal,
    and it tries to follow the control flow past the UD2 and gets
    confused.

    Previously, objtool *did* assume UD2 was always a dead end. That
    changed with the following commit:

    d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")

    The motivation behind that change was that Peter was planning on using
    UD2 for __WARN(), which is *not* a dead end. However, it turns out
    that some emulators rely on UD2 being fatal, so he ended up using
    'ud0' instead:

    9a93848fe787 ("x86/debug: Implement __WARN() using UD0")

    For GCC 4.5+, it should be safe to go back to the previous assumption
    that UD2 is fatal, even when it's not annotated with unreachable().

    But for pre-4.5 versions of GCC, the unreachable() macro isn't
    supported, so such cases of UD2 need to be explicitly annotated as
    reachable.

    Reported-by: Arnd Bergmann
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: d1091c7fa3d5 ("objtool: Improve detection of BUG() and other dead ends")
    Link: http://lkml.kernel.org/r/e57fa9dfede25f79487da8126ee9cdf7b856db65.1501188854.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

25 Jul, 2017

1 commit

  • Objtool tries to silence 'unreachable instruction' warnings when it
    detects gcov is enabled, because gcov produces a lot of unreachable
    instructions and they don't really matter.

    However, the 0-day bot is still reporting some unreachable instruction
    warnings with CONFIG_GCOV_KERNEL=y on GCC 4.6.4.

    As it turns out, objtool's gcov detection doesn't work with older
    versions of GCC because they don't create a bunch of symbols with the
    'gcov.' prefix like newer versions of GCC do.

    Move the gcov check out of objtool and instead just create a new
    '--no-unreachable' flag which can be passed in by the kernel Makefile
    when CONFIG_GCOV_KERNEL is defined.

    Also rename the 'nofp' variable to 'no_fp' for consistency with the new
    'no_unreachable' variable.

    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Fixes: 9cfffb116887 ("objtool: Skip all "unreachable instruction" warnings for gcov kernels")
    Link: http://lkml.kernel.org/r/c243dc78eb2ffdabb6e927844dea39b6033cd395.1500939244.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

18 Jul, 2017

2 commits

  • Some asm (and inline asm) code does special things to the stack which
    objtool can't understand. (Nor can GCC or GNU assembler, for that
    matter.) In such cases we need a facility for the code to provide
    annotations, so the unwinder can unwind through it.

    This provides such a facility, in the form of unwind hints. They're
    similar to the GNU assembler .cfi* directives, but they give more
    information, and are needed in far fewer places, because objtool can
    fill in the blanks by following branches and adjusting the stack pointer
    for pushes and pops.

    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Jiri Slaby
    Cc: Linus Torvalds
    Cc: Mike Galbraith
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: live-patching@vger.kernel.org
    Link: http://lkml.kernel.org/r/0f5f3c9104fca559ff4088bece1d14ae3bca52d5.1499786555.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • Now that objtool knows the states of all registers on the stack for each
    instruction, it's straightforward to generate debuginfo for an unwinder
    to use.

    Instead of generating DWARF, generate a new format called ORC, which is
    more suitable for an in-kernel unwinder. See
    Documentation/x86/orc-unwinder.txt for a more detailed description of
    this new debuginfo format and why it's preferable to DWARF.

    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Borislav Petkov
    Cc: Brian Gerst
    Cc: Denys Vlasenko
    Cc: H. Peter Anvin
    Cc: Jiri Slaby
    Cc: Linus Torvalds
    Cc: Mike Galbraith
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: live-patching@vger.kernel.org
    Link: http://lkml.kernel.org/r/c9b9f01ba6c5ed2bdc9bb0957b78167fdbf9632e.1499786555.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

08 Jul, 2017

1 commit

  • With some configs, objtool reports the following warning:

    arch/x86/kernel/ftrace.o: warning: objtool: ftrace_modify_code_direct()+0x2d: sibling call from callable instruction with modified stack frame

    The instruction it's complaining about isn't actually a sibling call.
    It's just a normal jump to an address inside the function. Objtool
    thought it was a sibling call because the instruction's jump_dest wasn't
    initialized because the function was supposed to be ignored due to its
    use of sync_core().

    Objtool ended up validating the function instead of ignoring it because
    it didn't properly recognize a sibling call to the function. So fix the
    sibling call logic. Also add a warning to catch ignored functions being
    validated so we'll get a more useful error message next time.

    Reported-by: Mike Galbraith
    Signed-off-by: Josh Poimboeuf
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Link: http://lkml.kernel.org/r/96cc8ecbcdd8cb29ddd783817b4af918a6a171b0.1499437107.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

01 Jul, 2017

1 commit

  • Previously, objtool ignored functions which have the IRET instruction
    in them. That's because it assumed that such functions know what
    they're doing with respect to frame pointers.

    With the new "objtool 2.0" changes, it stopped ignoring such functions,
    and started complaining about them:

    arch/x86/kernel/alternative.o: warning: objtool: do_sync_core()+0x1b: unsupported instruction in callable function
    arch/x86/kernel/alternative.o: warning: objtool: text_poke()+0x1a8: unsupported instruction in callable function
    arch/x86/kernel/ftrace.o: warning: objtool: do_sync_core()+0x16: unsupported instruction in callable function
    arch/x86/kernel/cpu/mcheck/mce.o: warning: objtool: machine_check_poll()+0x166: unsupported instruction in callable function
    arch/x86/kernel/cpu/mcheck/mce.o: warning: objtool: do_machine_check()+0x147: unsupported instruction in callable function

    Silence those warnings for now. They can be re-enabled later, once we
    have unwind hints which will allow the code to annotate the IRET usages.

    Reported-by: Ingo Molnar
    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Jiri Slaby
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: live-patching@vger.kernel.org
    Fixes: baa41469a7b9 ("objtool: Implement stack validation 2.0")
    Link: http://lkml.kernel.org/r/20170630140934.mmwtpockvpupahro@treble
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

30 Jun, 2017

2 commits

  • This is a major rewrite of objtool. Instead of only tracking frame
    pointer changes, it now tracks all stack-related operations, including
    all register saves/restores.

    In addition to making stack validation more robust, this also paves the
    way for undwarf generation.

    Signed-off-by: Josh Poimboeuf
    Cc: Andy Lutomirski
    Cc: Jiri Slaby
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: live-patching@vger.kernel.org
    Link: http://lkml.kernel.org/r/678bd94c0566c6129bcc376cddb259c4c5633004.1498659915.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     
  • In preparation for the new 'objtool undwarf generate' command, which
    will rely on 'objtool check', move the checking code from
    builtin-check.c to check.c where it can be used by other commands.

    Signed-off-by: Josh Poimboeuf
    Reviewed-by: Jiri Slaby
    Cc: Andy Lutomirski
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    Cc: live-patching@vger.kernel.org
    Link: http://lkml.kernel.org/r/294c5c695fd73c1a5000bbe5960a7c9bec4ee6b4.1498659915.git.jpoimboe@redhat.com
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf