+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
-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
- //\r
- // Initialize 'Buffer' to NULL before usage\r
- //\r
- Buffer = NULL;\r
- HobStart2 = HobStart;\r
- Status = GetNextGuidHob (\r
- &HobStart2,\r
- &gPalEntryHob,\r
- &Buffer,\r
- &BufferSize\r
- );\r
- if (EFI_ERROR (Status) || (Buffer == NULL)) {\r
- //\r
- // Failed to get HOB for gPalEntryHob\r
- //\r
- return EFI_NOT_FOUND;\r
- }\r
- *PalEntry = *((EFI_PHYSICAL_ADDRESS *) Buffer);\r
- return EFI_SUCCESS;\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
- //\r
- // Initialize 'Buffer' to NULL before usage\r
- //\r
- Buffer = NULL;\r
- HobStart2 = HobStart;\r
- Status = GetNextGuidHob (\r
- &HobStart2,\r
- &gEfiIoBaseHobGuid,\r
- &Buffer,\r
- &BufferSize\r
- );\r
- if (EFI_ERROR (Status) || (Buffer == NULL)) {\r
- //\r
- // Failed to get HOB for gEfiIoBaseHobGuid\r
- //\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- *IoPortSpaceAddress = *((EFI_PHYSICAL_ADDRESS *) Buffer);\r
- return EFI_SUCCESS;\r
-}\r