Files
slimbootloader/BootloaderCommonPkg/Library/ShellLib/CmdPerf.c
T

204 lines
5.0 KiB
C
Raw Normal View History

2021-11-10 11:36:23 +00:00
/** @file
Shell command `perf` to display system performance data.
2023-07-19 14:03:41 -07:00
Copyright (c) 2017 - 2023, Intel Corporation. All rights reserved.<BR>
2021-11-10 11:36:23 +00:00
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Library/ShellLib.h>
#include <Library/DebugLib.h>
#include <Guid/CsmePerformanceInfoGuid.h>
2021-11-10 11:36:23 +00:00
#include <Guid/PerformanceInfoGuid.h>
#include <Library/HobLib.h>
#include <Library/BootloaderCommonLib.h>
#include <Library/LoaderPerformanceLib.h>
2024-10-09 19:34:16 -07:00
#include <Library/TimeStampLib.h>
#include <Library/IppCryptoPerfLib.h>
2021-11-10 11:36:23 +00:00
/**
Display performance data.
@param[in] Shell shell instance
@param[in] Argc number of command line arguments
@param[in] Argv command line arguments
@retval EFI_SUCCESS
**/
STATIC
EFI_STATUS
EFIAPI
ShellCommandPerfFunc (
IN SHELL *Shell,
IN UINTN Argc,
IN CHAR16 *Argv[]
);
CONST SHELL_COMMAND ShellCommandPerf = {
L"perf",
L"Display performance data",
&ShellCommandPerfFunc
};
/**
Print loader PERFORMANCE_INFO data.
2024-10-09 19:34:16 -07:00
@param[in] PerfData pointer to performance data
@param[in] InMicroSecond Show host performance time in MicroSecond when it is TRUE
2021-11-10 11:36:23 +00:00
**/
VOID
EFIAPI
PrintPerformanceInfo (
2024-10-09 19:34:16 -07:00
IN PERFORMANCE_INFO *PerfData,
IN BOOLEAN InMicroSecond
2021-11-10 11:36:23 +00:00
)
{
2024-10-09 19:34:16 -07:00
UINT32 Idx;
UINT64 Time;
UINT64 PrevTime;
UINT16 Id;
2021-11-10 11:36:23 +00:00
UINT64 Tsc;
PrevTime = 0;
2024-10-09 19:34:16 -07:00
ShellPrint (L" Id | Time (ms) | Delta (ms) | Description\n");
ShellPrint (L"------+---------------+-------------+---------------------------\n");
2021-11-10 11:36:23 +00:00
for (Idx = 0; Idx < PerfData->Count; Idx++) {
Tsc = PerfData->TimeStamp[Idx] & 0x0000FFFFFFFFFFFFULL;
Id = (RShiftU64 (PerfData->TimeStamp[Idx], 48)) & 0xFFFF;
2024-10-09 19:34:16 -07:00
if (InMicroSecond) {
Time = TimeStampTickToMicroSecond (Tsc);
} else {
Time = DivU64x32 (Tsc, PerfData->Frequency);
}
ShellPrint (L" %4x | %10d ms | %8d ms | %a\n", Id, (UINT32)(UINTN)Time, (UINT32)(UINTN)(Time - PrevTime), PerfIdToStr (Id, NULL));
2021-11-10 11:36:23 +00:00
PrevTime = Time;
}
2024-10-09 19:34:16 -07:00
ShellPrint (L"------+---------------+-------------+---------------------------\n");
2021-11-10 11:36:23 +00:00
}
/**
Print CSME PERFORMANCE_INFO data.
@param[in] PerfData pointer to performance data
**/
STATIC
VOID
EFIAPI
PrintCsmePerformanceInfo (
VOID
)
{
UINT8 Index;
UINT32 PrevTS;
EFI_HOB_GUID_TYPE *GuidHob;
CSME_PERFORMANCE_INFO *CsmePerformanceInfo;
GuidHob = GetNextGuidHob (&gCsmePerformanceInfoGuid, GetHobList());
if (GuidHob == NULL) {
return;
}
CsmePerformanceInfo = (CSME_PERFORMANCE_INFO *)GET_GUID_HOB_DATA (GuidHob);
ShellPrint (L"CSME Performance Info\n");
ShellPrint (L"=======================\n\n");
ShellPrint (L" Id | Time (ms) | Delta (ms) | Description\n");
ShellPrint (L"------+------------+------------+---------------------------\n");
//
// Initialize previous time stamp to CSME ROM Start execution TS
//
PrevTS = CsmePerformanceInfo->BootPerformanceData[1];
for (Index = 1; Index < CsmePerformanceInfo->BootDataLength; Index++) {
//
// Ignore timestamps with value as 0
//
if (CsmePerformanceInfo->BootPerformanceData[Index] == 0) {
continue;
}
ShellPrint (L" %4x | %7d ms | %7d ms | %a\n",
Index,\
CsmePerformanceInfo->BootPerformanceData[Index],\
CsmePerformanceInfo->BootPerformanceData[Index] - PrevTS,\
PerfIdToStr (Index, CsmePerfIdToStr));
PrevTS = CsmePerformanceInfo->BootPerformanceData[Index];
}
}
2021-11-10 11:36:23 +00:00
/**
Display performance data.
@param[in] Shell shell instance
@param[in] Argc number of command line arguments
@param[in] Argv command line arguments
@retval EFI_SUCCESS
**/
STATIC
EFI_STATUS
EFIAPI
ShellCommandPerfFunc (
IN SHELL *Shell,
IN UINTN Argc,
IN CHAR16 *Argv[]
)
{
VOID *GuidHob;
PERFORMANCE_INFO *PerfData;
2024-10-09 19:34:16 -07:00
BOOLEAN InMicroSecond;
InMicroSecond = FALSE;
if (Argc == 2) {
if (StrCmp (Argv[1], L"-d") == 0) {
InMicroSecond = TRUE;
}
#if FixedPcdGetBool (PcdEnableCryptoPerfTest)
else if (StrCmp (Argv[1], L"-c") == 0) {
CryptoPerfTestPrintResult();
return EFI_SUCCESS;
}
#endif
else {
2024-10-09 19:34:16 -07:00
goto usage;
}
} else if (Argc > 2) {
goto usage;
}
2021-11-10 11:36:23 +00:00
GuidHob = GetNextGuidHob (&gLoaderPerformanceInfoGuid, GetHobList());
if (GuidHob == NULL) {
ASSERT (FALSE);
return RETURN_NOT_FOUND;
}
PerfData = (PERFORMANCE_INFO *)GET_GUID_HOB_DATA (GuidHob);
ShellPrint (L"Loader Performance Info\n");
ShellPrint (L"=======================\n\n");
2024-10-09 19:34:16 -07:00
PrintPerformanceInfo (PerfData, InMicroSecond);
2021-11-10 11:36:23 +00:00
// Print CSME boot performance
if ((PcdGet32 (PcdBootPerformanceMask) & BIT2) != 0) {
PrintCsmePerformanceInfo ();
}
2021-11-10 11:36:23 +00:00
return EFI_SUCCESS;
2024-10-09 19:34:16 -07:00
usage:
ShellPrint (L"Usage: %s [-d]\n", Argv[0]);
ShellPrint (L"\n"
L"Flags:\n"
L" -d Show host performance time in MicroSecond, by default in MilliSecond\n"
#if FixedPcdGetBool (PcdEnableCryptoPerfTest)
L" -c Show host crypto performance time in MicroSecond\n"
#endif
);
2024-10-09 19:34:16 -07:00
return EFI_ABORTED;
2021-11-10 11:36:23 +00:00
}