From patchwork Fri Sep 9 04:46:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Reiji Watanabe X-Patchwork-Id: 12971016 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 22656ECAAA1 for ; Fri, 9 Sep 2022 04:48:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:Message-ID: References:Mime-Version: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=k/75puKdYgdiKmMpSI/rIqeJKh2scIuKFarSB8xWPME=; b=KWVhONmgX2F9nlyokwWkC7Vm5x E8FEf6iH+79Cx0ocOLvJ8j8jB6uiV1tXZWeACLsNncSeBxjPQwTNJEC3hQ1LUyplTTOmZNyqUpxv1 CfcuNkzzKQqec9oot2fWfQVbpdVAp9KjPCluTMIw2OFLswT1ndAMRT/MmH3xKCOTJr8JuZFs8K6zK Tq5L7cB61MD2oP3FhAeXEJeeyHl7Fm1sGtLu/RDQ8JuT4MHtgICvvGS6vk0qerK8xrn+8qYxQBADy EUATINSKjdUTQEc+x7Bjn7R11J4NFC7HrAD0+AGKL8f6pz3h/vllOEGhABTIvjLf4e+7BV+0Y09wR pMrJTjsA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oWVv2-00CNz6-QB; Fri, 09 Sep 2022 04:47:08 +0000 Received: from mail-yb1-xb49.google.com ([2607:f8b0:4864:20::b49]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oWVv0-00CNxD-Ci for linux-arm-kernel@lists.infradead.org; Fri, 09 Sep 2022 04:47:07 +0000 Received: by mail-yb1-xb49.google.com with SMTP id d8-20020a25bc48000000b00680651cf051so707833ybk.23 for ; Thu, 08 Sep 2022 21:47:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date; bh=qVBGSrI/KWTPkFtct01o77r/n8MEFbFBIyqHK8mbnss=; b=A+f8ccaReT78Mwr926D5zlus5ryXHfto50Ldpi0s9C5izCShLC+jvi3H3HpPwHgiW1 XynSsZFsuLULMM1uIRAQjFeMBiRclaBgOq3b077Y6TGYw8a2f0FV2XwVx1c7sM9xUcON Lx+p6gimmASMygHqi7BWdXIqsj1C1gwasz0C7PoVfiekkcjql3fuuFkOJGOTi77Y7f9Q m/vV/W7X/38f33WtwECtJMdPGm8TDJSy66KHbUhGRfepKwNsM8rNVLVi0urb2BNf4CYv tPygzgftFS3sMHB/0T5HhrjApKv6pWtgwZIDB8o7QpvOIPe0Gzg7opLiK2Uu4GdP9ECU FVDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date; bh=qVBGSrI/KWTPkFtct01o77r/n8MEFbFBIyqHK8mbnss=; b=iyXbmsceIG1z1D0N94lKMg3NWsW9iGaL5JeWDvh09tah3VcRUZrfYVmqBV1skWVEZ8 Fbd7OZqAJezTck/fDuGmSXvZTuQcpU16mn690KEa2kAapDED75dyxaaqdHuGntT+R+jL LQNVCEA8kFXx+G7XXZ3Fm6PxUVPSPj3CtiDA7rArN1GDzWRsWGdfi4kf79gQrCwZo5LZ h76JwaFa6NbJVRckEPUfbcfajF/l+yDuCP0mqnxZ2xMcUZFPwSklCv0aMQ4sfFVbrYx0 +M2v/jb2i4C03Z2bfFu1U/Q20EZA7iP87+GwXrnVyVrHwD6OpkdiXYFAxF6LeubKE9Pr y58g== X-Gm-Message-State: ACgBeo2JgZEdY/XgM6LH36djkDEaaObFtlHZ4dYXyyRThIS8j57+HR5R uPGw1yx5h/jX4pASgnt8XiqD6Ky+mMc= X-Google-Smtp-Source: AA6agR6cNEIBry9BgSshMGxwWWRc5xAzxMKV1YLdQXwf+d9BHb/bCy3OT+neJ1h+yygWbHJZgWChiqkfD2E= X-Received: from reijiw-west4.c.googlers.com ([fda3:e722:ac3:cc00:20:ed76:c0a8:aa1]) (user=reijiw job=sendgmr) by 2002:a81:8681:0:b0:33c:7394:9ee1 with SMTP id w123-20020a818681000000b0033c73949ee1mr10317707ywf.408.1662698820238; Thu, 08 Sep 2022 21:47:00 -0700 (PDT) Date: Thu, 8 Sep 2022 21:46:34 -0700 In-Reply-To: <20220909044636.1997755-1-reijiw@google.com> Mime-Version: 1.0 References: <20220909044636.1997755-1-reijiw@google.com> X-Mailer: git-send-email 2.37.2.789.g6183377224-goog Message-ID: <20220909044636.1997755-2-reijiw@google.com> Subject: [PATCH 1/3] KVM: arm64: Don't set PSTATE.SS when Software Step state is Active-pending From: Reiji Watanabe To: Marc Zyngier , kvmarm@lists.cs.columbia.edu Cc: kvm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, James Morse , Alexandru Elisei , Suzuki K Poulose , Paolo Bonzini , Ricardo Koller , Oliver Upton , Jing Zhang , Raghavendra Rao Anata , Reiji Watanabe X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220908_214706_456079_2722A348 X-CRM114-Status: GOOD ( 20.87 ) 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 Currently, PSTATE.SS is set on every guest entry if single-step is enabled for the vCPU by userspace. However, it could cause extra single-step execution without returning to userspace, which shouldn't be performed, if the Software Step state at the last guest exit was Active-pending (i.e. the last exit was not triggered by Software Step exception, but by an asynchronous exception after the single-step execution is performed). Fix this by not setting PSTATE.SS on guest entry if the Software Step state at the last exit was Active-pending. Fixes: 337b99bf7edf ("KVM: arm64: guest debug, add support for single-step") Signed-off-by: Reiji Watanabe --- arch/arm64/include/asm/kvm_host.h | 3 +++ arch/arm64/kvm/debug.c | 19 ++++++++++++++++++- arch/arm64/kvm/guest.c | 1 + arch/arm64/kvm/handle_exit.c | 2 ++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index e9c9388ccc02..4cf6eef02565 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -535,6 +535,9 @@ struct kvm_vcpu_arch { #define IN_WFIT __vcpu_single_flag(sflags, BIT(3)) /* vcpu system registers loaded on physical CPU */ #define SYSREGS_ON_CPU __vcpu_single_flag(sflags, BIT(4)) +/* Software step state is Active-pending */ +#define DBG_SS_ACTIVE_PENDING __vcpu_single_flag(sflags, BIT(5)) + /* Pointer to the vcpu's SVE FFR for sve_{save,load}_state() */ #define vcpu_sve_pffr(vcpu) (kern_hyp_va((vcpu)->arch.sve_state) + \ diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c index 0b28d7db7c76..125cfb94b4ad 100644 --- a/arch/arm64/kvm/debug.c +++ b/arch/arm64/kvm/debug.c @@ -188,7 +188,16 @@ void kvm_arm_setup_debug(struct kvm_vcpu *vcpu) * debugging the system. */ if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) { - *vcpu_cpsr(vcpu) |= DBG_SPSR_SS; + /* + * If the software step state at the last guest exit + * was Active-pending, we don't set DBG_SPSR_SS so + * that the state is maintained (to not run another + * single-step until the pending Software Step + * exception is taken). + */ + if (!vcpu_get_flag(vcpu, DBG_SS_ACTIVE_PENDING)) + *vcpu_cpsr(vcpu) |= DBG_SPSR_SS; + mdscr = vcpu_read_sys_reg(vcpu, MDSCR_EL1); mdscr |= DBG_MDSCR_SS; vcpu_write_sys_reg(vcpu, mdscr, MDSCR_EL1); @@ -279,6 +288,14 @@ void kvm_arm_clear_debug(struct kvm_vcpu *vcpu) &vcpu->arch.debug_ptr->dbg_wcr[0], &vcpu->arch.debug_ptr->dbg_wvr[0]); } + + if ((vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) && + !(*vcpu_cpsr(vcpu) & DBG_SPSR_SS)) + /* + * Mark the vcpu as ACTIVE_PENDING + * until Software Step exception is confirmed. + */ + vcpu_set_flag(vcpu, DBG_SS_ACTIVE_PENDING); } } diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c index f802a3b3f8db..2ff13a3f8479 100644 --- a/arch/arm64/kvm/guest.c +++ b/arch/arm64/kvm/guest.c @@ -937,6 +937,7 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, } else { /* If not enabled clear all flags */ vcpu->guest_debug = 0; + vcpu_clear_flag(vcpu, DBG_SS_ACTIVE_PENDING); } out: diff --git a/arch/arm64/kvm/handle_exit.c b/arch/arm64/kvm/handle_exit.c index bbe5b393d689..8e43b2668d67 100644 --- a/arch/arm64/kvm/handle_exit.c +++ b/arch/arm64/kvm/handle_exit.c @@ -154,6 +154,8 @@ static int kvm_handle_guest_debug(struct kvm_vcpu *vcpu) if (ESR_ELx_EC(esr) == ESR_ELx_EC_WATCHPT_LOW) run->debug.arch.far = vcpu->arch.fault.far_el2; + else if (ESR_ELx_EC(esr) == ESR_ELx_EC_SOFTSTP_LOW) + vcpu_clear_flag(vcpu, DBG_SS_ACTIVE_PENDING); return 0; }