#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
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
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
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
// 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