From: Sasha Levin Date: Thu, 11 Apr 2019 15:28:36 +0000 (-0400) Subject: patches for 4.14 X-Git-Tag: v4.9.169~46 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=26e0990b8cc88ea5e3deaf0f9bd418491ed3a126;p=thirdparty%2Fkernel%2Fstable-queue.git patches for 4.14 Signed-off-by: Sasha Levin --- diff --git a/queue-4.14/kbuild-clang-choose-gcc_toolchain_dir-not-on-ld.patch b/queue-4.14/kbuild-clang-choose-gcc_toolchain_dir-not-on-ld.patch new file mode 100644 index 00000000000..d7ebd58a641 --- /dev/null +++ b/queue-4.14/kbuild-clang-choose-gcc_toolchain_dir-not-on-ld.patch @@ -0,0 +1,46 @@ +From 45db3e51befdacad3ad67def7078a61da40507e1 Mon Sep 17 00:00:00 2001 +From: Nick Desaulniers +Date: Mon, 11 Feb 2019 11:30:04 -0800 +Subject: kbuild: clang: choose GCC_TOOLCHAIN_DIR not on LD + +commit ad15006cc78459d059af56729c4d9bed7c7fd860 upstream. + +This causes an issue when trying to build with `make LD=ld.lld` if +ld.lld and the rest of your cross tools aren't in the same directory +(ex. /usr/local/bin) (as is the case for Android's build system), as the +GCC_TOOLCHAIN_DIR then gets set based on `which $(LD)` which will point +where LLVM tools are, not GCC/binutils tools are located. + +Instead, select the GCC_TOOLCHAIN_DIR based on another tool provided by +binutils for which LLVM does not provide a substitute for, such as +elfedit. + +Fixes: 785f11aa595b ("kbuild: Add better clang cross build support") +Link: https://github.com/ClangBuiltLinux/linux/issues/341 +Suggested-by: Nathan Chancellor +Reviewed-by: Nathan Chancellor +Tested-by: Nathan Chancellor +Signed-off-by: Nick Desaulniers +Signed-off-by: Masahiro Yamada +Signed-off-by: Nathan Chancellor +Signed-off-by: Sasha Levin +--- + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index da223c660c9a..85753250984c 100644 +--- a/Makefile ++++ b/Makefile +@@ -480,7 +480,7 @@ endif + ifeq ($(cc-name),clang) + ifneq ($(CROSS_COMPILE),) + CLANG_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%)) +-GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD))) ++GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit)) + CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR) + GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..) + endif +-- +2.19.1 + diff --git a/queue-4.14/lib-string.c-implement-a-basic-bcmp.patch b/queue-4.14/lib-string.c-implement-a-basic-bcmp.patch new file mode 100644 index 00000000000..f7aa14bb867 --- /dev/null +++ b/queue-4.14/lib-string.c-implement-a-basic-bcmp.patch @@ -0,0 +1,111 @@ +From 3bb727e00e5848fe66827ada8b2903b4c2b35a36 Mon Sep 17 00:00:00 2001 +From: Nick Desaulniers +Date: Fri, 5 Apr 2019 18:38:45 -0700 +Subject: lib/string.c: implement a basic bcmp + +[ Upstream commit 5f074f3e192f10c9fade898b9b3b8812e3d83342 ] + +A recent optimization in Clang (r355672) lowers comparisons of the +return value of memcmp against zero to comparisons of the return value +of bcmp against zero. This helps some platforms that implement bcmp +more efficiently than memcmp. glibc simply aliases bcmp to memcmp, but +an optimized implementation is in the works. + +This results in linkage failures for all targets with Clang due to the +undefined symbol. For now, just implement bcmp as a tailcail to memcmp +to unbreak the build. This routine can be further optimized in the +future. + +Other ideas discussed: + + * A weak alias was discussed, but breaks for architectures that define + their own implementations of memcmp since aliases to declarations are + not permitted (only definitions). Arch-specific memcmp + implementations typically declare memcmp in C headers, but implement + them in assembly. + + * -ffreestanding also is used sporadically throughout the kernel. + + * -fno-builtin-bcmp doesn't work when doing LTO. + +Link: https://bugs.llvm.org/show_bug.cgi?id=41035 +Link: https://code.woboq.org/userspace/glibc/string/memcmp.c.html#bcmp +Link: https://github.com/llvm/llvm-project/commit/8e16d73346f8091461319a7dfc4ddd18eedcff13 +Link: https://github.com/ClangBuiltLinux/linux/issues/416 +Link: http://lkml.kernel.org/r/20190313211335.165605-1-ndesaulniers@google.com +Signed-off-by: Nick Desaulniers +Reported-by: Nathan Chancellor +Reported-by: Adhemerval Zanella +Suggested-by: Arnd Bergmann +Suggested-by: James Y Knight +Suggested-by: Masahiro Yamada +Suggested-by: Nathan Chancellor +Suggested-by: Rasmus Villemoes +Acked-by: Steven Rostedt (VMware) +Reviewed-by: Nathan Chancellor +Tested-by: Nathan Chancellor +Reviewed-by: Masahiro Yamada +Reviewed-by: Andy Shevchenko +Cc: David Laight +Cc: Rasmus Villemoes +Cc: Namhyung Kim +Cc: Greg Kroah-Hartman +Cc: Alexander Shishkin +Cc: Dan Williams +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + include/linux/string.h | 3 +++ + lib/string.c | 20 ++++++++++++++++++++ + 2 files changed, 23 insertions(+) + +diff --git a/include/linux/string.h b/include/linux/string.h +index 96115bf561b4..3d43329c20be 100644 +--- a/include/linux/string.h ++++ b/include/linux/string.h +@@ -142,6 +142,9 @@ extern void * memscan(void *,int,__kernel_size_t); + #ifndef __HAVE_ARCH_MEMCMP + extern int memcmp(const void *,const void *,__kernel_size_t); + #endif ++#ifndef __HAVE_ARCH_BCMP ++extern int bcmp(const void *,const void *,__kernel_size_t); ++#endif + #ifndef __HAVE_ARCH_MEMCHR + extern void * memchr(const void *,int,__kernel_size_t); + #endif +diff --git a/lib/string.c b/lib/string.c +index 5e8d410a93df..1530643edf00 100644 +--- a/lib/string.c ++++ b/lib/string.c +@@ -865,6 +865,26 @@ __visible int memcmp(const void *cs, const void *ct, size_t count) + EXPORT_SYMBOL(memcmp); + #endif + ++#ifndef __HAVE_ARCH_BCMP ++/** ++ * bcmp - returns 0 if and only if the buffers have identical contents. ++ * @a: pointer to first buffer. ++ * @b: pointer to second buffer. ++ * @len: size of buffers. ++ * ++ * The sign or magnitude of a non-zero return value has no particular ++ * meaning, and architectures may implement their own more efficient bcmp(). So ++ * while this particular implementation is a simple (tail) call to memcmp, do ++ * not rely on anything but whether the return value is zero or non-zero. ++ */ ++#undef bcmp ++int bcmp(const void *a, const void *b, size_t len) ++{ ++ return memcmp(a, b, len); ++} ++EXPORT_SYMBOL(bcmp); ++#endif ++ + #ifndef __HAVE_ARCH_MEMSCAN + /** + * memscan - Find a character in an area of memory. +-- +2.19.1 + diff --git a/queue-4.14/series b/queue-4.14/series index 3c9f1b136d4..8580fb5f1b8 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -5,3 +5,8 @@ x86-power-32-move-sysenter-msr-restoration-to-fix_pr.patch x86-power-make-restore_processor_context-sane.patch drm-i915-gvt-do-not-let-pin-count-of-shadow-mm-go-ne.patch powerpc-tm-limit-tm-code-inside-ppc_transactional_me.patch +kbuild-clang-choose-gcc_toolchain_dir-not-on-ld.patch +x86-vdso-use-ld-instead-of-cc-to-link.patch +x86-vdso-drop-implicit-common-page-size-linker-flag.patch +lib-string.c-implement-a-basic-bcmp.patch +stating-ccree-revert-staging-ccree-fix-leak-of-impor.patch diff --git a/queue-4.14/stating-ccree-revert-staging-ccree-fix-leak-of-impor.patch b/queue-4.14/stating-ccree-revert-staging-ccree-fix-leak-of-impor.patch new file mode 100644 index 00000000000..084e5b8f83c --- /dev/null +++ b/queue-4.14/stating-ccree-revert-staging-ccree-fix-leak-of-impor.patch @@ -0,0 +1,56 @@ +From b6f2e7667ad28631b07a70e3c45ac089f5db593f Mon Sep 17 00:00:00 2001 +From: Gilad Ben-Yossef +Date: Sun, 7 Jan 2018 12:14:22 +0000 +Subject: stating: ccree: revert "staging: ccree: fix leak of import() after + init()" + +commit 293edc27f8bc8a44978e9e95902b07b74f1c7523 upstream + +This reverts commit c5f39d07860c ("staging: ccree: fix leak of import() +after init()") and commit aece09024414 ("staging: ccree: Uninitialized +return in ssi_ahash_import()"). + +This is the wrong solution and ends up relying on uninitialized memory, +although it was not obvious to me at the time. + +Cc: stable@vger.kernel.org +Signed-off-by: Gilad Ben-Yossef +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sudip Mukherjee +Signed-off-by: Sasha Levin +--- + drivers/staging/ccree/ssi_hash.c | 11 ++++------- + 1 file changed, 4 insertions(+), 7 deletions(-) + +diff --git a/drivers/staging/ccree/ssi_hash.c b/drivers/staging/ccree/ssi_hash.c +index e266a70a1b32..13291aeaf350 100644 +--- a/drivers/staging/ccree/ssi_hash.c ++++ b/drivers/staging/ccree/ssi_hash.c +@@ -1781,7 +1781,7 @@ static int ssi_ahash_import(struct ahash_request *req, const void *in) + struct device *dev = &ctx->drvdata->plat_dev->dev; + struct ahash_req_ctx *state = ahash_request_ctx(req); + u32 tmp; +- int rc = 0; ++ int rc; + + memcpy(&tmp, in, sizeof(u32)); + if (tmp != CC_EXPORT_MAGIC) { +@@ -1790,12 +1790,9 @@ static int ssi_ahash_import(struct ahash_request *req, const void *in) + } + in += sizeof(u32); + +- /* call init() to allocate bufs if the user hasn't */ +- if (!state->digest_buff) { +- rc = ssi_hash_init(state, ctx); +- if (rc) +- goto out; +- } ++ rc = ssi_hash_init(state, ctx); ++ if (rc) ++ goto out; + + dma_sync_single_for_cpu(dev, state->digest_buff_dma_addr, + ctx->inter_digestsize, DMA_BIDIRECTIONAL); +-- +2.19.1 + diff --git a/queue-4.14/x86-vdso-drop-implicit-common-page-size-linker-flag.patch b/queue-4.14/x86-vdso-drop-implicit-common-page-size-linker-flag.patch new file mode 100644 index 00000000000..07dab30913d --- /dev/null +++ b/queue-4.14/x86-vdso-drop-implicit-common-page-size-linker-flag.patch @@ -0,0 +1,59 @@ +From 0187bae4d0e6e7897d4fdea3ea3a6e1cb64687f1 Mon Sep 17 00:00:00 2001 +From: Nick Desaulniers +Date: Thu, 6 Dec 2018 11:12:31 -0800 +Subject: x86/vdso: Drop implicit common-page-size linker flag + +commit ac3e233d29f7f77f28243af0132057d378d3ea58 upstream. + +GNU linker's -z common-page-size's default value is based on the target +architecture. arch/x86/entry/vdso/Makefile sets it to the architecture +default, which is implicit and redundant. Drop it. + +Fixes: 2aae950b21e4 ("x86_64: Add vDSO for x86-64 with gettimeofday/clock_gettime/getcpu") +Reported-by: Dmitry Golovin +Reported-by: Bill Wendling +Suggested-by: Dmitry Golovin +Suggested-by: Rui Ueyama +Signed-off-by: Nick Desaulniers +Signed-off-by: Borislav Petkov +Acked-by: Andy Lutomirski +Cc: Andi Kleen +Cc: Fangrui Song +Cc: "H. Peter Anvin" +Cc: Ingo Molnar +Cc: Thomas Gleixner +Cc: x86-ml +Link: https://lkml.kernel.org/r/20181206191231.192355-1-ndesaulniers@google.com +Link: https://bugs.llvm.org/show_bug.cgi?id=38774 +Link: https://github.com/ClangBuiltLinux/linux/issues/31 +Signed-off-by: Nathan Chancellor +Signed-off-by: Sasha Levin +--- + arch/x86/entry/vdso/Makefile | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/entry/vdso/Makefile b/arch/x86/entry/vdso/Makefile +index 0defcc939ab4..839015f1b0de 100644 +--- a/arch/x86/entry/vdso/Makefile ++++ b/arch/x86/entry/vdso/Makefile +@@ -49,7 +49,7 @@ targets += $(vdso_img_sodbg) + export CPPFLAGS_vdso.lds += -P -C + + VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -soname linux-vdso.so.1 --no-undefined \ +- -z max-page-size=4096 -z common-page-size=4096 ++ -z max-page-size=4096 + + $(obj)/vdso64.so.dbg: $(src)/vdso.lds $(vobjs) FORCE + $(call if_changed,vdso) +@@ -102,7 +102,7 @@ CFLAGS_REMOVE_vvar.o = -pg + + CPPFLAGS_vdsox32.lds = $(CPPFLAGS_vdso.lds) + VDSO_LDFLAGS_vdsox32.lds = -m elf32_x86_64 -soname linux-vdso.so.1 \ +- -z max-page-size=4096 -z common-page-size=4096 ++ -z max-page-size=4096 + + # 64-bit objects to re-brand as x32 + vobjs64-for-x32 := $(filter-out $(vobjs-nox32),$(vobjs-y)) +-- +2.19.1 + diff --git a/queue-4.14/x86-vdso-use-ld-instead-of-cc-to-link.patch b/queue-4.14/x86-vdso-use-ld-instead-of-cc-to-link.patch new file mode 100644 index 00000000000..6e538423f11 --- /dev/null +++ b/queue-4.14/x86-vdso-use-ld-instead-of-cc-to-link.patch @@ -0,0 +1,111 @@ +From 71b2ce1b044539753bbca8628860162b0c53c4f6 Mon Sep 17 00:00:00 2001 +From: Alistair Strachan +Date: Fri, 3 Aug 2018 10:39:31 -0700 +Subject: x86: vdso: Use $LD instead of $CC to link + +commit 379d98ddf41344273d9718556f761420f4dc80b3 upstream. + +The vdso{32,64}.so can fail to link with CC=clang when clang tries to find +a suitable GCC toolchain to link these libraries with. + +/usr/bin/ld: arch/x86/entry/vdso/vclock_gettime.o: + access beyond end of merged section (782) + +This happens because the host environment leaked into the cross compiler +environment due to the way clang searches for suitable GCC toolchains. + +Clang is a retargetable compiler, and each invocation of it must provide +--target= --gcc-toolchain= to allow it to find the +correct binutils for cross compilation. These flags had been added to +KBUILD_CFLAGS, but the vdso code uses CC and not KBUILD_CFLAGS (for various +reasons) which breaks clang's ability to find the correct linker when cross +compiling. + +Most of the time this goes unnoticed because the host linker is new enough +to work anyway, or is incompatible and skipped, but this cannot be reliably +assumed. + +This change alters the vdso makefile to just use LD directly, which +bypasses clang and thus the searching problem. The makefile will just use +${CROSS_COMPILE}ld instead, which is always what we want. This matches the +method used to link vmlinux. + +This drops references to DISABLE_LTO; this option doesn't seem to be set +anywhere, and not knowing what its possible values are, it's not clear how +to convert it from CC to LD flag. + +Signed-off-by: Alistair Strachan +Signed-off-by: Thomas Gleixner +Acked-by: Andy Lutomirski +Cc: "H. Peter Anvin" +Cc: Greg Kroah-Hartman +Cc: kernel-team@android.com +Cc: joel@joelfernandes.org +Cc: Andi Kleen +Link: https://lkml.kernel.org/r/20180803173931.117515-1-astrachan@google.com +Signed-off-by: Nathan Chancellor +Signed-off-by: Sasha Levin +--- + arch/x86/entry/vdso/Makefile | 22 +++++++++------------- + 1 file changed, 9 insertions(+), 13 deletions(-) + +diff --git a/arch/x86/entry/vdso/Makefile b/arch/x86/entry/vdso/Makefile +index 0a550dc5c525..0defcc939ab4 100644 +--- a/arch/x86/entry/vdso/Makefile ++++ b/arch/x86/entry/vdso/Makefile +@@ -48,10 +48,8 @@ targets += $(vdso_img_sodbg) + + export CPPFLAGS_vdso.lds += -P -C + +-VDSO_LDFLAGS_vdso.lds = -m64 -Wl,-soname=linux-vdso.so.1 \ +- -Wl,--no-undefined \ +- -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096 \ +- $(DISABLE_LTO) ++VDSO_LDFLAGS_vdso.lds = -m elf_x86_64 -soname linux-vdso.so.1 --no-undefined \ ++ -z max-page-size=4096 -z common-page-size=4096 + + $(obj)/vdso64.so.dbg: $(src)/vdso.lds $(vobjs) FORCE + $(call if_changed,vdso) +@@ -103,10 +101,8 @@ CFLAGS_REMOVE_vvar.o = -pg + # + + CPPFLAGS_vdsox32.lds = $(CPPFLAGS_vdso.lds) +-VDSO_LDFLAGS_vdsox32.lds = -Wl,-m,elf32_x86_64 \ +- -Wl,-soname=linux-vdso.so.1 \ +- -Wl,-z,max-page-size=4096 \ +- -Wl,-z,common-page-size=4096 ++VDSO_LDFLAGS_vdsox32.lds = -m elf32_x86_64 -soname linux-vdso.so.1 \ ++ -z max-page-size=4096 -z common-page-size=4096 + + # 64-bit objects to re-brand as x32 + vobjs64-for-x32 := $(filter-out $(vobjs-nox32),$(vobjs-y)) +@@ -134,7 +130,7 @@ $(obj)/vdsox32.so.dbg: $(src)/vdsox32.lds $(vobjx32s) FORCE + $(call if_changed,vdso) + + CPPFLAGS_vdso32.lds = $(CPPFLAGS_vdso.lds) +-VDSO_LDFLAGS_vdso32.lds = -m32 -Wl,-m,elf_i386 -Wl,-soname=linux-gate.so.1 ++VDSO_LDFLAGS_vdso32.lds = -m elf_i386 -soname linux-gate.so.1 + + # This makes sure the $(obj) subdirectory exists even though vdso32/ + # is not a kbuild sub-make subdirectory. +@@ -180,13 +176,13 @@ $(obj)/vdso32.so.dbg: FORCE \ + # The DSO images are built using a special linker script. + # + quiet_cmd_vdso = VDSO $@ +- cmd_vdso = $(CC) -nostdlib -o $@ \ ++ cmd_vdso = $(LD) -nostdlib -o $@ \ + $(VDSO_LDFLAGS) $(VDSO_LDFLAGS_$(filter %.lds,$(^F))) \ +- -Wl,-T,$(filter %.lds,$^) $(filter %.o,$^) && \ ++ -T $(filter %.lds,$^) $(filter %.o,$^) && \ + sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@' + +-VDSO_LDFLAGS = -fPIC -shared $(call cc-ldoption, -Wl$(comma)--hash-style=both) \ +- $(call cc-ldoption, -Wl$(comma)--build-id) -Wl,-Bsymbolic $(LTO_CFLAGS) ++VDSO_LDFLAGS = -shared $(call ld-option, --hash-style=both) \ ++ $(call ld-option, --build-id) -Bsymbolic + GCOV_PROFILE := n + + # +-- +2.19.1 +