From nobody Mon Feb 9 02:12:19 2026 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 --- 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-