]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.c
Fix the issues that StatusCode can't work when PcdStatusCodeUseMemory is set to TRUE.
[mirror_edk2.git] / MdeModulePkg / Universal / StatusCodeHandler / RuntimeDxe / StatusCodeHandlerRuntimeDxe.c
index 81a9e3c4ca0df3be9a3ecf79d583f230b3294d2f..9149ca4efa44215ceb9219cd24effe467f8d085e 100644 (file)
@@ -79,9 +79,8 @@ InitializationDispatcherWorker (
   EFI_STATUS                        Status;\r
   MEMORY_STATUSCODE_PACKET_HEADER   *PacketHeader;\r
   MEMORY_STATUSCODE_RECORD          *Record;\r
-  UINTN                             ExpectedPacketIndex;\r
   UINTN                             Index;\r
-  VOID                              *HobStart;\r
+  UINTN                             MaxRecordNumber;\r
 \r
   //\r
   // If enable UseSerial, then initialize serial port.\r
@@ -107,54 +106,40 @@ InitializationDispatcherWorker (
     // Journal GUID'ed HOBs to find all record entry, if found, \r
     // then output record to support replay device.\r
     //\r
-    ExpectedPacketIndex = 0;\r
     Hob.Raw   = GetFirstGuidHob (&gMemoryStatusCodeRecordGuid);\r
-    HobStart  = Hob.Raw;\r
-    while (Hob.Raw != NULL) {\r
+    if (Hob.Raw != NULL) {\r
       PacketHeader = (MEMORY_STATUSCODE_PACKET_HEADER *) GET_GUID_HOB_DATA (Hob.Guid);\r
-      if (PacketHeader->PacketIndex == ExpectedPacketIndex) {\r
-        Record = (MEMORY_STATUSCODE_RECORD *) (PacketHeader + 1);\r
-        for (Index = 0; Index < PacketHeader->RecordIndex; Index++) {\r
-          //\r
-          // Dispatch records to devices based on feature flag.\r
-          //\r
-          if (FeaturePcdGet (PcdStatusCodeUseSerial)) {\r
-            SerialStatusCodeReportWorker (\r
-              Record[Index].CodeType,\r
-              Record[Index].Value,\r
-              Record[Index].Instance,\r
-              NULL,\r
-              NULL\r
-              );\r
-          }\r
-          if (FeaturePcdGet (PcdStatusCodeUseMemory)) {\r
-            RtMemoryStatusCodeReportWorker (\r
-              Record[Index].CodeType,\r
-              Record[Index].Value,\r
-              Record[Index].Instance,\r
-              NULL,\r
-              NULL\r
-              );\r
-          }\r
-        }\r
-        ExpectedPacketIndex++;\r
-  \r
+      Record = (MEMORY_STATUSCODE_RECORD *) (PacketHeader + 1);\r
+      MaxRecordNumber = (UINTN) PacketHeader->RecordIndex;\r
+      if (PacketHeader->PacketIndex > 0) {\r
         //\r
-        // See whether there is gap of packet or not\r
+        // Record has been wrapped around. So, record number has arrived at max number.\r
         //\r
-        if (HobStart != NULL) {\r
-          HobStart  = NULL;\r
-          Hob.Raw   = HobStart;\r
-          continue;\r
-        }\r
-      } else if (HobStart != NULL) {\r
+        MaxRecordNumber = (UINTN) PacketHeader->MaxRecordsNumber;\r
+      }\r
+      for (Index = 0; Index < MaxRecordNumber; Index++) {\r
         //\r
-        // Cache the found packet for improve the performance\r
+        // Dispatch records to devices based on feature flag.\r
         //\r
-        HobStart = Hob.Raw;\r
+        if (FeaturePcdGet (PcdStatusCodeUseSerial)) {\r
+          SerialStatusCodeReportWorker (\r
+            Record[Index].CodeType,\r
+            Record[Index].Value,\r
+            Record[Index].Instance,\r
+            NULL,\r
+            NULL\r
+            );\r
+        }\r
+        if (FeaturePcdGet (PcdStatusCodeUseMemory)) {\r
+          RtMemoryStatusCodeReportWorker (\r
+            Record[Index].CodeType,\r
+            Record[Index].Value,\r
+            Record[Index].Instance,\r
+            NULL,\r
+            NULL\r
+            );\r
+        }\r
       }\r
-  \r
-      Hob.Raw = GetNextGuidHob (&gMemoryStatusCodeRecordGuid, Hob.Raw);\r
     }\r
   }\r
 }\r