]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Fix the issues that StatusCode can't work when PcdStatusCodeUseMemory is set to TRUE.
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 5 Jul 2010 08:59:57 +0000 (08:59 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 5 Jul 2010 08:59:57 +0000 (08:59 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10630 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/StatusCodeHandler/Pei/MemoryStausCodeWorker.c
MdeModulePkg/Universal/StatusCodeHandler/RuntimeDxe/StatusCodeHandlerRuntimeDxe.c

index 7ae314d7ec332d7a634181a8d5a8978c2da54526..bdf1d2700e10106238ea6139e073230a878514eb 100644 (file)
 #include "StatusCodeHandlerPei.h"\r
 \r
 /**\r
-  Worker function to create one memory status code GUID'ed HOB,\r
-  using PacketIndex to identify the packet.\r
-\r
-  @param   PacketIndex    Index of records packet.\r
+  Create the first memory status code GUID'ed HOB as initialization for memory status code worker.\r
 \r
-  @return  Pointer to the memory status code packet.\r
+  @retval EFI_SUCCESS  The GUID'ed HOB is created successfully.\r
 \r
 **/\r
-MEMORY_STATUSCODE_PACKET_HEADER *\r
-CreateMemoryStatusCodePacket (\r
-  UINT16 PacketIndex\r
+EFI_STATUS\r
+MemoryStatusCodeInitializeWorker (\r
+  VOID\r
   )\r
 {\r
+  //\r
+  // Create memory status code GUID'ed HOB.\r
+  //\r
   MEMORY_STATUSCODE_PACKET_HEADER *PacketHeader;\r
 \r
   //\r
@@ -40,28 +40,9 @@ CreateMemoryStatusCodePacket (
   ASSERT (PacketHeader != NULL);\r
 \r
   PacketHeader->MaxRecordsNumber = (PcdGet16 (PcdStatusCodeMemorySize) * 1024) / sizeof (MEMORY_STATUSCODE_RECORD);\r
-  PacketHeader->PacketIndex      = PacketIndex;\r
+  PacketHeader->PacketIndex      = 0;\r
   PacketHeader->RecordIndex      = 0;\r
 \r
-  return PacketHeader;\r
-}\r
-\r
-/**\r
-  Create the first memory status code GUID'ed HOB as initialization for memory status code worker.\r
-\r
-  @retval EFI_SUCCESS  The GUID'ed HOB is created successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-MemoryStatusCodeInitializeWorker (\r
-  VOID\r
-  )\r
-{\r
-  //\r
-  // Create first memory status code GUID'ed HOB.\r
-  //\r
-  CreateMemoryStatusCodePacket (0);\r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -107,48 +88,40 @@ MemoryStatusCodeReportWorker (
   EFI_PEI_HOB_POINTERS              Hob;\r
   MEMORY_STATUSCODE_PACKET_HEADER   *PacketHeader;\r
   MEMORY_STATUSCODE_RECORD          *Record;\r
-  UINT16                            PacketIndex;\r
-\r
-  Record      = NULL;\r
-  PacketIndex = 0;\r
 \r
   //\r
-  // Journal GUID'ed HOBs to find empty record entry. if found, then save status code in it.\r
-  // otherwise, create a new GUID'ed HOB.\r
+  // Find GUID'ed HOBs to locate current record buffer. \r
   //\r
   Hob.Raw = GetFirstGuidHob (&gMemoryStatusCodeRecordGuid);\r
-  while (Hob.Raw != NULL) {\r
-    PacketHeader = (MEMORY_STATUSCODE_PACKET_HEADER *) GET_GUID_HOB_DATA (Hob.Guid);\r
+  ASSERT (Hob.Raw != NULL);\r
 \r
-    //\r
-    // Check whether pccket is full or not.\r
-    //\r
-    if (PacketHeader->RecordIndex < PacketHeader->MaxRecordsNumber) {\r
-      Record = (MEMORY_STATUSCODE_RECORD *) (PacketHeader + 1);\r
-      Record = &Record[PacketHeader->RecordIndex++];\r
-      break;\r
-    }\r
-    //\r
-    // Cache number of found packet in PacketIndex.\r
-    //\r
-    PacketIndex++;\r
+  PacketHeader = (MEMORY_STATUSCODE_PACKET_HEADER *) GET_GUID_HOB_DATA (Hob.Guid);\r
+  Record = (MEMORY_STATUSCODE_RECORD *) (PacketHeader + 1);\r
+  Record = &Record[PacketHeader->RecordIndex++];\r
 \r
-    Hob.Raw = GetNextGuidHob (&gMemoryStatusCodeRecordGuid, Hob.Raw);\r
-  }\r
+  //\r
+  // Save status code.\r
+  //\r
+  Record->CodeType = CodeType;\r
+  Record->Instance = Instance;\r
+  Record->Value    = Value;\r
 \r
-  if (Record == NULL) {\r
+  //\r
+  // If record index equals to max record number, then wrap around record index to zero.\r
+  //\r
+  // The reader of status code should compare the number of records with max records number,\r
+  // If it is equal to or larger than the max number, then the wrap-around had happened,\r
+  // so the first record is pointed by record index.\r
+  // If it is less then max number, index of the first record is zero.\r
+  //\r
+  if (PacketHeader->RecordIndex == PacketHeader->MaxRecordsNumber) {\r
     //\r
-    // No available entry found, so create new packet.\r
+    // Wrap around record index.\r
     //\r
-    PacketHeader = CreateMemoryStatusCodePacket (PacketIndex);\r
-\r
-    Record = (MEMORY_STATUSCODE_RECORD *) (PacketHeader + 1);\r
-    Record = &Record[PacketHeader->RecordIndex++];\r
+    PacketHeader->RecordIndex = 0;\r
+    PacketHeader->PacketIndex ++;\r
   }\r
 \r
-  Record->CodeType = CodeType;\r
-  Record->Instance = Instance;\r
-  Record->Value    = Value;\r
-\r
   return EFI_SUCCESS;\r
 }\r
+\r
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