Commit 61b38f75 authored by Mostafa Saleh's avatar Mostafa Saleh Committed by Marc Zyngier
Browse files

KVM: arm64: Introduce CONFIG_UBSAN_KVM_EL2



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: default avatarMostafa Saleh <smostafa@google.com>
Reviewed-by: default avatarKees Cook <kees@kernel.org>
Link: https://lore.kernel.org/r/20250430162713.1997569-4-smostafa@google.com


Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent d683a856
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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)
+9 −0
Original line number Diff line number Diff line
@@ -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
+4 −2
Original line number Diff line number Diff line
@@ -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",
+4 −1
Original line number Diff line number Diff line
# 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)