From nobody Sat May 18 15:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+103606+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+103606+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1682474117; cv=none; d=zohomail.com; s=zohoarc; b=eJoQ2arpSsQrkaoC28ncTJf24VCL4qwxFcc98CyWod9+GMOyHsYAPwoSqjXn2zXs5UszrA7Y+4bpV/S1KS0uAlSV/HR154nI6MFB/l/+w6mgFXtfnPgjRZQDOSymjHmLD0VIEDBSc8SBx3nSaU6/Ra0+4AzmwMHynY3xS3x7TqM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1682474117; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=X9OeWxxLtzfxmGLNENO7osjqNW+U13696YIOpjE/EhU=; b=Rc9+YGE4dfQR7cdWu2oneVn3Kr2JGbEKj94HEAVU8CmRrFwK94BWCZxHm1YozP5lY1A6AK7ZXUDOfx1Ou3gt2RnyvUd8s+DE6WMOJonCmuXld0Kx6CTREhVKPACFHi7hKRzKXr91SS1YDjowgrAyXCoa8UAWK4aEEbJKLbPcTyQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+103606+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1682474117106469.0503339471668; Tue, 25 Apr 2023 18:55:17 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id SgsCYY1788612xZL95TVniOs; Tue, 25 Apr 2023 18:55:16 -0700 X-Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web10.98639.1682474113859855876 for ; Tue, 25 Apr 2023 18:55:16 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10691"; a="327280926" X-IronPort-AV: E=Sophos;i="5.99,227,1677571200"; d="scan'208";a="327280926" X-Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2023 18:55:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10691"; a="644051923" X-IronPort-AV: E=Sophos;i="5.99,227,1677571200"; d="scan'208";a="644051923" X-Received: from shwdeopenlab702.ccr.corp.intel.com ([10.239.55.92]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2023 18:54:56 -0700 From: "duntan" To: devel@edk2.groups.io Cc: Eric Dong , Ray Ni , Rahul Kumar , Gerd Hoffmann , Xiao X Chen Subject: [edk2-devel] [Patch V3 1/2] UefiCpuPkg: Update code to support enable ProcTrace only on BSP Date: Wed, 26 Apr 2023 09:54:28 +0800 Message-Id: <20230426015429.3117-2-dun.tan@intel.com> In-Reply-To: <20230426015429.3117-1-dun.tan@intel.com> References: <20230426015429.3117-1-dun.tan@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,dun.tan@intel.com X-Gm-Message-State: ycySvWX5tmdTRICLanicAaLxx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1682474116; bh=N4HnUH1McLfiQ8TkAwp6aMXzCB3gLRBJnT1ZE4toXUw=; h=Cc:Date:From:Reply-To:Subject:To; b=OwFAKYgGc6FQxN0jLE6+qo8NPwBWcEaafLPeYpyDtaYuqokAbwuHucOomEcW1N4IvLs YNIiEa4IZpb8RBVReNDU7Je7pOf0KAUt9mZLh4S28xBJC9tVt0PnQyMQs6sE8HU7IdZMF 6vy0689w45cfnxl05KjAPKK51GsODkFPsCU= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1682474119043100008 Content-Type: text/plain; charset="utf-8" Update code to support enable ProcTrace only on BSP. Add a new dynamic PCD to indicate if enable ProcTrace only on BSP. In ProcTrace.c code, if this new PCD is true, only allocate buffer and set CtrlReg.Bits.TraceEn to 1 for BSP. Bugzila: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4423 Signed-off-by: Dun Tan Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Xiao X Chen Reviewed-by: Ray Ni --- UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf | 3 ++- UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c | 174 +++= +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++= ++++++++++++++++++++++++++++++++-------------------------------------------= --------------------- UefiCpuPkg/UefiCpuPkg.dec | 7 +++= ++++ 3 files changed, 119 insertions(+), 65 deletions(-) diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.i= nf b/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf index 7fbcd8da0e..d803012ce2 100644 --- a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf +++ b/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf @@ -4,7 +4,7 @@ # This library registers CPU features defined in Intel(R) 64 and IA-32 # Architectures Software Developer's Manual. # -# Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2017 - 2023, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -62,3 +62,4 @@ gUefiCpuPkgTokenSpaceGuid.PcdIsPowerOnReset ## SOMETIMES_= CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceOutputScheme ## SOMETIMES_= CONSUMES gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceMemSize ## SOMETIMES_= CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceBspOnly ## SOMETIMES_= CONSUMES diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c b/UefiCpuP= kg/Library/CpuCommonFeaturesLib/ProcTrace.c index 04e6a60728..92d6f54b42 100644 --- a/UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c +++ b/UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c @@ -1,7 +1,7 @@ /** @file Intel Processor Trace feature. =20 - Copyright (c) 2017 - 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2017 - 2023, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent =20 **/ @@ -46,6 +46,8 @@ typedef struct { =20 UINTN *TopaMemArray; =20 + BOOLEAN EnableOnBspOnly; + PROC_TRACE_PROCESSOR_DATA *ProcessorData; } PROC_TRACE_DATA; =20 @@ -77,6 +79,7 @@ ProcTraceGetConfigData ( ConfigData->NumberOfProcessors =3D (UINT32)NumberOfProcessors; ConfigData->ProcTraceMemSize =3D PcdGet32 (PcdCpuProcTraceMemSize); ConfigData->ProcTraceOutputScheme =3D PcdGet8 (PcdCpuProcTraceOutputSche= me); + ConfigData->EnableOnBspOnly =3D PcdGetBool (PcdCpuProcTraceBspOnly= ); =20 return ConfigData; } @@ -188,6 +191,7 @@ ProcTraceInitialize ( MSR_IA32_RTIT_OUTPUT_BASE_REGISTER OutputBaseReg; MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER OutputMaskPtrsReg; RTIT_TOPA_TABLE_ENTRY *TopaEntryPtr; + BOOLEAN IsBsp; =20 // // The scope of the MSR_IA32_RTIT_* is core for below processor type, on= ly program @@ -236,6 +240,12 @@ ProcTraceInitialize ( return RETURN_SUCCESS; } =20 + IsBsp =3D (CpuInfo->ProcessorInfo.StatusFlag & PROCESSOR_AS_BSP_BIT) ? T= RUE : FALSE; + + if (ProcTraceData->EnableOnBspOnly && !IsBsp) { + return RETURN_SUCCESS; + } + MemRegionBaseAddr =3D 0; FirstIn =3D FALSE; =20 @@ -260,43 +270,62 @@ ProcTraceInitialize ( // address base in MSR, IA32_RTIT_OUTPUT_BASE (560h) bits 47:12. Not= e that all regions must be // aligned based on their size, not just 4K. Thus a 2M region must h= ave bits 20:12 cleared. // - ThreadMemRegionTable =3D (UINTN *)AllocatePool (ProcTraceData->NumberO= fProcessors * sizeof (UINTN *)); - if (ThreadMemRegionTable =3D=3D NULL) { - DEBUG ((DEBUG_ERROR, "Allocate ProcTrace ThreadMemRegionTable Failed= \n")); - return RETURN_OUT_OF_RESOURCES; - } =20 - ProcTraceData->ThreadMemRegionTable =3D ThreadMemRegionTable; - - for (Index =3D 0; Index < ProcTraceData->NumberOfProcessors; Index++, = ProcTraceData->AllocatedThreads++) { - Pages =3D EFI_SIZE_TO_PAGES (MemRegionSize); - Alignment =3D MemRegionSize; - AlignedAddress =3D (UINTN)AllocateAlignedReservedPages (Pages, Align= ment); - if (AlignedAddress =3D=3D 0) { - DEBUG ((DEBUG_ERROR, "ProcTrace: Out of mem, allocated only for %d= threads\n", ProcTraceData->AllocatedThreads)); - if (Index =3D=3D 0) { - // - // Could not allocate for BSP even - // - FreePool ((VOID *)ThreadMemRegionTable); - ThreadMemRegionTable =3D NULL; - return RETURN_OUT_OF_RESOURCES; + Pages =3D EFI_SIZE_TO_PAGES (MemRegionSize); + Alignment =3D MemRegionSize; + if (ProcTraceData->EnableOnBspOnly) { + // + // When only enable ProcTrace on BSP, this is the first and only tim= e ProcTraceInitialize() runs. + // + MemRegionBaseAddr =3D (UINTN)AllocateAlignedReservedPages (Pages, Al= ignment); + if (MemRegionBaseAddr =3D=3D 0) { + // + // Could not allocate for BSP even + // + DEBUG ((DEBUG_ERROR, "ProcTrace: Out of mem, failed to allocate bu= ffer for BSP\n")); + return RETURN_OUT_OF_RESOURCES; + } + + DEBUG ((DEBUG_INFO, "ProcTrace: Allocated PT MemRegionBaseAddr(align= ed) for BSP only: 0x%llX.\n", (UINT64)MemRegionBaseAddr)); + } else { + ThreadMemRegionTable =3D (UINTN *)AllocatePool (ProcTraceData->Numbe= rOfProcessors * sizeof (UINTN *)); + if (ThreadMemRegionTable =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "Allocate ProcTrace ThreadMemRegionTable Fail= ed\n")); + return RETURN_OUT_OF_RESOURCES; + } + + ProcTraceData->ThreadMemRegionTable =3D ThreadMemRegionTable; + + for (Index =3D 0; Index < ProcTraceData->NumberOfProcessors; Index++= , ProcTraceData->AllocatedThreads++) { + AlignedAddress =3D (UINTN)AllocateAlignedReservedPages (Pages, Ali= gnment); + if (AlignedAddress =3D=3D 0) { + DEBUG ((DEBUG_ERROR, "ProcTrace: Out of mem, allocated only for = %d threads\n", ProcTraceData->AllocatedThreads)); + if (Index =3D=3D 0) { + // + // Could not allocate for BSP even + // + FreePool ((VOID *)ThreadMemRegionTable); + ThreadMemRegionTable =3D NULL; + return RETURN_OUT_OF_RESOURCES; + } + + break; } =20 - break; + ThreadMemRegionTable[Index] =3D AlignedAddress; + DEBUG ((DEBUG_INFO, "ProcTrace: PT MemRegionBaseAddr(aligned) for = thread %d: 0x%llX \n", Index, (UINT64)ThreadMemRegionTable[Index])); } =20 - ThreadMemRegionTable[Index] =3D AlignedAddress; - DEBUG ((DEBUG_INFO, "ProcTrace: PT MemRegionBaseAddr(aligned) for th= read %d: 0x%llX \n", Index, (UINT64)ThreadMemRegionTable[Index])); + DEBUG ((DEBUG_INFO, "ProcTrace: Allocated PT mem for %d thread \n", = ProcTraceData->AllocatedThreads)); } - - DEBUG ((DEBUG_INFO, "ProcTrace: Allocated PT mem for %d thread \n", Pr= ocTraceData->AllocatedThreads)); } =20 - if (ProcessorNumber < ProcTraceData->AllocatedThreads) { - MemRegionBaseAddr =3D ProcTraceData->ThreadMemRegionTable[ProcessorNum= ber]; - } else { - return RETURN_SUCCESS; + if (!ProcTraceData->EnableOnBspOnly) { + if (ProcessorNumber < ProcTraceData->AllocatedThreads) { + MemRegionBaseAddr =3D ProcTraceData->ThreadMemRegionTable[ProcessorN= umber]; + } else { + return RETURN_SUCCESS; + } } =20 /// @@ -367,50 +396,67 @@ ProcTraceInitialize ( // if (FirstIn) { DEBUG ((DEBUG_INFO, "ProcTrace: Enabling ToPA scheme \n")); - // - // Let BSP allocate ToPA table mem for all threads - // - TopaMemArray =3D (UINTN *)AllocatePool (ProcTraceData->AllocatedThre= ads * sizeof (UINTN *)); - if (TopaMemArray =3D=3D NULL) { - DEBUG ((DEBUG_ERROR, "ProcTrace: Allocate mem for ToPA Failed\n")); - return RETURN_OUT_OF_RESOURCES; - } =20 - ProcTraceData->TopaMemArray =3D TopaMemArray; + Pages =3D EFI_SIZE_TO_PAGES (sizeof (PROC_TRACE_TOPA_TABLE)); + Alignment =3D 0x1000; =20 - for (Index =3D 0; Index < ProcTraceData->AllocatedThreads; Index++) { - Pages =3D EFI_SIZE_TO_PAGES (sizeof (PROC_TRACE_TOPA_TABL= E)); - Alignment =3D 0x1000; - AlignedAddress =3D (UINTN)AllocateAlignedReservedPages (Pages, Ali= gnment); - if (AlignedAddress =3D=3D 0) { - if (Index < ProcTraceData->AllocatedThreads) { - ProcTraceData->AllocatedThreads =3D Index; - } + if (ProcTraceData->EnableOnBspOnly) { + // + // When only enable ProcTrace on BSP, this is the first and only t= ime ProcTraceInitialize() runs. + // + TopaTableBaseAddr =3D (UINTN)AllocateAlignedReservedPages (Pages, = Alignment); + if (TopaTableBaseAddr =3D=3D 0) { + DEBUG ((DEBUG_ERROR, "ProcTrace: Out of mem, failed to allocate = ToPA mem for BSP")); + return RETURN_OUT_OF_RESOURCES; + } =20 - DEBUG ((DEBUG_ERROR, "ProcTrace: Out of mem, allocated ToPA mem= only for %d threads\n", ProcTraceData->AllocatedThreads)); - if (Index =3D=3D 0) { - // - // Could not allocate for BSP even - // - FreePool ((VOID *)TopaMemArray); - TopaMemArray =3D NULL; - return RETURN_OUT_OF_RESOURCES; + DEBUG ((DEBUG_INFO, "ProcTrace: Topa table address(aligned) for BS= P only: 0x%llX \n", (UINT64)TopaTableBaseAddr)); + } else { + // + // Let BSP allocate ToPA table mem for all threads + // + TopaMemArray =3D (UINTN *)AllocatePool (ProcTraceData->AllocatedTh= reads * sizeof (UINTN *)); + if (TopaMemArray =3D=3D NULL) { + DEBUG ((DEBUG_ERROR, "ProcTrace: Allocate mem for ToPA Failed\n"= )); + return RETURN_OUT_OF_RESOURCES; + } + + ProcTraceData->TopaMemArray =3D TopaMemArray; + + for (Index =3D 0; Index < ProcTraceData->AllocatedThreads; Index++= ) { + AlignedAddress =3D (UINTN)AllocateAlignedReservedPages (Pages, A= lignment); + if (AlignedAddress =3D=3D 0) { + if (Index < ProcTraceData->AllocatedThreads) { + ProcTraceData->AllocatedThreads =3D Index; + } + + DEBUG ((DEBUG_ERROR, "ProcTrace: Out of mem, allocated ToPA m= em only for %d threads\n", ProcTraceData->AllocatedThreads)); + if (Index =3D=3D 0) { + // + // Could not allocate for BSP even + // + FreePool ((VOID *)TopaMemArray); + TopaMemArray =3D NULL; + return RETURN_OUT_OF_RESOURCES; + } + + break; } =20 - break; + TopaMemArray[Index] =3D AlignedAddress; + DEBUG ((DEBUG_INFO, "ProcTrace: Topa table address(aligned) for = thread %d is 0x%llX \n", Index, (UINT64)TopaMemArray[Index])); } =20 - TopaMemArray[Index] =3D AlignedAddress; - DEBUG ((DEBUG_INFO, "ProcTrace: Topa table address(aligned) for th= read %d is 0x%llX \n", Index, (UINT64)TopaMemArray[Index])); + DEBUG ((DEBUG_INFO, "ProcTrace: Allocated ToPA mem for %d thread \= n", ProcTraceData->AllocatedThreads)); } - - DEBUG ((DEBUG_INFO, "ProcTrace: Allocated ToPA mem for %d thread \n"= , ProcTraceData->AllocatedThreads)); } =20 - if (ProcessorNumber < ProcTraceData->AllocatedThreads) { - TopaTableBaseAddr =3D ProcTraceData->TopaMemArray[ProcessorNumber]; - } else { - return RETURN_SUCCESS; + if (!ProcTraceData->EnableOnBspOnly) { + if (ProcessorNumber < ProcTraceData->AllocatedThreads) { + TopaTableBaseAddr =3D ProcTraceData->TopaMemArray[ProcessorNumber]; + } else { + return RETURN_SUCCESS; + } } =20 TopaTable =3D (PROC_TRACE_TOPA_TABLE *)TopaTableBaseAd= dr; diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index a5528277ff..14dadfbf53 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -422,5 +422,12 @@ # @Prompt GHCB Hypervisor Features gUefiCpuPkgTokenSpaceGuid.PcdGhcbHypervisorFeatures|0x0|UINT64|0x60000018 =20 + ## This PCD indicates whether CPU processor trace is enabled on BSP only= when CPU processor trace is enabled.

+ # This PCD is ignored if CPU processor trace is disabled.

+ # TRUE - CPU processor trace is enabled on BSP only.
+ # FASLE - CPU processor trace is enabled on all CPU.
+ # @Prompt Enable CPU processor trace only on BSP. + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceBspOnly|FALSE|BOOLEAN|0x60000019 + [UserExtensions.TianoCore."ExtraFiles"] UefiCpuPkgExtra.uni --=20 2.39.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#103606): https://edk2.groups.io/g/devel/message/103606 Mute This Topic: https://groups.io/mt/98506881/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- From nobody Sat May 18 15:08:28 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+103607+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+103607+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1682474117; cv=none; d=zohomail.com; s=zohoarc; b=CIufL/gtrH7tdo9aGrVkIhuS3WLNxAWSSpSPoqLWrolM4Ne44RptcSO22pYs8oR2L2mAk/JfPmLR1EgmYosNLp2COTkEuU6ixGW83ZN0W/aWiXa1fpLQL4oJEDjev6iFmgNbFW21f2GAxOzm0IGpbVCj79QzUi0rq14QkwSP7kw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1682474117; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=fYk0cJ+0B1VCKJ6LycWjnEN1ZtfRfNIQuN16LqRnOis=; b=nLuRPrbIX4D6uEGowk9/fESJnQ4iPOUezjhCie9js4NAaw617QO/RCaEzyIsEeWpV246hUoO5FfaxU5oanlW/NCbOvz6xFTWnp6NB8oa0/U/beuDpwwnjuAMFfi05pWTK3Rbwy3Mh4fhN4hdbY5xx2jT/VoU3FZKK6/Qv9n3nVg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+103607+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1682474117968926.3307511922741; Tue, 25 Apr 2023 18:55:17 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id GUR0YY1788612xFehPveOHcj; Tue, 25 Apr 2023 18:55:17 -0700 X-Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by mx.groups.io with SMTP id smtpd.web10.98639.1682474113859855876 for ; Tue, 25 Apr 2023 18:55:17 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10691"; a="327280950" X-IronPort-AV: E=Sophos;i="5.99,227,1677571200"; d="scan'208";a="327280950" X-Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2023 18:55:03 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10691"; a="644051993" X-IronPort-AV: E=Sophos;i="5.99,227,1677571200"; d="scan'208";a="644051993" X-Received: from shwdeopenlab702.ccr.corp.intel.com ([10.239.55.92]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2023 18:55:01 -0700 From: "duntan" To: devel@edk2.groups.io Cc: Eric Dong , Ray Ni , Rahul Kumar , Gerd Hoffmann , Xiao X Chen Subject: [edk2-devel] [Patch V3 2/2] UefiCpuPkg: Update PT code to support enable collect performance Date: Wed, 26 Apr 2023 09:54:29 +0800 Message-Id: <20230426015429.3117-3-dun.tan@intel.com> In-Reply-To: <20230426015429.3117-1-dun.tan@intel.com> References: <20230426015429.3117-1-dun.tan@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,dun.tan@intel.com X-Gm-Message-State: 1Pp7Jo1wTi3rwaRAEGqfeibTx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1682474117; bh=Im1fi8ltuF1Fii/9iiJmhyXCeNr0e8VoHUttRS1YDHM=; h=Cc:Date:From:Reply-To:Subject:To; b=DkOOZ+5YjmZOvYOjblMKnXP8jvZVy5EbvtPeSH0jUWOxJZLf3p8JyWL9wEmZ2oduWh0 vSvZwhvzr9JzGwwUMWa0CpWb/tjq+CzarevsOVmdtQYOrvU/neMSB7u3ovBU+0hGSMMfo DbFvA7xQdiJni0Th/hV8Kl17iWvYx8nXodg= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1682474119046100009 Content-Type: text/plain; charset="utf-8" Update ProcTrace feature code to support enable collect performance data by generating CYC and TSC packets. Add a new dynamic PCD to indicate if enable performance collecting. In ProcTrace.c code, if this new PCD is true, after check cpuid, CYC and TSC packets will be generated by setting the corresponding MSR bits feilds if supported. Bugzila: https://bugzilla.tianocore.org/show_bug.cgi?id=3D4423 Signed-off-by: Dun Tan Cc: Eric Dong Cc: Ray Ni Cc: Rahul Kumar Cc: Gerd Hoffmann Cc: Xiao X Chen Reviewed-by: Ray Ni --- UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf | 11 ++++= ++----- UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c | 38 ++++= ++++++++++++++++++++++++++-------- UefiCpuPkg/UefiCpuPkg.dec | 8 ++++= ++++ 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.i= nf b/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf index d803012ce2..1b823155b1 100644 --- a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf +++ b/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf @@ -58,8 +58,9 @@ LocalApicLib =20 [Pcd] - gUefiCpuPkgTokenSpaceGuid.PcdCpuClockModulationDutyCycle ## SOMETIMES_= CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdIsPowerOnReset ## SOMETIMES_= CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceOutputScheme ## SOMETIMES_= CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceMemSize ## SOMETIMES_= CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceBspOnly ## SOMETIMES_= CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuClockModulationDutyCycle ## SOMETI= MES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdIsPowerOnReset ## SOMETI= MES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceOutputScheme ## SOMETI= MES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceMemSize ## SOMETI= MES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceBspOnly ## SOMETI= MES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTracePerformanceCollecting ## SOMETI= MES_CONSUMES diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c b/UefiCpuP= kg/Library/CpuCommonFeaturesLib/ProcTrace.c index 92d6f54b42..a4510eb802 100644 --- a/UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c +++ b/UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c @@ -33,6 +33,7 @@ typedef struct { MSR_IA32_RTIT_CTL_REGISTER RtitCtrl; MSR_IA32_RTIT_OUTPUT_BASE_REGISTER RtitOutputBase; MSR_IA32_RTIT_OUTPUT_MASK_PTRS_REGISTER RtitOutputMaskPtrs; + BOOLEAN CycPacketSupported; } PROC_TRACE_PROCESSOR_DATA; =20 typedef struct { @@ -47,6 +48,7 @@ typedef struct { UINTN *TopaMemArray; =20 BOOLEAN EnableOnBspOnly; + BOOLEAN EnablePerformanceCollecting; =20 PROC_TRACE_PROCESSOR_DATA *ProcessorData; } PROC_TRACE_DATA; @@ -76,10 +78,11 @@ ProcTraceGetConfigData ( ASSERT (ConfigData !=3D NULL); ConfigData->ProcessorData =3D (PROC_TRACE_PROCESSOR_DATA *)((UINT8 *)Con= figData + sizeof (PROC_TRACE_DATA)); =20 - ConfigData->NumberOfProcessors =3D (UINT32)NumberOfProcessors; - ConfigData->ProcTraceMemSize =3D PcdGet32 (PcdCpuProcTraceMemSize); - ConfigData->ProcTraceOutputScheme =3D PcdGet8 (PcdCpuProcTraceOutputSche= me); - ConfigData->EnableOnBspOnly =3D PcdGetBool (PcdCpuProcTraceBspOnly= ); + ConfigData->NumberOfProcessors =3D (UINT32)NumberOfProcessors; + ConfigData->ProcTraceMemSize =3D PcdGet32 (PcdCpuProcTraceMem= Size); + ConfigData->ProcTraceOutputScheme =3D PcdGet8 (PcdCpuProcTraceOutp= utScheme); + ConfigData->EnableOnBspOnly =3D PcdGetBool (PcdCpuProcTraceB= spOnly); + ConfigData->EnablePerformanceCollecting =3D PcdGetBool (PcdCpuProcTraceP= erformanceCollecting); =20 return ConfigData; } @@ -111,7 +114,8 @@ ProcTraceSupport ( { PROC_TRACE_DATA *ProcTraceData; CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS_EBX Ebx; - CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_ECX Ecx; + CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_ECX ProcTraceEcx; + CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF_EBX ProcTraceEbx; =20 // // Check if ProcTraceMemorySize option is enabled (0xFF means disable by= user) @@ -132,15 +136,17 @@ ProcTraceSupport ( return FALSE; } =20 - AsmCpuidEx (CPUID_INTEL_PROCESSOR_TRACE, CPUID_INTEL_PROCESSOR_TRACE_MAI= N_LEAF, NULL, NULL, &Ecx.Uint32, NULL); - ProcTraceData->ProcessorData[ProcessorNumber].TopaSupported =3D (= BOOLEAN)(Ecx.Bits.RTIT =3D=3D 1); - ProcTraceData->ProcessorData[ProcessorNumber].SingleRangeSupported =3D (= BOOLEAN)(Ecx.Bits.SingleRangeOutput =3D=3D 1); + AsmCpuidEx (CPUID_INTEL_PROCESSOR_TRACE, CPUID_INTEL_PROCESSOR_TRACE_MAI= N_LEAF, NULL, &ProcTraceEbx.Uint32, &ProcTraceEcx.Uint32, NULL); + ProcTraceData->ProcessorData[ProcessorNumber].TopaSupported =3D (= BOOLEAN)(ProcTraceEcx.Bits.RTIT =3D=3D 1); + ProcTraceData->ProcessorData[ProcessorNumber].SingleRangeSupported =3D (= BOOLEAN)(ProcTraceEcx.Bits.SingleRangeOutput =3D=3D 1); if ((ProcTraceData->ProcessorData[ProcessorNumber].TopaSupported && (Pro= cTraceData->ProcTraceOutputScheme =3D=3D RtitOutputSchemeToPA)) || (ProcTraceData->ProcessorData[ProcessorNumber].SingleRangeSupported = && (ProcTraceData->ProcTraceOutputScheme =3D=3D RtitOutputSchemeSingleRange= ))) { ProcTraceData->ProcessorData[ProcessorNumber].RtitCtrl.Uint64 = =3D AsmReadMsr64 (MSR_IA32_RTIT_CTL); ProcTraceData->ProcessorData[ProcessorNumber].RtitOutputBase.Uint64 = =3D AsmReadMsr64 (MSR_IA32_RTIT_OUTPUT_BASE); ProcTraceData->ProcessorData[ProcessorNumber].RtitOutputMaskPtrs.Uint6= 4 =3D AsmReadMsr64 (MSR_IA32_RTIT_OUTPUT_MASK_PTRS); + ProcTraceData->ProcessorData[ProcessorNumber].CycPacketSupported = =3D (BOOLEAN)(ProcTraceEbx.Bits.ConfigurablePsb =3D=3D 1); + return TRUE; } =20 @@ -517,6 +523,22 @@ ProcTraceInitialize ( CtrlReg.Bits.User =3D 1; CtrlReg.Bits.BranchEn =3D 1; CtrlReg.Bits.TraceEn =3D 1; + + // + // Generate CYC/TSC timing packets to collect performance data. + // + if (ProcTraceData->EnablePerformanceCollecting) { + if (ProcTraceData->ProcessorData[ProcessorNumber].CycPacketSupported) { + CtrlReg.Bits.CYCEn =3D 1; + CtrlReg.Bits.CYCThresh =3D 5; + } + + // + // Write to TSCEn is always supported + // + CtrlReg.Bits.TSCEn =3D 1; + } + CPU_REGISTER_TABLE_WRITE64 ( ProcessorNumber, Msr, diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index 14dadfbf53..b7a46e3235 100644 --- a/UefiCpuPkg/UefiCpuPkg.dec +++ b/UefiCpuPkg/UefiCpuPkg.dec @@ -429,5 +429,13 @@ # @Prompt Enable CPU processor trace only on BSP. gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceBspOnly|FALSE|BOOLEAN|0x60000019 =20 + ## This PCD indicates if enable performance collecting when CPU processo= r trace is enabled.

+ # CYC/TSC timing packets will be generated to collect performance data = if this PCD is TRUE. + # This PCD is ignored if CPU processor trace is disabled.

+ # TRUE - Performance collecting will be enabled in processor trace.
+ # FASLE - Performance collecting will be disabled in processor trace. + # @Prompt Enable performance collecting when processor trace is enabled. + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTracePerformanceCollecting|FALSE|BOO= LEAN|0x60000020 + [UserExtensions.TianoCore."ExtraFiles"] UefiCpuPkgExtra.uni --=20 2.39.1.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#103607): https://edk2.groups.io/g/devel/message/103607 Mute This Topic: https://groups.io/mt/98506882/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-