From patchwork Fri Jul 24 14:35:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Will Deacon X-Patchwork-Id: 11683449 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id EB6B9618 for ; Fri, 24 Jul 2020 14:37:09 +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 C368D2065C for ; Fri, 24 Jul 2020 14:37:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="ET09I6M2"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="pH6pshNX" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C368D2065C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.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:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=hIfmX4zqrj0UEIw15nhSa0yUM1SW40PLY3gCOzho3Ec=; b=ET09I6M2S12Z5otsCcwRfv4pf Zi6AZxhotMUIUUKn1c9g20GZVZucfEIF1k1iuDW3nHfm6sIAy1HwII/FDDtvRiniZ32RF6aZ/jUxW PLAtDpeqxD6zR+ozFFjo97go0LX+Au3JWPk76cDLi31XxRhO+G6ptmjJGyROKnKk2WuOU/hg5QqPS fF5qC1+/BHvPiNKmjEPwWi2ZIxI3r1MUVylmOqijRg5Ay+8Tc66Vg0jO84nKhngQfGHqyME+ZLKLz RYqe9kxqLjgI+SmEaVMAV5u7mkOYS37qu1CoatGVHhPoQ53rs2nvHZXQfbOwlT3QgnVPISMVZ4Mvb Zp/78qP6w==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jyyna-0003K2-QE; Fri, 24 Jul 2020 14:35:46 +0000 Received: from mail.kernel.org ([198.145.29.99]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jyynE-0003Ef-Iv for linux-arm-kernel@lists.infradead.org; Fri, 24 Jul 2020 14:35:25 +0000 Received: from localhost.localdomain (236.31.169.217.in-addr.arpa [217.169.31.236]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 7A08A206F0; Fri, 24 Jul 2020 14:35:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1595601323; bh=RIsZfSCZmrp/wPqTZvZHGiqd/TR+61Y5jeApU2sToMo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pH6pshNXOl66q6bN+6OAOkNvX7CEbYgEkUEf79c08LvqRTWh0ZuYyk16AxIUnHETF 2BktErnFvndXfPgMsWYW8y+QSVmikB0qTMfCvpjUkhlj70lPGgjX+uBQ/2yTl+byMF yTQogZqmhbRMLVPz/ryZ16m6ZXiDaksmJzSK+XEU= From: Will Deacon To: kvmarm@lists.cs.columbia.edu Subject: [PATCH 6/7] KVM: arm64: Handle stage-2 faults on stage-1 page-table walks earlier Date: Fri, 24 Jul 2020 15:35:05 +0100 Message-Id: <20200724143506.17772-7-will@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200724143506.17772-1-will@kernel.org> References: <20200724143506.17772-1-will@kernel.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200724_103524_776664_9E2CFDD2 X-CRM114-Status: GOOD ( 14.21 ) X-Spam-Score: -5.2 (-----) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-5.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -5.0 RCVD_IN_DNSWL_HI RBL: Sender listed at https://www.dnswl.org/, high trust [198.145.29.99 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain -0.0 DKIMWL_WL_HIGH DKIMwl.org - Whitelisted High sender 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: Quentin Perret , kernel-team@android.com, Suzuki Poulose , James Morse , Marc Zyngier , Will Deacon , linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org Stage-2 faults on stage-1 page-table walks can occur on both the I-side and the D-side. It is IMPLEMENTATATION DEFINED whether they are reported as reads or writes and, in the case that they are generated by an AT instruction, they are reported with the CM bit set. All of this deeply confuses the logic in kvm_handle_guest_abort(); userspace may or may not see the fault, depending on whether it occurs on the data or the instruction side, and an AT instruction may be skipped if the translation tables are held in a read-only memslot. Move the handling of stage-2 faults on stage-1 page-table walks earlier so that they consistently result in either a data or an instruction abort being re-injected back to the guest. Cc: Marc Zyngier Cc: Quentin Perret Signed-off-by: Will Deacon --- arch/arm64/kvm/mmu.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index adb933ecd177..9e72e7f4a2c2 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -2124,6 +2124,11 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run) goto out; } + if (kvm_vcpu_dabt_iss1tw(vcpu)) { + ret = -ENXIO; + goto out; + } + /* * Check for a cache maintenance operation. Since we * ended-up here, we know it is outside of any memory @@ -2157,11 +2162,6 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run) goto out_unlock; } - if (kvm_vcpu_dabt_iss1tw(vcpu)) { - ret = -ENXIO; - goto out; - } - ret = io_mem_abort(vcpu, run, fault_ipa); goto out_unlock; }