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