]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Library/GenericBdsLib/Performance.c
IntelFrameworkModulePkg GenericBdsLib: Do not assume perf entry count has no change
[mirror_edk2.git] / IntelFrameworkModulePkg / Library / GenericBdsLib / Performance.c
index 78039e79a578eca477f1ce58febff86b90f76959..e50345a597325f264774dd369de1ac04151f696d 100644 (file)
@@ -168,13 +168,8 @@ WriteBootToOsPerformanceData (
   UINT64                    StartValue;\r
   UINT64                    EndValue;\r
   BOOLEAN                   CountUp;\r
-  UINTN                     EntryIndex;\r
-  UINTN                     NumPerfEntries;\r
-  //\r
-  // List of flags indicating PerfEntry contains DXE handle\r
-  //\r
-  BOOLEAN                   *PerfEntriesAsDxeHandle;\r
   UINTN                     VarSize;\r
+  BOOLEAN                   Found;\r
 \r
   //\r
   // Record the performance data for End of BDS\r
@@ -203,6 +198,11 @@ WriteBootToOsPerformanceData (
     CountUp            = FALSE;\r
   }\r
 \r
+  //\r
+  // Reset the entry count\r
+  //\r
+  mPerfHeader.Count = 0;\r
+\r
   if (mAcpiLowMemoryBase == 0x0FFFFFFFF) {\r
     VarSize = sizeof (EFI_PHYSICAL_ADDRESS);\r
     Status = gRT->GetVariable (\r
@@ -238,73 +238,10 @@ WriteBootToOsPerformanceData (
   Ptr        = (UINT8 *) ((UINT32) mAcpiLowMemoryBase + sizeof (PERF_HEADER));\r
   LimitCount = (UINT32) (PERF_DATA_MAX_LENGTH - sizeof (PERF_HEADER)) / sizeof (PERF_DATA);\r
 \r
-  NumPerfEntries = 0;\r
-  LogEntryKey    = 0;\r
-  while ((LogEntryKey = GetPerformanceMeasurement (\r
-                          LogEntryKey,\r
-                          &Handle,\r
-                          &Token,\r
-                          &Module,\r
-                          &StartTicker,\r
-                          &EndTicker)) != 0) {\r
-    NumPerfEntries++;\r
-  }\r
-  PerfEntriesAsDxeHandle = AllocateZeroPool (NumPerfEntries * sizeof (BOOLEAN));\r
-  ASSERT (PerfEntriesAsDxeHandle != NULL);\r
-  \r
-  //\r
-  // Get DXE drivers performance\r
-  //\r
-  for (Index = 0; Index < NoHandles; Index++) {\r
-    Ticker = 0;\r
-    LogEntryKey = 0;\r
-    EntryIndex  = 0;\r
-    while ((LogEntryKey = GetPerformanceMeasurement (\r
-                            LogEntryKey,\r
-                            &Handle,\r
-                            &Token,\r
-                            &Module,\r
-                            &StartTicker,\r
-                            &EndTicker)) != 0) {\r
-      if (Handle == Handles[Index] && !PerfEntriesAsDxeHandle[EntryIndex]) {\r
-        PerfEntriesAsDxeHandle[EntryIndex] = TRUE;\r
-      }\r
-      EntryIndex++;\r
-      if ((Handle == Handles[Index]) && (EndTicker != 0)) {\r
-        if (StartTicker == 1) {\r
-          StartTicker = StartValue;\r
-        }\r
-        if (EndTicker == 1) {\r
-          EndTicker = StartValue;\r
-        }\r
-        Ticker += CountUp ? (EndTicker - StartTicker) : (StartTicker - EndTicker);\r
-      }\r
-    }\r
-\r
-    Duration = (UINT32) DivU64x32 (Ticker, (UINT32) Freq);\r
-\r
-    if (Duration > 0) {\r
-\r
-      GetNameFromHandle (Handles[Index], GaugeString);\r
-\r
-      AsciiStrCpyS (mPerfData.Token, PERF_TOKEN_SIZE, GaugeString);\r
-      mPerfData.Duration = Duration;\r
-\r
-      CopyMem (Ptr, &mPerfData, sizeof (PERF_DATA));\r
-      Ptr += sizeof (PERF_DATA);\r
-\r
-      mPerfHeader.Count++;\r
-      if (mPerfHeader.Count == LimitCount) {\r
-        goto Done;\r
-      }\r
-    }\r
-  }\r
-\r
   //\r
-  // Get inserted performance data\r
+  // Get performance data\r
   //\r
   LogEntryKey = 0;\r
-  EntryIndex  = 0;\r
   while ((LogEntryKey = GetPerformanceMeasurement (\r
                           LogEntryKey,\r
                           &Handle,\r
@@ -312,11 +249,7 @@ WriteBootToOsPerformanceData (
                           &Module,\r
                           &StartTicker,\r
                           &EndTicker)) != 0) {\r
-    if (!PerfEntriesAsDxeHandle[EntryIndex] && EndTicker != 0) {\r
-\r
-      ZeroMem (&mPerfData, sizeof (PERF_DATA));\r
-\r
-      AsciiStrnCpyS (mPerfData.Token, PERF_TOKEN_SIZE, Token, PERF_TOKEN_LENGTH);\r
+    if (EndTicker != 0) {\r
       if (StartTicker == 1) {\r
         StartTicker = StartValue;\r
       }\r
@@ -325,7 +258,31 @@ WriteBootToOsPerformanceData (
       }\r
       Ticker = CountUp ? (EndTicker - StartTicker) : (StartTicker - EndTicker);\r
 \r
-      mPerfData.Duration = (UINT32) DivU64x32 (Ticker, (UINT32) Freq);\r
+      Duration = (UINT32) DivU64x32 (Ticker, (UINT32) Freq);\r
+      if (Duration == 0) {\r
+        continue;\r
+      }\r
+\r
+      ZeroMem (&mPerfData, sizeof (PERF_DATA));\r
+\r
+      mPerfData.Duration = Duration;\r
+\r
+      //\r
+      // See if the Handle is in the handle buffer\r
+      //\r
+      Found = FALSE;\r
+      for (Index = 0; Index < NoHandles; Index++) {\r
+        if (Handle == Handles[Index]) {\r
+          GetNameFromHandle (Handles[Index], GaugeString);\r
+          AsciiStrCpyS (mPerfData.Token, PERF_TOKEN_SIZE, GaugeString);\r
+          Found = TRUE;\r
+          break;\r
+        }\r
+      }\r
+\r
+      if (!Found) {\r
+        AsciiStrnCpyS (mPerfData.Token, PERF_TOKEN_SIZE, Token, PERF_TOKEN_LENGTH);\r
+      }\r
 \r
       CopyMem (Ptr, &mPerfData, sizeof (PERF_DATA));\r
       Ptr += sizeof (PERF_DATA);\r
@@ -335,13 +292,11 @@ WriteBootToOsPerformanceData (
         goto Done;\r
       }\r
     }\r
-    EntryIndex++;\r
   }\r
 \r
 Done:\r
 \r
   FreePool (Handles);\r
-  FreePool (PerfEntriesAsDxeHandle);\r
 \r
   mPerfHeader.Signiture = PERFORMANCE_SIGNATURE;\r
 \r