mirror of
https://github.com/torvalds/linux.git
synced 2025-08-15 14:11:42 +02:00
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: 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>
This commit is contained in:
parent
d683a85618
commit
61b38f7591
5 changed files with 24 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue