--- /dev/null
+/*++\r
+\r
+Copyright (c) 2004 - 2006, Intel Corporation \r
+All rights reserved. This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php \r
+ \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+\r
+Module Name:\r
+\r
+ hob.c\r
+\r
+Abstract:\r
+\r
+ Support for hob operation\r
+\r
+--*/\r
+\r
+#include "Tiano.h"\r
+#include "EfiDriverLib.h"\r
+#include "PeiHob.h"\r
+#include EFI_GUID_DEFINITION (IoBaseHob)\r
+#include EFI_GUID_DEFINITION (MemoryAllocationHob)\r
+\r
+VOID *\r
+GetHob (\r
+ IN UINT16 Type,\r
+ IN VOID *HobStart\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ This function returns the first instance of a HOB type in a HOB list.\r
+ \r
+Arguments:\r
+\r
+ Type The HOB type to return.\r
+ HobStart The first HOB in the HOB list.\r
+ \r
+Returns:\r
+\r
+ HobStart There were no HOBs found with the requested type.\r
+ else Returns the first HOB with the matching type.\r
+\r
+--*/\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+\r
+ Hob.Raw = HobStart;\r
+ //\r
+ // Return input if not found\r
+ //\r
+ if (HobStart == NULL) {\r
+ return HobStart;\r
+ }\r
+\r
+ //\r
+ // Parse the HOB list, stop if end of list or matching type found.\r
+ //\r
+ while (!END_OF_HOB_LIST (Hob)) {\r
+\r
+ if (Hob.Header->HobType == Type) {\r
+ break;\r
+ }\r
+\r
+ Hob.Raw = GET_NEXT_HOB (Hob);\r
+ }\r
+ \r
+ //\r
+ // Return input if not found\r
+ //\r
+ if (END_OF_HOB_LIST (Hob)) {\r
+ return HobStart;\r
+ }\r
+\r
+ return (VOID *) (Hob.Raw);\r
+}\r
+\r
+UINTN\r
+GetHobListSize (\r
+ IN VOID *HobStart\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Get size of hob list.\r
+\r
+Arguments:\r
+\r
+ HobStart - Start pointer of hob list\r
+\r
+Returns:\r
+\r
+ Size of hob list.\r
+\r
+--*/\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+ UINTN Size;\r
+\r
+ Hob.Raw = HobStart;\r
+ Size = 0;\r
+\r
+ while (Hob.Header->HobType != EFI_HOB_TYPE_END_OF_HOB_LIST) {\r
+ Size += Hob.Header->HobLength;\r
+ Hob.Raw += Hob.Header->HobLength;\r
+ }\r
+\r
+ Size += Hob.Header->HobLength;\r
+\r
+ return Size;\r
+}\r
+\r
+UINT32\r
+GetHobVersion (\r
+ IN VOID *HobStart\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Get hob version.\r
+\r
+Arguments:\r
+\r
+ HobStart - Start pointer of hob list\r
+\r
+Returns:\r
+\r
+ Hob version.\r
+\r
+--*/\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+\r
+ Hob.Raw = HobStart;\r
+ return Hob.HandoffInformationTable->Version;\r
+}\r
+\r
+EFI_STATUS\r
+GetHobBootMode (\r
+ IN VOID *HobStart,\r
+ OUT EFI_BOOT_MODE *BootMode\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Get current boot mode.\r
+\r
+Arguments:\r
+\r
+ HobStart - Start pointer of hob list\r
+ \r
+ BootMode - Current boot mode recorded in PHIT hob\r
+\r
+Returns:\r
+\r
+ EFI_NOT_FOUND - Invalid hob header\r
+ \r
+ EFI_SUCCESS - Boot mode found\r
+\r
+--*/\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+\r
+ Hob.Raw = HobStart;\r
+ if (Hob.Header->HobType != EFI_HOB_TYPE_HANDOFF) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ *BootMode = Hob.HandoffInformationTable->BootMode;\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+GetCpuHobInfo (\r
+ IN VOID *HobStart,\r
+ OUT UINT8 *SizeOfMemorySpace,\r
+ OUT UINT8 *SizeOfIoSpace\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Get information recorded in CPU hob (Memory space size, Io space size)\r
+\r
+Arguments:\r
+\r
+ HobStart - Start pointer of hob list\r
+ \r
+ SizeOfMemorySpace - Size of memory size\r
+ \r
+ SizeOfIoSpace - Size of IO size\r
+\r
+Returns:\r
+\r
+ EFI_NOT_FOUND - CPU hob not found\r
+ \r
+ EFI_SUCCESS - CPU hob found and information got.\r
+\r
+--*/\r
+{\r
+ EFI_PEI_HOB_POINTERS CpuHob;\r
+\r
+ CpuHob.Raw = HobStart;\r
+ CpuHob.Raw = GetHob (EFI_HOB_TYPE_CPU, CpuHob.Raw);\r
+ if (CpuHob.Header->HobType != EFI_HOB_TYPE_CPU) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ *SizeOfMemorySpace = CpuHob.Cpu->SizeOfMemorySpace;\r
+ *SizeOfIoSpace = CpuHob.Cpu->SizeOfIoSpace;\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+GetDxeCoreHobInfo (\r
+ IN VOID *HobStart,\r
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
+ OUT UINT64 *Length,\r
+ OUT VOID **EntryPoint,\r
+ OUT EFI_GUID **FileName\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Get memory allocation hob created for DXE core and extract its information\r
+\r
+Arguments:\r
+\r
+ HobStart - Start pointer of the hob list\r
+ BaseAddress - Start address of memory allocated for DXE core\r
+ Length - Length of memory allocated for DXE core\r
+ EntryPoint - DXE core file name\r
+ FileName - File Name\r
+\r
+Returns:\r
+\r
+ EFI_NOT_FOUND - DxeCoreHob not found \r
+ EFI_SUCCESS - DxeCoreHob found and information got\r
+\r
+--*/\r
+{\r
+ EFI_PEI_HOB_POINTERS DxeCoreHob;\r
+ \r
+ \r
+ DxeCoreHob.Raw = HobStart;\r
+ DxeCoreHob.Raw = GetHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, DxeCoreHob.Raw);\r
+ while (DxeCoreHob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION && \r
+ !EfiCompareGuid (&DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.Name, \r
+ &gEfiHobMemeryAllocModuleGuid)) {\r
+\r
+ DxeCoreHob.Raw = GET_NEXT_HOB (DxeCoreHob);\r
+ DxeCoreHob.Raw = GetHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, DxeCoreHob.Raw);\r
+\r
+ }\r
+\r
+ if (DxeCoreHob.Header->HobType != EFI_HOB_TYPE_MEMORY_ALLOCATION) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ *BaseAddress = DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.MemoryBaseAddress;\r
+ *Length = DxeCoreHob.MemoryAllocationModule->MemoryAllocationHeader.MemoryLength;\r
+ *EntryPoint = (VOID *) (UINTN) DxeCoreHob.MemoryAllocationModule->EntryPoint;\r
+ *FileName = &DxeCoreHob.MemoryAllocationModule->ModuleName;\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+GetNextFirmwareVolumeHob (\r
+ IN OUT VOID **HobStart,\r
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
+ OUT UINT64 *Length\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Get next firmware volume hob from HobStart\r
+\r
+Arguments:\r
+\r
+ HobStart - Start pointer of hob list\r
+ \r
+ BaseAddress - Start address of next firmware volume\r
+ \r
+ Length - Length of next firmware volume\r
+\r
+Returns:\r
+\r
+ EFI_NOT_FOUND - Next firmware volume not found\r
+ \r
+ EFI_SUCCESS - Next firmware volume found with address information\r
+\r
+--*/\r
+{\r
+ EFI_PEI_HOB_POINTERS FirmwareVolumeHob;\r
+\r
+ FirmwareVolumeHob.Raw = *HobStart;\r
+ if (END_OF_HOB_LIST (FirmwareVolumeHob)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ FirmwareVolumeHob.Raw = GetHob (EFI_HOB_TYPE_FV, *HobStart);\r
+ if (FirmwareVolumeHob.Header->HobType != EFI_HOB_TYPE_FV) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ *BaseAddress = FirmwareVolumeHob.FirmwareVolume->BaseAddress;\r
+ *Length = FirmwareVolumeHob.FirmwareVolume->Length;\r
+\r
+ *HobStart = GET_NEXT_HOB (FirmwareVolumeHob);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+#if (PI_SPECIFICATION_VERSION >= 0x00010000)\r
+EFI_STATUS\r
+GetNextFirmwareVolume2Hob (\r
+ IN OUT VOID **HobStart,\r
+ OUT EFI_PHYSICAL_ADDRESS *BaseAddress,\r
+ OUT UINT64 *Length,\r
+ OUT EFI_GUID *FileName\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Get next firmware volume2 hob from HobStart\r
+\r
+Arguments:\r
+\r
+ HobStart - Start pointer of hob list\r
+ \r
+ BaseAddress - Start address of next firmware volume\r
+ \r
+ Length - Length of next firmware volume\r
+\r
+Returns:\r
+\r
+ EFI_NOT_FOUND - Next firmware volume not found\r
+ \r
+ EFI_SUCCESS - Next firmware volume found with address information\r
+\r
+--*/\r
+{\r
+ EFI_PEI_HOB_POINTERS FirmwareVolumeHob;\r
+\r
+ FirmwareVolumeHob.Raw = *HobStart;\r
+ if (END_OF_HOB_LIST (FirmwareVolumeHob)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ FirmwareVolumeHob.Raw = GetHob (EFI_HOB_TYPE_FV2, *HobStart);\r
+ if (FirmwareVolumeHob.Header->HobType != EFI_HOB_TYPE_FV2) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ *BaseAddress = FirmwareVolumeHob.FirmwareVolume2->BaseAddress;\r
+ *Length = FirmwareVolumeHob.FirmwareVolume2->Length;\r
+ EfiCommonLibCopyMem(FileName,&FirmwareVolumeHob.FirmwareVolume2->FileName,sizeof(EFI_GUID));\r
+\r
+ *HobStart = GET_NEXT_HOB (FirmwareVolumeHob);\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+#endif\r
+\r
+EFI_STATUS\r
+GetNextGuidHob (\r
+ IN OUT VOID **HobStart,\r
+ IN EFI_GUID * Guid,\r
+ OUT VOID **Buffer,\r
+ OUT UINTN *BufferSize OPTIONAL\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+ Get the next guid hob.\r
+ \r
+Arguments:\r
+ HobStart A pointer to the start hob.\r
+ Guid A pointer to a guid.\r
+ Buffer A pointer to the buffer.\r
+ BufferSize Buffer size.\r
+ \r
+Returns:\r
+ Status code.\r
+\r
+ EFI_NOT_FOUND - Next Guid hob not found\r
+ \r
+ EFI_SUCCESS - Next Guid hob found and data for this Guid got\r
+ \r
+ EFI_INVALID_PARAMETER - invalid parameter\r
+\r
+--*/\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_PEI_HOB_POINTERS GuidHob;\r
+\r
+ if (Buffer == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ for (Status = EFI_NOT_FOUND; EFI_ERROR (Status);) {\r
+\r
+ GuidHob.Raw = *HobStart;\r
+ if (END_OF_HOB_LIST (GuidHob)) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
+ GuidHob.Raw = GetHob (EFI_HOB_TYPE_GUID_EXTENSION, *HobStart);\r
+ if (GuidHob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) {\r
+ if (EfiCompareGuid (Guid, &GuidHob.Guid->Name)) {\r
+ Status = EFI_SUCCESS;\r
+ *Buffer = (VOID *) ((UINT8 *) (&GuidHob.Guid->Name) + sizeof (EFI_GUID));\r
+ if (BufferSize != NULL) {\r
+ *BufferSize = GuidHob.Header->HobLength - sizeof (EFI_HOB_GUID_TYPE);\r
+ }\r
+ }\r
+ }\r
+\r
+ *HobStart = GET_NEXT_HOB (GuidHob);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+\r
+#define PAL_ENTRY_HOB {0xe53cb8cc, 0xd62c, 0x4f74, 0xbd, 0xda, 0x31, 0xe5, 0x8d, 0xe5, 0x3e, 0x2}\r
+EFI_GUID gPalEntryHob = PAL_ENTRY_HOB;\r
+\r
+EFI_STATUS\r
+GetPalEntryHobInfo (\r
+ IN VOID *HobStart,\r
+ OUT EFI_PHYSICAL_ADDRESS *PalEntry\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Get PAL entry from PalEntryHob\r
+\r
+Arguments:\r
+\r
+ HobStart - Start pointer of hob list\r
+ \r
+ PalEntry - Pointer to PAL entry\r
+\r
+Returns:\r
+\r
+ Status code.\r
+\r
+--*/\r
+{\r
+ VOID *Buffer;\r
+ UINTN BufferSize;\r
+ EFI_STATUS Status;\r
+ VOID *HobStart2;\r
+\r
+ HobStart2 = HobStart;\r
+ Status = GetNextGuidHob (\r
+ &HobStart2,\r
+ &gPalEntryHob,\r
+ &Buffer,\r
+ &BufferSize\r
+ );\r
+\r
+ *PalEntry = *((EFI_PHYSICAL_ADDRESS *) Buffer);\r
+ return Status;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+GetIoPortSpaceAddressHobInfo (\r
+ IN VOID *HobStart,\r
+ OUT EFI_PHYSICAL_ADDRESS *IoPortSpaceAddress\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ Get IO port space address from IoBaseHob.\r
+\r
+Arguments:\r
+\r
+ HobStart - Start pointer of hob list\r
+ \r
+ IoPortSpaceAddress - IO port space address\r
+\r
+Returns:\r
+\r
+ Status code\r
+\r
+--*/\r
+{\r
+\r
+ VOID *Buffer;\r
+ UINTN BufferSize;\r
+ EFI_STATUS Status;\r
+ VOID *HobStart2;\r
+\r
+ HobStart2 = HobStart;\r
+ Status = GetNextGuidHob (\r
+ &HobStart2,\r
+ &gEfiIoBaseHobGuid,\r
+ &Buffer,\r
+ &BufferSize\r
+ );\r
+\r
+ *IoPortSpaceAddress = *((EFI_PHYSICAL_ADDRESS *) Buffer);\r
+ return Status;\r
+}\r