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