From: Sasha Levin Date: Thu, 11 Apr 2019 15:28:37 +0000 (-0400) Subject: patches for 3.18 X-Git-Tag: v4.9.169~43 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2b1b98572933dad587f37e13cf88e007d859148f;p=thirdparty%2Fkernel%2Fstable-queue.git patches for 3.18 Signed-off-by: Sasha Levin --- diff --git a/queue-3.18/lib-string.c-implement-a-basic-bcmp.patch b/queue-3.18/lib-string.c-implement-a-basic-bcmp.patch new file mode 100644 index 00000000000..b684121e717 --- /dev/null +++ b/queue-3.18/lib-string.c-implement-a-basic-bcmp.patch @@ -0,0 +1,111 @@ +From 4974ffe3e72f4a065a9b8f01661a378156b94bd8 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 b29098d154c3..4cf10407ba84 100644 +--- a/include/linux/string.h ++++ b/include/linux/string.h +@@ -113,6 +113,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 de4bf3778958..63be6c2d4551 100644 +--- a/lib/string.c ++++ b/lib/string.c +@@ -778,6 +778,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-3.18/series b/queue-3.18/series index 83cb0fd0bb9..7b077c72888 100644 --- a/queue-3.18/series +++ b/queue-3.18/series @@ -40,3 +40,4 @@ x86-build-mark-per-cpu-symbols-as-absolute-explicitl.patch dmaengine-tegra-avoid-overflow-of-byte-tracking.patch drm-dp-mst-configure-no_stop_bit-correctly-for-remot.patch binfmt_elf-switch-to-new-creds-when-switching-to-new-mm.patch +lib-string.c-implement-a-basic-bcmp.patch