[GIT PULL] objtool changes for v5.2: Add build-time uaccess permissions and DF validation

From: Ingo Molnar
Date: Mon May 06 2019 - 03:25:56 EST


Linus,

Please pull the latest core-objtool-for-linus git tree from:

git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core-objtool-for-linus

# HEAD: 29da93fea3ea39ab9b12270cc6be1b70ef201c9e mm/uaccess: Use 'unsigned long' to placate UBSAN warnings on older GCC versions

This is a series from Peter Zijlstra that adds x86 build-time uaccess
validation of SMAP to objtool, which will detect and warn about the
following uaccess API usage bugs and weirdnesses:

call to %s() with UACCESS enabled
return with UACCESS enabled
return with UACCESS disabled from a UACCESS-safe function
recursive UACCESS enable
redundant UACCESS disable
UACCESS-safe disables UACCESS

As it turns out not leaking uaccess permissions outside the intended
uaccess functionality is hard when the interfaces are complex and when
such bugs are mostly dormant.

As a bonus we now also check the DF flag. We had at least one
high-profile bug in that area in the early days of Linux, and the
checking is fairly simple. The checks performed and warnings emitted are:

call to %s() with DF set
return with DF set
return with modified stack frame
recursive STD
redundant CLD

It's all x86-only for now, but later on this can also be used for PAN on
ARM and objtool is fairly cross-platform in principle.

While all warnings emitted by this new checking facility that got
reported to us were fixed, there might be GCC version dependent warnings
that were not reported yet - which we'll address, should they trigger.

The warnings are non-fatal build warnings.

Thanks,

Ingo

------------------>
Josh Poimboeuf (1):
tracing: Improve "if" macro code generation

Peter Zijlstra (26):
sched/x86: Save [ER]FLAGS on context switch
x86/ia32: Fix ia32_restore_sigcontext() AC leak
i915, uaccess: Fix redundant CLAC
x86/uaccess: Move copy_user_handle_tail() into asm
x86/uaccess: Fix up the fixup
x86/nospec, objtool: Introduce ANNOTATE_IGNORE_ALTERNATIVE
x86/uaccess, xen: Suppress SMAP warnings
x86/uaccess: Always inline user_access_begin()
x86/uaccess, signal: Fix AC=1 bloat
x86/uaccess: Introduce user_access_{save,restore}()
x86/smap: Ditch __stringify()
x86/uaccess, kasan: Fix KASAN vs SMAP
x86/uaccess, ubsan: Fix UBSAN vs. SMAP
x86/uaccess, ftrace: Fix ftrace_likely_update() vs. SMAP
x86/uaccess, kcov: Disable stack protector
objtool: Set insn->func for alternatives
objtool: Handle function aliases
objtool: Rewrite add_ignores()
objtool: Add --backtrace support
objtool: Rewrite alt->skip_orig
objtool: Fix sibling call detection
objtool: Add UACCESS validation
objtool: Add Direction Flag validation
sched/x86_64: Don't save flags on context switch
x86/uaccess: Dont leak the AC flag into __put_user() argument evaluation
mm/uaccess: Use 'unsigned long' to placate UBSAN warnings on older GCC versions


arch/x86/entry/entry_32.S | 2 +
arch/x86/ia32/ia32_signal.c | 29 ++-
arch/x86/include/asm/alternative-asm.h | 11 +
arch/x86/include/asm/alternative.h | 10 +
arch/x86/include/asm/asm.h | 24 --
arch/x86/include/asm/nospec-branch.h | 28 +-
arch/x86/include/asm/smap.h | 37 ++-
arch/x86/include/asm/switch_to.h | 1 +
arch/x86/include/asm/uaccess.h | 12 +-
arch/x86/include/asm/uaccess_64.h | 3 -
arch/x86/include/asm/xen/hypercall.h | 24 +-
arch/x86/kernel/process_32.c | 7 +
arch/x86/kernel/process_64.c | 1 +
arch/x86/kernel/signal.c | 29 ++-
arch/x86/lib/copy_user_64.S | 48 ++++
arch/x86/lib/memcpy_64.S | 3 +-
arch/x86/lib/usercopy_64.c | 20 --
drivers/gpu/drm/i915/i915_gem_execbuffer.c | 6 +-
include/linux/compiler.h | 2 +-
include/linux/uaccess.h | 2 +
kernel/Makefile | 1 +
kernel/trace/trace_branch.c | 4 +
lib/Makefile | 1 +
lib/strncpy_from_user.c | 5 +-
lib/strnlen_user.c | 4 +-
lib/ubsan.c | 4 +
mm/kasan/Makefile | 3 +
mm/kasan/common.c | 10 +
mm/kasan/report.c | 3 +-
scripts/Makefile.build | 3 +
tools/objtool/arch.h | 8 +-
tools/objtool/arch/x86/decode.c | 21 +-
tools/objtool/builtin-check.c | 4 +-
tools/objtool/builtin.h | 2 +-
tools/objtool/check.c | 400 ++++++++++++++++++++++-------
tools/objtool/check.h | 4 +-
tools/objtool/elf.c | 15 +-
tools/objtool/elf.h | 3 +-
tools/objtool/special.c | 18 ++
tools/objtool/special.h | 1 +
tools/objtool/warn.h | 8 +
41 files changed, 602 insertions(+), 219 deletions(-)