From patchwork Thu Jul 4 17:28:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 13724128 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 E3DA8C3271F for ; Thu, 4 Jul 2024 17:30:03 +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=A+2Mk8ZRTB5ayf0AFEa4Z3/60nXnBK7+2UwXoo++iZM=; b=mjUxisqm3TMbulMG+eTL+2vxPu 4wCt2pLSJ6TNlBpU64PVT+YQFVqw/omvk6yQOIAkdm7Nb/DMaZIj8BJhx6YTF5SijZPqfdvhQoUxI wrfMP4FsnH6oxZqnvMbXrc7vxFe3gJ5J35KNcoF5NXzcL8UM0QTxZIfX4FgUNZReT3cuO59Q9sspH aEEQsTZO/+ZeE7a2zjec9b1RzKuKMdh51Fh2BdZP/T74lAt/73tJ8N0+qky0ePqPBSJFwQYwKTCXy vmyg7856OnsBNCeJ8+XO0gDE6BIEWYOcSfy4tA9MGtcBpRY+2jVwrCDcxvrCuJwp2hNhNvw1kAvPB nKupUWXQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1sPQHJ-0000000E1IY-3VoI; Thu, 04 Jul 2024 17:29:53 +0000 Received: from sin.source.kernel.org ([145.40.73.55]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1sPQGL-0000000E0uZ-0SeA for linux-arm-kernel@lists.infradead.org; Thu, 04 Jul 2024 17:28:55 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 3D564CE34CD; Thu, 4 Jul 2024 17:28:51 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6D218C4AF0A; Thu, 4 Jul 2024 17:28:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1720114130; bh=uej+Tf8xf9z3hwiLLHmVJLafNhINst5vjRm2ck0g7NI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=oCrA6yCvxOENhuEijgkLNf7jJ5dycTeVKssisuXMZ096HMOazZhuH4ywgMd5yrwMt kUzyaV1tQCfnEuqfL+GX1iz3UBaWIDKHw/NMBA++GSBZPYrw3b/0Erx2lCLI8vuYio zLNEG5qmA3a9sFY2nklH207+4j1LTeikH/m2bLtglM3tZZP+cer2eVrUjRqj9tU0ag znpqhLEtJbrvCK6+2tWefcasHV2QvuifLouCZ2Yk/UsnDrv6DnVDXc17XbX0imvF23 wA6qSIt/F62xyhm9/h0bvsU5m1t8AXohZzvOE4cBodZIswF++IrLB0fnV+gYhcjkns apwKiQU6xSzuw== From: Mark Brown Date: Thu, 04 Jul 2024 18:28:18 +0100 Subject: [PATCH v4 3/4] KVM: arm64: Fix FFR offset calculation for pKVM host state save and restore MIME-Version: 1.0 Message-Id: <20240704-kvm-arm64-fix-pkvm-sve-vl-v4-3-b6898ab23dc4@kernel.org> References: <20240704-kvm-arm64-fix-pkvm-sve-vl-v4-0-b6898ab23dc4@kernel.org> In-Reply-To: <20240704-kvm-arm64-fix-pkvm-sve-vl-v4-0-b6898ab23dc4@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.14-dev-d4707 X-Developer-Signature: v=1; a=openpgp-sha256; l=3038; i=broonie@kernel.org; h=from:subject:message-id; bh=uej+Tf8xf9z3hwiLLHmVJLafNhINst5vjRm2ck0g7NI=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBmhtvG8RgiIH7ChU7tPW0F2wZPbjGxluAsnwcZnMXw lhtUMGmJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCZobbxgAKCRAk1otyXVSH0G/wB/ 9MsIJ3abfou/ive8mabeCSn8wAHdZkkcIlJI0JBjwl6niTejAwiAEUPLkJFcgelmtA5PNO8Ls0f2QW oa6PqWl/C6LhMJEpaFPEaMvrwGvmjzNLbgsleJkoXyEfgWuJrL6fH9tMu9m8QYoWHyn++dk+eu0uPy RU3b2cv/KUJ3XYIFe7UmTVsDYA45TbG9aS5HTznFGffYmoIyTr9JNqxiqG71vzjJhtLkjo9WdAdO+O VVwvW+59r9mkrDri69m5j6pF0OzBdeB338wTPBRV2QH8ycFBa8+aQLkcNCEZUYTqrRpVgZ/WIU0VXQ srg0T+ZCxfFZ/bU4B1JBXv8/otGFPJ 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-20240704_102853_545180_E66E944F X-CRM114-Status: GOOD ( 16.01 ) 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. We can just read the current VL from the hardware with an instruction so do that instead of a saved value, we need to correct the value and this makes the consistency obvious. 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 b05bceca3385..7510383d78a6 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 0c4de44534b7..06efcca765cc 100644 --- a/arch/arm64/kvm/hyp/include/hyp/switch.h +++ b/arch/arm64/kvm/hyp/include/hyp/switch.h @@ -327,7 +327,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);