Received: by 2002:a05:7412:2a8c:b0:e2:908c:2ebd with SMTP id u12csp3354928rdh; Thu, 28 Sep 2023 09:13:29 -0700 (PDT) X-Google-Smtp-Source: AGHT+IECdpMgQ63lv/vbholIOmX5MNUigoqNtfCTqw5zwXrIvj0FCbENzquRsRBEW2aFqFR4Y0ii X-Received: by 2002:a05:6a20:4403:b0:136:e26b:6401 with SMTP id ce3-20020a056a20440300b00136e26b6401mr2111940pzb.16.1695917608885; Thu, 28 Sep 2023 09:13:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695917608; cv=none; d=google.com; s=arc-20160816; b=nWGgT62UBthLbA/ZF9xK2rxEOY65lbFFTD8bsjZ7JpMOYlFsoKCNDnw/1fg00D8SOV pgNvcqMMR+OqGl+7f5dCoPGCjzobzqFsiKtFBs5f92Lw9nzfxDwghN0ZH5VuC13K5+/d TAnhDxf8AGza5RzbYz8P9VA/CLiXxTbBOsnyLRTyVFTERe8Q2Xll88nr84lWDDcLsjfe f8nPQWHkeXb/8rGm38+tOhGS1YCfX2Z9Zq0CvNhRM+PBBm9tYCOv4Tr7K3plizJGr61x 6CD9+5Dwz43gjH/kTEf62bPdB223tOfDkLBCPhdWFI3z6RRf2e5iTAUMx9R5p6pxqULE jq/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=oVgZDPrBlxA8kNDcaGse+76mVxT0SgmeZQ5jdougeNY=; fh=c22Vo8jmrolb3C2NHSTiTLszWLzURTk1MpvpruViKqw=; b=Nak+mjuf1iUYU/Yk5iZCBdfwh1/F4m2udynEkiyA4vuOW4JQHfTEJGXIIPR3iXNg0W OG8G7CXZddBCoLN/y/+iyiZhxe4KXTiozWug+7h7SeN1MJ+zU/9Ny1TOspQtRCybQE1Q xJ+hIPkn8DEpJmFfWolFiPNR4MMaMNKOkez86dFEHwsMARuAbYtzzxynuo5LyIZpvMMH rWU6FUwzksnoeFEh5QEL/hKsQodcH7i7IWunyINiQ1Z+2LiyjYd5ogifvqcpdkn++Hxp jgGACrmKTtm3dXcHJilGO1MVbsP5ZS6HdW38YBjU5ENxOGDCnLTpoaG+HPfqIbEsxwPC zeiA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from howler.vger.email (howler.vger.email. [23.128.96.34]) by mx.google.com with ESMTPS id i7-20020a170902c94700b001b9ea0f0e25si6900282pla.607.2023.09.28.09.13.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Sep 2023 09:13:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) client-ip=23.128.96.34; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 5F60C853A92A; Thu, 28 Sep 2023 08:17:13 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231895AbjI1PQ7 (ORCPT + 99 others); Thu, 28 Sep 2023 11:16:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231833AbjI1PQw (ORCPT ); Thu, 28 Sep 2023 11:16:52 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 25131CCD for ; Thu, 28 Sep 2023 08:16:48 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2AE021476; Thu, 28 Sep 2023 08:17:26 -0700 (PDT) Received: from e127643.arm.com (unknown [10.57.3.6]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id E7AD23F59C; Thu, 28 Sep 2023 08:16:43 -0700 (PDT) From: James Clark To: coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, broonie@kernel.org, maz@kernel.org, suzuki.poulose@arm.com Cc: James Clark , Oliver Upton , James Morse , Zenghui Yu , Catalin Marinas , Will Deacon , Mike Leach , Leo Yan , Alexander Shishkin , Anshuman Khandual , Rob Herring , Jintack Lim , Joey Gouly , linux-kernel@vger.kernel.org Subject: [PATCH v1 4/5] arm64: KVM: Write TRFCR value on guest switch with nVHE Date: Thu, 28 Sep 2023 16:16:08 +0100 Message-Id: <20230928151611.3042443-5-james.clark@arm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230928151611.3042443-1-james.clark@arm.com> References: <20230928151611.3042443-1-james.clark@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Thu, 28 Sep 2023 08:17:14 -0700 (PDT) The guest value for TRFCR requested by the Coresight driver is saved in guest_trfcr_el1. On guest switch this value needs to be written to the register. Currently TRFCR is only modified when we want to disable trace completely in guests due to an issue with TRBE. Expand the __debug_save_trace() function to always write to the register if a different value for guests is required, but also keep the existing TRBE disable behavior if that's required. The TRFCR restore function remains functionally the same, except a value of 0 doesn't mean "don't restore" anymore. Now that we save both guest and host values the register is restored any time the guest and host values differ. Signed-off-by: James Clark --- arch/arm64/kvm/debug.c | 13 ++++++- arch/arm64/kvm/hyp/nvhe/debug-sr.c | 56 ++++++++++++++++++------------ 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c index 379d2677961f..e39f2d535b25 100644 --- a/arch/arm64/kvm/debug.c +++ b/arch/arm64/kvm/debug.c @@ -332,10 +332,21 @@ void kvm_arch_vcpu_load_debug_state_flags(struct kvm_vcpu *vcpu) !(read_sysreg_s(SYS_PMBIDR_EL1) & BIT(PMBIDR_EL1_P_SHIFT))) vcpu_set_flag(vcpu, DEBUG_STATE_SAVE_SPE); - /* Check if we have TRBE implemented and available at the host */ + /* + * Check if we have TRBE implemented and available at the host. If it's + * in use at the time of guest switch it will need to be disabled and + * then restored. + */ if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_TraceBuffer_SHIFT) && !(read_sysreg_s(SYS_TRBIDR_EL1) & TRBIDR_EL1_P)) vcpu_set_flag(vcpu, DEBUG_STATE_SAVE_TRFCR); + /* + * Also save TRFCR on nVHE if FEAT_TRF (TraceFilt) exists. This will be + * done in cases where use of TRBE doesn't completely disable trace and + * handles the exclude_host/exclude_guest rules of the trace session. + */ + if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_TraceFilt_SHIFT)) + vcpu_set_flag(vcpu, DEBUG_STATE_SAVE_TRFCR); } void kvm_arch_vcpu_put_debug_state_flags(struct kvm_vcpu *vcpu) diff --git a/arch/arm64/kvm/hyp/nvhe/debug-sr.c b/arch/arm64/kvm/hyp/nvhe/debug-sr.c index 55bc01e9808f..7ceb16be14cd 100644 --- a/arch/arm64/kvm/hyp/nvhe/debug-sr.c +++ b/arch/arm64/kvm/hyp/nvhe/debug-sr.c @@ -51,32 +51,44 @@ static void __debug_restore_spe(u64 pmscr_el1) write_sysreg_s(pmscr_el1, SYS_PMSCR_EL1); } -static void __debug_save_trace(u64 *trfcr_el1) +/* + * Save TRFCR and disable trace completely if TRBE is being used, otherwise + * apply required guest TRFCR value. + */ +static void __debug_save_trace(struct kvm_vcpu *vcpu) { - *trfcr_el1 = 0; + vcpu->arch.host_debug_state.host_trfcr_el1 = read_sysreg_s(SYS_TRFCR_EL1); /* Check if the TRBE is enabled */ - if (!(read_sysreg_s(SYS_TRBLIMITR_EL1) & TRBLIMITR_EL1_E)) - return; - /* - * Prohibit trace generation while we are in guest. - * Since access to TRFCR_EL1 is trapped, the guest can't - * modify the filtering set by the host. - */ - *trfcr_el1 = read_sysreg_s(SYS_TRFCR_EL1); - write_sysreg_s(0, SYS_TRFCR_EL1); - isb(); - /* Drain the trace buffer to memory */ - tsb_csync(); + if (read_sysreg_s(SYS_TRBLIMITR_EL1) & TRBLIMITR_EL1_E) { + /* + * Prohibit trace generation while we are in guest. Since access + * to TRFCR_EL1 is trapped, the guest can't modify the filtering + * set by the host. + */ + vcpu->arch.host_debug_state.guest_trfcr_el1 = 0; + write_sysreg_s(0, SYS_TRFCR_EL1); + isb(); + /* Drain the trace buffer to memory */ + tsb_csync(); + } else { + /* + * Not using TRBE, so guest trace works. Apply the guest filters + * provided by the Coresight driver, if different. + */ + if (vcpu->arch.host_debug_state.guest_trfcr_el1 != + vcpu->arch.host_debug_state.host_trfcr_el1) + write_sysreg_s(vcpu->arch.host_debug_state.guest_trfcr_el1, + SYS_TRFCR_EL1); + } } -static void __debug_restore_trace(u64 trfcr_el1) +static void __debug_restore_trace(struct kvm_vcpu *vcpu) { - if (!trfcr_el1) - return; - /* Restore trace filter controls */ - write_sysreg_s(trfcr_el1, SYS_TRFCR_EL1); + if (vcpu->arch.host_debug_state.host_trfcr_el1 != + vcpu->arch.host_debug_state.guest_trfcr_el1) + write_sysreg_s(vcpu->arch.host_debug_state.host_trfcr_el1, SYS_TRFCR_EL1); } void __debug_save_host_buffers_nvhe(struct kvm_vcpu *vcpu) @@ -84,9 +96,9 @@ void __debug_save_host_buffers_nvhe(struct kvm_vcpu *vcpu) /* Disable and flush SPE data generation */ if (vcpu_get_flag(vcpu, DEBUG_STATE_SAVE_SPE)) __debug_save_spe(&vcpu->arch.host_debug_state.pmscr_el1); - /* Disable and flush Self-Hosted Trace generation */ + if (vcpu_get_flag(vcpu, DEBUG_STATE_SAVE_TRFCR)) - __debug_save_trace(&vcpu->arch.host_debug_state.host_trfcr_el1); + __debug_save_trace(vcpu); } void __debug_switch_to_guest(struct kvm_vcpu *vcpu) @@ -99,7 +111,7 @@ void __debug_restore_host_buffers_nvhe(struct kvm_vcpu *vcpu) if (vcpu_get_flag(vcpu, DEBUG_STATE_SAVE_SPE)) __debug_restore_spe(vcpu->arch.host_debug_state.pmscr_el1); if (vcpu_get_flag(vcpu, DEBUG_STATE_SAVE_TRFCR)) - __debug_restore_trace(vcpu->arch.host_debug_state.host_trfcr_el1); + __debug_restore_trace(vcpu); } void __debug_switch_to_host(struct kvm_vcpu *vcpu) -- 2.34.1