27 Mar, 2019

1 commit

  • commit 0c671812f152b628bd87c0af49da032cc2a2c319 upstream.

    Objtool uses over 512k of stack, thanks to the hash table embedded in
    the objtool_file struct. This causes an unnecessarily large stack
    allocation and breaks users with low stack limits.

    Move the struct off the stack.

    Fixes: 042ba73fe7eb ("objtool: Add several performance improvements")
    Reported-by: Vassili Karpov
    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/df92dcbc4b84b02ffa252f46876df125fb56e2d7.1552954176.git.jpoimboe@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Josh Poimboeuf
     

14 Aug, 2018

1 commit

  • Pull x86 asm updates from Thomas Gleixner:
    "The lowlevel and ASM code updates for x86:

    - Make stack trace unwinding more reliable

    - ASM instruction updates for better code generation

    - Various cleanups"

    * 'x86-asm-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
    x86/entry/64: Add two more instruction suffixes
    x86/asm/64: Use 32-bit XOR to zero registers
    x86/build/vdso: Simplify 'cmd_vdso2c'
    x86/build/vdso: Remove unused vdso-syms.lds
    x86/stacktrace: Enable HAVE_RELIABLE_STACKTRACE for the ORC unwinder
    x86/unwind/orc: Detect the end of the stack
    x86/stacktrace: Do not fail for ORC with regs on stack
    x86/stacktrace: Clarify the reliable success paths
    x86/stacktrace: Remove STACKTRACE_DUMP_ONCE
    x86/stacktrace: Do not unwind after user regs
    x86/asm: Use CC_SET/CC_OUT in percpu_cmpxchg8b_double() to micro-optimize code generation

    Linus Torvalds
     

21 Jun, 2018

1 commit

  • The existing UNWIND_HINT_EMPTY annotations happen to be good indicators
    of where entry code calls into C code for the first time. So also use
    them to mark the end of the stack for the ORC unwinder.

    Use that information to set unwind->error if the ORC unwinder doesn't
    unwind all the way to the end. This will be needed for enabling
    HAVE_RELIABLE_STACKTRACE for the ORC unwinder so we can use it with the
    livepatch consistency model.

    Thanks to Jiri Slaby for teaching the ORCs about the unwind hints.

    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Jiri Slaby
    Acked-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
    Link: https://lkml.kernel.org/lkml/20180518064713.26440-5-jslaby@suse.cz
    Signed-off-by: Ingo Molnar

    Josh Poimboeuf
     

20 Jun, 2018

1 commit

  • machine_real_restart() is annotated as '__noreturn", so add it to the
    objtool noreturn list. This fixes the following warning with clang and
    CONFIG_CC_OPTIMIZE_FOR_SIZE=y:

    arch/x86/kernel/reboot.o: warning: objtool: native_machine_emergency_restart() falls through to next function machine_power_off()

    Reported-by: Matthias Kaehlcke
    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Thomas Gleixner
    Tested-by: Matthias Kaehlcke
    Reviewed-by: Matthias Kaehlcke
    Link: https://lkml.kernel.org/r/791712792aa4431bdd55bf1beb33a169ddf3b4a2.1529423255.git.jpoimboe@redhat.com

    Josh Poimboeuf
     

06 Jun, 2018

1 commit

  • The kbuild test robot reported the following issue:

    kernel/time/posix-stubs.o: warning: objtool: sys_ni_posix_timers.cold.1()+0x0: unreachable instruction

    This file creates symbol aliases for the sys_ni_posix_timers() function.
    So there are multiple ELF function symbols for the same function:

    23: 0000000000000150 26 FUNC GLOBAL DEFAULT 1 __x64_sys_timer_create
    24: 0000000000000150 26 FUNC GLOBAL DEFAULT 1 sys_ni_posix_timers
    25: 0000000000000150 26 FUNC GLOBAL DEFAULT 1 __ia32_sys_timer_create
    26: 0000000000000150 26 FUNC GLOBAL DEFAULT 1 __x64_sys_timer_gettime

    Here's the corresponding cold subfunction:

    11: 0000000000000000 45 FUNC LOCAL DEFAULT 6 sys_ni_posix_timers.cold.1

    When analyzing overlapping functions, objtool only looks at the first
    one in the symbol list. The rest of the functions are basically ignored
    because they point to instructions which have already been analyzed.

    So in this case it analyzes the __x64_sys_timer_create() function, but
    then it fails to recognize that its cold subfunction is
    sys_ni_posix_timers.cold.1(), because the names are different.

    Make the subfunction detection a little smarter by associating each
    subfunction with the first function which jumps to it, since that's the
    one which will be analyzed.

    Unfortunately we still have to leave the original subfunction detection
    code in place, thanks to GCC switch tables. (See the comment for more
    details.)

    Fixes: 13810435b9a7 ("objtool: Support GCC 8's cold subfunctions")
    Reported-by: kbuild test robot
    Signed-off-by: Josh Poimboeuf
    Signed-off-by: Thomas Gleixner
    Cc: Peter Zijlstra
    Link: https://lkml.kernel.org/r/d3ba52662cbc8e3a64a3b64d44b4efc5674fd9ab.1527855808.git.jpoimboe@redhat.com

    Josh Poimboeuf
     

19 May, 2018

1 commit

  • 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

    Josh Poimboeuf
     

15 May, 2018

1 commit

  • 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

    Josh Poimboeuf
     

14 May, 2018

3 commits

  • 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

    Josh Poimboeuf
     
  • 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

    Josh Poimboeuf
     
  • 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

    Josh Poimboeuf
     

27 Mar, 2018

1 commit

  • 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

    Josh Poimboeuf
     

07 Mar, 2018

1 commit

  • 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

    Josh Poimboeuf
     

28 Feb, 2018

1 commit

  • 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

    Josh Poimboeuf
     

21 Feb, 2018

3 commits

  • 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

    Peter Zijlstra
     
  • 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

    Peter Zijlstra
     
  • 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

    Peter Zijlstra
     

15 Feb, 2018

2 commits

  • Pull x86 PTI and Spectre related fixes and updates from Ingo Molnar:
    "Here's the latest set of Spectre and PTI related fixes and updates:

    Spectre:
    - Add entry code register clearing to reduce the Spectre attack
    surface
    - Update the Spectre microcode blacklist
    - Inline the KVM Spectre helpers to get close to v4.14 performance
    again.
    - Fix indirect_branch_prediction_barrier()
    - Fix/improve Spectre related kernel messages
    - Fix array_index_nospec_mask() asm constraint
    - KVM: fix two MSR handling bugs

    PTI:
    - Fix a paranoid entry PTI CR3 handling bug
    - Fix comments

    objtool:
    - Fix paranoid_entry() frame pointer warning
    - Annotate WARN()-related UD2 as reachable
    - Various fixes
    - Add Add Peter Zijlstra as objtool co-maintainer

    Misc:
    - Various x86 entry code self-test fixes
    - Improve/simplify entry code stack frame generation and handling
    after recent heavy-handed PTI and Spectre changes. (There's two
    more WIP improvements expected here.)
    - Type fix for cache entries

    There's also some low risk non-fix changes I've included in this
    branch to reduce backporting conflicts:

    - rename a confusing x86_cpu field name
    - de-obfuscate the naming of single-TLB flushing primitives"

    * 'x86-pti-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (41 commits)
    x86/entry/64: Fix CR3 restore in paranoid_exit()
    x86/cpu: Change type of x86_cache_size variable to unsigned int
    x86/spectre: Fix an error message
    x86/cpu: Rename cpu_data.x86_mask to cpu_data.x86_stepping
    selftests/x86/mpx: Fix incorrect bounds with old _sigfault
    x86/mm: Rename flush_tlb_single() and flush_tlb_one() to __flush_tlb_one_[user|kernel]()
    x86/speculation: Add dependency
    nospec: Move array_index_nospec() parameter checking into separate macro
    x86/speculation: Fix up array_index_nospec_mask() asm constraint
    x86/debug: Use UD2 for WARN()
    x86/debug, objtool: Annotate WARN()-related UD2 as reachable
    objtool: Fix segfault in ignore_unreachable_insn()
    selftests/x86: Disable tests requiring 32-bit support on pure 64-bit systems
    selftests/x86: Do not rely on "int $0x80" in single_step_syscall.c
    selftests/x86: Do not rely on "int $0x80" in test_mremap_vdso.c
    selftests/x86: Fix build bug caused by the 5lvl test which has been moved to the VM directory
    selftests/x86/pkeys: Remove unused functions
    selftests/x86: Clean up and document sscanf() usage
    selftests/x86: Fix vDSO selftest segfault for vsyscall=none
    x86/entry/64: Remove the unused 'icebp' macro
    ...

    Linus Torvalds
     
  • 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

    Josh Poimboeuf
     

09 Feb, 2018

1 commit

  • 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

    Peter Zijlstra
     

05 Feb, 2018

1 commit

  • Pull spectre/meltdown updates from Thomas Gleixner:
    "The next round of updates related to melted spectrum:

    - The initial set of spectre V1 mitigations:

    - Array index speculation blocker and its usage for syscall,
    fdtable and the n180211 driver.

    - Speculation barrier and its usage in user access functions

    - Make indirect calls in KVM speculation safe

    - Blacklisting of known to be broken microcodes so IPBP/IBSR are not
    touched.

    - The initial IBPB support and its usage in context switch

    - The exposure of the new speculation MSRs to KVM guests.

    - A fix for a regression in x86/32 related to the cpu entry area

    - Proper whitelisting for known to be safe CPUs from the mitigations.

    - objtool fixes to deal proper with retpolines and alternatives

    - Exclude __init functions from retpolines which speeds up the boot
    process.

    - Removal of the syscall64 fast path and related cleanups and
    simplifications

    - Removal of the unpatched paravirt mode which is yet another source
    of indirect unproteced calls.

    - A new and undisputed version of the module mismatch warning

    - A couple of cleanup and correctness fixes all over the place

    Yet another step towards full mitigation. There are a few things still
    missing like the RBS underflow mitigation for Skylake and other small
    details, but that's being worked on.

    That said, I'm taking a belated christmas vacation for a week and hope
    that everything is magically solved when I'm back on Feb 12th"

    * 'x86-pti-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (37 commits)
    KVM/SVM: Allow direct access to MSR_IA32_SPEC_CTRL
    KVM/VMX: Allow direct access to MSR_IA32_SPEC_CTRL
    KVM/VMX: Emulate MSR_IA32_ARCH_CAPABILITIES
    KVM/x86: Add IBPB support
    KVM/x86: Update the reverse_cpuid list to include CPUID_7_EDX
    x86/speculation: Fix typo IBRS_ATT, which should be IBRS_ALL
    x86/pti: Mark constant arrays as __initconst
    x86/spectre: Simplify spectre_v2 command line parsing
    x86/retpoline: Avoid retpolines for built-in __init functions
    x86/kvm: Update spectre-v1 mitigation
    KVM: VMX: make MSR bitmaps per-VCPU
    x86/paravirt: Remove 'noreplace-paravirt' cmdline option
    x86/speculation: Use Indirect Branch Prediction Barrier in context switch
    x86/cpuid: Fix up "virtual" IBRS/IBPB/STIBP feature bits on Intel
    x86/spectre: Fix spelling mistake: "vunerable"-> "vulnerable"
    x86/spectre: Report get_user mitigation for spectre_v1
    nl80211: Sanitize array index in parse_txq_params
    vfs, fdtable: Prevent bounds-check bypass via speculative execution
    x86/syscall: Sanitize syscall table de-references under speculation
    x86/get_user: Use pointer masking to limit speculation
    ...

    Linus Torvalds
     

04 Feb, 2018

1 commit

  • Pull hardened usercopy whitelisting from Kees Cook:
    "Currently, hardened usercopy performs dynamic bounds checking on slab
    cache objects. This is good, but still leaves a lot of kernel memory
    available to be copied to/from userspace in the face of bugs.

    To further restrict what memory is available for copying, this creates
    a way to whitelist specific areas of a given slab cache object for
    copying to/from userspace, allowing much finer granularity of access
    control.

    Slab caches that are never exposed to userspace can declare no
    whitelist for their objects, thereby keeping them unavailable to
    userspace via dynamic copy operations. (Note, an implicit form of
    whitelisting is the use of constant sizes in usercopy operations and
    get_user()/put_user(); these bypass all hardened usercopy checks since
    these sizes cannot change at runtime.)

    This new check is WARN-by-default, so any mistakes can be found over
    the next several releases without breaking anyone's system.

    The series has roughly the following sections:
    - remove %p and improve reporting with offset
    - prepare infrastructure and whitelist kmalloc
    - update VFS subsystem with whitelists
    - update SCSI subsystem with whitelists
    - update network subsystem with whitelists
    - update process memory with whitelists
    - update per-architecture thread_struct with whitelists
    - update KVM with whitelists and fix ioctl bug
    - mark all other allocations as not whitelisted
    - update lkdtm for more sensible test overage"

    * tag 'usercopy-v4.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux: (38 commits)
    lkdtm: Update usercopy tests for whitelisting
    usercopy: Restrict non-usercopy caches to size 0
    kvm: x86: fix KVM_XEN_HVM_CONFIG ioctl
    kvm: whitelist struct kvm_vcpu_arch
    arm: Implement thread_struct whitelist for hardened usercopy
    arm64: Implement thread_struct whitelist for hardened usercopy
    x86: Implement thread_struct whitelist for hardened usercopy
    fork: Provide usercopy whitelisting for task_struct
    fork: Define usercopy region in thread_stack slab caches
    fork: Define usercopy region in mm_struct slab caches
    net: Restrict unwhitelisted proto caches to size 0
    sctp: Copy struct sctp_sock.autoclose to userspace using put_user()
    sctp: Define usercopy region in SCTP proto slab cache
    caif: Define usercopy region in caif proto slab cache
    ip: Define usercopy region in IP proto slab cache
    net: Define usercopy region in struct proto slab cache
    scsi: Define usercopy region in scsi_sense_cache slab cache
    cifs: Define usercopy region in cifs_request slab cache
    vxfs: Define usercopy region in vxfs_inode slab cache
    ufs: Define usercopy region in ufs_inode_cache slab cache
    ...

    Linus Torvalds
     

30 Jan, 2018

2 commits

  • 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

    Josh Poimboeuf
     
  • 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

    Josh Poimboeuf
     

16 Jan, 2018

1 commit

  • In preparation for refactoring the usercopy checks to pass offset to
    the hardened usercopy report, this renames report_usercopy() to the
    more accurate usercopy_abort(), marks it as noreturn because it is,
    adds a hopefully helpful comment for anyone investigating such reports,
    makes the function available to the slab allocators, and adds new "detail"
    and "offset" arguments.

    Signed-off-by: Kees Cook

    Kees Cook
     

12 Jan, 2018

2 commits

  • 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

    Josh Poimboeuf
     
  • 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

    Josh Poimboeuf
     

02 Nov, 2017

1 commit


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
     

28 Sep, 2017

1 commit

  • 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

    Josh Poimboeuf
     

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