The main problem solved is logging from hyp/nVHE. Because the nVHE code is independent from the Linux kernel the logging mechanisms aren’t working. For this purpose a generic kvm_debug_buffer is designed. It is composed from a statically allocated array and a writing index and comes with a set of macros to facilitate it’s usage. To avoid concurrency problems between cores, the kvm_debug_buffer is defined per_cpu. The buffer is checked every time when the code returns from an hvc call, by modifying the kvm_call_hyp and kvm_call_hyp_ret macros. The buffer’s writing index is reseted to zero inside of the el1_sync entry. Since UBSan’s handlers are living inside the kernel, they can not be called inside hyp/nVHE. To enable UBSan new handlers had to be defined there. To store the data from the handler, the kvm_ubsan_buff is defined. It can store logging data from the handlers in a new defined struct called struct kvm_ubsan_info. Each handler has to encapsulate it’s data inside the new struct and write it into the buffer. The kvm_debug_buffer.c file is responsible for decapsulating the data and calling the kernel handlers. To check if UBSan works correctly inside hyp/nVHE the last patch comes with a test mechanism, that calls UBSan when the hyp is initialized. George Popescu (14): KVM: arm64: Enable UBSan instrumentation in nVHE hyp code KVM: arm64: Define a macro for storing a value inside a per_cpu variable KVM: arm64: Add support for creating and checking a logging buffer inside hyp/nVHE KVM: arm64: Add support for buffer usage KVM: arm64: Define a buffer that can pass UBSan data from hyp/nVHE to kernel Fix CFLAGS for UBSAN_BOUNDS on Clang KVM: arm64: Enable UBSAN_BOUNDS for the both the kernel and hyp/nVHE KVM: arm64: Enable UBsan check for unreachable code inside hyp/nVHE code KVM: arm64: Enable shift out of bounds undefined behaviour check for hyp/nVHE KVM: arm64: __ubsan_handle_load_invalid_value hyp/nVHE implementation. KVM: arm64: Detect type mismatch undefined behaviour from hyp/nVHE code KVM: arm64: Detect arithmetic overflow is inside hyp/nVHE. KVM: arm64: Enable the CONFIG_TEST UBSan for PKVM. DO NOT MERGE: Enable configs to test the patch series arch/arm64/include/asm/kvm_asm.h | 8 ++ arch/arm64/include/asm/kvm_debug_buffer.h | 61 ++++++++ arch/arm64/include/asm/kvm_host.h | 12 ++ arch/arm64/include/asm/kvm_ubsan.h | 53 +++++++ arch/arm64/kvm/Kconfig | 3 + arch/arm64/kvm/Makefile | 4 + arch/arm64/kvm/arm.c | 46 +++++- arch/arm64/kvm/hyp/hyp-entry.S | 6 +- arch/arm64/kvm/hyp/nvhe/Makefile | 5 +- arch/arm64/kvm/hyp/nvhe/ubsan.c | 164 ++++++++++++++++++++++ arch/arm64/kvm/hyp/nvhe/ubsan_test.c | 115 +++++++++++++++ arch/arm64/kvm/kvm_ubsan_buffer.c | 75 ++++++++++ lib/Kconfig.ubsan | 5 +- scripts/Makefile.ubsan | 9 +- 14 files changed, 561 insertions(+), 5 deletions(-) create mode 100644 arch/arm64/include/asm/kvm_debug_buffer.h create mode 100644 arch/arm64/include/asm/kvm_ubsan.h create mode 100644 arch/arm64/kvm/hyp/nvhe/ubsan.c create mode 100644 arch/arm64/kvm/hyp/nvhe/ubsan_test.c create mode 100644 arch/arm64/kvm/kvm_ubsan_buffer.c -- 2.28.0.618.gf4bc123cb7-goog