/** @file SMM MP perf-logging implementation Copyright (c) 2023, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "PiSmmCpuDxeSmm.h" #define SMM_MP_PERF_PROCEDURE_NAME(procedure) # procedure GLOBAL_REMOVE_IF_UNREFERENCED CHAR8 *gSmmMpPerfProcedureName[] = { SMM_MP_PERF_PROCEDURE_LIST (SMM_MP_PERF_PROCEDURE_NAME) }; // // Each element holds the performance data for one processor. // GLOBAL_REMOVE_IF_UNREFERENCED SMM_PERF_AP_PROCEDURE_PERFORMANCE *mSmmMpProcedurePerformance = NULL; /** Initialize the perf-logging feature for APs. @param NumberofCpus Number of processors in the platform. **/ VOID InitializeMpPerf ( UINTN NumberofCpus ) { mSmmMpProcedurePerformance = AllocateZeroPool (NumberofCpus * sizeof (*mSmmMpProcedurePerformance)); ASSERT (mSmmMpProcedurePerformance != NULL); } /** Migrate MP performance data to standardized performance database. @param NumberofCpus Number of processors in the platform. @param BspIndex The index of the BSP. **/ VOID MigrateMpPerf ( UINTN NumberofCpus, UINTN BspIndex ) { UINTN CpuIndex; UINTN MpProcecureId; for (CpuIndex = 0; CpuIndex < NumberofCpus; CpuIndex++) { if ((CpuIndex != BspIndex) && !FeaturePcdGet (PcdSmmApPerfLogEnable)) { // // Skip migrating AP performance data if AP perf-logging is disabled. // continue; } for (MpProcecureId = 0; MpProcecureId < SMM_MP_PERF_PROCEDURE_ID (SmmMpProcedureMax); MpProcecureId++) { if (mSmmMpProcedurePerformance[CpuIndex].Begin[MpProcecureId] != 0) { PERF_START (NULL, gSmmMpPerfProcedureName[MpProcecureId], NULL, mSmmMpProcedurePerformance[CpuIndex].Begin[MpProcecureId]); PERF_END (NULL, gSmmMpPerfProcedureName[MpProcecureId], NULL, mSmmMpProcedurePerformance[CpuIndex].End[MpProcecureId]); } } } ZeroMem (mSmmMpProcedurePerformance, NumberofCpus * sizeof (*mSmmMpProcedurePerformance)); } /** Save the performance counter value before running the MP procedure. @param CpuIndex The index of the CPU. @param MpProcedureId The ID of the MP procedure. **/ VOID MpPerfBegin ( IN UINTN CpuIndex, IN UINTN MpProcedureId ) { mSmmMpProcedurePerformance[CpuIndex].Begin[MpProcedureId] = GetPerformanceCounter (); } /** Save the performance counter value after running the MP procedure. @param CpuIndex The index of the CPU. @param MpProcedureId The ID of the MP procedure. **/ VOID MpPerfEnd ( IN UINTN CpuIndex, IN UINTN MpProcedureId ) { mSmmMpProcedurePerformance[CpuIndex].End[MpProcedureId] = GetPerformanceCounter (); }