Fix the issues that StatusCode can't work when PcdStatusCodeUseMemory is set to TRUE.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10630 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
lgao4 2010-07-05 08:59:57 +00:00
parent b24633c74e
commit be63a20a02
2 changed files with 64 additions and 106 deletions

View File

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

View File

@ -79,9 +79,8 @@ InitializationDispatcherWorker (
EFI_STATUS Status; EFI_STATUS Status;
MEMORY_STATUSCODE_PACKET_HEADER *PacketHeader; MEMORY_STATUSCODE_PACKET_HEADER *PacketHeader;
MEMORY_STATUSCODE_RECORD *Record; MEMORY_STATUSCODE_RECORD *Record;
UINTN ExpectedPacketIndex;
UINTN Index; UINTN Index;
VOID *HobStart; UINTN MaxRecordNumber;
// //
// If enable UseSerial, then initialize serial port. // If enable UseSerial, then initialize serial port.
@ -107,14 +106,18 @@ InitializationDispatcherWorker (
// Journal GUID'ed HOBs to find all record entry, if found, // Journal GUID'ed HOBs to find all record entry, if found,
// then output record to support replay device. // then output record to support replay device.
// //
ExpectedPacketIndex = 0;
Hob.Raw = GetFirstGuidHob (&gMemoryStatusCodeRecordGuid); Hob.Raw = GetFirstGuidHob (&gMemoryStatusCodeRecordGuid);
HobStart = Hob.Raw; if (Hob.Raw != NULL) {
while (Hob.Raw != NULL) {
PacketHeader = (MEMORY_STATUSCODE_PACKET_HEADER *) GET_GUID_HOB_DATA (Hob.Guid); PacketHeader = (MEMORY_STATUSCODE_PACKET_HEADER *) GET_GUID_HOB_DATA (Hob.Guid);
if (PacketHeader->PacketIndex == ExpectedPacketIndex) {
Record = (MEMORY_STATUSCODE_RECORD *) (PacketHeader + 1); Record = (MEMORY_STATUSCODE_RECORD *) (PacketHeader + 1);
for (Index = 0; Index < PacketHeader->RecordIndex; Index++) { MaxRecordNumber = (UINTN) PacketHeader->RecordIndex;
if (PacketHeader->PacketIndex > 0) {
//
// Record has been wrapped around. So, record number has arrived at max number.
//
MaxRecordNumber = (UINTN) PacketHeader->MaxRecordsNumber;
}
for (Index = 0; Index < MaxRecordNumber; Index++) {
// //
// Dispatch records to devices based on feature flag. // Dispatch records to devices based on feature flag.
// //
@ -137,24 +140,6 @@ InitializationDispatcherWorker (
); );
} }
} }
ExpectedPacketIndex++;
//
// See whether there is gap of packet or not
//
if (HobStart != NULL) {
HobStart = NULL;
Hob.Raw = HobStart;
continue;
}
} else if (HobStart != NULL) {
//
// Cache the found packet for improve the performance
//
HobStart = Hob.Raw;
}
Hob.Raw = GetNextGuidHob (&gMemoryStatusCodeRecordGuid, Hob.Raw);
} }
} }
} }