]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: arm64: Introduce CONFIG_UBSAN_KVM_EL2
authorMostafa Saleh <smostafa@google.com>
Wed, 30 Apr 2025 16:27:10 +0000 (16:27 +0000)
committerMarc Zyngier <maz@kernel.org>
Wed, 7 May 2025 10:21:35 +0000 (11:21 +0100)
Add a new Kconfig CONFIG_UBSAN_KVM_EL2 for KVM which enables
UBSAN for EL2 code (in protected/nvhe/hvhe) modes.
This will re-use the same checks enabled for the kernel for
the hypervisor. The only difference is that for EL2 it always
emits a "brk" instead of implementing hooks as the hypervisor
can't print reports.

The KVM code will re-use the same code for the kernel
"report_ubsan_failure()" so #ifdefs are changed to also have this
code for CONFIG_UBSAN_KVM_EL2

Signed-off-by: Mostafa Saleh <smostafa@google.com>
Reviewed-by: Kees Cook <kees@kernel.org>
Link: https://lore.kernel.org/r/20250430162713.1997569-4-smostafa@google.com
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/kvm/hyp/nvhe/Makefile
include/linux/ubsan.h
lib/Kconfig.ubsan
lib/ubsan.c
scripts/Makefile.ubsan

index b43426a493df5a388caa920e259cc8c54d118a1b..a76522d63c3e630795db5972a99abc3d24bc5e26 100644 (file)
@@ -99,3 +99,9 @@ KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_FTRACE) $(CC_FLAGS_SCS), $(KBUILD_CFLAG
 # causes a build failure. Remove profile optimization flags.
 KBUILD_CFLAGS := $(filter-out -fprofile-sample-use=% -fprofile-use=%, $(KBUILD_CFLAGS))
 KBUILD_CFLAGS += -fno-asynchronous-unwind-tables -fno-unwind-tables
+
+ifeq ($(CONFIG_UBSAN_KVM_EL2),y)
+UBSAN_SANITIZE := y
+# Always use brk and not hooks
+ccflags-y += $(CFLAGS_UBSAN_TRAP)
+endif
index c843816f5f6827df820a762761d75431d366b8fd..3ab8d38aedb8d3a3bb8f9bd388bd052f68d766df 100644 (file)
@@ -2,7 +2,7 @@
 #ifndef _LINUX_UBSAN_H
 #define _LINUX_UBSAN_H
 
-#ifdef CONFIG_UBSAN_TRAP
+#if defined(CONFIG_UBSAN_TRAP) || defined(CONFIG_UBSAN_KVM_EL2)
 const char *report_ubsan_failure(u32 check_type);
 #else
 static inline const char *report_ubsan_failure(u32 check_type)
index f6ea0c5b5da39307c73649dd8e15ba501b7f3168..42ed4180464480628e71f9930b6cb84b7ecdb336 100644 (file)
@@ -165,4 +165,13 @@ config TEST_UBSAN
          This is a test module for UBSAN.
          It triggers various undefined behavior, and detect it.
 
+config UBSAN_KVM_EL2
+       bool "UBSAN for KVM code at EL2"
+       depends on ARM64
+       help
+         Enable UBSAN when running on ARM64 with KVM in a split mode
+         (nvhe/hvhe/protected) for the hypervisor code running in EL2.
+         In this mode, any UBSAN violation in EL2 would panic the kernel
+         and information similar to UBSAN_TRAP would be printed.
+
 endif  # if UBSAN
index 17993727fc96e5cecbf16d061cc124b4cc174411..a6ca235dd714f503fc59e96f15aa11de5797ba76 100644 (file)
@@ -19,7 +19,7 @@
 
 #include "ubsan.h"
 
-#ifdef CONFIG_UBSAN_TRAP
+#if defined(CONFIG_UBSAN_TRAP) || defined(CONFIG_UBSAN_KVM_EL2)
 /*
  * Only include matches for UBSAN checks that are actually compiled in.
  * The mappings of struct SanitizerKind (the -fsanitize=xxx args) to
@@ -97,7 +97,9 @@ const char *report_ubsan_failure(u32 check_type)
        }
 }
 
-#else
+#endif
+
+#ifndef CONFIG_UBSAN_TRAP
 static const char * const type_check_kinds[] = {
        "load of",
        "store to",
index 9e35198edbf0d08d7b281cd43d882046a84e4e37..73c7a9be07963be0de41fed6d08ba3ef46b0d2ed 100644 (file)
@@ -1,5 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0
 
+# Shared with KVM/arm64.
+export CFLAGS_UBSAN_TRAP := $(call cc-option,-fsanitize-trap=undefined,-fsanitize-undefined-trap-on-error)
+
 # Enable available and selected UBSAN features.
 ubsan-cflags-$(CONFIG_UBSAN_ALIGNMENT)         += -fsanitize=alignment
 ubsan-cflags-$(CONFIG_UBSAN_BOUNDS_STRICT)     += -fsanitize=bounds-strict
@@ -10,7 +13,7 @@ ubsan-cflags-$(CONFIG_UBSAN_DIV_ZERO)         += -fsanitize=integer-divide-by-zero
 ubsan-cflags-$(CONFIG_UBSAN_UNREACHABLE)       += -fsanitize=unreachable
 ubsan-cflags-$(CONFIG_UBSAN_BOOL)              += -fsanitize=bool
 ubsan-cflags-$(CONFIG_UBSAN_ENUM)              += -fsanitize=enum
-ubsan-cflags-$(CONFIG_UBSAN_TRAP)              += $(call cc-option,-fsanitize-trap=undefined,-fsanitize-undefined-trap-on-error)
+ubsan-cflags-$(CONFIG_UBSAN_TRAP)              += $(CFLAGS_UBSAN_TRAP)
 
 export CFLAGS_UBSAN := $(ubsan-cflags-y)