From patchwork Fri Jan 15 17:18:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 1366053 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C3282C433DB for ; Fri, 15 Jan 2021 17:19:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 9B7D623772 for ; Fri, 15 Jan 2021 17:19:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731555AbhAORTb (ORCPT ); Fri, 15 Jan 2021 12:19:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44556 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729435AbhAORTa (ORCPT ); Fri, 15 Jan 2021 12:19:30 -0500 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B9494C0613C1 for ; Fri, 15 Jan 2021 09:18:49 -0800 (PST) Received: by mail-qv1-xf49.google.com with SMTP id cc1so8301279qvb.3 for ; Fri, 15 Jan 2021 09:18:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=UgDs2wXmKTNFZw7IyERVXhSRi4O+lIRTxi4K3FR+2eo=; b=DYevj3oUdHfFqoPzpKfhqj1mj2K3AAMmzbDr56bDluU1dRt2ncqiu78K58yY20DuOv 1wEh1UJa53ZoHOAcbkzm02W8kSdEh60XjZJsmYXmgj3neWu+HpGCga9jR2N1aQsiyz3G rhVRiq1P3lY7XVo1HRvbtUlwLh2uUpsCK1QA8w+WZC7NFOpxq/O7GbdrAMqySleco44z 9bF/5xYkpnfPp3bR9l4M6KAcsSUai3NXQZyDbjcan1LwyiEl0jQH65IrjD/PuLguGJ3i fP+CVEG7Sy+HYa94GnjDOdwSWn/crNM+gxy1JOn2fIM3RliKl59o8x9MTdWtdFYtg9nO gEGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=UgDs2wXmKTNFZw7IyERVXhSRi4O+lIRTxi4K3FR+2eo=; b=mMxp5f+NSo0jDd5sV4cTn1iml0Tq+s6A7fOf9UYY1BYjEph0bl8ukp0mOKcrmGy6NZ Dm/oKAxFgnzaegNkHRgdSaBFeiPFoho+kJlwaMUu9SAZNIIyNU60saZBxryagm0vuHmC g+kxYLix7Jra37cqkLJDYGkPWaW1XJyvDMdqwR/wWqv5UiPwfuuBjVWFF69kjhAbKwAQ Ny7kUhX8r9A9rOL+DUZy1NyWxLiGDm9jW0qvKHFx3XPEsSqlYslsHUdb2a/wkgjWZd5n SgVOhYMLSVlIf5xfSNJMr/jKoQEXQqC6Ow05avTFQV4HMs2MBdWRl1oMi9N657H3B54Y 8InQ== X-Gm-Message-State: AOAM5317HnLBJ0DO99FrfPlPgmyRqNEW3PMQyRNfJm2CL02KyoQfN4oa Ea/uHUyKJuquhMswDiSLgD/P3be7HnWr X-Google-Smtp-Source: ABdhPJy6ISdrGnRn9CouEV5yxigJFodkL9NQqNNhZDDdgN4wy4Bt8DXBalgoL+ge3A3oT0tlGsHh2R/Jrpyu Sender: "lenaptr via sendgmr" X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a05:6214:4e2:: with SMTP id cl2mr12940505qvb.27.1610731128896; Fri, 15 Jan 2021 09:18:48 -0800 (PST) Date: Fri, 15 Jan 2021 17:18:22 +0000 In-Reply-To: <20210115171830.3602110-1-lenaptr@google.com> Message-Id: <20210115171830.3602110-2-lenaptr@google.com> Mime-Version: 1.0 References: <20210115171830.3602110-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog Subject: [PATCH v3 1/9] KVM: arm64: Enable UBSan instrumentation in nVHE hyp code From: Elena Petrova To: kvmarm@lists.cs.columbia.edu Cc: Elena Petrova , linux-arm-kernel@lists.infradead.org, open list , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , George Popescu , George-Aurelian Popescu Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: George-Aurelian Popescu Implement UBSan handlers inside nVHe hyp code, as empty functions for the moment, so the undefined behaviours, that are triggered there, will be linked to them, not to the ones defined in kernel-proper lib/ubsan.c. In this way, enabling UBSAN_MISC won't cause a link error. Signed-off-by: Elena Petrova Acked-by: David Brazdil --- arch/arm64/kvm/hyp/nvhe/Makefile | 3 ++- arch/arm64/kvm/hyp/nvhe/ubsan.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 arch/arm64/kvm/hyp/nvhe/ubsan.c diff --git a/arch/arm64/kvm/hyp/nvhe/Makefile b/arch/arm64/kvm/hyp/nvhe/Makefile index 1f1e351c5fe2..2a683e7c6c5b 100644 --- a/arch/arm64/kvm/hyp/nvhe/Makefile +++ b/arch/arm64/kvm/hyp/nvhe/Makefile @@ -10,6 +10,8 @@ obj-y := timer-sr.o sysreg-sr.o debug-sr.o switch.o tlb.o hyp-init.o host.o \ hyp-main.o hyp-smp.o psci-relay.o obj-y += ../vgic-v3-sr.o ../aarch32.o ../vgic-v2-cpuif-proxy.o ../entry.o \ ../fpsimd.o ../hyp-entry.o ../exception.o +obj-$(CONFIG_UBSAN) += ubsan.o +CFLAGS_ubsan.nvhe.o += -I $(srctree)/lib/ ## ## Build rules for compiling nVHE hyp code @@ -61,7 +63,6 @@ KBUILD_CFLAGS := $(filter-out $(CC_FLAGS_FTRACE) $(CC_FLAGS_SCS), $(KBUILD_CFLAG # cause crashes. Just disable it. GCOV_PROFILE := n KASAN_SANITIZE := n -UBSAN_SANITIZE := n KCOV_INSTRUMENT := n # Skip objtool checking for this directory because nVHE code is compiled with diff --git a/arch/arm64/kvm/hyp/nvhe/ubsan.c b/arch/arm64/kvm/hyp/nvhe/ubsan.c new file mode 100644 index 000000000000..a5db6b61ceb2 --- /dev/null +++ b/arch/arm64/kvm/hyp/nvhe/ubsan.c @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright 2020 Google LLC + * Author: George Popescu + */ +#include +#include +#include + +void __ubsan_handle_add_overflow(void *_data, void *lhs, void *rhs) {} + +void __ubsan_handle_sub_overflow(void *_data, void *lhs, void *rhs) {} + +void __ubsan_handle_mul_overflow(void *_data, void *lhs, void *rhs) {} + +void __ubsan_handle_negate_overflow(void *_data, void *old_val) {} + +void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs) {} + +void __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr) {} + +void __ubsan_handle_type_mismatch_v1(void *_data, void *ptr) {} + +void __ubsan_handle_out_of_bounds(void *_data, void *index) {} + +void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs) {} + +void __ubsan_handle_builtin_unreachable(void *_data) {} + +void __ubsan_handle_load_invalid_value(void *_data, void *val) {} From patchwork Fri Jan 15 17:18:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 1366055 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E5B3CC43381 for ; Fri, 15 Jan 2021 17:19:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B277B2388B for ; Fri, 15 Jan 2021 17:19:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731926AbhAORTg (ORCPT ); Fri, 15 Jan 2021 12:19:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44574 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731073AbhAORTe (ORCPT ); Fri, 15 Jan 2021 12:19:34 -0500 Received: from mail-wr1-x449.google.com (mail-wr1-x449.google.com [IPv6:2a00:1450:4864:20::449]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9E6D7C0613D3 for ; Fri, 15 Jan 2021 09:18:53 -0800 (PST) Received: by mail-wr1-x449.google.com with SMTP id w8so4426791wrv.18 for ; Fri, 15 Jan 2021 09:18:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=wpyFyG+eiUEEzv+tQsWiZF8Zwyi/AUhtPNl+Hm4opV0=; b=AVX8GMiwg8WGPq/0z1Xu/+8sHMtoa1UmPJmR+MWeyXW+plQYVosR0fyg4o8wlpDgOw QjPzW0UWKvmgwasdpRbk9MikLFU76zKwTU+tTKgoJ7Ymnmac+PR50ruUreezWPWjV8vr 05lE4k6H+IWKBmPiKPw6iKstlOBMhz1mUhoZA33ZSvM8bfkZ2uRsLQ8K8LcSDbO+fS3I 6KAvW57ucA/LGTJc06YuwJ0JUvit0/g+YgIY0nYq8/AHye9zXf+7pLH/rZWORZoZH5db Efrx87of5p43yR8RKLCseZeqG5E1HhSIkWUnGMOoEDjDsktoOydT4bvFNaaw8Thjs4EL SOcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=wpyFyG+eiUEEzv+tQsWiZF8Zwyi/AUhtPNl+Hm4opV0=; b=VExv5adIOE7Z5ujN99Hy296fePce9BM5a0ECXoyzzrRhU9gUVy98xRWCGLN+a38ych Zf9nj50+a9ghCbPp0V7fHYbEdqr3ok2LJKS/J2rq/LEegmYAQ8dD/h34VX/VEEngZuUA cFZr8HwHhJvw2HS1iv0Fe4uylUDBaSrR/Sh1o9/Vw+NebZk5qnkNWMobOc2DENXgSwen OxkbCTbVDyFYIJiiugxcDvevHov11tyG1KeMdpT8hf4Pbhmidz3DpQcSe9o7mv63Wi0w sTyEC8bs8xzyvZtGWU0Bur4OV03CEgBMEhKwzJNF77UbpRpJxnUwlvnyfCnCSZMS0XSq Clhg== X-Gm-Message-State: AOAM5313hR2VATwm5sUdnynzsIwjq7g4KGRFTCOWS9uS+D7dB7RmSZeL ju8Sj2q5nFUs73lbCGJZDFhAR6v1Imq3 X-Google-Smtp-Source: ABdhPJzvrzsTdtlxSx/5Xbk5Hjx8CpoAqp+Evo8nGH5OJ/3gmNHv8fDdcA1kL5ClgTjN24/CEgxK5Z4ds2LP Sender: "lenaptr via sendgmr" X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a1c:1bcc:: with SMTP id b195mr9757461wmb.131.1610731132351; Fri, 15 Jan 2021 09:18:52 -0800 (PST) Date: Fri, 15 Jan 2021 17:18:23 +0000 In-Reply-To: <20210115171830.3602110-1-lenaptr@google.com> Message-Id: <20210115171830.3602110-3-lenaptr@google.com> Mime-Version: 1.0 References: <20210115171830.3602110-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog Subject: [PATCH v3 2/9] KVM: arm64: Add a buffer that can pass UBSan data from hyp/nVHE to kernel From: Elena Petrova To: kvmarm@lists.cs.columbia.edu Cc: Elena Petrova , linux-arm-kernel@lists.infradead.org, open list , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , George Popescu , George Popescu Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: George Popescu Share a buffer between the kernel and the hyp/nVHE code by using the macros from kvm_debug_buffer.h. The hyp/nVHE code requires a write index which counts how many elements have been writtens inside the buffer and the kernel requires a read index which counts how many elements have been read from the buffer. The write index and the buffer are shared with the kernel in read-only. The kvm_debug_buffer_ind returns the reading and writing points of the circular buffer and updates the reading index. Data collected from UBSan handlers inside hyp/nVHE is stored in the kvm_ubsan_buffer. This buffer stores only UBSan data because it should not be preoccupied by other mechanisms data structures and functionalities. Also, for the moment the buffer is mapped inside .bss, where both the kernel and the hyp/nVHE code have Read/Write rights, but in the future this will change and the kernel will not be able to acess hyp/nVHE's .bss. At that point the buffer will only need to be mapped in order for this patch to work. Signed-off-by: Elena Petrova --- arch/arm64/include/asm/assembler.h | 11 +++++++ arch/arm64/include/asm/kvm_debug_buffer.h | 36 ++++++++++++++++++++ arch/arm64/include/asm/kvm_host.h | 8 ++++- arch/arm64/include/asm/kvm_ubsan.h | 14 ++++++++ arch/arm64/kvm/Makefile | 2 ++ arch/arm64/kvm/arm.c | 9 +++++ arch/arm64/kvm/hyp/nvhe/host.S | 4 +++ arch/arm64/kvm/hyp/nvhe/ubsan.c | 23 +++++++++++++ arch/arm64/kvm/kvm_ubsan_buffer.c | 40 +++++++++++++++++++++++ 9 files changed, 146 insertions(+), 1 deletion(-) 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/kvm_ubsan_buffer.c diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h index bf125c591116..ebc18a8a0e1f 100644 --- a/arch/arm64/include/asm/assembler.h +++ b/arch/arm64/include/asm/assembler.h @@ -258,6 +258,17 @@ alternative_endif ldr \dst, [\dst, \tmp] .endm + /* + * @sym: The name of the per-cpu variable + * @reg: value to store + * @tmp1: scratch register + * @tmp2: scratch register + */ + .macro str_this_cpu sym, reg, tmp1, tmp2 + adr_this_cpu \tmp1, \sym, \tmp2 + str \reg, [\tmp1] + .endm + /* * vma_vm_mm - get mm pointer from vma pointer (vma->vm_mm) */ diff --git a/arch/arm64/include/asm/kvm_debug_buffer.h b/arch/arm64/include/asm/kvm_debug_buffer.h new file mode 100644 index 000000000000..e5375c2cff1a --- /dev/null +++ b/arch/arm64/include/asm/kvm_debug_buffer.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright 2020 Google LLC + * Author: George Popescu + */ + +#include + + +#define KVM_DEBUG_BUFFER_SIZE 1000 + +#ifdef __KVM_NVHE_HYPERVISOR__ +#define DEFINE_KVM_DEBUG_BUFFER(type_name, buffer_name, write_ind, size)\ + DEFINE_PER_CPU(type_name, buffer_name)[size]; \ + DEFINE_PER_CPU(unsigned long, write_ind) = 0; + +#define DECLARE_KVM_DEBUG_BUFFER(type_name, buffer_name, write_ind, size)\ + DECLARE_PER_CPU(type_name, buffer_name)[size]; \ + DECLARE_PER_CPU(unsigned long, write_ind); +#else +#define DECLARE_KVM_DEBUG_BUFFER(type_name, buffer_name, write_ind, size)\ + DECLARE_KVM_NVHE_PER_CPU(type_name, buffer_name)[size]; \ + DECLARE_KVM_NVHE_PER_CPU(unsigned long, write_ind); +#endif //__KVM_NVHE_HYPERVISOR__ + +#ifdef __ASSEMBLY__ +#include + +.macro clear_buffer tmp1, tmp2, tmp3 + mov \tmp1, 0 +#ifdef CONFIG_UBSAN + str_this_cpu kvm_ubsan_buff_wr_ind, \tmp1, \tmp2, \tmp3 +#endif //CONFIG_UBSAN +.endm + +#endif \ No newline at end of file diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index 8fcfab0c2567..905ca0d7c52c 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -592,6 +592,12 @@ int kvm_test_age_hva(struct kvm *kvm, unsigned long hva); void kvm_arm_halt_guest(struct kvm *kvm); void kvm_arm_resume_guest(struct kvm *kvm); + +#ifdef CONFIG_UBSAN +extern void __kvm_check_ubsan_buffer(void); +#else +static inline void __kvm_check_ubsan_buffer(void) {} +#endif /* CONFIG_UBSAN */ #define kvm_call_hyp_nvhe(f, ...) \ ({ \ struct arm_smccc_res res; \ @@ -599,7 +605,7 @@ void kvm_arm_resume_guest(struct kvm *kvm); arm_smccc_1_1_hvc(KVM_HOST_SMCCC_FUNC(f), \ ##__VA_ARGS__, &res); \ WARN_ON(res.a0 != SMCCC_RET_SUCCESS); \ - \ + __kvm_check_ubsan_buffer(); \ res.a1; \ }) diff --git a/arch/arm64/include/asm/kvm_ubsan.h b/arch/arm64/include/asm/kvm_ubsan.h new file mode 100644 index 000000000000..fb32c7fd65d4 --- /dev/null +++ b/arch/arm64/include/asm/kvm_ubsan.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright 2020 Google LLC + * Author: George Popescu + */ + +#include + +#define UBSAN_MAX_TYPE 6 +#define KVM_UBSAN_BUFFER_SIZE 1000 + +struct kvm_ubsan_info { + int type; +}; diff --git a/arch/arm64/kvm/Makefile b/arch/arm64/kvm/Makefile index 13b017284bf9..ab3a9c402550 100644 --- a/arch/arm64/kvm/Makefile +++ b/arch/arm64/kvm/Makefile @@ -4,6 +4,7 @@ # ccflags-y += -I $(srctree)/$(src) +CFLAGS_kvm_ubsan_buffer.o += -I $(srctree)/lib/ KVM=../../../virt/kvm @@ -25,3 +26,4 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \ vgic/vgic-its.o vgic/vgic-debug.o kvm-$(CONFIG_HW_PERF_EVENTS) += pmu-emul.o +kvm-$(CONFIG_UBSAN) += kvm_ubsan_buffer.o diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 04c44853b103..63f0495550b8 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -1784,6 +1784,15 @@ static int init_hyp_mode(void) goto out_err; } } +#ifdef CONFIG_UBSAN + /* required by ubsan to access the handlers structures fields */ + err = create_hyp_mappings(kvm_ksym_ref(_data), + kvm_ksym_ref(__end_once), PAGE_HYP_RO); + if (err) { + kvm_err("Cannot map data section\n"); + goto out_err; + } +#endif /* * Map Hyp percpu pages diff --git a/arch/arm64/kvm/hyp/nvhe/host.S b/arch/arm64/kvm/hyp/nvhe/host.S index a820dfdc9c25..0967906265d3 100644 --- a/arch/arm64/kvm/hyp/nvhe/host.S +++ b/arch/arm64/kvm/hyp/nvhe/host.S @@ -8,6 +8,7 @@ #include #include +#include #include .text @@ -34,6 +35,9 @@ SYM_FUNC_START(__host_exit) /* Store the host regs x18-x29, lr */ save_callee_saved_regs x0 + /* when entering the host clear the buffers */ + clear_buffer x4, x5, x6 + /* Save the host context pointer in x29 across the function call */ mov x29, x0 bl handle_trap diff --git a/arch/arm64/kvm/hyp/nvhe/ubsan.c b/arch/arm64/kvm/hyp/nvhe/ubsan.c index a5db6b61ceb2..8a194fb1f6cf 100644 --- a/arch/arm64/kvm/hyp/nvhe/ubsan.c +++ b/arch/arm64/kvm/hyp/nvhe/ubsan.c @@ -3,10 +3,33 @@ * Copyright 2020 Google LLC * Author: George Popescu */ +#include #include #include +#include +#include +#include +#include +#include +#include +#include #include +DEFINE_KVM_DEBUG_BUFFER(struct kvm_ubsan_info, kvm_ubsan_buffer, + kvm_ubsan_buff_wr_ind, KVM_UBSAN_BUFFER_SIZE); + +static inline struct kvm_ubsan_info *kvm_ubsan_buffer_next_slot(void) +{ + struct kvm_ubsan_info *res = NULL; + unsigned long write_ind = __this_cpu_read(kvm_ubsan_buff_wr_ind); + if (write_ind < KVM_UBSAN_BUFFER_SIZE) { + res = this_cpu_ptr(&kvm_ubsan_buffer[write_ind]); + ++write_ind; + __this_cpu_write(kvm_ubsan_buff_wr_ind, write_ind); + } + return res; +} + void __ubsan_handle_add_overflow(void *_data, void *lhs, void *rhs) {} void __ubsan_handle_sub_overflow(void *_data, void *lhs, void *rhs) {} diff --git a/arch/arm64/kvm/kvm_ubsan_buffer.c b/arch/arm64/kvm/kvm_ubsan_buffer.c new file mode 100644 index 000000000000..4a1959ba9f68 --- /dev/null +++ b/arch/arm64/kvm/kvm_ubsan_buffer.c @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright 2020 Google LLC + * Author: George Popescu + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +DECLARE_KVM_DEBUG_BUFFER(struct kvm_ubsan_info, kvm_ubsan_buffer, + kvm_ubsan_buff_wr_ind, KVM_UBSAN_BUFFER_SIZE); + + +void iterate_kvm_ubsan_buffer(unsigned long left, unsigned long right) +{ + unsigned long i; + struct kvm_ubsan_info *slot; + + slot = (struct kvm_ubsan_info *) this_cpu_ptr_nvhe_sym(kvm_ubsan_buffer); + for (i = left; i < right; ++i) { + /* check ubsan data */ + slot[i].type = 0; + } +} + +void __kvm_check_ubsan_buffer(void) +{ + unsigned long *write_ind; + + write_ind = (unsigned long *) this_cpu_ptr_nvhe_sym(kvm_ubsan_buff_wr_ind); + iterate_kvm_ubsan_buffer(0, *write_ind); +} + From patchwork Fri Jan 15 17:18:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 1366054 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB828C433E9 for ; Fri, 15 Jan 2021 17:19:42 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CC2642339E for ; Fri, 15 Jan 2021 17:19:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732001AbhAORTj (ORCPT ); Fri, 15 Jan 2021 12:19:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44590 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726065AbhAORTi (ORCPT ); Fri, 15 Jan 2021 12:19:38 -0500 Received: from mail-wm1-x34a.google.com (mail-wm1-x34a.google.com [IPv6:2a00:1450:4864:20::34a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2B583C061793 for ; Fri, 15 Jan 2021 09:18:58 -0800 (PST) Received: by mail-wm1-x34a.google.com with SMTP id h21so3228140wmq.7 for ; Fri, 15 Jan 2021 09:18:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=/8un1Ary21jdPLd+LUk6zbXqqm3VArAc3S7FbSuGJ7M=; b=JA9FdkQhxjQG1gw49w0maesw4+ti5fXadr2Pq9t0aXEEkIUFnr+mtX+ZPRryioLTTQ ufXKI35Qv4143oJiZ03pZOiJW4C0nD+T2UJHD21bTz/ZqBncZvuqw7RywHlbplN8ubdi OPjwcRTE2z0HAJ+M6IAN3c0CzTqyW5Nr9KH5cVTk7RTx4vuxLt8Ip4BYBsSqaOIJaVi+ DQ/6wlQYfRRGd4+ZEFFmmmPHJjGH4cOU18Jm855txWLIALUp9WPAC9FJUqpExi9dVCY/ 09iJS+eDvTjNHk5QYRigUeLosU5F+HefFR41guZQzpb4hpVI+RxEOrAf4yoR12BrZVbF 7gfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=/8un1Ary21jdPLd+LUk6zbXqqm3VArAc3S7FbSuGJ7M=; b=BzNp6ruCLNNcEjixtuw5dhMVZuxjYJ2O+q/CkwmSHZhfnoWpX1ZlhfvJnoIKWRjCEx fDm3yW9jEpgw0W2EpTXRMGH74kreFVvhWG7frExITe/FTtTwVZvGI9nl8s3al+kxW34F jfHZrgHyDUK6qf4mN8NT9rI7V6lTmJYFpLQ99IWAJRZ9WzqJnrP43XHtJ0nC3T+Dj052 +jW0St7CqVvMDlnALFmcxyPqYELoJzBFO/6a/Iql5i3gqwblZE5AQ446yNFoW4IB8dCu pPTnXjvK4spMEjLw83CUJYcqk1BQlaZ29LQ7nedZ6HyvlOZ0fj2svpRnc5ywrfgwCzmu C4kg== X-Gm-Message-State: AOAM533kBZtnICc293j7iTRIiMIHlIAbPAvBk49w3OKPUhI4LDxOYYfI ZC3N8JX+lVCq0WDjaoMsu9fikCIwHAAx X-Google-Smtp-Source: ABdhPJzLy46RtKRhJlfnQR0PbFbCxme0w7jH3ufnM4lCPC+V5c3Y6pJYMT8Sxhrrv3zXM6c86O3sE5a05K3D Sender: "lenaptr via sendgmr" X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a1c:9dcb:: with SMTP id g194mr9789599wme.59.1610731135867; Fri, 15 Jan 2021 09:18:55 -0800 (PST) Date: Fri, 15 Jan 2021 17:18:24 +0000 In-Reply-To: <20210115171830.3602110-1-lenaptr@google.com> Message-Id: <20210115171830.3602110-4-lenaptr@google.com> Mime-Version: 1.0 References: <20210115171830.3602110-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog Subject: [PATCH v3 3/9] KVM: arm64: Enable UBSAN_BOUNDS for the both the kernel and hyp/nVHE From: Elena Petrova To: kvmarm@lists.cs.columbia.edu Cc: Elena Petrova , linux-arm-kernel@lists.infradead.org, open list , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , George Popescu , George Popescu Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: George Popescu If an out of bounds happens inside the hyp/nVHE code, the ubsan_out_of_bounds handler stores the logging data inside the kvm_ubsan_buffer. The one responsible for printing is the kernel ubsan_out_of_bounds handler. The process of decapsulating the data from the buffer is straightforward. Signed-off-by: George Popescu Signed-off-by: Elena Petrova --- arch/arm64/include/asm/kvm_ubsan.h | 19 ++++++++++++++++++- arch/arm64/kvm/hyp/nvhe/ubsan.c | 14 ++++++++++++-- arch/arm64/kvm/kvm_ubsan_buffer.c | 10 ++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/arch/arm64/include/asm/kvm_ubsan.h b/arch/arm64/include/asm/kvm_ubsan.h index fb32c7fd65d4..4f471acb88b0 100644 --- a/arch/arm64/include/asm/kvm_ubsan.h +++ b/arch/arm64/include/asm/kvm_ubsan.h @@ -9,6 +9,23 @@ #define UBSAN_MAX_TYPE 6 #define KVM_UBSAN_BUFFER_SIZE 1000 + +struct ubsan_values { + void *lval; + void *rval; + char op; +}; + struct kvm_ubsan_info { - int type; + enum { + UBSAN_OUT_OF_BOUNDS, + } type; + union { + struct out_of_bounds_data out_of_bounds_data; + }; + union { + struct ubsan_values u_val; + }; }; + +void __ubsan_handle_out_of_bounds(void *_data, void *index); diff --git a/arch/arm64/kvm/hyp/nvhe/ubsan.c b/arch/arm64/kvm/hyp/nvhe/ubsan.c index 8a194fb1f6cf..55a8f6db8555 100644 --- a/arch/arm64/kvm/hyp/nvhe/ubsan.c +++ b/arch/arm64/kvm/hyp/nvhe/ubsan.c @@ -13,7 +13,6 @@ #include #include #include -#include DEFINE_KVM_DEBUG_BUFFER(struct kvm_ubsan_info, kvm_ubsan_buffer, kvm_ubsan_buff_wr_ind, KVM_UBSAN_BUFFER_SIZE); @@ -44,7 +43,18 @@ void __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr) {} void __ubsan_handle_type_mismatch_v1(void *_data, void *ptr) {} -void __ubsan_handle_out_of_bounds(void *_data, void *index) {} +void __ubsan_handle_out_of_bounds(void *_data, void *index) +{ + struct kvm_ubsan_info *slot; + struct out_of_bounds_data *data = _data; + + slot = kvm_ubsan_buffer_next_slot(); + if (slot) { + slot->type = UBSAN_OUT_OF_BOUNDS; + slot->out_of_bounds_data = *data; + slot->u_val.lval = index; + } +} void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs) {} diff --git a/arch/arm64/kvm/kvm_ubsan_buffer.c b/arch/arm64/kvm/kvm_ubsan_buffer.c index 4a1959ba9f68..a1523f86be3c 100644 --- a/arch/arm64/kvm/kvm_ubsan_buffer.c +++ b/arch/arm64/kvm/kvm_ubsan_buffer.c @@ -17,6 +17,15 @@ DECLARE_KVM_DEBUG_BUFFER(struct kvm_ubsan_info, kvm_ubsan_buffer, kvm_ubsan_buff_wr_ind, KVM_UBSAN_BUFFER_SIZE); +void __kvm_check_ubsan_data(struct kvm_ubsan_info *slot) +{ + switch (slot->type) { + case UBSAN_OUT_OF_BOUNDS: + __ubsan_handle_out_of_bounds(&slot->out_of_bounds_data, + slot->u_val.lval); + break; + } +} void iterate_kvm_ubsan_buffer(unsigned long left, unsigned long right) { @@ -26,6 +35,7 @@ void iterate_kvm_ubsan_buffer(unsigned long left, unsigned long right) slot = (struct kvm_ubsan_info *) this_cpu_ptr_nvhe_sym(kvm_ubsan_buffer); for (i = left; i < right; ++i) { /* check ubsan data */ + __kvm_check_ubsan_data(slot + i); slot[i].type = 0; } } From patchwork Fri Jan 15 17:18:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 1366056 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 11FEAC433DB for ; Fri, 15 Jan 2021 17:20:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D1B222339E for ; Fri, 15 Jan 2021 17:20:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732208AbhAORTm (ORCPT ); Fri, 15 Jan 2021 12:19:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44602 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726065AbhAORTl (ORCPT ); Fri, 15 Jan 2021 12:19:41 -0500 Received: from mail-qk1-x74a.google.com (mail-qk1-x74a.google.com [IPv6:2607:f8b0:4864:20::74a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B82ADC061794 for ; Fri, 15 Jan 2021 09:19:00 -0800 (PST) Received: by mail-qk1-x74a.google.com with SMTP id c83so8627169qkg.15 for ; Fri, 15 Jan 2021 09:19:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=VLLmnZ0Ac3m76z32lc7f4mhhOZikEiI3As160KoTLrU=; b=egSS6f+/ZiSYDrYEqcmLy80yB2G8pLh4/46w4bOcE9bAiACETRhrIOb9DHjpvEIVRC /PgKrFttwj0MMDdD5zOroWcM10AEnpHSh4bCQdjiPpZNljcUGkNfLJRvgUCW/z/yGQfN LnctQtGQmXmFh4qFP8c74u0vAbaWhzKuG3qTIL0jDn8XsP/f1xVmGf2wfipFy0xdD1a5 6PsIwBV/6iCT6SuAY28J4lBPpO182IzI3Mhs0PwRRVnv53i45BbGMWwOVIb6W+dV/wtZ ZRYUwJGEFaLcB/qIU7O2/lXdYU4SRAXB0q5fCJNRSpnp5nw0eVPUwCE/IrGeHwWLtMxi PtdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=VLLmnZ0Ac3m76z32lc7f4mhhOZikEiI3As160KoTLrU=; b=DjI4nl40Z6LVhOop5wAisaxXN9+kyE7MLuZ4+UMnF35AoPJrEQQl5cODsZK8a9QfuZ A3/CHGTwcPJM/tPAdGRvo6mj9Cxyac112cXlledSj38U6ihBWtWkqwOTySLCP7t5FM24 ydE9V8mmrk6VcpHa2jcokPtafFYcDpdzKrG/GXYBPedsvr2Q+ZED8f0uGa6en9SFBHlX QzYWmAIvNaQddscguZ5lX1NE+HogPu+Y4izULBHbnm0IupI/ZRWAKgaV+sNxRZAF7jKL 2lgNSf3tQocOddIJ65BTDviLnAA0LHM+QAQzQ0X/JU3HRckkdCXY1tQQ3QlsSgYy8ZMn Bv6A== X-Gm-Message-State: AOAM532FOTYKrkrdL6l3Y8jU37//kJatq5w2OhT3SGrS7PBBk1nlLsZg hN5nNWYmnJchzH9fGQ9HJjS6JqO2Re0v X-Google-Smtp-Source: ABdhPJyX2gz/c3WBh1CNS135ZWzqDcKoMX6gQYN7QuSu6bRWqRPWCQ+Yg2fsS5KxlhOHepRi0Xak+17hYmtT Sender: "lenaptr via sendgmr" X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a05:6214:a94:: with SMTP id ev20mr13079298qvb.56.1610731139913; Fri, 15 Jan 2021 09:18:59 -0800 (PST) Date: Fri, 15 Jan 2021 17:18:25 +0000 In-Reply-To: <20210115171830.3602110-1-lenaptr@google.com> Message-Id: <20210115171830.3602110-5-lenaptr@google.com> Mime-Version: 1.0 References: <20210115171830.3602110-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog Subject: [PATCH v3 4/9] KVM: arm64: Enable UBsan check for unreachable code inside hyp/nVHE code From: Elena Petrova To: kvmarm@lists.cs.columbia.edu Cc: Elena Petrova , linux-arm-kernel@lists.infradead.org, open list , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , George Popescu , George Popescu Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: George Popescu The data from __ubsan_handle_builtin_unreachable is passed to the buffer and printed inside the kernel by its simetric handler. Signed-off-by: George Popescu Signed-off-by: Elena Petrova --- arch/arm64/include/asm/kvm_ubsan.h | 3 +++ arch/arm64/kvm/hyp/nvhe/ubsan.c | 12 +++++++++++- arch/arm64/kvm/kvm_ubsan_buffer.c | 3 +++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/kvm_ubsan.h b/arch/arm64/include/asm/kvm_ubsan.h index 4f471acb88b0..70c6f2541d07 100644 --- a/arch/arm64/include/asm/kvm_ubsan.h +++ b/arch/arm64/include/asm/kvm_ubsan.h @@ -19,9 +19,11 @@ struct ubsan_values { struct kvm_ubsan_info { enum { UBSAN_OUT_OF_BOUNDS, + UBSAN_UNREACHABLE_DATA } type; union { struct out_of_bounds_data out_of_bounds_data; + struct unreachable_data unreachable_data; }; union { struct ubsan_values u_val; @@ -29,3 +31,4 @@ struct kvm_ubsan_info { }; void __ubsan_handle_out_of_bounds(void *_data, void *index); +void __ubsan_handle_builtin_unreachable(void *_data); diff --git a/arch/arm64/kvm/hyp/nvhe/ubsan.c b/arch/arm64/kvm/hyp/nvhe/ubsan.c index 55a8f6db8555..5e55897b2d72 100644 --- a/arch/arm64/kvm/hyp/nvhe/ubsan.c +++ b/arch/arm64/kvm/hyp/nvhe/ubsan.c @@ -58,6 +58,16 @@ void __ubsan_handle_out_of_bounds(void *_data, void *index) void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs) {} -void __ubsan_handle_builtin_unreachable(void *_data) {} +void __ubsan_handle_builtin_unreachable(void *_data) +{ + struct kvm_ubsan_info *slot; + struct unreachable_data *data = _data; + + slot = kvm_ubsan_buffer_next_slot(); + if (slot) { + slot->type = UBSAN_UNREACHABLE_DATA; + slot->unreachable_data = *data; + } +} void __ubsan_handle_load_invalid_value(void *_data, void *val) {} diff --git a/arch/arm64/kvm/kvm_ubsan_buffer.c b/arch/arm64/kvm/kvm_ubsan_buffer.c index a1523f86be3c..e51949c275aa 100644 --- a/arch/arm64/kvm/kvm_ubsan_buffer.c +++ b/arch/arm64/kvm/kvm_ubsan_buffer.c @@ -24,6 +24,9 @@ void __kvm_check_ubsan_data(struct kvm_ubsan_info *slot) __ubsan_handle_out_of_bounds(&slot->out_of_bounds_data, slot->u_val.lval); break; + case UBSAN_UNREACHABLE_DATA: + __ubsan_handle_builtin_unreachable(&slot->unreachable_data); + break; } } From patchwork Fri Jan 15 17:18:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 1366057 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC760C433E0 for ; Fri, 15 Jan 2021 17:20:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 724852339E for ; Fri, 15 Jan 2021 17:20:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733274AbhAORUI (ORCPT ); Fri, 15 Jan 2021 12:20:08 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44692 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733216AbhAORUG (ORCPT ); Fri, 15 Jan 2021 12:20:06 -0500 Received: from mail-qk1-x74a.google.com (mail-qk1-x74a.google.com [IPv6:2607:f8b0:4864:20::74a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E8F07C061795 for ; Fri, 15 Jan 2021 09:19:03 -0800 (PST) Received: by mail-qk1-x74a.google.com with SMTP id 189so8652749qko.1 for ; Fri, 15 Jan 2021 09:19:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=r0Yb1c7k86IyNObw3uSoYlpOEjwui41Agh14pBOSnbw=; b=hSGoDFKkQJHGGbbbprh+JxndXzQMIC8A2b8d9cTjLGKS/6zjlELBAHWg4LPBIoZ4jj sjmAkDmfv8OsfkYhVYnYCIySbeWOKuX/YZ1Ccj1CD02RwKuakr2GX0dRfijjqAv1wS3K U9n5bG3Wpn8v3e/+eR4uc6iSuNxdSuav4Ptyyb1iFzorCs1hN2Mi7vMiOD2jI2m59SYP hE2QzF1GzaMu2pOCfiYHmdwDe6f0Z0L4DNaBXsGwupkD6R3LZKduwiOrHwvy3o6qXMuA SulMTJ5ImdYgKkn7evHvJql8gV/auPPTSyGhJAq51ES+qrEVB9OqAbZNeZhysMsu2A4E boCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=r0Yb1c7k86IyNObw3uSoYlpOEjwui41Agh14pBOSnbw=; b=gNMpenJVY6vqmysPHLTfEdIZYkKGhEQf5sbX6oQH04Uvrch6E+EUhjMpV8zMTJ3Jfq n/8wX1DGNgKTDn+ZEa6mRvamquMWjFiYRB9hRUnoEh/ilWxBUm6Q3hAZarLl3fdRRu45 nKVYVAiIHqnNQ2SL1th5UNAD4VXTnR+CP5rvAqqreSrUCkZqyh4LIIM3dtvHR/xnnoqK jOHGFHOrpVeB4kzcmxCnopY3hn5CBi2YF9S6ggotr3/FquZB5F6M7vWZFWA0gyX8k8CA zlthEUrx51OYSwS5E0gChIFcYaPJ0cuMxeqA0PoFXn6jA5AI+Ha8/xVSJoaC/PKMtQcS c40Q== X-Gm-Message-State: AOAM531M8yn22pq46iGBA7Ln6bF7ecdsqjta9B6qNj9tTazaIlm8Z3Rx GByBGGhvZ2Qv0TEbvZyJgH86zlxOTC8Z X-Google-Smtp-Source: ABdhPJweYd/lOR/2KFC86rRuTjATek2F+PrOdMNMG0Iz9+YTijZh11W4oUszwbXeTbKE9po4C1UvasiMh4dA Sender: "lenaptr via sendgmr" X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a0c:b65f:: with SMTP id q31mr13017862qvf.24.1610731143114; Fri, 15 Jan 2021 09:19:03 -0800 (PST) Date: Fri, 15 Jan 2021 17:18:26 +0000 In-Reply-To: <20210115171830.3602110-1-lenaptr@google.com> Message-Id: <20210115171830.3602110-6-lenaptr@google.com> Mime-Version: 1.0 References: <20210115171830.3602110-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog Subject: [PATCH v3 5/9] KVM: arm64: Enable shift out of bounds undefined behaviour check for hyp/nVHE From: Elena Petrova To: kvmarm@lists.cs.columbia.edu Cc: Elena Petrova , linux-arm-kernel@lists.infradead.org, open list , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , George Popescu , George Popescu Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: George Popescu __ubsan_handle_shift_out_of_bounds data is passed to the buffer inside hyp/nVHE. This data is passed to the original handler from kernel. The 64bit values of the shift expression operands are stored as the lhs and rhs pointers, so there is no need to dereference them. Signed-off-by: George Popescu Signed-off-by: Elena Petrova --- arch/arm64/include/asm/kvm_ubsan.h | 5 ++++- arch/arm64/kvm/hyp/nvhe/ubsan.c | 14 +++++++++++++- arch/arm64/kvm/kvm_ubsan_buffer.c | 4 ++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/arch/arm64/include/asm/kvm_ubsan.h b/arch/arm64/include/asm/kvm_ubsan.h index 70c6f2541d07..0eef0e11a93b 100644 --- a/arch/arm64/include/asm/kvm_ubsan.h +++ b/arch/arm64/include/asm/kvm_ubsan.h @@ -19,11 +19,13 @@ struct ubsan_values { struct kvm_ubsan_info { enum { UBSAN_OUT_OF_BOUNDS, - UBSAN_UNREACHABLE_DATA + UBSAN_UNREACHABLE_DATA, + UBSAN_SHIFT_OUT_OF_BOUNDS } type; union { struct out_of_bounds_data out_of_bounds_data; struct unreachable_data unreachable_data; + struct shift_out_of_bounds_data shift_out_of_bounds_data; }; union { struct ubsan_values u_val; @@ -32,3 +34,4 @@ struct kvm_ubsan_info { void __ubsan_handle_out_of_bounds(void *_data, void *index); void __ubsan_handle_builtin_unreachable(void *_data); +void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs); diff --git a/arch/arm64/kvm/hyp/nvhe/ubsan.c b/arch/arm64/kvm/hyp/nvhe/ubsan.c index 5e55897b2d72..1069ed5036d5 100644 --- a/arch/arm64/kvm/hyp/nvhe/ubsan.c +++ b/arch/arm64/kvm/hyp/nvhe/ubsan.c @@ -56,7 +56,19 @@ void __ubsan_handle_out_of_bounds(void *_data, void *index) } } -void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs) {} +void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs) +{ + struct kvm_ubsan_info *slot; + struct shift_out_of_bounds_data *data = _data; + + slot = kvm_ubsan_buffer_next_slot(); + if (slot) { + slot->type = UBSAN_SHIFT_OUT_OF_BOUNDS; + slot->shift_out_of_bounds_data = *data; + slot->u_val.lval = lhs; + slot->u_val.rval = rhs; + } +} void __ubsan_handle_builtin_unreachable(void *_data) { diff --git a/arch/arm64/kvm/kvm_ubsan_buffer.c b/arch/arm64/kvm/kvm_ubsan_buffer.c index e51949c275aa..b80045883047 100644 --- a/arch/arm64/kvm/kvm_ubsan_buffer.c +++ b/arch/arm64/kvm/kvm_ubsan_buffer.c @@ -27,6 +27,10 @@ void __kvm_check_ubsan_data(struct kvm_ubsan_info *slot) case UBSAN_UNREACHABLE_DATA: __ubsan_handle_builtin_unreachable(&slot->unreachable_data); break; + case UBSAN_SHIFT_OUT_OF_BOUNDS: + __ubsan_handle_shift_out_of_bounds(&slot->shift_out_of_bounds_data, + slot->u_val.lval, slot->u_val.rval); + break; } } From patchwork Fri Jan 15 17:18:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 1366058 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CD2D7C433E6 for ; Fri, 15 Jan 2021 17:20:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 92A61233CF for ; Fri, 15 Jan 2021 17:20:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733303AbhAORUJ (ORCPT ); Fri, 15 Jan 2021 12:20:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44694 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733220AbhAORUG (ORCPT ); Fri, 15 Jan 2021 12:20:06 -0500 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 440ACC061798 for ; Fri, 15 Jan 2021 09:19:10 -0800 (PST) Received: by mail-qv1-xf49.google.com with SMTP id i13so8269622qvx.11 for ; Fri, 15 Jan 2021 09:19:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=wIND0+cbxytiLi3TnPdU2y1dHj/fBtnQl0WZoWO1f3g=; b=iHwsC+akDTq/2izyfNfOh1mU4qeWdID+7XlRvI35seFl8BcVTWfx/aYX6KGgmYx4gm nemwGN0YAtiLxNca5Pah/pRIobzlTYHohJdqOHFZSuDTAN0HlibzCwDjaeY5UaVR3wKD yYQVD1ZTbEEsZVfEFwQfUqlIPV8RSbFp3u+G3YHrrOUXDmlbhMZPXGM/WPvJ70UPskaz OC1lWKa0J5wDu5N9gpIf1qGsJnTNl+AbVHva8vHJynBcAQPu6YDKyeOsdLyBa1n+GY4D t2uagGsIxrG+2prq9ENs/kMJ2pMUBIFg3hBWWQTd2h/3hHInUH30Y2BxUxo+//q9w44h MD5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=wIND0+cbxytiLi3TnPdU2y1dHj/fBtnQl0WZoWO1f3g=; b=cS9M1b4HkdpNUBbjKeJo06I7ACbulpq2cLT39pK8A0Mda40eTpqEiYb0LtXL9tMBUW DS4cOp0hySAsFjtBq/bANiItn9CWe0RZzuMUNvBuw+on78O3cr5WU3vUatz1fI2aMxJL ZVkvUNWvG0PlWFtNRbYmbaevuKPQP7TUl27FtjESN18gIz3WCDTULpsTheAb9vphaF+Q 6hxmlM9Dn+b89Su036zTdTDtLeM76Hz3IlnOPkJ1doUjq2yPvYsVY0+6l4nvP2OjGk2w FVXQLmUDK1wtt3Az69119u6lEKgFZZ46wGza9wh+sRZyFy48QlIZe/I4rlwDe2IN/4DU mEAw== X-Gm-Message-State: AOAM531294jBszXrG6MSahI387iKPSfnwOIV0EaZ8FF8wDKobiUXk5Kf kRXDWPiDNf/J413Bi7FW+W42cwtddcRv X-Google-Smtp-Source: ABdhPJwoIqBmsZNjVlpKeTgLS1FR734TbBWA8MBe6gEFE2giI4dUNxyRBYn+N6v78Z3Uq8/6D05NfIKeh490 Sender: "lenaptr via sendgmr" X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a0c:f185:: with SMTP id m5mr13304807qvl.19.1610731149343; Fri, 15 Jan 2021 09:19:09 -0800 (PST) Date: Fri, 15 Jan 2021 17:18:27 +0000 In-Reply-To: <20210115171830.3602110-1-lenaptr@google.com> Message-Id: <20210115171830.3602110-7-lenaptr@google.com> Mime-Version: 1.0 References: <20210115171830.3602110-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog Subject: [PATCH v3 6/9] KVM: arm64: __ubsan_handle_load_invalid_value EL2 implementation. From: Elena Petrova To: kvmarm@lists.cs.columbia.edu Cc: Elena Petrova , linux-arm-kernel@lists.infradead.org, open list , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , George Popescu , George Popescu Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: George Popescu The handler for the load invalid value undefined behaviour is implemented at EL2. The EL2 handler's parameters are stored inside the buffer. They are used by the symetric handler from EL1. Signed-off-by: George Popescu Signed-off-by: Elena Petrova --- arch/arm64/include/asm/kvm_ubsan.h | 5 ++++- arch/arm64/kvm/hyp/nvhe/ubsan.c | 14 +++++++++++++- arch/arm64/kvm/kvm_ubsan_buffer.c | 6 +++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/arch/arm64/include/asm/kvm_ubsan.h b/arch/arm64/include/asm/kvm_ubsan.h index 0eef0e11a93b..95ac6728ffd1 100644 --- a/arch/arm64/include/asm/kvm_ubsan.h +++ b/arch/arm64/include/asm/kvm_ubsan.h @@ -20,12 +20,14 @@ struct kvm_ubsan_info { enum { UBSAN_OUT_OF_BOUNDS, UBSAN_UNREACHABLE_DATA, - UBSAN_SHIFT_OUT_OF_BOUNDS + UBSAN_SHIFT_OUT_OF_BOUNDS, + UBSAN_INVALID_DATA } type; union { struct out_of_bounds_data out_of_bounds_data; struct unreachable_data unreachable_data; struct shift_out_of_bounds_data shift_out_of_bounds_data; + struct invalid_value_data invalid_value_data; }; union { struct ubsan_values u_val; @@ -35,3 +37,4 @@ struct kvm_ubsan_info { void __ubsan_handle_out_of_bounds(void *_data, void *index); void __ubsan_handle_builtin_unreachable(void *_data); void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs); +void __ubsan_handle_load_invalid_value(void *_data, void *val); diff --git a/arch/arm64/kvm/hyp/nvhe/ubsan.c b/arch/arm64/kvm/hyp/nvhe/ubsan.c index 1069ed5036d5..3143f7722be2 100644 --- a/arch/arm64/kvm/hyp/nvhe/ubsan.c +++ b/arch/arm64/kvm/hyp/nvhe/ubsan.c @@ -82,4 +82,16 @@ void __ubsan_handle_builtin_unreachable(void *_data) } } -void __ubsan_handle_load_invalid_value(void *_data, void *val) {} +void __ubsan_handle_load_invalid_value(void *_data, void *val) +{ + struct kvm_ubsan_info *slot; + struct invalid_value_data *data = _data; + + slot = kvm_ubsan_buffer_next_slot(); + if (slot) { + slot->type = UBSAN_INVALID_DATA; + slot->invalid_value_data = *data; + slot->u_val.lval = val; + } + +} diff --git a/arch/arm64/kvm/kvm_ubsan_buffer.c b/arch/arm64/kvm/kvm_ubsan_buffer.c index b80045883047..5439f7a91636 100644 --- a/arch/arm64/kvm/kvm_ubsan_buffer.c +++ b/arch/arm64/kvm/kvm_ubsan_buffer.c @@ -31,7 +31,11 @@ void __kvm_check_ubsan_data(struct kvm_ubsan_info *slot) __ubsan_handle_shift_out_of_bounds(&slot->shift_out_of_bounds_data, slot->u_val.lval, slot->u_val.rval); break; - } + case UBSAN_INVALID_DATA: + __ubsan_handle_load_invalid_value(&slot->invalid_value_data, + slot->u_val.lval); + break; + } } void iterate_kvm_ubsan_buffer(unsigned long left, unsigned long right) From patchwork Fri Jan 15 17:18:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 1366059 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0A392C433E9 for ; Fri, 15 Jan 2021 17:20:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CF728239D0 for ; Fri, 15 Jan 2021 17:20:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387456AbhAORUN (ORCPT ); Fri, 15 Jan 2021 12:20:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44710 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732382AbhAORUK (ORCPT ); Fri, 15 Jan 2021 12:20:10 -0500 Received: from mail-wr1-x44a.google.com (mail-wr1-x44a.google.com [IPv6:2a00:1450:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B1D8DC061796 for ; Fri, 15 Jan 2021 09:19:12 -0800 (PST) Received: by mail-wr1-x44a.google.com with SMTP id n11so4426444wro.7 for ; Fri, 15 Jan 2021 09:19:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=ac9iKnNyoG+yHGcTDAMRhMwUzeXQu2/WPJbZdHzHiDM=; b=OAyogaLZUq5MdAiMQ7o6yYDrA4xFWT3n//pON1UcS/hSVpv0bPZGVr5NBg7ZTb4yO6 Q80Ta+Re6sKynisYOvneXafA6KmueojgT1HmipWZVI/xy5JrRkwc6vI/K2bNA4fGsXzQ WLdpwCeoopBmdpGI5TAMS0hrNbHej7j7SweB583NzaooMOTNOWURPog3cFUxUztdNS1f gkjb9dYC85KgoaxaumXHIi1kzeGf98swUpoTsXI656EhGUHLtSnpbBgCNdXSHv3o1Jnk kIWddWa7f7LK4G00om+EmIdTn2mV3xrf9FpR4lvhLfiOM5kpNLhmIEkegfvDPX06Y13k L8dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=ac9iKnNyoG+yHGcTDAMRhMwUzeXQu2/WPJbZdHzHiDM=; b=SnRNkqLDmTJl8eBY4XE9TOVpq3145AJFPFLbE3VRTWx55QgrRt5ptsgVMS/EuCqSPr +VR6sULTJYEawwU4NkNiYoyDkJHW/KVk/ADPw4Sa9yFf4XbG7L79x+iEf5TaJnxy7ola r+LzrwAX7EVXPZNajlNsY83RE1KZ9a+7MpeE8L3ot8792eMTisR3keGffMkocP9PRR8Z Ubzd9EAYtzi+0Z//zASstLP5MHPjJKCchh32b5oSzQZe6k3Zn3tPYlPLERopWPNsjbwD B3ePqS4uMTqVTv+lqpRfdovbOGJbhz6ITIPjh3oLmhIAcJ6gxcciWqqGTcUNuCbX1A6X yyNw== X-Gm-Message-State: AOAM532eTz9KDPvcxPdgr6MrN5L4lHJzUGSb77FS6UsfINI274rq8n59 HY9sqpET7QE9P65ESbyAlDgF4VMiKEi0 X-Google-Smtp-Source: ABdhPJx8CnxfxMc88an10BfA7jJXL8kT9++eM18I3b0opJbatRfb/r4GrAI2JcUfytJA5JKRYuFonjSWiQc5 Sender: "lenaptr via sendgmr" X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a7b:c395:: with SMTP id s21mr7798201wmj.97.1610731151420; Fri, 15 Jan 2021 09:19:11 -0800 (PST) Date: Fri, 15 Jan 2021 17:18:28 +0000 In-Reply-To: <20210115171830.3602110-1-lenaptr@google.com> Message-Id: <20210115171830.3602110-8-lenaptr@google.com> Mime-Version: 1.0 References: <20210115171830.3602110-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog Subject: [PATCH v3 7/9] KVM: arm64: Detect type mismatch undefined behaviour from hyp/nVHE code From: Elena Petrova To: kvmarm@lists.cs.columbia.edu Cc: Elena Petrova , linux-arm-kernel@lists.infradead.org, open list , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , George Popescu , George Popescu Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: George Popescu Type mismatch undefiend behaviour handler provides two handlers with two data structures type_mismatch_data and type_mismatch_data_v1. Both can be stored inside a common data structure: type_mismatch_data_common, which differs of type_mismatch_data only by keeping a pointer to a struct source_location. In this way, the buffer keeps the data encapsulated inside of a struct type_mismatch_data, because pointers from nVHE can not be passed to the kernel. Inside the kernel call the __ubsan_handle_type_mismatch_data with the data from the buffer. Signed-off-by: George Popescu Signed-off-by: Elena Petrova --- arch/arm64/include/asm/kvm_ubsan.h | 6 ++++- arch/arm64/kvm/hyp/nvhe/ubsan.c | 41 ++++++++++++++++++++++++++++-- arch/arm64/kvm/kvm_ubsan_buffer.c | 5 +++- 3 files changed, 48 insertions(+), 4 deletions(-) diff --git a/arch/arm64/include/asm/kvm_ubsan.h b/arch/arm64/include/asm/kvm_ubsan.h index 95ac6728ffd1..93c1b695097a 100644 --- a/arch/arm64/include/asm/kvm_ubsan.h +++ b/arch/arm64/include/asm/kvm_ubsan.h @@ -21,13 +21,15 @@ struct kvm_ubsan_info { UBSAN_OUT_OF_BOUNDS, UBSAN_UNREACHABLE_DATA, UBSAN_SHIFT_OUT_OF_BOUNDS, - UBSAN_INVALID_DATA + UBSAN_INVALID_DATA, + UBSAN_TYPE_MISMATCH } type; union { struct out_of_bounds_data out_of_bounds_data; struct unreachable_data unreachable_data; struct shift_out_of_bounds_data shift_out_of_bounds_data; struct invalid_value_data invalid_value_data; + struct type_mismatch_data type_mismatch_data; }; union { struct ubsan_values u_val; @@ -38,3 +40,5 @@ void __ubsan_handle_out_of_bounds(void *_data, void *index); void __ubsan_handle_builtin_unreachable(void *_data); void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs); void __ubsan_handle_load_invalid_value(void *_data, void *val); +void __ubsan_handle_type_mismatch(struct type_mismatch_data *_data, void *ptr); + diff --git a/arch/arm64/kvm/hyp/nvhe/ubsan.c b/arch/arm64/kvm/hyp/nvhe/ubsan.c index 3143f7722be2..a9f72d4bcab7 100644 --- a/arch/arm64/kvm/hyp/nvhe/ubsan.c +++ b/arch/arm64/kvm/hyp/nvhe/ubsan.c @@ -29,6 +29,24 @@ static inline struct kvm_ubsan_info *kvm_ubsan_buffer_next_slot(void) return res; } +static void write_type_mismatch_data(struct type_mismatch_data_common *data, void *lval) +{ + struct kvm_ubsan_info *slot; + struct type_mismatch_data *aux_cont; + + slot = kvm_ubsan_buffer_next_slot(); + if (slot) { + slot->type = UBSAN_TYPE_MISMATCH; + aux_cont = &slot->type_mismatch_data; + aux_cont->location.file_name = data->location->file_name; + aux_cont->location.reported = data->location->reported; + aux_cont->type = data->type; + aux_cont->alignment = data->alignment; + aux_cont->type_check_kind = data->type_check_kind; + slot->u_val.lval = lval; + } +} + void __ubsan_handle_add_overflow(void *_data, void *lhs, void *rhs) {} void __ubsan_handle_sub_overflow(void *_data, void *lhs, void *rhs) {} @@ -39,9 +57,28 @@ void __ubsan_handle_negate_overflow(void *_data, void *old_val) {} void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs) {} -void __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr) {} +void __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr) +{ + struct type_mismatch_data_common common_data = { + .location = &data->location, + .type = data->type, + .alignment = data->alignment, + .type_check_kind = data->type_check_kind + }; + write_type_mismatch_data(&common_data, ptr); +} -void __ubsan_handle_type_mismatch_v1(void *_data, void *ptr) {} +void __ubsan_handle_type_mismatch_v1(void *_data, void *ptr) +{ + struct type_mismatch_data_v1 *data = _data; + struct type_mismatch_data_common common_data = { + .location = &data->location, + .type = data->type, + .alignment = 1UL << data->log_alignment, + .type_check_kind = data->type_check_kind + }; + write_type_mismatch_data(&common_data, ptr); +} void __ubsan_handle_out_of_bounds(void *_data, void *index) { diff --git a/arch/arm64/kvm/kvm_ubsan_buffer.c b/arch/arm64/kvm/kvm_ubsan_buffer.c index 5439f7a91636..b7823dedf8b1 100644 --- a/arch/arm64/kvm/kvm_ubsan_buffer.c +++ b/arch/arm64/kvm/kvm_ubsan_buffer.c @@ -35,6 +35,10 @@ void __kvm_check_ubsan_data(struct kvm_ubsan_info *slot) __ubsan_handle_load_invalid_value(&slot->invalid_value_data, slot->u_val.lval); break; + case UBSAN_TYPE_MISMATCH: + __ubsan_handle_type_mismatch(&slot->type_mismatch_data, + slot->u_val.lval); + break; } } @@ -58,4 +62,3 @@ void __kvm_check_ubsan_buffer(void) write_ind = (unsigned long *) this_cpu_ptr_nvhe_sym(kvm_ubsan_buff_wr_ind); iterate_kvm_ubsan_buffer(0, *write_ind); } - From patchwork Fri Jan 15 17:18:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 1366061 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E5839C433DB for ; Fri, 15 Jan 2021 17:20:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B03C72388B for ; Fri, 15 Jan 2021 17:20:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387432AbhAORUM (ORCPT ); Fri, 15 Jan 2021 12:20:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44712 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1733220AbhAORUK (ORCPT ); Fri, 15 Jan 2021 12:20:10 -0500 Received: from mail-qv1-xf49.google.com (mail-qv1-xf49.google.com [IPv6:2607:f8b0:4864:20::f49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3BFC4C061799 for ; Fri, 15 Jan 2021 09:19:14 -0800 (PST) Received: by mail-qv1-xf49.google.com with SMTP id j5so8255194qvu.22 for ; Fri, 15 Jan 2021 09:19:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=dbukutgYzHT9MiWfvULK4mqHhSiWytSaif6tz/CiEZM=; b=o5x+TKeEjPaVlxVW2WwM7smd2sabHdLTnC8LFV1VrZQ/GGd4Bgqar1ue6KnB83naGM MJT/HcEcZkF+D0O1RZQx8Y1GwomJ6XnuSWTYL0NEttffqFoWwA+fVJhe+Y2sP/jwHFXK LM3I0Iasp3fRNiQMEpuS/VH3E8cWKObdLfSP4yNdHw1DzrecpCrtArsNMvVchBJqI8SF mWo6vbOqPdhLmriUmNoOOUNjqLKR6SmKIirmIAnCV2/PvV+vpiAFpTYjRByIy3cSPSLK /d3ZiripFD1TXXle8YUHzFq0zkpAbs4aGPx+spj4dKEkZ8zz4Pp0TzP4ASQz1o5xy8XX 0fwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=dbukutgYzHT9MiWfvULK4mqHhSiWytSaif6tz/CiEZM=; b=LDbg1H12a9EKstPKKSYsMmVOubDMg909MVL52n/BkEYwvnaJXuDynxVGPgvfFYZQJe ZyVqB010siGysIGKVuSu0jo2DbLRVNhNl/T4hNFf/FB/rlQBLnkIIkNOyfRojYV3yiDf An7DyIPIyZ4SzN/2LlXPi2bx7hP3FffmD+9rqwUSwc3LXv9FwYrEBECnG5iMD7+IKLCw /TVpGGsX0YML9e54WTJQB7CqIfpl6Jhlu3E/hyczPpbC1V2YgxEgV5bH2F1MFXo/ShsH RFQjuTh2rCGGy37QDSbZhhyuw+pNIE2mnOSloO+qHtT0DZxswQcj1OzfCgukASwzZQN/ WPvA== X-Gm-Message-State: AOAM530jrcd0nfEYAdowMbbZj5hCVy6sTGlrftPpjcobtZCur4wrDSx/ UYel5wfKl5v+P9adSu/zvArGaCh8b4qP X-Google-Smtp-Source: ABdhPJyQcMFM2gScJdAyiUCENJPpKRcOpuNpdPzq/hrwPtvifyN9mwpzU1Ikbkzr28w4TO2zS8LDW0ssH6cR Sender: "lenaptr via sendgmr" X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:ad4:5901:: with SMTP id ez1mr13147103qvb.6.1610731153435; Fri, 15 Jan 2021 09:19:13 -0800 (PST) Date: Fri, 15 Jan 2021 17:18:29 +0000 In-Reply-To: <20210115171830.3602110-1-lenaptr@google.com> Message-Id: <20210115171830.3602110-9-lenaptr@google.com> Mime-Version: 1.0 References: <20210115171830.3602110-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog Subject: [PATCH v3 8/9] KVM: arm64: Detect arithmetic overflow is inside hyp/nVHE. From: Elena Petrova To: kvmarm@lists.cs.columbia.edu Cc: Elena Petrova , linux-arm-kernel@lists.infradead.org, open list , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , George Popescu , George Popescu Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: George Popescu Whenever an arithmetic overflow: addition, substraction, multiplication, division or negating happens inside the hyp/nVHE code, an __ubsan_handle_*_overflow is called. All the overflow handlers are sharing the same structure called overflow_data. Signed-off-by: George Popescu Signed-off-by: Elena Petrova --- arch/arm64/include/asm/kvm_ubsan.h | 10 ++++++-- arch/arm64/kvm/hyp/nvhe/ubsan.c | 40 ++++++++++++++++++++++++++---- arch/arm64/kvm/kvm_ubsan_buffer.c | 20 ++++++++++++++- 3 files changed, 62 insertions(+), 8 deletions(-) diff --git a/arch/arm64/include/asm/kvm_ubsan.h b/arch/arm64/include/asm/kvm_ubsan.h index 93c1b695097a..da4a3b4e28e0 100644 --- a/arch/arm64/include/asm/kvm_ubsan.h +++ b/arch/arm64/include/asm/kvm_ubsan.h @@ -22,7 +22,8 @@ struct kvm_ubsan_info { UBSAN_UNREACHABLE_DATA, UBSAN_SHIFT_OUT_OF_BOUNDS, UBSAN_INVALID_DATA, - UBSAN_TYPE_MISMATCH + UBSAN_TYPE_MISMATCH, + UBSAN_OVERFLOW_DATA } type; union { struct out_of_bounds_data out_of_bounds_data; @@ -30,6 +31,7 @@ struct kvm_ubsan_info { struct shift_out_of_bounds_data shift_out_of_bounds_data; struct invalid_value_data invalid_value_data; struct type_mismatch_data type_mismatch_data; + struct overflow_data overflow_data; }; union { struct ubsan_values u_val; @@ -41,4 +43,8 @@ void __ubsan_handle_builtin_unreachable(void *_data); void __ubsan_handle_shift_out_of_bounds(void *_data, void *lhs, void *rhs); void __ubsan_handle_load_invalid_value(void *_data, void *val); void __ubsan_handle_type_mismatch(struct type_mismatch_data *_data, void *ptr); - +void __ubsan_handle_add_overflow(void *data, void *lhs, void *rhs); +void __ubsan_handle_sub_overflow(void *data, void *lhs, void *rhs); +void __ubsan_handle_mul_overflow(void *data, void *lhs, void *rhs); +void __ubsan_handle_negate_overflow(void *_data, void *old_val); +void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs); diff --git a/arch/arm64/kvm/hyp/nvhe/ubsan.c b/arch/arm64/kvm/hyp/nvhe/ubsan.c index a9f72d4bcab7..f16842ff7316 100644 --- a/arch/arm64/kvm/hyp/nvhe/ubsan.c +++ b/arch/arm64/kvm/hyp/nvhe/ubsan.c @@ -47,15 +47,45 @@ static void write_type_mismatch_data(struct type_mismatch_data_common *data, voi } } -void __ubsan_handle_add_overflow(void *_data, void *lhs, void *rhs) {} +static void write_overflow_data(struct overflow_data *data, void *lval, void *rval, char op) +{ + struct kvm_ubsan_info *slot = kvm_ubsan_buffer_next_slot(); + + if (slot) { + slot->type = UBSAN_OVERFLOW_DATA; + slot->overflow_data = *data; + slot->u_val.op = op; + slot->u_val.lval = lval; + if (op != '!') + slot->u_val.rval = rval; + } +} + +void __ubsan_handle_add_overflow(void *_data, void *lhs, void *rhs) +{ + write_overflow_data(_data, lhs, rhs, '+'); +} -void __ubsan_handle_sub_overflow(void *_data, void *lhs, void *rhs) {} +void __ubsan_handle_sub_overflow(void *_data, void *lhs, void *rhs) +{ + write_overflow_data(_data, lhs, rhs, '-'); +} -void __ubsan_handle_mul_overflow(void *_data, void *lhs, void *rhs) {} +void __ubsan_handle_mul_overflow(void *_data, void *lhs, void *rhs) +{ + write_overflow_data(_data, lhs, rhs, '*'); +} -void __ubsan_handle_negate_overflow(void *_data, void *old_val) {} +void __ubsan_handle_negate_overflow(void *_data, void *old_val) +{ + write_overflow_data(_data, old_val, NULL, '!'); +} + +void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs) +{ + write_overflow_data(_data, lhs, rhs, '/'); +} -void __ubsan_handle_divrem_overflow(void *_data, void *lhs, void *rhs) {} void __ubsan_handle_type_mismatch(struct type_mismatch_data *data, void *ptr) { diff --git a/arch/arm64/kvm/kvm_ubsan_buffer.c b/arch/arm64/kvm/kvm_ubsan_buffer.c index b7823dedf8b1..2c7060cbb48b 100644 --- a/arch/arm64/kvm/kvm_ubsan_buffer.c +++ b/arch/arm64/kvm/kvm_ubsan_buffer.c @@ -39,7 +39,25 @@ void __kvm_check_ubsan_data(struct kvm_ubsan_info *slot) __ubsan_handle_type_mismatch(&slot->type_mismatch_data, slot->u_val.lval); break; - } + case UBSAN_OVERFLOW_DATA: + if (slot->u_val.op == '/') { + __ubsan_handle_divrem_overflow(&slot->overflow_data, + slot->u_val.lval, slot->u_val.rval); + } else if (slot->u_val.op == '!') { + __ubsan_handle_negate_overflow(&slot->overflow_data, + slot->u_val.lval); + } else if (slot->u_val.op == '+') { + __ubsan_handle_add_overflow(&slot->overflow_data, + slot->u_val.lval, slot->u_val.rval); + } else if (slot->u_val.op == '-') { + __ubsan_handle_sub_overflow(&slot->overflow_data, + slot->u_val.lval, slot->u_val.rval); + } else if (slot->u_val.op == '*') { + __ubsan_handle_mul_overflow(&slot->overflow_data, + slot->u_val.lval, slot->u_val.rval); + } + break; + } } void iterate_kvm_ubsan_buffer(unsigned long left, unsigned long right) From patchwork Fri Jan 15 17:18:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 1366060 Return-Path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1FA4BC43381 for ; Fri, 15 Jan 2021 17:20:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id EDDB8233CF for ; Fri, 15 Jan 2021 17:20:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387500AbhAORUQ (ORCPT ); Fri, 15 Jan 2021 12:20:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44732 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732382AbhAORUP (ORCPT ); Fri, 15 Jan 2021 12:20:15 -0500 Received: from mail-qk1-x749.google.com (mail-qk1-x749.google.com [IPv6:2607:f8b0:4864:20::749]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 58681C06179A for ; Fri, 15 Jan 2021 09:19:16 -0800 (PST) Received: by mail-qk1-x749.google.com with SMTP id b206so8628518qkc.14 for ; Fri, 15 Jan 2021 09:19:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=sender:date:in-reply-to:message-id:mime-version:references:subject :from:to:cc; bh=iHVLKT2GDoD/bWysfKR91nfDSkdEIEEwPqsvUiYvewQ=; b=unnSOFGbj7bYH0H/CfqTTqhAsljbi+sSDonzIXbCfRF7iewo4PeFFpUK1S/em2X+rM j25bv/JtA6hqRivqRMgcMz19priFMFir91PJUhurQyaOkM8RiGvFvKWAq7DkCDnGa0/d lyTgIzQCS7p2tbDvRrmCjFWjy7UotZMN/lSOkRw/V6XAxApNu567s/4SqTMsBrdVvCiv zUL0lupK+jpd7pGMBLTK4gzWD8XztaGs1pHD2xlqn1fQduPBYYBvFZcjVkRuFQI+2euZ XYrgSPaqNhC7sxidOiyX/h1owrXH0fmG4y2m123yVDR4BZafeYTogGXsrwJNXvlvXNSX 9Q4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=iHVLKT2GDoD/bWysfKR91nfDSkdEIEEwPqsvUiYvewQ=; b=W9jL0Pqm0irDNFV2C+6RstNo2sLpl/lfCQqDRQWumzaZQ9/zKsd5yaYEw//LQEG+WH F8DKLOMykJy2WmF/7ATyWC1Q2PeNsibNhHeKdsjebb3nLxp3aELemgP9muov5tigXwfx CxLHn67jLHqkvPOZMAfxejzMsBnHbQ43rj8voy0EzxEJSXsClOyhG3klccCS3E5qnS2G 25rvdVGjv+WNd9qi8qZ/Ksk8/JIcbWrD0BqVPrHut9g6KNrFmDHmfpMK1B0VOxCIwyFA KtXy0AdDfk8RBpEp1hFSsuZ8PwvVeQA0esHN8C+9jbr9XOswHW38nUczNkS/VWXGPaix Ceww== X-Gm-Message-State: AOAM531Q4kzpofvZfk7ugx32bo1oR9TRAnncK8EgwmU5UcxGp+pw1nz5 ppKWu+Eau3vhQQlr6/Hr7wKHApmaFe7x X-Google-Smtp-Source: ABdhPJxRGiugW2lCtf26zO/nfxMa2RoqN+pB/rzgJWom5N/4mvf0M7cLCSVGq7QosXUMoERXi86lNP0vt9AC Sender: "lenaptr via sendgmr" X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a05:6214:321:: with SMTP id j1mr13395636qvu.32.1610731155510; Fri, 15 Jan 2021 09:19:15 -0800 (PST) Date: Fri, 15 Jan 2021 17:18:30 +0000 In-Reply-To: <20210115171830.3602110-1-lenaptr@google.com> Message-Id: <20210115171830.3602110-10-lenaptr@google.com> Mime-Version: 1.0 References: <20210115171830.3602110-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.296.g2bfb1c46d8-goog Subject: [PATCH v3 9/9] KVM: arm64: Add UBSan tests for PKVM. From: Elena Petrova To: kvmarm@lists.cs.columbia.edu Cc: Elena Petrova , linux-arm-kernel@lists.infradead.org, open list , Marc Zyngier , James Morse , Julien Thierry , Suzuki K Poulose , George Popescu , George-Aurelian Popescu Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: George-Aurelian Popescu Test the UBsan functionality inside hyp/nVHE. Because modules are not supported inside of hyp/nVHE code, the default testing module for UBSan can not be used. New functions have to be defined inside of hyp/nVHE. They are called in kvm_get_mdcr_el2, to test UBSAN whenever a VM starts. Signed-off-by: Elena Petrova --- arch/arm64/include/asm/assembler.h | 17 ++- arch/arm64/include/asm/kvm_debug_buffer.h | 10 +- arch/arm64/include/asm/kvm_ubsan.h | 2 +- arch/arm64/kvm/hyp/include/hyp/test_ubsan.h | 112 ++++++++++++++++++++ arch/arm64/kvm/hyp/nvhe/hyp-main.c | 3 + arch/arm64/kvm/kvm_ubsan_buffer.c | 1 - 6 files changed, 128 insertions(+), 17 deletions(-) create mode 100644 arch/arm64/kvm/hyp/include/hyp/test_ubsan.h diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h index ebc18a8a0e1f..8422b0d925e8 100644 --- a/arch/arm64/include/asm/assembler.h +++ b/arch/arm64/include/asm/assembler.h @@ -259,16 +259,15 @@ alternative_endif .endm /* - * @sym: The name of the per-cpu variable - * @reg: value to store - * @tmp1: scratch register - * @tmp2: scratch register - */ - .macro str_this_cpu sym, reg, tmp1, tmp2 - adr_this_cpu \tmp1, \sym, \tmp2 + * @sym: The name of the per-cpu variable + * @reg: value to store + * @tmp1: scratch register + * @tmp2: scratch register + */ + .macro str_this_cpu sym, reg, tmp1, tmp2 + adr_this_cpu \tmp1, \sym, \tmp2 str \reg, [\tmp1] - .endm - + .endm /* * vma_vm_mm - get mm pointer from vma pointer (vma->vm_mm) */ diff --git a/arch/arm64/include/asm/kvm_debug_buffer.h b/arch/arm64/include/asm/kvm_debug_buffer.h index e5375c2cff1a..361b473bb004 100644 --- a/arch/arm64/include/asm/kvm_debug_buffer.h +++ b/arch/arm64/include/asm/kvm_debug_buffer.h @@ -3,10 +3,8 @@ * Copyright 2020 Google LLC * Author: George Popescu */ - #include - #define KVM_DEBUG_BUFFER_SIZE 1000 #ifdef __KVM_NVHE_HYPERVISOR__ @@ -20,17 +18,17 @@ #else #define DECLARE_KVM_DEBUG_BUFFER(type_name, buffer_name, write_ind, size)\ DECLARE_KVM_NVHE_PER_CPU(type_name, buffer_name)[size]; \ - DECLARE_KVM_NVHE_PER_CPU(unsigned long, write_ind); + DECLARE_KVM_NVHE_PER_CPU(unsigned long, write_ind); #endif //__KVM_NVHE_HYPERVISOR__ #ifdef __ASSEMBLY__ #include .macro clear_buffer tmp1, tmp2, tmp3 - mov \tmp1, 0 + mov \tmp1, 0 #ifdef CONFIG_UBSAN - str_this_cpu kvm_ubsan_buff_wr_ind, \tmp1, \tmp2, \tmp3 + str_this_cpu kvm_ubsan_buff_wr_ind, \tmp1, \tmp2, \tmp3 #endif //CONFIG_UBSAN .endm -#endif \ No newline at end of file +#endif diff --git a/arch/arm64/include/asm/kvm_ubsan.h b/arch/arm64/include/asm/kvm_ubsan.h index da4a3b4e28e0..0b8bed08d48e 100644 --- a/arch/arm64/include/asm/kvm_ubsan.h +++ b/arch/arm64/include/asm/kvm_ubsan.h @@ -9,7 +9,6 @@ #define UBSAN_MAX_TYPE 6 #define KVM_UBSAN_BUFFER_SIZE 1000 - struct ubsan_values { void *lval; void *rval; @@ -18,6 +17,7 @@ struct ubsan_values { struct kvm_ubsan_info { enum { + UBSAN_NONE, UBSAN_OUT_OF_BOUNDS, UBSAN_UNREACHABLE_DATA, UBSAN_SHIFT_OUT_OF_BOUNDS, diff --git a/arch/arm64/kvm/hyp/include/hyp/test_ubsan.h b/arch/arm64/kvm/hyp/include/hyp/test_ubsan.h new file mode 100644 index 000000000000..07759c0d1e0e --- /dev/null +++ b/arch/arm64/kvm/hyp/include/hyp/test_ubsan.h @@ -0,0 +1,112 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include + +typedef void(*test_ubsan_fp)(void); + +static void test_ubsan_add_overflow(void) +{ + volatile int val = INT_MAX; + + val += 2; +} + +static void test_ubsan_sub_overflow(void) +{ + volatile int val = INT_MIN; + volatile int val2 = 2; + + val -= val2; +} + +static void test_ubsan_mul_overflow(void) +{ + volatile int val = INT_MAX / 2; + + val *= 3; +} + +static void test_ubsan_negate_overflow(void) +{ + volatile int val = INT_MIN; + + val = -val; +} + +static void test_ubsan_divrem_overflow(void) +{ + volatile int val = 16; + volatile int val2 = 0; + + val /= val2; +} + +static void test_ubsan_shift_out_of_bounds(void) +{ + volatile int val = -1; + int val2 = 10; + + val2 <<= val; +} + +static void test_ubsan_out_of_bounds(void) +{ + volatile int i = 4, j = 5; + volatile int arr[4]; + + arr[j] = i; +} + +static void test_ubsan_load_invalid_value(void) +{ + volatile char *dst, *src; + bool val, val2, *ptr; + char c = 4; + + dst = (char *)&val; + src = &c; + *dst = *src; + + ptr = &val2; + val2 = val; +} + +static void test_ubsan_misaligned_access(void) +{ + volatile char arr[5] __aligned(4) = {1, 2, 3, 4, 5}; + volatile int *ptr, val = 6; + + ptr = (int *)(arr + 1); + *ptr = val; +} + +static void test_ubsan_object_size_mismatch(void) +{ + /* "((aligned(8)))" helps this not into be misaligned for ptr-access. */ + volatile int val __aligned(8) = 4; + volatile long long *ptr, val2; + + ptr = (long long *)&val; + val2 = *ptr; +} + +static const test_ubsan_fp test_ubsan_array[] = { + test_ubsan_out_of_bounds, + test_ubsan_add_overflow, + test_ubsan_sub_overflow, + test_ubsan_mul_overflow, + test_ubsan_negate_overflow, + test_ubsan_divrem_overflow, + test_ubsan_shift_out_of_bounds, + test_ubsan_load_invalid_value, + test_ubsan_misaligned_access, + test_ubsan_object_size_mismatch, +}; + +static void test_ubsan(void) +{ + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(test_ubsan_array); i++) + test_ubsan_array[i](); +} diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/hyp-main.c index a906f9e2ff34..939600e9fdd6 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c @@ -13,6 +13,7 @@ #include #include +#include DEFINE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params); @@ -90,6 +91,8 @@ static void handle___vgic_v3_init_lrs(struct kvm_cpu_context *host_ctxt) static void handle___kvm_get_mdcr_el2(struct kvm_cpu_context *host_ctxt) { cpu_reg(host_ctxt, 1) = __kvm_get_mdcr_el2(); + if (IS_ENABLED(CONFIG_TEST_UBSAN)) + test_ubsan(); } static void handle___vgic_v3_save_aprs(struct kvm_cpu_context *host_ctxt) diff --git a/arch/arm64/kvm/kvm_ubsan_buffer.c b/arch/arm64/kvm/kvm_ubsan_buffer.c index 2c7060cbb48b..49bedc9de139 100644 --- a/arch/arm64/kvm/kvm_ubsan_buffer.c +++ b/arch/arm64/kvm/kvm_ubsan_buffer.c @@ -11,7 +11,6 @@ #include #include -#include #include DECLARE_KVM_DEBUG_BUFFER(struct kvm_ubsan_info, kvm_ubsan_buffer,