From patchwork Tue Jul 30 13:29:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 13747405 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8BA24C3DA49 for ; Tue, 30 Jul 2024 13:33:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To:In-Reply-To:References :Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=UeUIfmVd2L1bFv87y4nlazJJh6F1riiSutBaaqv8tEw=; b=M/fjLCplcHNn197w+afJdPCD9R hxu4qgoCYwJ6feMNXAymya2jm1lHi6+FKMoIwCbHtUNeQj3/RaWd4hXz74XdKqG94fKit1vvpnp9C xO9hnHke+3f2Kak9NSaNYjlRFyEtH8NAhhHHHAApuUYkp0VyusnvRKPAPcOWXkmR/Zs66npmoMMA5 Sk7blSpv5s5Gh6SDBWLJYcDoqbIW1baAJW9sOEj9qVhkjY6+mah1dHf6U9Y1/goSx9P4CPzB9uz2U I2ATKlsMcLhJp0EiIZgWCFUi0a32nKHvG/6YhABh+DJjaw6pF/ckSZer/cKxwT+CADNI5gOHQSYWA 5O4LoVNw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sYmy8-0000000FHiz-2Sk8; Tue, 30 Jul 2024 13:32:48 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sYmwX-0000000FHGk-44cj for linux-arm-kernel@lists.infradead.org; Tue, 30 Jul 2024 13:31:11 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 6BFBD61EF9; Tue, 30 Jul 2024 13:31:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id CC638C4AF0F; Tue, 30 Jul 2024 13:31:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1722346269; bh=Hh0bBv0Uinp19NOdsxRBjh5fZ/0nyJqTw+fsAoXtvjo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ADIJ1hB9RSjFfyojHeR87Wgjg0+BLjd5ZuV3bILAa+ZOn+rfu1Pn/YPmetVPNVQ7I opWl3+lwQ1AtAZOx/vyuUL+kKesPLWg66TqlVKD4MX/by5lD0AujDWfXJm0JUaSGlQ AyX6VDjKp4W49NPS3dRwM8mD7/zHG/ERpFreAYVGl1vZjgHRMmPZXWL4NtUMuot3nc xpfUAZSVcyV6oaHDKhd3SDneBXJlEM4FdH47sdfeuafmOTCPcUEgZz6Ol2psbzCDHR GNsMb85Hy+eWAb3Q7KGpnqAGMQ9Seng+CHmUkI4DEQQIuOtvfSRxXCuERf/mh0PoeA 40tQbfl5GOXBQ== From: Mark Brown Date: Tue, 30 Jul 2024 14:29:15 +0100 Subject: [PATCH v6 3/4] KVM: arm64: Fix FFR offset calculation for pKVM host state save and restore MIME-Version: 1.0 Message-Id: <20240730-kvm-arm64-fix-pkvm-sve-vl-v6-3-cae8a2e0bd66@kernel.org> References: <20240730-kvm-arm64-fix-pkvm-sve-vl-v6-0-cae8a2e0bd66@kernel.org> In-Reply-To: <20240730-kvm-arm64-fix-pkvm-sve-vl-v6-0-cae8a2e0bd66@kernel.org> To: Catalin Marinas , Will Deacon , Marc Zyngier , Oliver Upton , James Morse , Suzuki K Poulose , Fuad Tabba Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev, Mark Brown X-Mailer: b4 0.15-dev-37811 X-Developer-Signature: v=1; a=openpgp-sha256; l=3206; i=broonie@kernel.org; h=from:subject:message-id; bh=Hh0bBv0Uinp19NOdsxRBjh5fZ/0nyJqTw+fsAoXtvjo=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBmqOsQJWqCq6fmsC0JdY+DmVUd1I3fd1kQDilFaVnx a07qBhSJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCZqjrEAAKCRAk1otyXVSH0BODB/ 9Cm+AOQiqOzGljQgfVO2X+nhRfYllxzG+ma4VpNwilRfbKXBxbtsYZbNxLooa4VUcBTf0Je4aqCaik SotpKbJ7qNBVX1OcNs/4hEX2+SI0QLP8sRyvh43YIJmPdUY20nkbI9YTr4S4mkvWXAeYk89Oxi/4Sd 5Sg8T0Q0UJFkL5HQSlLAInrZ1d54JGChgdFAYMfzOgeY+q3FuYoAIKkR/T5YyHWj6rswVi/whsfxjB Q/LzDc+ZJ+zec9L1d5z1EH6qKBrpsnOVKb8Ll3C3tq/MrL7FQRNRwkoNZ7tVgydrSNEczlMTWoPA3+ nOlLuiVT0WC4YGJbDdYnDS7LslGjLB X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240730_063110_149744_2D367F86 X-CRM114-Status: GOOD ( 17.52 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org When saving and restoring the SVE state for the host we configure the hardware for the maximum VL it supports, but when calculating offsets in memory we use the maximum usable VL for the host. Since these two values may not be the same this may result in data corruption in the case where the PE supports a VL larger than the maximum usable VL for the host. We can just read the current VL from the hardware with an instruction so use that instead of a saved value, we need to correct the value used to lay out the stored data and this makes it clear that the layout is consistent with the hardware configuration. Fixes: b5b9955617bc ("KVM: arm64: Eagerly restore host fpsimd/sve state in pKVM") Signed-off-by: Mark Brown --- arch/arm64/include/asm/kvm_hyp.h | 1 + arch/arm64/kvm/hyp/fpsimd.S | 5 +++++ arch/arm64/kvm/hyp/include/hyp/switch.h | 2 +- arch/arm64/kvm/hyp/nvhe/hyp-main.c | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/arm64/include/asm/kvm_hyp.h b/arch/arm64/include/asm/kvm_hyp.h index c838309e4ec4..6b074f4d48b2 100644 --- a/arch/arm64/include/asm/kvm_hyp.h +++ b/arch/arm64/include/asm/kvm_hyp.h @@ -113,6 +113,7 @@ void __fpsimd_save_state(struct user_fpsimd_state *fp_regs); void __fpsimd_restore_state(struct user_fpsimd_state *fp_regs); void __sve_save_state(void *sve_pffr, u32 *fpsr, int save_ffr); void __sve_restore_state(void *sve_pffr, u32 *fpsr, int restore_ffr); +int __sve_get_vl(void); u64 __guest_enter(struct kvm_vcpu *vcpu); diff --git a/arch/arm64/kvm/hyp/fpsimd.S b/arch/arm64/kvm/hyp/fpsimd.S index e950875e31ce..d272dbf36da8 100644 --- a/arch/arm64/kvm/hyp/fpsimd.S +++ b/arch/arm64/kvm/hyp/fpsimd.S @@ -31,3 +31,8 @@ SYM_FUNC_START(__sve_save_state) sve_save 0, x1, x2, 3 ret SYM_FUNC_END(__sve_save_state) + +SYM_FUNC_START(__sve_get_vl) + _sve_rdvl 0, 1 + ret +SYM_FUNC_END(__sve_get_vl) diff --git a/arch/arm64/kvm/hyp/include/hyp/switch.h b/arch/arm64/kvm/hyp/include/hyp/switch.h index f59ccfe11ab9..526e49b6f09e 100644 --- a/arch/arm64/kvm/hyp/include/hyp/switch.h +++ b/arch/arm64/kvm/hyp/include/hyp/switch.h @@ -340,7 +340,7 @@ static inline void __hyp_sve_save_host(void) sve_state->zcr_el1 = read_sysreg_el1(SYS_ZCR); write_sysreg_s(ZCR_ELx_LEN_MASK, SYS_ZCR_EL2); - __sve_save_state(sve_state->sve_regs + sve_ffr_offset(kvm_host_sve_max_vl), + __sve_save_state(sve_state->sve_regs + sve_ffr_offset(__sve_get_vl()), &sve_state->fpsr, true); } diff --git a/arch/arm64/kvm/hyp/nvhe/hyp-main.c b/arch/arm64/kvm/hyp/nvhe/hyp-main.c index f43d845f3c4e..bd8f671e848c 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp-main.c +++ b/arch/arm64/kvm/hyp/nvhe/hyp-main.c @@ -49,7 +49,7 @@ static void __hyp_sve_restore_host(void) * supported by the system (or limited at EL3). */ write_sysreg_s(ZCR_ELx_LEN_MASK, SYS_ZCR_EL2); - __sve_restore_state(sve_state->sve_regs + sve_ffr_offset(kvm_host_sve_max_vl), + __sve_restore_state(sve_state->sve_regs + sve_ffr_offset(__sve_get_vl()), &sve_state->fpsr, true); write_sysreg_el1(sve_state->zcr_el1, SYS_ZCR);