From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mx.groups.io with SMTP id smtpd.web10.75002.1682413536302521396 for ; Tue, 25 Apr 2023 02:05:41 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=hzyecCb3; spf=pass (domain: intel.com, ip: 134.134.136.65, mailfrom: dun.tan@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1682413541; x=1713949541; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=IpFcco+3v0yY2BHvS57ATH5Y6DsZkC27KxQLV84bcYU=; b=hzyecCb3ajwqjnggDtsvy70ufqSPYm2/eNVskg5H40fe75ifdqtrs1h4 YoJqhiptc+q8cf3IsvdxLIO8xYBUNXhqZBZMggseaZ87vrT+eX6Hsd1LR q8BENHrVotGaX9OvdwM//7nlgf3oSUUOCBXrY8qbrSsCwiKLhN5d/0nqk VwaWRfPd5IiDL/4PG32B5gc45Wc2iTb4WwDoXTzgGET1lcNZeBGggLxAT 72YBvySAXTFXimWBHVzN1m0eY/zocTxqgTMz+VVBcmYJbOkk7nbNpokbS Z7oJp3UFJ4EARUol4Jx12CIyoPinJbEDW6i4dp0pJR8lsg46Cus1MpjR6 Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10690"; a="349497201" X-IronPort-AV: E=Sophos;i="5.99,225,1677571200"; d="scan'208";a="349497201" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2023 02:05:41 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10690"; a="939691159" X-IronPort-AV: E=Sophos;i="5.99,225,1677571200"; d="scan'208";a="939691159" Received: from shwdeopenlab702.ccr.corp.intel.com ([10.239.55.92]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2023 02:05:39 -0700 From: "duntan" To: devel@edk2.groups.io Cc: Eric Dong , Ray Ni , Rahul Kumar , Gerd Hoffmann , Xiao X Chen Subject: [Patch V2 2/2] UefiCpuPkg: Update PT code to support enable collect performance Date: Tue, 25 Apr 2023 17:05:24 +0800 Message-Id: <20230425090524.3027-3-dun.tan@intel.com> X-Mailer: git-send-email 2.31.1.windows.1 In-Reply-To: <20230425090524.3027-1-dun.tan@intel.com> References: <20230425090524.3027-1-dun.tan@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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=4423 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 | 11 ++++++----- UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c | 34 ++++++++++++++++++++++++++++++---- UefiCpuPkg/UefiCpuPkg.dec | 8 ++++++++ 3 files changed, 44 insertions(+), 9 deletions(-) diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/CpuCommonFeaturesLib.inf 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 [Pcd] - gUefiCpuPkgTokenSpaceGuid.PcdCpuClockModulationDutyCycle ## SOMETIMES_CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdIsPowerOnReset ## SOMETIMES_CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceOutputScheme ## SOMETIMES_CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceMemSize ## SOMETIMES_CONSUMES - gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceBspOnly ## SOMETIMES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuClockModulationDutyCycle ## SOMETIMES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdIsPowerOnReset ## SOMETIMES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceOutputScheme ## SOMETIMES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceMemSize ## SOMETIMES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTraceBspOnly ## SOMETIMES_CONSUMES + gUefiCpuPkgTokenSpaceGuid.PcdCpuProcTracePerformanceCollecting ## SOMETIMES_CONSUMES diff --git a/UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c b/UefiCpuPkg/Library/CpuCommonFeaturesLib/ProcTrace.c index 367a9f9cfe..92926486df 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; typedef struct { @@ -47,6 +48,7 @@ typedef struct { UINTN *TopaMemArray; BOOLEAN EnableOnBspOnly; + BOOLEAN EnablePerformanceCollecting; PROC_TRACE_PROCESSOR_DATA *ProcessorData; } PROC_TRACE_DATA; @@ -76,10 +78,11 @@ ProcTraceGetConfigData ( ASSERT (ConfigData != NULL); ConfigData->ProcessorData = (PROC_TRACE_PROCESSOR_DATA *)((UINT8 *)ConfigData + sizeof (PROC_TRACE_DATA)); - ConfigData->NumberOfProcessors = (UINT32)NumberOfProcessors; - ConfigData->ProcTraceMemSize = PcdGet32 (PcdCpuProcTraceMemSize); - ConfigData->ProcTraceOutputScheme = PcdGet8 (PcdCpuProcTraceOutputScheme); - ConfigData->EnableOnBspOnly = PcdGetBool (PcdCpuProcTraceBspOnly); + ConfigData->NumberOfProcessors = (UINT32)NumberOfProcessors; + ConfigData->ProcTraceMemSize = PcdGet32 (PcdCpuProcTraceMemSize); + ConfigData->ProcTraceOutputScheme = PcdGet8 (PcdCpuProcTraceOutputScheme); + ConfigData->EnableOnBspOnly = PcdGetBool (PcdCpuProcTraceBspOnly); + ConfigData->EnablePerformanceCollecting = PcdGetBool (PcdCpuProcTracePerformanceCollecting); return ConfigData; } @@ -112,6 +115,7 @@ 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_EBX MainLeafEbx; // // Check if ProcTraceMemorySize option is enabled (0xFF means disable by user) @@ -141,6 +145,12 @@ ProcTraceSupport ( ProcTraceData->ProcessorData[ProcessorNumber].RtitCtrl.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_CTL); ProcTraceData->ProcessorData[ProcessorNumber].RtitOutputBase.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_OUTPUT_BASE); ProcTraceData->ProcessorData[ProcessorNumber].RtitOutputMaskPtrs.Uint64 = AsmReadMsr64 (MSR_IA32_RTIT_OUTPUT_MASK_PTRS); + + if (ProcTraceData->EnablePerformanceCollecting) { + AsmCpuidEx (CPUID_INTEL_PROCESSOR_TRACE, CPUID_INTEL_PROCESSOR_TRACE_MAIN_LEAF, NULL, &MainLeafEbx.Uint32, NULL, NULL); + ProcTraceData->ProcessorData[ProcessorNumber].CycPacketSupported = (BOOLEAN)(MainLeafEbx.Bits.ConfigurablePsb == 1); + } + return TRUE; } @@ -511,6 +521,22 @@ ProcTraceInitialize ( CtrlReg.Bits.User = 1; CtrlReg.Bits.BranchEn = 1; CtrlReg.Bits.TraceEn = 1; + + // + // Generate CYC/TSC timing packets to to collect performance data. + // + if (ProcTraceData->EnablePerformanceCollecting) { + if (ProcTraceData->ProcessorData[ProcessorNumber].CycPacketSupported) { + CtrlReg.Bits.CYCEn = 1; + CtrlReg.Bits.CYCThresh = 5; + } + + // + // Write to TSCEn is always supported + // + CtrlReg.Bits.TSCEn = 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 + ## This PCD indicates if enable performance collecting when CPU processor 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|BOOLEAN|0x60000020 + [UserExtensions.TianoCore."ExtraFiles"] UefiCpuPkgExtra.uni -- 2.39.1.windows.1