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 3876661..9253413 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 aae0213..96bc89d 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 8dd3076..d8bc745 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 7f7d296..675cbc3 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 39f71a0..5c6ab20 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