From patchwork Thu Jan 14 17:23:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 12020389 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EF29EC433E6 for ; Thu, 14 Jan 2021 17:26:18 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AB03F23A5E for ; Thu, 14 Jan 2021 17:26:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AB03F23A5E Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=CNekVIbh2KDksWCypbrV2AlSGThOGPxJvdkhOTIaQ0I=; b=OuqCudnGUh9Vh6Nnu6YMeuGEW mDpP9DbkeecgIxoyQy1cmDVt3gRq23KxPb5VM0M/DMtWG1TKHFOcgtz75PLeTngt32fzGsmhrumDi SvxXhKUCjYlq7fEr182NKbLFf0jyTYAJfEihxEA0mxFUtfvJHQbGH+XjjHLA02Q4uT1T2n7MKcvuL 5TqyAaFZthUsztiZ7GJM1+H9YNp5H/ToTKWLJXTYfqqzVJzMcXemygk7Nou+umuzUidJ3SN0oV1yG QdJpRad4OSothmOVs8Pgcb1aR5edlNoR5fn8KGvntCIE6BSkFb7r28I/3DGhIn6Yu741zgbsiiALh LplB+ezKw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06MR-0000iR-9G; Thu, 14 Jan 2021 17:24:39 +0000 Received: from mail-wr1-x449.google.com ([2a00:1450:4864:20::449]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06MO-0000hn-OB for linux-arm-kernel@lists.infradead.org; Thu, 14 Jan 2021 17:24:37 +0000 Received: by mail-wr1-x449.google.com with SMTP id 88so2881663wrc.17 for ; Thu, 14 Jan 2021 09:24:34 -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=y3uVL2zsp0VJR2OozRdghUzMpLjApzFCfr62Fn6g7rg=; b=jXDVpHxScZiOuheuAvtB58//oBlibKwTMFxR8j3bTBIqi2TYWJks5H6A9l9H4iZEQo vRunm5PZ3PchWeHirQY8/It+PP3sfBYMvaGGZnDFPbesmOwT8brcqLpjhAy+DXjARHcM rmgXiHd8w8oSdElQ/RL48v5yfEv5plBKJKu8F/hjhdek6o6w+/14JykyMOcpvjqvIljz JVMrr3GrTj+XeJqSptoJFoF/uyIVGka1QGy1Rwxf/g41YbKCtc+G7vJjjGEtOzUuNiqD d1d+FY7iVHTWBIG4BRg8Y818P+5IjkwMe+TKBM9iNC8lF3UZ92DO/o9C97QMFiyPjJKo k8XQ== 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=y3uVL2zsp0VJR2OozRdghUzMpLjApzFCfr62Fn6g7rg=; b=I1jS0o3RLbc3SdVY4DPhhK2nO9qBHli0fqq19vKYlSUX2GhZL+AWYCogDY8w96Rzih TjjhZXQAqKwhMueWA07+Z+pmB2iv9N1lNMkAAcs+y824/+Bc3XmhTHUgpztPvDXFJpg8 DFKZYlrdPSzV7rZJ4i0fVzdHpo6C+6M+6hE6juLZI2l5LDYiPWoYTCvmcsIyL8hCjnK4 FQg/1tg6up1FpQWjPMEKY1QPNdXeIuObtV0yxIT4fwD8dx/XdOJvTqz4WZ3JJlFp5FGG qyb6rA9BkQ91U/Nahc2m0Cn5J3a1KNtJe5lUE/s/Fte6K5JHSv68fNl0yc8cyyISL0tN mPxA== X-Gm-Message-State: AOAM532DmfMnOOOIBiG4AjAbEV88ttOyeSlfDTE1pzPTbZxNJ0Y37B2t wcvyt3ATmeQyipfpdslfiRnONcKQ8Wmn X-Google-Smtp-Source: ABdhPJydi7AsXcrMM3CBUVXuKwwycVtR+4ZFfJv4lMAMFVPeGz4BC+6e8WueiOFjSoLsgWVbliWfdubnCMzh X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a1c:2c89:: with SMTP id s131mr533151wms.0.1610645073118; Thu, 14 Jan 2021 09:24:33 -0800 (PST) Date: Thu, 14 Jan 2021 17:23:31 +0000 In-Reply-To: <20210114172338.2798389-1-lenaptr@google.com> Message-Id: <20210114172338.2798389-2-lenaptr@google.com> Mime-Version: 1.0 References: <20210114172338.2798389-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v2 1/9] KVM: arm64: Enable UBSan instrumentation in nVHE hyp code From: Elena Petrova To: kvmarm@lists.cs.columbia.edu X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210114_122436_835322_3514CA5F X-CRM114-Status: GOOD ( 12.42 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: George-Aurelian Popescu , Elena Petrova , Suzuki K Poulose , Marc Zyngier , open list , James Morse , linux-arm-kernel@lists.infradead.org, George Popescu , Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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. Change-Id: I4a468b33251fa099ddfc05a7cefa520cb8817994 Signed-off-by: Elena Petrova --- 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 Thu Jan 14 17:23:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 12020391 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BCE91C433DB for ; Thu, 14 Jan 2021 17:26:23 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6BD5C23B31 for ; Thu, 14 Jan 2021 17:26:23 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6BD5C23B31 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Mim5MEAFIWI/Q7ZaIoEbJDkJZDBmr1YRhoOl7CMjM5Y=; b=eKNjtaCmJA8vkeUYpzfM08r6O ZbHXjCtGPNuyw+1nxMrBgJYeD0gfEdXFbESRMw4n3KwkgXQn6OowMLg/jjCJ5r4WLalOc+4O57KRe /aa7+nHxUY5gXUW6UKm9nf7O9WaEZ/cwHxpJbAbzGZXJfPD3slEGZl1E9bBROveSOSx/YUzv8MwH8 4/am1vOg9xXACYuTZjbaPV6JdY9qRWY+uvEkY/XbJJhTTWebYZ5HdTeOof7xjSfgSBV9DWgyZ+Gja IiHVClje6QP+Mcb1HpdUzJ0phrLC5LUjJ1PJIPaOOSjJ+lb/ybQMc7k5l5pjcKyPaXaL9ptjJGQc2 erXUJYILA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06MX-0000jq-JH; Thu, 14 Jan 2021 17:24:45 +0000 Received: from mail-wr1-x449.google.com ([2a00:1450:4864:20::449]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06MS-0000iL-Pt for linux-arm-kernel@lists.infradead.org; Thu, 14 Jan 2021 17:24:42 +0000 Received: by mail-wr1-x449.google.com with SMTP id 88so2881747wrc.17 for ; Thu, 14 Jan 2021 09:24:38 -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=Cqajn8Gr0BEtGeWrxOB6xIakr1jQrGTIfoptaTOzY5c=; b=apPdH/09u011lx+u6v3t/SyvxeP4gH+R8VoSTQpnw/Y94d5ltnyBP2IBhSOZU/u5cZ GGcJDhu041Mx4/maRvOuCrmRHgWPBIIp8pU+K+BxYvHtxKLIsmNvCy8qYytkl8b3rSQL 0OMqhuvUoKCNLTwDP9jn/dyD6Lc3F5gQsbBhWxPe5X3JAefKns/ZwCPcomrylp2TRABH NY1Hgrlv1Imr4EsgsDsaeuQldrO1yBEmPLpCbLgYYG7VJ+UP+/dNfsld0bKcDvi0So84 2qeWs+vfyGW/q7qzi3unrbX6WhNg/YMWU+M0PvLnVYgTJOXr0JEDFbNg2lBLnWBjgzf4 TnBw== 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=Cqajn8Gr0BEtGeWrxOB6xIakr1jQrGTIfoptaTOzY5c=; b=IY5mzZ/d1vfOto13Mz/R5v3803umD97PpQWdlfdGM/LWhVLLzPaEzYCje0u3Qkwt4k m8wLU13OXjQx+WTGYfaahOqpTFmCKOInwh3PzNcO8B5ROjg3i4DhC8r5tAffKoRG/nax 9qO42sac0CNtL1UCc08exBFyTdp2rIw9/7/KRgBWsIRFYahkGDahafwnMe0FXZs8LKB6 ncPhr3j12448SsY4juXRC4avbyMKpFbZqcDLE9dVcaPLA7o7+xeDgm+P34A+Zp7Y+J2t tKnFCjz5x8uHEFXeJDfRnM1Ay4d86xMso/g0JDl0arwzBmpik9+pdZ3DffcjO5D891cv IHFg== X-Gm-Message-State: AOAM532Nfugbur57OXQEOMN7ppJmiX2HKCpXIhRhXx/VENYCGxL5IhUQ ZXjtEX2eK/HypUafOmSBdpKlPHakVc2c X-Google-Smtp-Source: ABdhPJySRU4y/aTAxbsw8OwhOfDHsUnT1jINFZa/XvcmnK0JVSZMKWBP3Mdc4E03+qsxv5KkJNDEtZUHKDiX X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a05:600c:25c2:: with SMTP id 2mr5037646wml.170.1610645078126; Thu, 14 Jan 2021 09:24:38 -0800 (PST) Date: Thu, 14 Jan 2021 17:23:32 +0000 In-Reply-To: <20210114172338.2798389-1-lenaptr@google.com> Message-Id: <20210114172338.2798389-3-lenaptr@google.com> Mime-Version: 1.0 References: <20210114172338.2798389-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v2 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210114_122440_930080_DBD9BCCA X-CRM114-Status: GOOD ( 27.90 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: George Popescu , Elena Petrova , Suzuki K Poulose , Marc Zyngier , open list , James Morse , linux-arm-kernel@lists.infradead.org, George Popescu , Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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. Change-Id: I696409db1de629b082abfe4c7f6bf066f12b539f 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 11beda85ee7e..385aa82c3fec 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -569,6 +569,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; \ @@ -576,7 +582,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 60fd181df624..fa3fcf3898d4 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 @@ -24,4 +25,5 @@ kvm-y := $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o \ vgic/vgic-mmio-v3.o vgic/vgic-kvm-device.o \ vgic/vgic-its.o vgic/vgic-debug.o +kvm-$(CONFIG_UBSAN) += kvm_ubsan_buffer.o kvm-$(CONFIG_KVM_ARM_PMU) += pmu-emul.o diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 6e637d2b4cfb..ddcc180e59e9 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -1780,6 +1780,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 Thu Jan 14 17:23:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 12020393 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 68B45C433DB for ; Thu, 14 Jan 2021 17:26:29 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2B1C323A5E for ; Thu, 14 Jan 2021 17:26:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2B1C323A5E Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=kGTexQRtDtRxBbDh2TY+O4Ybdr1VKscS7eiHmVINR70=; b=p6npp3qnZnZFIfV4ePKQ9x+iu Zl0y3pe7drhaojO9s/pSTmar8H8OWLifirtRimkEAzPlCGMuYIzl/IS8nFlDBzM3LOW2SZ9GlvO3P eI+h9EJvCnE/jThPot7ZBcZxBiGka8hN0m4MD5wzO3kZW51yohnFB/wm32jvVOYvDmJFBSitH/hk+ dc5i41pKzoD99WT7xiuDJTchAaIc6f8bQOSeKKKp9SGA1EWDSGiXrns2v8pH58yy4exA4QLlcMAvw eTLlxWYQ5UnL3YQi5/eDYTnFfkweXUZxnVXdb5XwgdJOPP2s+aL5TPHZCTETfS986WGy+tXV7Bopd nPEoQZEtw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Mc-0000lD-WB; Thu, 14 Jan 2021 17:24:51 +0000 Received: from mail-qv1-xf4a.google.com ([2607:f8b0:4864:20::f4a]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06MZ-0000jW-2G for linux-arm-kernel@lists.infradead.org; Thu, 14 Jan 2021 17:24:48 +0000 Received: by mail-qv1-xf4a.google.com with SMTP id eb4so5114786qvb.21 for ; Thu, 14 Jan 2021 09:24:43 -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=xV+/a2Rp5lRcHlFRCafjdMqZdknib/NjGfl4/F+eUSQ=; b=RHWeCTmFFlh0JG7mSrwt1xtK3BPDcF/hNwHiBSWk2tm3duHiYAEvtevj2/GAO5f869 2m3HICWqldEJ2EfhWZYJCnQAAWHfwp4TUOTERQqiZTnMzKq4FXSuSlHKsQCkxaLo5kyJ JZVSqwaPfHYu/kDGisDgA7beJwN0XcGGRgTpC4koHF1IBZ6E1aV1zcU2X2ozQZL+hprg GrABIORMdgZx5+EJ9vs7hqClA49Ey+lSP3BmQz4bubQJKTHQ36oAAVVxJ3tegF17coOb T9ZgM+wBKsYD90vhlOkPfEgk6gcyTQJ+48x4N36NaoN+BBBZ8562dlxSZD1b5nMk/z5w cP2A== 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=xV+/a2Rp5lRcHlFRCafjdMqZdknib/NjGfl4/F+eUSQ=; b=PmxHffCWU01u5MDRcHeE+lsBH+o9KD0d1e+Bkl5u3PGNyNJnHdCEGDSRrL/dP05Slm NR2L60lnvi3CvWwISjz++HekwWCQSWVlGMNNvxjL0GBmFnijisZsiMKd6/abNnTmrASR 1JaTKrBoNht98JqZ2MqBbVUIhEldfdnbajx3skp2WejxOlfrBxuu/ng7wDl+IVJz3Df/ taPMjj4WuLfH1BuI9m0YlwWJLzgQuKjCagBgZKshAmnrmkQ9IDePwaAPE82FZSGgBBcf X4gyoMURGOd+FmL9qnClw8Sogp18bDMr0Zc9TvwV164xRSE9z59KRj2thvAqxC+D22by vGBQ== X-Gm-Message-State: AOAM5321HlSs4uuw5itplMrZprPXOgzjxVFfGx984m40J06ow0To2q+1 3U806nVkbRfgpuXE9Zpy5oJ08MWp87NU X-Google-Smtp-Source: ABdhPJxYOrg0jToecCcCtBlCANab6SAeOu4IUUuOLW8kdj70MALJwg3ucMAxQNeuFfe9E7QdMPkIvkLD8o+D X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a0c:a789:: with SMTP id v9mr7957944qva.41.1610645082204; Thu, 14 Jan 2021 09:24:42 -0800 (PST) Date: Thu, 14 Jan 2021 17:23:33 +0000 In-Reply-To: <20210114172338.2798389-1-lenaptr@google.com> Message-Id: <20210114172338.2798389-4-lenaptr@google.com> Mime-Version: 1.0 References: <20210114172338.2798389-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v2 3/9] KVM: arm64: Enable UBSAN_BOUNDS for the both the kernel and hyp/nVHE From: Elena Petrova To: kvmarm@lists.cs.columbia.edu X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210114_122447_186606_5BF39443 X-CRM114-Status: GOOD ( 14.69 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: George Popescu , Elena Petrova , Suzuki K Poulose , Marc Zyngier , open list , James Morse , linux-arm-kernel@lists.infradead.org, George Popescu , Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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 Thu Jan 14 17:23:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 12020395 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0C668C433DB for ; Thu, 14 Jan 2021 17:26:39 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AFBEC23A5E for ; Thu, 14 Jan 2021 17:26:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AFBEC23A5E Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=S8oUzJ3NcXZUOZJPcRVtdwhFxDdOXW4ye4kxqz+u3QE=; b=hCxZjNCEo//mwjncSWbgXlK0K XLrU1GhfVsUwvCKBW6nUHwxLJahRDuLV0kBYREVm/kgtrVKzGgE2ruf19OIk1WLjeyEjheJ2J+tIz rzNL6NJrWwfHvHPa5KIHNNxeZcZRFFVDrP08TZnTsTOn4pnST6PoJZ6gABDtNrOByBRAoivCTHdEc kayoOiL4JnJATAQWJJCDCrHlMV4T2PqigaIGGnQQ1bGhSomw5XzSX5Jza0guQtp+WhSyH1yxt2sei 8zTrn/BZIfjZwFCFIP8XX5AAZ88ItktVQolGYDPQTeOEK4gYrJQJrjJwv99sfWaxlx28u5Q8WEjjJ G1ahFoF3g==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Mg-0000mZ-RP; Thu, 14 Jan 2021 17:24:54 +0000 Received: from mail-qv1-xf49.google.com ([2607:f8b0:4864:20::f49]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Mc-0000kc-To for linux-arm-kernel@lists.infradead.org; Thu, 14 Jan 2021 17:24:52 +0000 Received: by mail-qv1-xf49.google.com with SMTP id t18so5134182qva.6 for ; Thu, 14 Jan 2021 09:24:48 -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=1t4C6hJFamqbU7IDZaNfsvQVRkq+UVj+9twweJKBJmo=; b=bgfP8TgGrR3VBTfxn+pa3clqnf63XhBOsKIAki5GvZtlng2M161ujzp0pHbfhNNyjA xeiHwor4Pa7gtipfBdE2Xyw/5O3eTY+OrxtneNgiJWqrYMcs15pI7YZG12eJ+rTMAErL 3Buf0e0EVzM/0LSP2MFNkc7g6gjFzPDvNTC2STUIooq3kiYEdnpDZJ/3laERZt1iNbBI 1tjPQh1z+Tuqm5U9LlSnsi5JmCMZ17HTjOv6SGFcezW3O0asUYa18Z6WBxNxDWSpAnCU r62U7YSF4uCCVywsYFoM8bS070r7O0OdSpmHLfOsoJYJBwviRB6b1PoU0WuS26CQ5Wa4 24YQ== 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=1t4C6hJFamqbU7IDZaNfsvQVRkq+UVj+9twweJKBJmo=; b=NSA4i+p0+JrDWsYJQ/rTez8hSh+r/2SlAYBZRE0IrUxZ0BF8zrwUcRoj4qzApdr2yX UqPbN/k/CnL2eQ3Lv4pBSCOflIQcBBlpaCo29qziYpSJmNEL21ZdJM4S/I9S9+EePd2N TeXfcQUmN0V6YKbAB9PkBlhNQ400Nsr8XAn8cF+EiwPBTi+TrA4ZoPdwcMryYc2UfzyT b9wiAHt610Ek64O04fND4m37HAxhfH3rT5rmy/J68OD+a+uBdpJgBc1GGUd+Cnyz3Sqf ZqDufv6XXiu5FJyALfqWmSFUubKEvanrMf8vlxT5/ICbRu1/07Ur+F+cFjVodWftXYwW w0YQ== X-Gm-Message-State: AOAM532zvrZB9Gr8twpLQQmg1NA+1ApA+D/DzCuZyw3r2NB4CDs+f3TN yKk1plW/vq5wxk7g2OVqowyis4SqsBzl X-Google-Smtp-Source: ABdhPJyKfgLbpjRvxXH6s/OOkKAxjero/ui32HTdz9vnKOUUCIQ3+JwR/2tIRrkt6fOKe+/IuePNCZ4vImcm X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a0c:e90a:: with SMTP id a10mr8225156qvo.38.1610645087031; Thu, 14 Jan 2021 09:24:47 -0800 (PST) Date: Thu, 14 Jan 2021 17:23:34 +0000 In-Reply-To: <20210114172338.2798389-1-lenaptr@google.com> Message-Id: <20210114172338.2798389-5-lenaptr@google.com> Mime-Version: 1.0 References: <20210114172338.2798389-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v2 4/9] KVM: arm64: Enable UBsan check for unreachable code inside hyp/nVHE code From: Elena Petrova To: kvmarm@lists.cs.columbia.edu X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210114_122451_031426_DDC75BA4 X-CRM114-Status: GOOD ( 13.47 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: George Popescu , Elena Petrova , Suzuki K Poulose , Marc Zyngier , open list , James Morse , linux-arm-kernel@lists.infradead.org, George Popescu , Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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 Change-Id: I71d789b7f4ec3d4c787012a061b7f5d7952cee19 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 Thu Jan 14 17:23:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 12020397 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A003BC433DB for ; Thu, 14 Jan 2021 17:26:45 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 5604F23B31 for ; Thu, 14 Jan 2021 17:26:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5604F23B31 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=U9bMLUlNnahePG8ZjCTNZVRBFydhLhA0hcbh67Cqo+o=; b=U4TjwFNDhB3hsQDbgDka4Jpf+ XucxZ+7um8Nc+hjF45uCCzY+Vi8yPdYw3al7giUOyyZm/BH5qhm0nxRL8BjES3nFNfAwhjXYLA4RE 2Vx8J1keL8ERHrYN1sWjcubQ487JRrkIeYqI2siEY9b69K/YD7yK5cNMCELPyihoxwK3c9b3IOBRy eGXK0qSBaiWZkHvD1S+KChKSuwqFEvabIl3chTpogB9UOr6VrqXWOkalo72NI3tmFXrrO3WKvsBNf ooAOI9IfuJTQbmI9DCQmDMfQOL+1/hWkrd2cwOb6QwWoqwQZp76nFWfC151uRU3bu+OhwvRMEjGux b3wvi78qw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Mp-0000or-5T; Thu, 14 Jan 2021 17:25:03 +0000 Received: from mail-qv1-xf4a.google.com ([2607:f8b0:4864:20::f4a]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Mf-0000lL-Md for linux-arm-kernel@lists.infradead.org; Thu, 14 Jan 2021 17:24:54 +0000 Received: by mail-qv1-xf4a.google.com with SMTP id t17so5114973qvv.17 for ; Thu, 14 Jan 2021 09:24:51 -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=g4KIFCTj4cFhEnW/O46us+TReSaxYy0f2hLe/I7ffcA=; b=Hhr7KAKs8kOi8WVwQmidsIWDfqEk25rtQyJk/MDOmviLPuxOOzJXYdh3f3lkDblIxi bkOl0KJfgrERFCfypVjkChfLf+YPjTJ2R6MoqdE8g3xwuh+pQXXK3sHhXvwsKekmTuQr QQZ4C8ABTaOUX/c4/fxJ2IPw96KQYShHaP4aBligI7fm0lZfPVmDgpSb+bb/A9vzI0uT 05p9H0NYCR5SOIC0wIYgnUW2Vp5y9e+ep8LU3dqPpAd0MTpr4eJacqrwxYq+CNdewQnp iAKYH+6BEWrpZfWVGQL8yXKYA9g/L++6zE4c2taW502LbXImxUOSySltAIpQbEX82Xxe KNrg== 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=g4KIFCTj4cFhEnW/O46us+TReSaxYy0f2hLe/I7ffcA=; b=h35oF2eZX92wjUyK1+Mqu6Yk46vK9Pn9jjK+mUl6nDOGkuIxZeuJhwRRBqmi3bFN27 zE5HXbw8IX9fpMC1qfvZYGZiY/RCJZbMuiTXyqFsBW3R9hdds4MxNZd+jAHt588PUOvP 7UMNBjd/HkjLCjoNkwMyJpcGJzS7zTtcNGA8LhfbamgUploEB6v564Z0dlH94LZGcJ+n QYahx3nlLjL6JHS2yHQZhktZBpUpKrPk1TNgWfrZ0EH5C/0/W0XyRS1QctMUMBaQeTAg JxV2tDXW6mqtfwQwyUMRWZaoktBJbAjR471pWTpw1WCvwNQUG/4quFupA3GCFUCR9v0k OLyg== X-Gm-Message-State: AOAM5324ZGXhQgF/Ly1KsWWy3oKNgNbm1KLgMIaoflPYHmJel1oquZTO L7EVT5ufLWgxmCdD3s77rnXe0eDjrhaw X-Google-Smtp-Source: ABdhPJygeOs4qkIrlkzeio5jc/x8qxwkfpCDIRzqWD6MrXutel9ZiEnpHM1XoAxYJ1uynxI++vLlmJLX5+SR X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:ad4:5188:: with SMTP id b8mr8125977qvp.55.1610645090361; Thu, 14 Jan 2021 09:24:50 -0800 (PST) Date: Thu, 14 Jan 2021 17:23:35 +0000 In-Reply-To: <20210114172338.2798389-1-lenaptr@google.com> Message-Id: <20210114172338.2798389-6-lenaptr@google.com> Mime-Version: 1.0 References: <20210114172338.2798389-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v2 5/9] KVM: arm64: Enable shift out of bounds undefined behaviour check for hyp/nVHE From: Elena Petrova To: kvmarm@lists.cs.columbia.edu X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210114_122453_758836_CC0FFEEF X-CRM114-Status: GOOD ( 14.01 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: George Popescu , Elena Petrova , Suzuki K Poulose , Marc Zyngier , open list , James Morse , linux-arm-kernel@lists.infradead.org, George Popescu , Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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 Thu Jan 14 17:23:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 12020399 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6AD10C433DB for ; Thu, 14 Jan 2021 17:27:03 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2ED6023B31 for ; Thu, 14 Jan 2021 17:27:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2ED6023B31 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=0T5FzJuENjWDPE51yf44DO/c5DDgpF2A11yNam/YUn4=; b=tI0Jk319PEbTuHlGiW4ZV8DUg wz/devMHjly6P9N0BWA/MfGl/kvfFhFd73yjjC3udi1Bh7bBy8oK7ao5xxf56Bk1G+5CR3iV7lmUt xpIMCNW3JQ73zQgsj5QoXAvx3I2USeR0lhxa3PJcP/09+tXGWa2vZKSvbSq5YDCJfmb6hobIgDmDe 7vmMdRJu9j68o+oyvig1g8gz2MxkboRy9D/5OdkXuZ9LgKkn1pkTotDmC289WLjKfVMSgK0InztRf jRWOllIDxNvU5PBJDezhyQ5AyXCXSQ5EA1L0h60K3pu1yj3oye5UUx24/p5/QVejGIzZaa8WTNOH8 Hwdo1IggQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Mv-0000rr-GD; Thu, 14 Jan 2021 17:25:09 +0000 Received: from mail-wr1-x44a.google.com ([2a00:1450:4864:20::44a]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Mj-0000me-Pw for linux-arm-kernel@lists.infradead.org; Thu, 14 Jan 2021 17:24:59 +0000 Received: by mail-wr1-x44a.google.com with SMTP id w8so2892505wrv.18 for ; Thu, 14 Jan 2021 09:24:55 -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=mBnNW8oub18hKhhe8yHqfoSEZU2iRCB395w7gjgwxWc=; b=YyThgL189juUYY1QafUrt/nr4mL1Dlewr+4os9Exz6q+m6zwQXnoNIhxbHXPalrLo3 rT8BweykI8RXTWknugQU6KAjnTbwTL5UC5KFh1fQWQXdH41NrYXFexJt5/aptCnupsFC 0d1H6PKi/v1QEYbt0efPZVVZD5cgvjLF83q3cN7iaf2PLa7zmhtCGfTdNqioLq6dWhRd DPThFVt8UzRBUnyK/afuRop1dx5ZpmVKxLe29q8bs4SAmFaQR5aNAdvHzAeCXBAWn1d4 pqMd0rSFv2FKBgy8quIF4elmlwiDGceTp7vVFHE3FNNBk8B0YjV19JXoNZ096PTB1a18 UH+w== 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=mBnNW8oub18hKhhe8yHqfoSEZU2iRCB395w7gjgwxWc=; b=XKpyxgCuxlDfixXtwAV6Tq34gDLuYKplcMvADG3356PhIXAFZAeEcdg5MVPtgJuEA6 xipptughP0AlruX52kmYSIEVbClWjoBMyiIYlYNven7BCkfkUe4M5qzwfjl1whMeX6EP bcIrkPoAwTj8Uk55WKT2Avx4RzJBdy8pc505/97Xisz5ey4rfNerEmrj1QzM9Ok6MVGk Cv69Ph0RpdfF5TzwDiGQrl8b26enFUblkgfftyFFP0Pvp+/tbQMN9f/nf2Mv0Jo4S59T 8+S6FTY7QyXDPZcVL4klETmzfi5BLFkjM7HsAcld9iEBmepwmaaHfH4qiSD4mDMC2X87 X1tQ== X-Gm-Message-State: AOAM532BYSz2jPgkrUgyE6wKy8Akj2Owlh9ui/OhCN8acVpQw1hZGjmN bHklUK5Iv/8JYEl2WmpbSVjGWYMXnDYe X-Google-Smtp-Source: ABdhPJwgNb+fXta79qoc3ofmUnstDxPUmBtXRsFXZPs561fwW9D9l7EWAZMF5Ae/x9bNaAM6+JkZbZCSBJbJ X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a1c:2c89:: with SMTP id s131mr533256wms.0.1610645093881; Thu, 14 Jan 2021 09:24:53 -0800 (PST) Date: Thu, 14 Jan 2021 17:23:36 +0000 In-Reply-To: <20210114172338.2798389-1-lenaptr@google.com> Message-Id: <20210114172338.2798389-7-lenaptr@google.com> Mime-Version: 1.0 References: <20210114172338.2798389-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v2 6/9] KVM: arm64: __ubsan_handle_load_invalid_value EL2 implementation. From: Elena Petrova To: kvmarm@lists.cs.columbia.edu X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210114_122457_919650_48353451 X-CRM114-Status: GOOD ( 11.85 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: George Popescu , Elena Petrova , Suzuki K Poulose , Marc Zyngier , open list , James Morse , linux-arm-kernel@lists.infradead.org, George Popescu , Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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 Thu Jan 14 17:23:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 12020401 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A19DFC433DB for ; Thu, 14 Jan 2021 17:27:06 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 622A523B31 for ; Thu, 14 Jan 2021 17:27:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 622A523B31 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=LqQNM1ses25e41xtmUn81Tqq+/Uf1PB4GrLkv9FOW6A=; b=vrvjKznMZ4STgD5CjZUAeQlyr kd2Zv3SMDVHMqiCvc1HG3FWnyPOUO6F9k/1IG4SIEVcxNNfx8F8+KoS5Mt8KD2Gbn/S2rGWdoM9PU pv72NCP1rGa6fDjkh7AhL0Jfy1CXSkyNcHouyiiSZHvgiAgFFr/N20jxtuZhQK11DywREB85Ddznu Yj65UQiUMG3yFw7PVlhuR2BWYoj7QLANqKSP5/dSdE9/evtmho4djYwA3Ods31yLfWOr4mDvFyNfk ZN2Ye4MNFWSOEz6466VvrykHUG82AUAg5Ic4AABQqrOmP7h/pbNB/8jxolX4ddTHALjgQtT/lBcWx EOlw8WIaw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06N2-0000v7-9a; Thu, 14 Jan 2021 17:25:16 +0000 Received: from mail-wm1-x349.google.com ([2a00:1450:4864:20::349]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Mn-0000oH-TD for linux-arm-kernel@lists.infradead.org; Thu, 14 Jan 2021 17:25:04 +0000 Received: by mail-wm1-x349.google.com with SMTP id r1so2129643wmn.8 for ; Thu, 14 Jan 2021 09:24:59 -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=XOmV9rOXqPPVqcegQZNJofTEyx38uhN2nVbmi9afywU=; b=wW2e4FyZwiW4L+MD2pK71yjkUENfnlHKSdcjj5VQOEWjRQ/VMENAXofc/SBW/q3NqS As+WKNmk0v1a694hte5GMuu6L+ztFtEvy75X7u0teBJIkZrfu6w32KTxJvFl1zSXiiSs uh1waDR/zSMV8uINsy01PGok3/BSAn2BV/wG/RZPY9vbH5/bbWboCppBOonmCqz3a+IX 20gSuBJCAHT7XR8fGEnqlywuv05Z0b0k9Quho4eon4sbGa9nTUyGJhZzWp7FgN4E2wsz oNpYilKZdIn+H7Zmr4oEKebRiDVH0ovn0+TMHilpMqs053xwXZ6NuWFhU+Z3UaPs5seU KH6g== 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=XOmV9rOXqPPVqcegQZNJofTEyx38uhN2nVbmi9afywU=; b=gOEF5HgOPLu0/IbVO0kHb0IYO9zPjhVH6XrlkesPq5iZy4P1u1zYU5W22q0A5nNG/6 gaNn66ykmCKYqrztO5IDOxqPK5OVDycTxrbn9GkMYE/lhk9rpRQfeeWyqnj6UaZw8/Ca OOJMF7n0zCqsE0iVb0Eamq//qw6gS+Hvohw2xzPPgz6xdBuptwKNBiUnLk21MbIi8Pyx RnvuGsiXj9W+p2fr49W31eYGDkyaFN6Bx8bYR3InYYizBUh0O9Yok8BrszsjMLaTyFd1 TlNpkinbx9OhwTJtEbXMqYSWhOySIquicglKDLS+2pmstmBFFYtI6yimlZdENzstAZJI MelQ== X-Gm-Message-State: AOAM5300ESEU0QQpWwIATSci0wcjt1kVRkN/M4eyL+X0geRnrq26WsHV Qsc09vXAwlcpbIbm5hAiXluxzl/BsTe1 X-Google-Smtp-Source: ABdhPJxxZEBrrEl+PdqZxakS3Rf9SE4hlhTxKmLtFWnPFUshOyr5z5v7DthBWnq6r+pf53pcmG79PYu4vZOu X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:a1c:c204:: with SMTP id s4mr4820767wmf.73.1610645098345; Thu, 14 Jan 2021 09:24:58 -0800 (PST) Date: Thu, 14 Jan 2021 17:23:37 +0000 In-Reply-To: <20210114172338.2798389-1-lenaptr@google.com> Message-Id: <20210114172338.2798389-8-lenaptr@google.com> Mime-Version: 1.0 References: <20210114172338.2798389-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v2 7/9] KVM: arm64: Detect type mismatch undefined behaviour from hyp/nVHE code From: Elena Petrova To: kvmarm@lists.cs.columbia.edu X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210114_122502_091100_69A7C6C0 X-CRM114-Status: GOOD ( 13.20 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: George Popescu , Elena Petrova , Suzuki K Poulose , Marc Zyngier , open list , James Morse , linux-arm-kernel@lists.infradead.org, George Popescu , Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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 Thu Jan 14 17:23:38 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 12020403 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 50BA5C433E0 for ; Thu, 14 Jan 2021 17:27:11 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 14A9223B31 for ; Thu, 14 Jan 2021 17:27:11 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 14A9223B31 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=fyVpmUkj1r7rHeSfJ6q9OaZsYgZqqf/rRPhybftkC/E=; b=XcSYmHrjybby10hlh9B1LJwAe wH+r+LR+fqd9isFuh33VfjNYl4IMNJh6uzMeKqYrImmlx07v3fKRIJum87MghP1H/bZbcAZ58RMYs 5f5hh/O4RqRz6xflNo9JyUWdXPqvKe6wKotO+mJFyc8eXBDvX3koeDHgWErU9R0acjXm5Zaef6CDQ i/JfRTCgcqx/Mel0wQXZNtXlHhPHatHHn13eec5Nkq//Jd/vhR1T64r7EZQrOQLSzcZNydh97usdt N3mSEiGn3NySs8J897pKfUyP84Ps8A42BsYEVZJHbBA7KtQPikuWqivaTHSgh8yw5Bnu82zNn7opK w3XOXyOpA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06NB-0000yd-G3; Thu, 14 Jan 2021 17:25:25 +0000 Received: from mail-wr1-x44a.google.com ([2a00:1450:4864:20::44a]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Ms-0000pf-9b for linux-arm-kernel@lists.infradead.org; Thu, 14 Jan 2021 17:25:07 +0000 Received: by mail-wr1-x44a.google.com with SMTP id o17so2899823wra.8 for ; Thu, 14 Jan 2021 09:25:02 -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=2qQJjLuQRjXExkzU8FZkqO0GipUsTAXdfg8Nhn7veDk=; b=FWNr+g3VRFdqTHe9xhQ8PSAipaLD6xxQVRv7dohU3W24sntVwNzQCi+pb1OJbiKThd EG4CrBJtgW/DtsRcBldbjHi6ZGDI+7oCojMoVYt9wWKDDn/VfrccIILjLgLs2PvzxvtG PHqQIinKIrWoe8tpNcpB8OiBFzjyDS7TKggJkf6JvJhAstI6uuQ/lvswbzkuQXAhmUa5 jsngsMfh29icsgLfBqPcDnvNHwsugUbJVHple85F9jpI0v1nQ/r+RIiliJXbRAExuXrd ENxbF/uepCqWaWBJhaWuUNAthL/EblAcvqg6U2dg+XDXSsYV/GwoTzDMdG83grljnimE pLHg== 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=2qQJjLuQRjXExkzU8FZkqO0GipUsTAXdfg8Nhn7veDk=; b=ph0Czx3/l7HQzraQAbmlVrgohjwPAT5KWYorahM6kHFwzdigRDyUJBtW9AGq0xkMvl krwuOJpMgfpJCopuMfgSRjiasyJFTMuZQYFW7nKOW7kfIourmQweO5vx784+BRUFDqrK kLVfR3HecHsljRsBFRusCGAI8CLipdIL11fMiZgaUciP5wX/wwLRraQ070Y5kJUqAzok u3ti/B0k8/Tl89Ttkp42hEBQY/8LlBoBRwqgBJdkH6CvKHt52DB31XzLHWUR1qBpT/Iy FnH6YYXAq4YO0SdTMLTI3rtzfi69XKMCPURo8s9jW/pddC5Ooe3OH49UMbSLkGrKgVil pyyw== X-Gm-Message-State: AOAM5331JboUOdFY36W49TVHzEaMyLyuFYlPxnxpdmI6uWeWB9n18YM1 pw0tNjXL2ZX9FNuc7JtbJmB4SXwp4e5I X-Google-Smtp-Source: ABdhPJyqTh4gvF7otj7lmh3sfqgJ0R/FBjbEpmEgMRafwtxyhVmHUhbSGS8nbO+OrmqxnyZOGB2Dpcd48cfN X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:adf:9cca:: with SMTP id h10mr9047981wre.77.1610645101843; Thu, 14 Jan 2021 09:25:01 -0800 (PST) Date: Thu, 14 Jan 2021 17:23:38 +0000 In-Reply-To: <20210114172338.2798389-1-lenaptr@google.com> Message-Id: <20210114172338.2798389-9-lenaptr@google.com> Mime-Version: 1.0 References: <20210114172338.2798389-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v2 8/9] KVM: arm64: Detect arithmetic overflow is inside hyp/nVHE. From: Elena Petrova To: kvmarm@lists.cs.columbia.edu X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210114_122506_442221_972E7172 X-CRM114-Status: GOOD ( 14.13 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: George Popescu , Elena Petrova , Suzuki K Poulose , Marc Zyngier , open list , James Morse , linux-arm-kernel@lists.infradead.org, George Popescu , Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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 Change-Id: Iec1ef331e471efbb35a39ffaee0641107a3a0e3a 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 Thu Jan 14 17:23:39 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Elena Petrova X-Patchwork-Id: 12020405 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6409FC433DB for ; Thu, 14 Jan 2021 17:27:15 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2A58E23B31 for ; Thu, 14 Jan 2021 17:27:15 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2A58E23B31 Authentication-Results: mail.kernel.org; dmarc=fail (p=reject dis=none) header.from=google.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:From:Subject:References:Mime-Version:Message-Id: In-Reply-To:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=8YgRK/9tqi2g+n3Eh347+t/nDuhlxuLQjHvHRn85guY=; b=sBcrD9m2PqBKsO+f6OCdixZWf 72OsW/11gQMhPALZLv+fjSl+k3WuPqbOcoNwLkzW4XZe74iK0UFbJbayKBDtlCCU30nw4AhszyDUQ TffkMnwn8hnzBV1ohqPeYK+sT0SLrxBENXvORKTyuq6BUlg26ajx1ikFoexRErZ1I+5xIuZ3g+aKp TIhcFkDe0RGFT8w4sqepXP6/lpJH+ny3FaavgntlBMI0oFyvPT6wOQB1jUEpC36DjKnrG6Oinvknq UCCpaMa+f/v7g3bxgNQeZxKICDibHY5gzwgWzjTZXD+L8ki98wkguPCHpZZZRROpvcwaFACYjs6Yq 8Dpuux+Fg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06NI-00011C-HX; Thu, 14 Jan 2021 17:25:32 +0000 Received: from mail-qt1-x849.google.com ([2607:f8b0:4864:20::849]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l06Mv-0000qZ-MW for linux-arm-kernel@lists.infradead.org; Thu, 14 Jan 2021 17:25:11 +0000 Received: by mail-qt1-x849.google.com with SMTP id b24so5000806qtt.22 for ; Thu, 14 Jan 2021 09:25:06 -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=YXhQEwM4fG5mPLi7ddEZelU/prRnj9ZlJQxcm9wGO9I=; b=ocfLSWvtV3KN6WMXdkErJME9pwHbHsDIhaB6A45Xbi5viDBTekc2sQFNbwwix6IOpp kjR8/5B+r4dbB4QXvTrtaOPVkyydPdeEVVv2sct4JgcSHrsV/K1mEmX3TXGmBWsW2dQ3 iQZBdsiYYjfTSC9I8b9TIsC5Ir+azvRfgclgw5yoOacC9kdy9J1SsieN+Bl/9H04meDo JMl9uO9/ryLVay6doyDwnt63Iaq0CpjJargUlQB5Kf2HrK8tmDskvGBW4UcnA0UTzSHX 2RySlMZQ86ZwGgtj5kEGeUFJuLdHR0qhyUU2fqld3bCwEd6UIK4XR7IwI2n0NjkPKRY4 sO2Q== 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=YXhQEwM4fG5mPLi7ddEZelU/prRnj9ZlJQxcm9wGO9I=; b=kN+KI1pbynt2265FHQ4m4wAMJ+c6iqBlp3vsWMLcS3LiL5CQazkj8Ua78Y949XPLv0 1CSqRdAyVjznlmYg4OrRZkrbHZ0MFxZy/SBj1NGXNE53eGhVcRoXpJgOXMzW+hc1pnlU g+P2yZd2F6JQDv7ellkIb0PjlFtdPv1A0TFFMFIZLwsF/0MDqneVNdFA4Xgxiuse/gev UdwUwfbByXx6y0BdSanYSKU2R4xKxo6Tu23Q0IPFZEomBr/mbr7Jawc3ST8fA6KMLUPk yzdObBFgALmlfp87SHFf1lS9gcjAZTlfMhBNga6nHXbuvpIQ69uJVq3PtFPA6HFFUyt1 R0lw== X-Gm-Message-State: AOAM5325XHtdZf0kWVXyhBG58JtUXGcvhWiN8u4qnUpB5/W273QYj3on sDBGv1toURAXcASE1l7gQjX1se3jurhV X-Google-Smtp-Source: ABdhPJysInN8fr6eiFXQ3SJIsC4gBN+y924LMKNqqxgoWqNpwjKLBYzKoCyZbgLxQEkVrm1gF1iKxl7zvyHe X-Received: from beef.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:1091]) (user=lenaptr job=sendgmr) by 2002:ad4:568a:: with SMTP id bc10mr8105925qvb.29.1610645105400; Thu, 14 Jan 2021 09:25:05 -0800 (PST) Date: Thu, 14 Jan 2021 17:23:39 +0000 In-Reply-To: <20210114172338.2798389-1-lenaptr@google.com> Message-Id: <20210114172338.2798389-10-lenaptr@google.com> Mime-Version: 1.0 References: <20210114172338.2798389-1-lenaptr@google.com> X-Mailer: git-send-email 2.30.0.284.gd98b1dd5eaa7-goog Subject: [PATCH v2 9/9] KVM: arm64: Add UBSan tests for PKVM. From: Elena Petrova To: kvmarm@lists.cs.columbia.edu X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210114_122509_962929_85DCA20C X-CRM114-Status: GOOD ( 19.56 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: George-Aurelian Popescu , Elena Petrova , Suzuki K Poulose , Marc Zyngier , open list , James Morse , linux-arm-kernel@lists.infradead.org, George Popescu , Julien Thierry Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.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. Change-Id: Icf998da0af023c74d45be90788ac9f694e61c97c 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 bde658d51404..459f5ebe5e18 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,