mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
x86/build/64: Prevent native builds from generating EGPR use
Omar reports that CONFIG_X86_NATIVE_CPU=y allows builds to opportunistically emit instructions using %r16-%r31 (EGPRs) when the build host supports APX since the commit:ea1dcca1de("x86/kbuild/64: Add the CONFIG_X86_NATIVE_CPU option to locally optimize the kernel with '-march=native'") But the kernel is not yet prepared to use new registers internally. For example, there is no context-switch support for general in-kernel use. Explicitly disable EGPR use when building with -march=native. For C, since GCC 14 and Clang 18, both compilers support suppressing EGPR use with -mno-apx-features=egpr, whose availability can be detected via cc-option. For Rust, pass features=-apxf through the generated JSON to avoid unstable-feature warnings, see https://github.com/rust-lang/rust/issues/139284 Note Rust only accepts the option to disable APX instructions entirely or not. Support for this gating also depends on the Rust/LLVM combination. Rust 1.88 introduced the `apxf` feature option, but versions prior to 1.93 may emit an `apxf` attribute to the backend that only LLVM 23 or later can interpret. Restrict native Rust builds accordingly. Fixes:ea1dcca1de("x86/kbuild/64: Add the CONFIG_X86_NATIVE_CPU option to locally optimize the kernel with '-march=native'") Reported-by: Omar Avelar <omar.avelar@intel.com> Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Reviewed-by: Nathan Chancellor <nathan@kernel.org> Acked-by: Miguel Ojeda <ojeda@kernel.org> Cc: stable@vger.kernel.org Link: https://patch.msgid.link/20260916230003.1144622-1-chang.seok.bae@intel.com
This commit is contained in:
parent
96443a53bc
commit
63edf5a009
|
|
@ -204,10 +204,21 @@ config CC_HAS_MARCH_NATIVE
|
|||
# usage warnings that only appear wth '-march=native'.
|
||||
depends on CC_IS_GCC || CLANG_VERSION >= 190100
|
||||
|
||||
config RUSTC_HAS_APXF
|
||||
# The kernel isn't ready for in-kernel APX instructions. Without
|
||||
# explicit frontend gating of APX, the backend may emit those
|
||||
# instructions in native builds.
|
||||
#
|
||||
# Rust 1.88 added the `apxf` feature option, but versions before 1.93
|
||||
# emit an `apxf` target attribute that only LLVM 23+ can interpret.
|
||||
def_bool (RUSTC_VERSION >= 108800 && RUSTC_LLVM_MAJOR_VERSION >= 23) || \
|
||||
RUSTC_VERSION >= 109300
|
||||
|
||||
config X86_NATIVE_CPU
|
||||
bool "Build and optimize for local/native CPU"
|
||||
depends on X86_64
|
||||
depends on CC_HAS_MARCH_NATIVE
|
||||
depends on !RUST || RUSTC_HAS_APXF
|
||||
help
|
||||
Optimize for the current CPU used to compile the kernel.
|
||||
Use this option if you intend to build the kernel for your
|
||||
|
|
|
|||
|
|
@ -161,6 +161,11 @@ else
|
|||
|
||||
ifdef CONFIG_X86_NATIVE_CPU
|
||||
KBUILD_CFLAGS += -march=native
|
||||
# Prevent the compiler from generating EGPR use. The kernel is
|
||||
# not yet prepared for general in-kernel use.
|
||||
KBUILD_CFLAGS += $(call cc-option,-mno-apx-features=egpr)
|
||||
|
||||
# generate_rust_target.rs handles Rust APX gating.
|
||||
KBUILD_RUSTFLAGS += -Ctarget-cpu=native
|
||||
else
|
||||
KBUILD_CFLAGS += -march=x86-64 -mtune=generic
|
||||
|
|
|
|||
|
|
@ -224,6 +224,11 @@ fn main() {
|
|||
features += ",+harden-sls-ijmp";
|
||||
features += ",+harden-sls-ret";
|
||||
}
|
||||
if cfg.has("X86_NATIVE_CPU") {
|
||||
// Prevent the backend from generating APX instructions. The kernel is not yet prepared
|
||||
// for general in-kernel EGPR use.
|
||||
features += ",-apxf";
|
||||
}
|
||||
ts.push("features", features);
|
||||
ts.push("llvm-target", "x86_64-linux-gnu");
|
||||
ts.push("supported-sanitizers", ["kcfi", "kernel-address"]);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user