On Mon, Aug 26, 2024 at 02:22:52PM +0000, Alice Ryhl wrote: > This patch adds all of the flags that are needed to support the shadow > call stack (SCS) sanitizer with Rust, and updates Kconfig to allow only > configurations that work. > > The -Zfixed-x18 flag is required to use SCS on arm64, and requires rustc > version 1.80.0 or greater. This restriction is reflected in Kconfig. > > When CONFIG_DYNAMIC_SCS is enabled, the build will be configured to > include unwind tables in the build artifacts. Dynamic SCS uses the > unwind tables at boot to find all places that need to be patched. The > -Cforce-unwind-tables=y flag ensures that unwind tables are available > for Rust code. > > In non-dynamic mode, the -Zsanitizer=shadow-call-stack flag is what > enables the SCS sanitizer. Using this flag requires rustc version 1.82.0 > or greater on the targets used by Rust in the kernel. This restriction > is reflected in Kconfig. > > It is possible to avoid the requirement of rustc 1.80.0 by using > -Ctarget-feature=+reserve-x18 instead of -Zfixed-x18. However, this flag > emits a warning during the build, so this patch does not add support for > using it and instead requires 1.80.0 or greater. > > The dependency is placed on `select HAVE_RUST` to avoid a situation > where enabling Rust silently turns off the sanitizer. Instead, turning > on the sanitizer results in Rust being disabled. We generally do not > want changes to CONFIG_RUST to result in any mitigations being changed > or turned off. > > At the time of writing, rustc 1.82.0 only exists via the nightly release > channel. There is a chance that the -Zsanitizer=shadow-call-stack flag > will end up needing 1.83.0 instead, but I think it is small. > > Signed-off-by: Alice Ryhl <aliceryhl@xxxxxxxxxx> > --- > Link: https://lore.kernel.org/rust-for-linux/20240808221138.873750-1-ojeda@xxxxxxxxxx/ [1] > --- > Changes in v6: > - Move Kconfig requirements into arch/*/Kconfig. > - List non-dynamic SCS as supported on 1.82. This reflects newly added > things in rustc. > - Link to v5: https://lore.kernel.org/r/20240806-shadow-call-stack-v5-1-26dccb829154@xxxxxxxxxx > > Changes in v5: > - Rebase series on v6.11-rc2. > - The first patch is no longer included as it was merged in v6.11-rc2. > - The commit message is rewritten from scratch. > - Link to v4: https://lore.kernel.org/r/20240729-shadow-call-stack-v4-0-2a664b082ea4@xxxxxxxxxx > > Changes in v4: > - Move `depends on` to CONFIG_RUST. > - Rewrite commit messages to include more context. > - Link to v3: https://lore.kernel.org/r/20240704-shadow-call-stack-v3-0-d11c7a6ebe30@xxxxxxxxxx > > Changes in v3: > - Use -Zfixed-x18. > - Add logic to reject unsupported rustc versions. > - Also include a fix to be backported. > - Link to v2: https://lore.kernel.org/rust-for-linux/20240305-shadow-call-stack-v2-1-c7b4a3f4d616@xxxxxxxxxx/ > > Changes in v2: > - Add -Cforce-unwind-tables flag. > - Link to v1: https://lore.kernel.org/rust-for-linux/20240304-shadow-call-stack-v1-1-f055eaf40a2c@xxxxxxxxxx/ > --- > Makefile | 1 + > arch/arm64/Kconfig | 7 ++++++- > arch/arm64/Makefile | 3 +++ > arch/riscv/Kconfig | 7 ++++++- > init/Kconfig | 1 - > 5 files changed, 16 insertions(+), 3 deletions(-) For the arm64 parts: Acked-by: Will Deacon <will@xxxxxxxxxx> In which tree do you plan to merge this? Cheers, Will