From patchwork Tue Apr 19 06:55:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Reiji Watanabe X-Patchwork-Id: 12817511 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 1D679C433EF for ; Tue, 19 Apr 2022 07:03:13 +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: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=L/8UdfHm/kQazRdQJLBsTTA47u11GSmSY/sGQpAA3sA=; b=mUBIcoVCdVoSXLkL5Y1hj1/GdZ 0KcaldRADKw5YyBndgjYuWYdlKbS/DYAtybsqemqsW5iCtC4Hj1yPU9e7rSJpURq58BghzDyp4Vsw pDZllskCyjOf71lpFdgSDVVduMA9Q9kLMAz1aFW1pF0xxOB/SmZbHoEt/kcgg73IqlWuNPHJ2k2vo QhMwII3XBpjUSq5gcJQXjCHRlmTYvYZ0kocEYljfKdqEzqRuTw5IHRp5sQS8olGjJAR4YJjIeejNR YeAgtOIkh4JGD5WXrvH1X0DoW3b0q3wf1utebzVLdECD2/fd/xiEgMxN6vcup4weuosyz7IMeoOit db0hVb/A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nghsD-001pMI-Hl; Tue, 19 Apr 2022 07:02:05 +0000 Received: from mail-pl1-x64a.google.com ([2607:f8b0:4864:20::64a]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nghni-001nTJ-LV for linux-arm-kernel@lists.infradead.org; Tue, 19 Apr 2022 06:57:28 +0000 Received: by mail-pl1-x64a.google.com with SMTP id f6-20020a170902ab8600b0015895212d23so9243328plr.6 for ; Mon, 18 Apr 2022 23:57:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=/vjKAR/Lgrfopo8hEj0HEcKOQxQlZW68o1SkmclVnl4=; b=lzf/QpdqQv9uzaV5AJLSdksISlhdMJg0/X4yt3SQ6Pbv0hF+PdxOMJ8pLE+rdZv61f i15qaeHVtYUyP2dfbRSZD25p4C+rxzvhNV9nTEdGdED+ftIuvIRX25CuQu7SsRHKay0I YG15YkYFJ5L5ER/Zlz9Lcy7QJPO3/2Pguy2ljgPmnfmTnwIn/U+BDnLd59tE5llgaax2 QlBXRvDLgcj/dqlkHez/TKqYPZBwwn9BUAGjjkRm4puiWejX/Kpf36vPPJRPn+7i7tqr zy+Ew1QFJeF2Kin3d8ZeIH0wYeZGlKFCjcM7cAb5Ib41YdGcj2wXN2yIFxLOuyzLvU3S gxog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=/vjKAR/Lgrfopo8hEj0HEcKOQxQlZW68o1SkmclVnl4=; b=Fz58HYF3iJ21RruXeiFDOU2vmTTIxRMx/eo4cq8+SheUsGWvEw496feQZaYHQc09ch 9FcTaeYW+IF1PGV7Wl4BUw4tgpLlAJu5ETqKJmRI+uJhtMiJJ8LkjK59VM0YV55kg3EG NdYU9G5BeT96aybmbpID4voyf6icndOOU4A5mQ/hY1elIZn9v0BxNwMFyNpkA5VRsc4f 5M814YMsjDk+eJmdoQjPJJdtvJlveuQ9Nl1b8cl/Z+vfH5MpNCAPOuJUioEDzFfi6FNU fnHFYd2TVlrMqJRT/GGLkfKO8+n2yGU27+cG2dBqo5CmOfK7uIC+R2k8K/C/49B7hjWt 5Asw== X-Gm-Message-State: AOAM532KBXRTh+XqF17g3kv/YKPr6n46DE1uKzZpP1IJ3isQqThQe42J FOj46D9yn99YuXfPuhlz1ZtNdST/91A= X-Google-Smtp-Source: ABdhPJwLgiVYSYP5oQPSjEjSHx+cLaLtR0/2B0FVBvNOlRvoxy7xj829DfShZuFzYw4gbA0oeKTgAhX0I3s= X-Received: from reiji-vws-sp.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:3d59]) (user=reijiw job=sendgmr) by 2002:a05:6a00:10c7:b0:4fd:9ee6:4130 with SMTP id d7-20020a056a0010c700b004fd9ee64130mr16718408pfu.84.1650351445278; Mon, 18 Apr 2022 23:57:25 -0700 (PDT) Date: Mon, 18 Apr 2022 23:55:18 -0700 In-Reply-To: <20220419065544.3616948-1-reijiw@google.com> Message-Id: <20220419065544.3616948-13-reijiw@google.com> Mime-Version: 1.0 References: <20220419065544.3616948-1-reijiw@google.com> X-Mailer: git-send-email 2.36.0.rc0.470.gd361397f0d-goog Subject: [PATCH v7 12/38] KVM: arm64: Add a KVM flag indicating emulating debug regs access is needed 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 , Will Deacon , Andrew Jones , Fuad Tabba , Peng Liang , Peter Shier , 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-20220418_235726_757445_AD3C7A18 X-CRM114-Status: GOOD ( 19.40 ) 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 Highest numbered breakpoints must be context aware breakpoints (as specified by Arm ARM). If the number of non-context aware breakpoints for the guest is decreased by userspace, simply narrowing the breakpoints will be problematic because it will lead to narrowing context aware breakpoints for the guest. Introduce KVM_ARCH_FLAG_EMULATE_DEBUG_REGS for kvm->arch.flags to indicate trapping debug reg access is needed, and enable the trapping when the flag is set. Set the new flag at the first KVM_RUN if the number of non-context aware breakpoints for the guest is decreased by userspace. No code sets the new flag yet since ID_AA64DFR0_EL1 is not configurable by userspace. Signed-off-by: Reiji Watanabe --- arch/arm64/include/asm/kvm_host.h | 3 +++ arch/arm64/kvm/debug.c | 7 ++++++- arch/arm64/kvm/sys_regs.c | 35 +++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h index a43fddd58e68..dbed94e759a8 100644 --- a/arch/arm64/include/asm/kvm_host.h +++ b/arch/arm64/include/asm/kvm_host.h @@ -136,6 +136,8 @@ struct kvm_arch { */ #define KVM_ARCH_FLAG_REG_WIDTH_CONFIGURED 3 #define KVM_ARCH_FLAG_EL1_32BIT 4 + /* Access to debug registers need to be emulated ? */ +#define KVM_ARCH_FLAG_EMULATE_DEBUG_REGS 5 unsigned long flags; @@ -786,6 +788,7 @@ long kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm, void set_default_id_regs(struct kvm *kvm); int kvm_set_id_reg_feature(struct kvm *kvm, u32 id, u8 field_shift, u8 fval); +void kvm_vcpu_breakpoint_config(struct kvm_vcpu *vcpu); /* Guest/host FPSIMD coordination helpers */ int kvm_arch_vcpu_run_map_fp(struct kvm_vcpu *vcpu); diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c index 4fd5c216c4bb..6eb146d908f8 100644 --- a/arch/arm64/kvm/debug.c +++ b/arch/arm64/kvm/debug.c @@ -106,10 +106,14 @@ static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu) * (KVM_GUESTDBG_USE_HW is set). * - The guest is not using debug (KVM_ARM64_DEBUG_DIRTY is clear). * - The guest has enabled the OS Lock (debug exceptions are blocked). + * - The guest's access to debug registers needs to be emulated + * (the number of non-context aware breakpoints for the guest + * is decreased by userspace). */ if ((vcpu->guest_debug & KVM_GUESTDBG_USE_HW) || !(vcpu->arch.flags & KVM_ARM64_DEBUG_DIRTY) || - kvm_vcpu_os_lock_enabled(vcpu)) + kvm_vcpu_os_lock_enabled(vcpu) || + test_bit(KVM_ARCH_FLAG_EMULATE_DEBUG_REGS, &vcpu->kvm->arch.flags)) vcpu->arch.mdcr_el2 |= MDCR_EL2_TDA; trace_kvm_arm_set_dreg32("MDCR_EL2", vcpu->arch.mdcr_el2); @@ -124,6 +128,7 @@ static void kvm_arm_setup_mdcr_el2(struct kvm_vcpu *vcpu) */ void kvm_arm_vcpu_init_debug(struct kvm_vcpu *vcpu) { + kvm_vcpu_breakpoint_config(vcpu); preempt_disable(); kvm_arm_setup_mdcr_el2(vcpu); preempt_enable(); diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c index b68ae53af792..f4aae4ccffd0 100644 --- a/arch/arm64/kvm/sys_regs.c +++ b/arch/arm64/kvm/sys_regs.c @@ -844,6 +844,41 @@ static bool trap_dbgauthstatus_el1(struct kvm_vcpu *vcpu, } } +#define AA64DFR0_BRPS(v) \ + ((u8)cpuid_feature_extract_unsigned_field(v, ID_AA64DFR0_BRPS_SHIFT)) +#define AA64DFR0_CTX_CMPS(v) \ + ((u8)cpuid_feature_extract_unsigned_field(v, ID_AA64DFR0_CTX_CMPS_SHIFT)) + +/* + * Set KVM_ARCH_FLAG_EMULATE_DEBUG_REGS in the VM flags when the number of + * non-context aware breakpoints for the guest is decreased by userspace + * (meaning that debug register accesses need to be emulated). + */ +void kvm_vcpu_breakpoint_config(struct kvm_vcpu *vcpu) +{ + u64 p_val = read_sanitised_ftr_reg(SYS_ID_AA64DFR0_EL1); + u64 v_val = read_id_reg_with_encoding(vcpu, SYS_ID_AA64DFR0_EL1); + u8 v_nbpn, p_nbpn; + struct kvm *kvm = vcpu->kvm; + + /* + * Check the number of normal (non-context aware) breakpoints + * for the guest and the host. + */ + v_nbpn = AA64DFR0_BRPS(v_val) - AA64DFR0_CTX_CMPS(v_val); + p_nbpn = AA64DFR0_BRPS(p_val) - AA64DFR0_CTX_CMPS(p_val); + if (v_nbpn >= p_nbpn) + /* + * Nothing to do if the number of normal breakpoints for the + * guest is not decreased by userspace (meaning KVM doesn't + * need to emulate an access of debug registers). + */ + return; + + if (!test_bit(KVM_ARCH_FLAG_EMULATE_DEBUG_REGS, &kvm->arch.flags)) + set_bit(KVM_ARCH_FLAG_EMULATE_DEBUG_REGS, &kvm->arch.flags); +} + /* * We want to avoid world-switching all the DBG registers all the * time: