mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-01-04 22:54:56 +01:00
Pull more x86 updates from Borislav Petkov: - Remove a bunch of asm implementing condition flags testing in KVM's emulator in favor of int3_emulate_jcc() which is written in C - Replace KVM fastops with C-based stubs which avoids problems with the fastop infra related to latter not adhering to the C ABI due to their special calling convention and, more importantly, bypassing compiler control-flow integrity checking because they're written in asm - Remove wrongly used static branches and other ugliness accumulated over time in hyperv's hypercall implementation with a proper static function call to the correct hypervisor call variant - Add some fixes and modifications to allow running FRED-enabled kernels in KVM even on non-FRED hardware - Add kCFI improvements like validating indirect calls and prepare for enabling kCFI with GCC. Add cmdline params documentation and other code cleanups - Use the single-byte 0xd6 insn as the official #UD single-byte undefined opcode instruction as agreed upon by both x86 vendors - Other smaller cleanups and touchups all over the place * tag 'x86_core_for_v6.18_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (24 commits) x86,retpoline: Optimize patch_retpoline() x86,ibt: Use UDB instead of 0xEA x86/cfi: Remove __noinitretpoline and __noretpoline x86/cfi: Add "debug" option to "cfi=" bootparam x86/cfi: Standardize on common "CFI:" prefix for CFI reports x86/cfi: Document the "cfi=" bootparam options x86/traps: Clarify KCFI instruction layout compiler_types.h: Move __nocfi out of compiler-specific header objtool: Validate kCFI calls x86/fred: KVM: VMX: Always use FRED for IRQs when CONFIG_X86_FRED=y x86/fred: Play nice with invoking asm_fred_entry_from_kvm() on non-FRED hardware x86/fred: Install system vector handlers even if FRED isn't fully enabled x86/hyperv: Use direct call to hypercall-page x86/hyperv: Clean up hv_do_hypercall() KVM: x86: Remove fastops KVM: x86: Convert em_salc() to C KVM: x86: Introduce EM_ASM_3WCL KVM: x86: Introduce EM_ASM_1SRC2 KVM: x86: Introduce EM_ASM_2CL KVM: x86: Introduce EM_ASM_2W ...
156 lines
5.0 KiB
C
156 lines
5.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __LINUX_COMPILER_TYPES_H
|
|
#error "Please do not include <linux/compiler-clang.h> directly, include <linux/compiler.h> instead."
|
|
#endif
|
|
|
|
/* Compiler specific definitions for Clang compiler */
|
|
|
|
/*
|
|
* Clang prior to 17 is being silly and considers many __cleanup() variables
|
|
* as unused (because they are, their sole purpose is to go out of scope).
|
|
*
|
|
* https://github.com/llvm/llvm-project/commit/877210faa447f4cc7db87812f8ed80e398fedd61
|
|
*/
|
|
#undef __cleanup
|
|
#define __cleanup(func) __maybe_unused __attribute__((__cleanup__(func)))
|
|
|
|
/* all clang versions usable with the kernel support KASAN ABI version 5 */
|
|
#define KASAN_ABI_VERSION 5
|
|
|
|
/*
|
|
* Clang 22 added preprocessor macros to match GCC, in hopes of eventually
|
|
* dropping __has_feature support for sanitizers:
|
|
* https://github.com/llvm/llvm-project/commit/568c23bbd3303518c5056d7f03444dae4fdc8a9c
|
|
* Create these macros for older versions of clang so that it is easy to clean
|
|
* up once the minimum supported version of LLVM for building the kernel always
|
|
* creates these macros.
|
|
*
|
|
* 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) && !defined(__SANITIZE_ADDRESS__)
|
|
#define __SANITIZE_ADDRESS__
|
|
#endif
|
|
#if __has_feature(hwaddress_sanitizer) && !defined(__SANITIZE_HWADDRESS__)
|
|
#define __SANITIZE_HWADDRESS__
|
|
#endif
|
|
#if __has_feature(thread_sanitizer) && !defined(__SANITIZE_THREAD__)
|
|
#define __SANITIZE_THREAD__
|
|
#endif
|
|
|
|
/*
|
|
* Treat __SANITIZE_HWADDRESS__ the same as __SANITIZE_ADDRESS__ in the kernel.
|
|
*/
|
|
#ifdef __SANITIZE_HWADDRESS__
|
|
#define __SANITIZE_ADDRESS__
|
|
#endif
|
|
|
|
#ifdef __SANITIZE_ADDRESS__
|
|
#define __no_sanitize_address \
|
|
__attribute__((no_sanitize("address", "hwaddress")))
|
|
#else
|
|
#define __no_sanitize_address
|
|
#endif
|
|
|
|
#ifdef __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
|
|
|
|
#if __has_feature(memory_sanitizer)
|
|
#define __SANITIZE_MEMORY__
|
|
/*
|
|
* Unlike other sanitizers, KMSAN still inserts code into functions marked with
|
|
* no_sanitize("kernel-memory"). Using disable_sanitizer_instrumentation
|
|
* provides the behavior consistent with other __no_sanitize_ attributes,
|
|
* guaranteeing that __no_sanitize_memory functions remain uninstrumented.
|
|
*/
|
|
#define __no_sanitize_memory __disable_sanitizer_instrumentation
|
|
|
|
/*
|
|
* The __no_kmsan_checks attribute ensures that a function does not produce
|
|
* false positive reports by:
|
|
* - initializing all local variables and memory stores in this function;
|
|
* - skipping all shadow checks;
|
|
* - passing initialized arguments to this function's callees.
|
|
*/
|
|
#define __no_kmsan_checks __attribute__((no_sanitize("kernel-memory")))
|
|
#else
|
|
#define __no_sanitize_memory
|
|
#define __no_kmsan_checks
|
|
#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
|
|
|
|
/* Only Clang needs to disable the coverage sanitizer for kstack_erase. */
|
|
#define __no_kstack_erase __no_sanitize_coverage
|
|
|
|
#if __has_feature(shadow_call_stack)
|
|
# define __noscs __attribute__((__no_sanitize__("shadow-call-stack")))
|
|
#endif
|
|
|
|
/*
|
|
* Turn individual warnings and errors on and off locally, depending
|
|
* on version.
|
|
*/
|
|
#define __diag_clang(version, severity, s) \
|
|
__diag_clang_ ## version(__diag_clang_ ## severity s)
|
|
|
|
/* Severity used in pragma directives */
|
|
#define __diag_clang_ignore ignored
|
|
#define __diag_clang_warn warning
|
|
#define __diag_clang_error error
|
|
|
|
#define __diag_str1(s) #s
|
|
#define __diag_str(s) __diag_str1(s)
|
|
#define __diag(s) _Pragma(__diag_str(clang diagnostic s))
|
|
|
|
#define __diag_clang_13(s) __diag(s)
|
|
|
|
#define __diag_ignore_all(option, comment) \
|
|
__diag_clang(13, ignore, option)
|
|
|
|
/*
|
|
* clang has horrible behavior with "g" or "rm" constraints for asm
|
|
* inputs, turning them into something worse than "m". Avoid using
|
|
* constraints with multiple possible uses (but "ir" seems to be ok):
|
|
*
|
|
* https://github.com/llvm/llvm-project/issues/20571
|
|
*/
|
|
#define ASM_INPUT_G "ir"
|
|
#define ASM_INPUT_RM "r"
|
|
|
|
/*
|
|
* Declare compiler support for __typeof_unqual__() operator.
|
|
*
|
|
* Bindgen uses LLVM even if our C compiler is GCC, so we cannot
|
|
* rely on the auto-detected CONFIG_CC_HAS_TYPEOF_UNQUAL.
|
|
*/
|
|
#define CC_HAS_TYPEOF_UNQUAL (__clang_major__ >= 19)
|