]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ShellPkg/dp: Update dp tool to parse new Perf record
authorBi, Dandan <dandan.bi@intel.com>
Fri, 22 Jun 2018 08:56:20 +0000 (16:56 +0800)
committerLiming Gao <liming.gao@intel.com>
Tue, 26 Jun 2018 07:36:55 +0000 (15:36 +0800)
Since performance library instances have been updated
to create new FPDT records for new Perf macros.
So enhance dp tool to parse the new FPDT records.
Enhancement mainly includes:
1. parse the single records for PERF_EVENT macro
2. Parse the new added FPDT_DUAL_GUID_STRING_EVENT_RECORD

Cc: Liming Gao <liming.gao@intel.com>
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Dandan Bi <dandan.bi@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
ShellPkg/DynamicCommand/DpDynamicCommand/Dp.c
ShellPkg/DynamicCommand/DpDynamicCommand/Dp.h
ShellPkg/DynamicCommand/DpDynamicCommand/DpInternal.h
ShellPkg/DynamicCommand/DpDynamicCommand/DpTrace.c
ShellPkg/DynamicCommand/DpDynamicCommand/DpUtilities.c

index 38766613175510209794ecae049cb490316c30a0..925341303a4280f9804caf51554452d2a37315cf 100644 (file)
@@ -430,11 +430,25 @@ GetMeasurementInfo (
       ASSERT(FALSE);\r
     }\r
 \r
-    if (AsciiStrCmp (Measurement->Token, ALit_PEIM) == 0) {\r
-      Measurement->Handle         = &(((FPDT_GUID_EVENT_RECORD *)RecordHeader)->Guid);\r
+    if (Measurement->Token != NULL && AsciiStrCmp (Measurement->Token, ALit_PEIM) == 0) {\r
+      Measurement->Handle         = &(((FPDT_DYNAMIC_STRING_EVENT_RECORD *)RecordHeader)->Guid);\r
     } else {\r
       GetHandleFormModuleGuid(ModuleGuid, &StartHandle);\r
-      Measurement->Handle         = StartHandle;\r
+      Measurement->Handle = StartHandle;\r
+      //\r
+      // When no perf entry to record the PEI and DXE phase,\r
+      // For start image, we need detect the PEIM and non PEIM here.\r
+      //\r
+      if (Measurement->Token == NULL) {\r
+        if (StartHandle == NULL && !IsZeroGuid (ModuleGuid)) {\r
+          Measurement->Token      = ALit_PEIM;\r
+          Measurement->Module     = ALit_PEIM;\r
+          Measurement->Handle     = ModuleGuid;\r
+        } else {\r
+          Measurement->Token      = ALit_START_IMAGE;\r
+          Measurement->Module     = ALit_START_IMAGE;\r
+        }\r
+      }\r
     }\r
     break;\r
 \r
@@ -483,11 +497,23 @@ GetMeasurementInfo (
 \r
     Measurement->Module           = ((FPDT_DYNAMIC_STRING_EVENT_RECORD *)RecordHeader)->String;\r
 \r
-    if (AsciiStrCmp (Measurement->Token, ALit_PEIM) == 0) {\r
+    if (Measurement->Token != NULL && AsciiStrCmp (Measurement->Token, ALit_PEIM) == 0) {\r
       Measurement->Handle         = &(((FPDT_DYNAMIC_STRING_EVENT_RECORD *)RecordHeader)->Guid);\r
     } else {\r
       GetHandleFormModuleGuid(ModuleGuid, &StartHandle);\r
       Measurement->Handle = StartHandle;\r
+      //\r
+      // When no perf entry to record the PEI and DXE phase,\r
+      // For start image, we need detect the PEIM and non PEIM here.\r
+      //\r
+      if (Measurement->Token == NULL  && (Measurement->Identifier == MODULE_START_ID || Measurement->Identifier == MODULE_END_ID)) {\r
+        if (StartHandle == NULL && !IsZeroGuid (ModuleGuid)) {\r
+          Measurement->Token      = ALit_PEIM;\r
+          Measurement->Handle     = ModuleGuid;\r
+        } else {\r
+          Measurement->Token      = ALit_START_IMAGE;\r
+        }\r
+      }\r
     }\r
     break;\r
 \r
@@ -553,6 +579,20 @@ GetMeasurementInfo (
     Measurement->Handle = StartHandle;\r
     break;\r
 \r
+  case FPDT_DUAL_GUID_STRING_EVENT_TYPE:\r
+    ModuleGuid                    = &(((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->Guid1);\r
+    Measurement->Identifier       = ((UINT32)((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->ProgressID);\r
+    if (IsStart) {\r
+      Measurement->StartTimeStamp = ((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->Timestamp;\r
+    } else {\r
+      Measurement->EndTimeStamp   = ((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->Timestamp;\r
+    }\r
+    Measurement->Token            = ((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->String;\r
+    Measurement->Module           = ((FPDT_DUAL_GUID_STRING_EVENT_RECORD *)RecordHeader)->String;\r
+    GetHandleFormModuleGuid(ModuleGuid, &StartHandle);\r
+    Measurement->Handle = StartHandle;\r
+    break;\r
+\r
   default:\r
     break;\r
   }\r
@@ -580,6 +620,14 @@ SearchMeasurement (
         mMeasurementList[Index].EndTimeStamp = EndMeasureMent->EndTimeStamp;\r
         break;\r
       }\r
+    } else if (EndMeasureMent->Identifier == PERF_CROSSMODULE_END_ID) {\r
+      if (mMeasurementList[Index].EndTimeStamp == 0 &&\r
+         (AsciiStrCmp (mMeasurementList[Index].Token, EndMeasureMent->Token) == 0) &&\r
+         (AsciiStrCmp (mMeasurementList[Index].Module, EndMeasureMent->Module) == 0) &&\r
+         mMeasurementList[Index].Identifier == PERF_CROSSMODULE_START_ID) {\r
+        mMeasurementList[Index].EndTimeStamp = EndMeasureMent->EndTimeStamp;\r
+        break;\r
+      }\r
     } else {\r
       if (mMeasurementList[Index].EndTimeStamp == 0 && mMeasurementList[Index].Handle == EndMeasureMent->Handle &&\r
          (AsciiStrCmp (mMeasurementList[Index].Token, EndMeasureMent->Token) == 0) &&\r
@@ -620,25 +668,32 @@ BuildMeasurementList (
     StartProgressId   = ((FPDT_GUID_EVENT_RECORD *)StartRecordEvent)->ProgressID;\r
 \r
     //\r
+    // If the record with ProgressId 0, the record doesn't appear in pairs. The timestamp in the record is the EndTimeStamp, its StartTimeStamp is 0.\r
     // If the record is the start record, fill the info to the measurement in the mMeasurementList.\r
     // If the record is the end record, find the related start measurement in the mMeasurementList and fill the EndTimeStamp.\r
     //\r
-    if (((StartProgressId >= PERF_EVENTSIGNAL_START_ID && ((StartProgressId & 0x000F) == 0)) ||\r
+    if (StartProgressId == 0) {\r
+      GetMeasurementInfo (RecordHeader, FALSE, &(mMeasurementList[mMeasurementNum]));\r
+      mMeasurementNum ++;\r
+    } else if (((StartProgressId >= PERF_EVENTSIGNAL_START_ID && ((StartProgressId & 0x000F) == 0)) ||\r
         (StartProgressId < PERF_EVENTSIGNAL_START_ID && ((StartProgressId & 0x0001) != 0)))) {\r
       //\r
       // Since PEIM and StartImage has same Type and ID when PCD PcdEdkiiFpdtStringRecordEnableOnly = FALSE\r
       // So we need to identify these two kinds of record through different phase.\r
       //\r
-      if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordEvent)->String, ALit_PEI) == 0) {\r
-        mPeiPhase = TRUE;\r
-      } else if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordEvent)->String, ALit_DXE) == 0) {\r
-        mDxePhase = TRUE;\r
-        mPeiPhase = FALSE;\r
+      if(StartProgressId == PERF_CROSSMODULE_START_ID ){\r
+        if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordEvent)->String, ALit_PEI) == 0) {\r
+          mPeiPhase = TRUE;\r
+        } else if (AsciiStrCmp (((FPDT_DYNAMIC_STRING_EVENT_RECORD *)StartRecordEvent)->String, ALit_DXE) == 0) {\r
+          mDxePhase = TRUE;\r
+          mPeiPhase = FALSE;\r
+        }\r
       }\r
       // Get measurement info form the start record to the mMeasurementList.\r
       GetMeasurementInfo (RecordHeader, TRUE, &(mMeasurementList[mMeasurementNum]));\r
       mMeasurementNum ++;\r
     } else {\r
+      ZeroMem(&MeasureMent, sizeof(MEASUREMENT_RECORD));\r
       GetMeasurementInfo (RecordHeader, FALSE, &MeasureMent);\r
       SearchMeasurement (&MeasureMent);\r
     }\r
index aae021334d67c6808044c430df2b4ae6f67bb19b..96bc89db8dc80790dea5b8596844e69ac89c4b85 100644 (file)
@@ -41,6 +41,7 @@
 #include <Library/HiiLib.h>\r
 #include <Library/FileHandleLib.h>\r
 #include <Library/UefiHiiServicesLib.h>\r
+#include <Library/Performancelib.h>\r
 \r
 extern EFI_HANDLE mDpHiiHandle;\r
 \r
index 8dd3076cc719e547a277974c6a02854cbb6443fc..d8bc7453d2d6a74ca09cac84bea5626a262f169e 100644 (file)
@@ -85,6 +85,20 @@ IsPhase(
   IN MEASUREMENT_RECORD *Measurement\r
   );\r
 \r
+/**\r
+  Determine whether the Measurement record is for core code.\r
+\r
+  @param[in] Measurement  A pointer to the Measurement record to test.\r
+\r
+  @retval     TRUE        The measurement record is used for core.\r
+  @retval     FALSE       The measurement record is NOT used for core.\r
+\r
+**/\r
+BOOLEAN\r
+IsCorePerf(\r
+  IN MEASUREMENT_RECORD        *Measurement\r
+  );\r
+\r
 /** \r
   Get the file name portion of the Pdb File Name.\r
   \r
index 7f7d296946fe7ca01fd26846671ae182d15011c1..675cbc3fd14ae19f1f650d5ffe6f9fbf6bcc16e4 100644 (file)
@@ -604,7 +604,7 @@ ProcessHandles(
       ElapsedTime = DurationInMicroSeconds ( Duration );\r
       if ((ElapsedTime < mInterestThreshold)                 ||\r
           (Measurement.EndTimeStamp == 0)                    ||\r
-          (Measurement.Handle == NULL)                       ||\r
+          (!IsCorePerf (&Measurement))                       ||\r
           ((ExcludeFlag) && (GetCumulativeItem(&Measurement) >= 0))\r
          ) { // Ignore "uninteresting" or excluded records\r
         continue;\r
@@ -794,7 +794,7 @@ ProcessGlobal(
     mGaugeString[25] = 0;\r
     mUnicodeToken[31] = 0;\r
     if ( ! ( IsPhase( &Measurement)  ||\r
-        (Measurement.Handle != NULL)      ||\r
+        IsCorePerf (&Measurement)      ||\r
         (Measurement.EndTimeStamp == 0)\r
         ))\r
     {\r
index 39f71a044c34bf3f59592cf9a31f429299311c32..5c6ab209d5abff59b4e1cd1443097c3935ab4386 100644 (file)
@@ -108,6 +108,37 @@ IsPhase(
   return RetVal;\r
 }\r
 \r
+/**\r
+  Determine whether the Measurement record is for core code.\r
+\r
+  @param[in] Measurement  A pointer to the Measurement record to test.\r
+\r
+  @retval     TRUE        The measurement record is used for core.\r
+  @retval     FALSE       The measurement record is NOT used for core.\r
+\r
+**/\r
+BOOLEAN\r
+IsCorePerf(\r
+  IN MEASUREMENT_RECORD        *Measurement\r
+  )\r
+{\r
+  BOOLEAN   RetVal;\r
+\r
+  RetVal = (BOOLEAN)(\r
+            ((Measurement->Identifier == MODULE_START_ID)            ||\r
+             (Measurement->Identifier == MODULE_END_ID)              ||\r
+             (Measurement->Identifier == MODULE_LOADIMAGE_START_ID)  ||\r
+             (Measurement->Identifier == MODULE_LOADIMAGE_END_ID)    ||\r
+             (Measurement->Identifier == MODULE_DB_START_ID)         ||\r
+             (Measurement->Identifier == MODULE_DB_END_ID)           ||\r
+             (Measurement->Identifier == MODULE_DB_SUPPORT_START_ID) ||\r
+             (Measurement->Identifier == MODULE_DB_SUPPORT_END_ID)   ||\r
+             (Measurement->Identifier == MODULE_DB_STOP_START_ID)    ||\r
+             (Measurement->Identifier == MODULE_DB_STOP_START_ID))\r
+            );\r
+  return RetVal;\r
+}\r
+\r
 /** \r
   Get the file name portion of the Pdb File Name.\r
   \r