Clang 14 added support for the __builtin_function_start function,
which allows us to implement the function_nocfi macro without
architecture-specific inline assembly and in a way that also works
with static initializers.
Change CONFIG_CFI_CLANG to depend on Clang >= 14, define
function_nocfi using __builtin_function_start, and remove the arm64
inline assembly implementation.
Link: ec2e26eaf6
Link: https://github.com/ClangBuiltLinux/linux/issues/1353
Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Tested-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Will Deacon <will@kernel.org> # arm64
Reviewed-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
Bug: 244543039
Bug: 244373730
Link: https://lore.kernel.org/r/20220405221618.633743-1-samitolvanen@google.com
(cherry picked from commit e6f3b3c9c109ed57230996cf4a4c1b8ae7e36a81)
Change-Id: I71d0e805fc66123107ff51f6e30d689948d64fa1
Signed-off-by: Vincent Donnefort <vdonnefort@google.com>
81 lines
2.6 KiB
C
81 lines
2.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __LINUX_COMPILER_TYPES_H
|
|
#error "Please don't include <linux/compiler-clang.h> directly, include <linux/compiler.h> instead."
|
|
#endif
|
|
|
|
/* Compiler specific definitions for Clang compiler */
|
|
|
|
/* same as gcc, this was present in clang-2.6 so we can assume it works
|
|
* with any version that can compile the kernel
|
|
*/
|
|
#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
|
|
|
|
/* all clang versions usable with the kernel support KASAN ABI version 5 */
|
|
#define KASAN_ABI_VERSION 5
|
|
|
|
/*
|
|
* Note: Checking __has_feature(*_sanitizer) is only true if the feature is
|
|
* enabled. Therefore it is not required to additionally check defined(CONFIG_*)
|
|
* to avoid adding redundant attributes in other configurations.
|
|
*/
|
|
|
|
#if __has_feature(address_sanitizer) || __has_feature(hwaddress_sanitizer)
|
|
/* Emulate GCC's __SANITIZE_ADDRESS__ flag */
|
|
#define __SANITIZE_ADDRESS__
|
|
#define __no_sanitize_address \
|
|
__attribute__((no_sanitize("address", "hwaddress")))
|
|
#else
|
|
#define __no_sanitize_address
|
|
#endif
|
|
|
|
#if __has_feature(thread_sanitizer)
|
|
/* emulate gcc's __SANITIZE_THREAD__ flag */
|
|
#define __SANITIZE_THREAD__
|
|
#define __no_sanitize_thread \
|
|
__attribute__((no_sanitize("thread")))
|
|
#else
|
|
#define __no_sanitize_thread
|
|
#endif
|
|
|
|
#if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP)
|
|
#define __HAVE_BUILTIN_BSWAP32__
|
|
#define __HAVE_BUILTIN_BSWAP64__
|
|
#define __HAVE_BUILTIN_BSWAP16__
|
|
#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
|
|
|
|
#if __has_feature(undefined_behavior_sanitizer)
|
|
/* GCC does not have __SANITIZE_UNDEFINED__ */
|
|
#define __no_sanitize_undefined \
|
|
__attribute__((no_sanitize("undefined")))
|
|
#else
|
|
#define __no_sanitize_undefined
|
|
#endif
|
|
|
|
/*
|
|
* Support for __has_feature(coverage_sanitizer) was added in Clang 13 together
|
|
* with no_sanitize("coverage"). Prior versions of Clang support coverage
|
|
* instrumentation, but cannot be queried for support by the preprocessor.
|
|
*/
|
|
#if __has_feature(coverage_sanitizer)
|
|
#define __no_sanitize_coverage __attribute__((no_sanitize("coverage")))
|
|
#else
|
|
#define __no_sanitize_coverage
|
|
#endif
|
|
|
|
#if __has_feature(shadow_call_stack)
|
|
# define __noscs __attribute__((__no_sanitize__("shadow-call-stack")))
|
|
#endif
|
|
|
|
#define __nocfi __attribute__((__no_sanitize__("cfi")))
|
|
#define __cficanonical __attribute__((__cfi_canonical_jump_table__))
|
|
|
|
#if defined(CONFIG_CFI_CLANG)
|
|
/*
|
|
* With CONFIG_CFI_CLANG, the compiler replaces function address
|
|
* references with the address of the function's CFI jump table
|
|
* entry. The function_nocfi macro always returns the address of the
|
|
* actual function instead.
|
|
*/
|
|
#define function_nocfi(x) __builtin_function_start(x)
|
|
#endif
|