/** @file\r
Trace reporting for the Dp utility.\r
\r
- Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.\r
- (C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>\r
+ Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.\r
+ (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
#include <Library/MemoryAllocationLib.h>\r
#include <Library/DebugLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/TimerLib.h>\r
#include <Library/PeCoffGetEntryPointLib.h>\r
#include <Library/PerformanceLib.h>\r
#include <Library/PrintLib.h>\r
\r
@post The SummaryData and CumData structures contain statistics for the\r
current performance logs.\r
+\r
+ @param[in, out] CustomCumulativeData A pointer to the cumtom cumulative data.\r
+\r
**/\r
VOID\r
GatherStatistics(\r
- VOID\r
-)\r
+ IN OUT PERF_CUM_DATA *CustomCumulativeData OPTIONAL\r
+ )\r
{\r
MEASUREMENT_RECORD Measurement;\r
UINT64 Duration;\r
CumData[TIndex].MaxDur = Duration;\r
}\r
}\r
+\r
+ //\r
+ // Collect the data for custom cumulative data.\r
+ //\r
+ if ((CustomCumulativeData != NULL) && (AsciiStrCmp (Measurement.Token, CustomCumulativeData->Name) == 0)) {\r
+ CustomCumulativeData->Duration += Duration;\r
+ CustomCumulativeData->Count++;\r
+ if (Duration < CustomCumulativeData->MinDur) {\r
+ CustomCumulativeData->MinDur = Duration;\r
+ }\r
+ if (Duration > CustomCumulativeData->MaxDur) {\r
+ CustomCumulativeData->MaxDur = Duration;\r
+ }\r
+ }\r
}\r
}\r
\r
@param[in] Limit The number of records to print. Zero is ALL.\r
@param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display.\r
\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_ABORTED The user aborts the operation.\r
+ @return Others from a call to gBS->LocateHandleBuffer().\r
**/\r
-VOID\r
+EFI_STATUS\r
DumpAllTrace(\r
IN UINTN Limit,\r
IN BOOLEAN ExcludeFlag\r
UINTN TIndex;\r
\r
EFI_HANDLE *HandleBuffer;\r
- UINTN Size;\r
- EFI_HANDLE TempHandle;\r
+ UINTN HandleCount;\r
EFI_STATUS Status;\r
EFI_STRING StringPtrUnknown;\r
\r
\r
// Get Handle information\r
//\r
- Size = 0;\r
- HandleBuffer = &TempHandle;\r
- Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, &TempHandle);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- HandleBuffer = AllocatePool (Size);\r
- ASSERT (HandleBuffer != NULL);\r
- if (HandleBuffer == NULL) {\r
- return;\r
- }\r
- Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleBuffer);\r
- }\r
+ Status = gBS->LocateHandleBuffer (AllHandles, NULL, NULL, &HandleCount, &HandleBuffer);\r
if (EFI_ERROR (Status)) {\r
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_HANDLES_ERROR), gDpHiiHandle, Status);\r
}\r
++Count; // Count the number of records printed\r
\r
// If Handle is non-zero, see if we can determine a name for the driver\r
- AsciiStrToUnicodeStr (Measurement.Module, mGaugeString); // Use Module by default\r
- AsciiStrToUnicodeStr (Measurement.Token, mUnicodeToken);\r
+ AsciiStrToUnicodeStrS (Measurement.Module, mGaugeString, ARRAY_SIZE (mGaugeString)); // Use Module by default\r
+ AsciiStrToUnicodeStrS (Measurement.Token, mUnicodeToken, ARRAY_SIZE (mUnicodeToken));\r
if (Measurement.Handle != NULL) {\r
// See if the Handle is in the HandleBuffer\r
- for (TIndex = 0; TIndex < (Size / sizeof(HandleBuffer[0])); TIndex++) {\r
+ for (TIndex = 0; TIndex < HandleCount; TIndex++) {\r
if (Measurement.Handle == HandleBuffer[TIndex]) {\r
DpGetNameFromHandle (HandleBuffer[TIndex]);\r
break;\r
ElapsedTime\r
);\r
}\r
+ if (ShellGetExecutionBreakFlag ()) {\r
+ Status = EFI_ABORTED;\r
+ break;\r
+ }\r
}\r
}\r
- if (HandleBuffer != &TempHandle) {\r
+ if (HandleBuffer != NULL) {\r
FreePool (HandleBuffer);\r
}\r
SHELL_FREE_NON_NULL (IncFlag);\r
+\r
+ return Status;\r
}\r
\r
/** \r
\r
@param[in] Limit The number of records to print. Zero is ALL.\r
@param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display.\r
- \r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_ABORTED The user aborts the operation.\r
**/\r
-VOID\r
+EFI_STATUS\r
DumpRawTrace(\r
IN UINTN Limit,\r
IN BOOLEAN ExcludeFlag\r
\r
EFI_STRING StringPtr;\r
EFI_STRING StringPtrUnknown;\r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_SUCCESS;\r
\r
StringPtrUnknown = HiiGetString (gDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); \r
StringPtr = HiiGetString (gDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_RAWTRACE), NULL);\r
Measurement.Module\r
);\r
}\r
+ if (ShellGetExecutionBreakFlag ()) {\r
+ Status = EFI_ABORTED;\r
+ break;\r
+ }\r
}\r
+ return Status;\r
}\r
\r
/** \r
Gather and print Major Phase metrics.\r
\r
- @param[in] Ticker The timer value for the END of Shell phase\r
- \r
**/\r
VOID\r
ProcessPhases(\r
- IN UINT64 Ticker\r
+ VOID\r
)\r
{\r
MEASUREMENT_RECORD Measurement;\r
UINT64 PeiTime;\r
UINT64 DxeTime;\r
UINT64 BdsTime;\r
- UINT64 ShellTime;\r
UINT64 ElapsedTime;\r
UINT64 Duration;\r
UINT64 Total;\r
PeiTime = 0;\r
DxeTime = 0;\r
BdsTime = 0;\r
- ShellTime = 0; \r
//\r
// Get Execution Phase Statistics\r
//\r
&Measurement.EndTimeStamp,\r
&Measurement.Identifier)) != 0)\r
{\r
- if (AsciiStrnCmp (Measurement.Token, ALit_SHELL, PERF_TOKEN_LENGTH) == 0) {\r
- Measurement.EndTimeStamp = Ticker;\r
- }\r
if (Measurement.EndTimeStamp == 0) { // Skip "incomplete" records\r
continue;\r
}\r
DxeTime = Duration;\r
} else if (AsciiStrnCmp (Measurement.Token, ALit_BDS, PERF_TOKEN_LENGTH) == 0) {\r
BdsTime = Duration;\r
- } else if (AsciiStrnCmp (Measurement.Token, ALit_SHELL, PERF_TOKEN_LENGTH) == 0) {\r
- ShellTime = Duration;\r
}\r
}\r
\r
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PHASE_BDSTO), gDpHiiHandle, ALit_BdsTO, ElapsedTime);\r
}\r
\r
- // print SHELL phase duration time\r
- //\r
- if (ShellTime > 0) {\r
- ElapsedTime = DivU64x32 (\r
- ShellTime,\r
- (UINT32)TimerInfo.Frequency\r
- );\r
- Total += ElapsedTime;\r
- ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_PHASE_DURATION), gDpHiiHandle, ALit_SHELL, ElapsedTime);\r
- }\r
-\r
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_TOTAL_DURATION), gDpHiiHandle, Total);\r
}\r
\r
\r
@param[in] ExcludeFlag TRUE to exclude individual Cumulative items from display.\r
\r
- @return Status from a call to gBS->LocateHandle().\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_ABORTED The user aborts the operation.\r
+ @return Others from a call to gBS->LocateHandleBuffer().\r
**/\r
EFI_STATUS\r
ProcessHandles(\r
UINTN Index;\r
UINTN LogEntryKey;\r
UINTN Count;\r
- UINTN Size;\r
- EFI_HANDLE TempHandle;\r
+ UINTN HandleCount;\r
EFI_STATUS Status;\r
EFI_STRING StringPtrUnknown;\r
\r
FreePool (StringPtr);\r
FreePool (StringPtrUnknown);\r
\r
- Size = 0;\r
- HandleBuffer = &TempHandle;\r
- Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, &TempHandle);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- HandleBuffer = AllocatePool (Size);\r
- ASSERT (HandleBuffer != NULL);\r
- if (HandleBuffer == NULL) {\r
- return Status;\r
- }\r
- Status = gBS->LocateHandle (AllHandles, NULL, NULL, &Size, HandleBuffer);\r
- }\r
+ Status = gBS->LocateHandleBuffer (AllHandles, NULL, NULL, &HandleCount, &HandleBuffer);\r
if (EFI_ERROR (Status)) {\r
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_HANDLES_ERROR), gDpHiiHandle, Status);\r
}\r
continue;\r
}\r
mGaugeString[0] = 0; // Empty driver name by default\r
- AsciiStrToUnicodeStr (Measurement.Token, mUnicodeToken);\r
+ AsciiStrToUnicodeStrS (Measurement.Token, mUnicodeToken, ARRAY_SIZE (mUnicodeToken));\r
// See if the Handle is in the HandleBuffer\r
- for (Index = 0; Index < (Size / sizeof(HandleBuffer[0])); Index++) {\r
+ for (Index = 0; Index < HandleCount; Index++) {\r
if (Measurement.Handle == HandleBuffer[Index]) {\r
DpGetNameFromHandle (HandleBuffer[Index]); // Name is put into mGaugeString\r
break;\r
);\r
}\r
}\r
+ if (ShellGetExecutionBreakFlag ()) {\r
+ Status = EFI_ABORTED;\r
+ break;\r
+ }\r
}\r
}\r
- if (HandleBuffer != &TempHandle) {\r
+ if (HandleBuffer != NULL) {\r
FreePool (HandleBuffer);\r
}\r
return Status;\r
\r
Only prints complete PEIM records\r
\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_ABORTED The user aborts the operation.\r
**/\r
-VOID\r
+EFI_STATUS\r
ProcessPeims(\r
VOID\r
)\r
UINTN LogEntryKey;\r
UINTN TIndex;\r
EFI_STRING StringPtrUnknown;\r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_SUCCESS;\r
\r
StringPtrUnknown = HiiGetString (gDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); \r
StringPtr = HiiGetString (gDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_PEIMS), NULL);\r
);\r
}\r
}\r
+ if (ShellGetExecutionBreakFlag ()) {\r
+ Status = EFI_ABORTED;\r
+ break;\r
+ }\r
}\r
+ return Status;\r
}\r
\r
/** \r
Increment TIndex for every record, even skipped ones, so that we have an\r
indication of every measurement record taken.\r
\r
+ @retval EFI_SUCCESS The operation was successful.\r
+ @retval EFI_ABORTED The user aborts the operation.\r
**/\r
-VOID\r
+EFI_STATUS\r
ProcessGlobal(\r
VOID\r
)\r
UINTN LogEntryKey;\r
UINTN Index; // Index, or number, of the measurement record being processed\r
EFI_STRING StringPtrUnknown;\r
+ EFI_STATUS Status;\r
+\r
+ Status = EFI_SUCCESS;\r
\r
StringPtrUnknown = HiiGetString (gDpHiiHandle, STRING_TOKEN (STR_ALIT_UNKNOWN), NULL); \r
StringPtr = HiiGetString (gDpHiiHandle, STRING_TOKEN (STR_DP_SECTION_GENERAL), NULL);\r
&Measurement.EndTimeStamp,\r
&Measurement.Identifier)) != 0)\r
{\r
- AsciiStrToUnicodeStr (Measurement.Module, mGaugeString);\r
- AsciiStrToUnicodeStr (Measurement.Token, mUnicodeToken);\r
+ AsciiStrToUnicodeStrS (Measurement.Module, mGaugeString, ARRAY_SIZE (mGaugeString));\r
+ AsciiStrToUnicodeStrS (Measurement.Token, mUnicodeToken, ARRAY_SIZE (mUnicodeToken));\r
mGaugeString[25] = 0;\r
mUnicodeToken[31] = 0;\r
if ( ! ( IsPhase( &Measurement) ||\r
}\r
}\r
}\r
+ if (ShellGetExecutionBreakFlag ()) {\r
+ Status = EFI_ABORTED;\r
+ break;\r
+ }\r
Index++;\r
}\r
+ return Status;\r
}\r
\r
/** \r
For each record with a Token listed in the CumData array:<BR>\r
- Update the instance count and the total, minimum, and maximum durations.\r
Finally, print the gathered cumulative statistics.\r
- \r
+\r
+ @param[in] CustomCumulativeData A pointer to the cumtom cumulative data.\r
+\r
**/\r
VOID\r
ProcessCumulative(\r
- VOID\r
-)\r
+ IN PERF_CUM_DATA *CustomCumulativeData OPTIONAL\r
+ )\r
{\r
UINT64 AvgDur; // the computed average duration\r
UINT64 Dur;\r
);\r
}\r
}\r
+\r
+ //\r
+ // Print the custom cumulative data.\r
+ //\r
+ if (CustomCumulativeData != NULL) {\r
+ if (CustomCumulativeData->Count != 0) {\r
+ AvgDur = DivU64x32 (CustomCumulativeData->Duration, CustomCumulativeData->Count);\r
+ AvgDur = DurationInMicroSeconds (AvgDur);\r
+ Dur = DurationInMicroSeconds (CustomCumulativeData->Duration);\r
+ MaxDur = DurationInMicroSeconds (CustomCumulativeData->MaxDur);\r
+ MinDur = DurationInMicroSeconds (CustomCumulativeData->MinDur);\r
+ } else {\r
+ AvgDur = 0;\r
+ Dur = 0;\r
+ MaxDur = 0;\r
+ MinDur = 0;\r
+ }\r
+ ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DP_CUMULATIVE_STATS), gDpHiiHandle,\r
+ CustomCumulativeData->Name,\r
+ CustomCumulativeData->Count,\r
+ Dur,\r
+ AvgDur,\r
+ MinDur,\r
+ MaxDur\r
+ );\r
+ }\r
}\r