mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 21:51:05 +00:00
compiler.h: fix barrier_data() on clang
Commit815f0ddb34
("include/linux/compiler*.h: make compiler-*.h mutually exclusive") neglected to copy barrier_data() from compiler-gcc.h into compiler-clang.h. The definition in compiler-gcc.h was really to work around clang's more aggressive optimization, so this broke barrier_data() on clang, and consequently memzero_explicit() as well. For example, this results in at least the memzero_explicit() call in lib/crypto/sha256.c:sha256_transform() being optimized away by clang. Fix this by moving the definition of barrier_data() into compiler.h. Also move the gcc/clang definition of barrier() into compiler.h, __memory_barrier() is icc-specific (and barrier() is already defined using it in compiler-intel.h) and doesn't belong in compiler.h. [rdunlap@infradead.org: fix ALPHA builds when SMP is not enabled] Link: https://lkml.kernel.org/r/20201101231835.4589-1-rdunlap@infradead.org Fixes:815f0ddb34
("include/linux/compiler*.h: make compiler-*.h mutually exclusive") Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu> Signed-off-by: Randy Dunlap <rdunlap@infradead.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Tested-by: Nick Desaulniers <ndesaulniers@google.com> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Reviewed-by: Kees Cook <keescook@chromium.org> Cc: <stable@vger.kernel.org> Link: https://lkml.kernel.org/r/20201014212631.207844-1-nivedita@alum.mit.edu Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
96e1fac162
commit
3347acc6fc
4 changed files with 17 additions and 27 deletions
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#include <linux/compiler.h>
|
||||||
#include <asm/rwonce.h>
|
#include <asm/rwonce.h>
|
||||||
|
|
||||||
#ifndef nop
|
#ifndef nop
|
||||||
|
|
|
@ -60,12 +60,6 @@
|
||||||
#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
|
#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The following are for compatibility with GCC, from compiler-gcc.h,
|
|
||||||
* and may be redefined here because they should not be shared with other
|
|
||||||
* compilers, like ICC.
|
|
||||||
*/
|
|
||||||
#define barrier() __asm__ __volatile__("" : : : "memory")
|
|
||||||
|
|
||||||
#if __has_feature(shadow_call_stack)
|
#if __has_feature(shadow_call_stack)
|
||||||
# define __noscs __attribute__((__no_sanitize__("shadow-call-stack")))
|
# define __noscs __attribute__((__no_sanitize__("shadow-call-stack")))
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -15,25 +15,6 @@
|
||||||
# error Sorry, your version of GCC is too old - please use 4.9 or newer.
|
# error Sorry, your version of GCC is too old - please use 4.9 or newer.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Optimization barrier */
|
|
||||||
|
|
||||||
/* The "volatile" is due to gcc bugs */
|
|
||||||
#define barrier() __asm__ __volatile__("": : :"memory")
|
|
||||||
/*
|
|
||||||
* This version is i.e. to prevent dead stores elimination on @ptr
|
|
||||||
* where gcc and llvm may behave differently when otherwise using
|
|
||||||
* normal barrier(): while gcc behavior gets along with a normal
|
|
||||||
* barrier(), llvm needs an explicit input variable to be assumed
|
|
||||||
* clobbered. The issue is as follows: while the inline asm might
|
|
||||||
* access any memory it wants, the compiler could have fit all of
|
|
||||||
* @ptr into memory registers instead, and since @ptr never escaped
|
|
||||||
* from that, it proved that the inline asm wasn't touching any of
|
|
||||||
* it. This version works well with both compilers, i.e. we're telling
|
|
||||||
* the compiler that the inline asm absolutely may see the contents
|
|
||||||
* of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
|
|
||||||
*/
|
|
||||||
#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This macro obfuscates arithmetic on a variable address so that gcc
|
* This macro obfuscates arithmetic on a variable address so that gcc
|
||||||
* shouldn't recognize the original var, and make assumptions about it.
|
* shouldn't recognize the original var, and make assumptions about it.
|
||||||
|
|
|
@ -80,11 +80,25 @@ void ftrace_likely_update(struct ftrace_likely_data *f, int val,
|
||||||
|
|
||||||
/* Optimization barrier */
|
/* Optimization barrier */
|
||||||
#ifndef barrier
|
#ifndef barrier
|
||||||
# define barrier() __memory_barrier()
|
/* The "volatile" is due to gcc bugs */
|
||||||
|
# define barrier() __asm__ __volatile__("": : :"memory")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef barrier_data
|
#ifndef barrier_data
|
||||||
# define barrier_data(ptr) barrier()
|
/*
|
||||||
|
* This version is i.e. to prevent dead stores elimination on @ptr
|
||||||
|
* where gcc and llvm may behave differently when otherwise using
|
||||||
|
* normal barrier(): while gcc behavior gets along with a normal
|
||||||
|
* barrier(), llvm needs an explicit input variable to be assumed
|
||||||
|
* clobbered. The issue is as follows: while the inline asm might
|
||||||
|
* access any memory it wants, the compiler could have fit all of
|
||||||
|
* @ptr into memory registers instead, and since @ptr never escaped
|
||||||
|
* from that, it proved that the inline asm wasn't touching any of
|
||||||
|
* it. This version works well with both compilers, i.e. we're telling
|
||||||
|
* the compiler that the inline asm absolutely may see the contents
|
||||||
|
* of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
|
||||||
|
*/
|
||||||
|
# define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* workaround for GCC PR82365 if needed */
|
/* workaround for GCC PR82365 if needed */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue