Home | History | Annotate | Download | only in Library
      1 /** @file
      2   Provides services to create and parse HOBs. Only available for PEI
      3   and DXE module types.
      4 
      5   The HOB Library supports the efficient creation and searching of HOBs
      6   defined in the PI Specification.
      7   A HOB is a Hand-Off Block, defined in the Framework architecture, that
      8   allows the PEI phase to pass information to the DXE phase. HOBs are position
      9   independent and can be relocated easily to different memory memory locations.
     10 
     11 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
     12 This program and the accompanying materials
     13 are licensed and made available under the terms and conditions of the BSD License
     14 which accompanies this distribution.  The full text of the license may be found at
     15 http://opensource.org/licenses/bsd-license.php
     16 
     17 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     18 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     19 
     20 **/
     21 
     22 #ifndef __HOB_LIB_H__
     23 #define __HOB_LIB_H__
     24 
     25 /**
     26   Returns the pointer to the HOB list.
     27 
     28   This function returns the pointer to first HOB in the list.
     29   For PEI phase, the PEI service GetHobList() can be used to retrieve the pointer
     30   to the HOB list.  For the DXE phase, the HOB list pointer can be retrieved through
     31   the EFI System Table by looking up theHOB list GUID in the System Configuration Table.
     32   Since the System Configuration Table does not exist that the time the DXE Core is
     33   launched, the DXE Core uses a global variable from the DXE Core Entry Point Library
     34   to manage the pointer to the HOB list.
     35 
     36   If the pointer to the HOB list is NULL, then ASSERT().
     37 
     38   @return The pointer to the HOB list.
     39 
     40 **/
     41 VOID *
     42 EFIAPI
     43 GetHobList (
     44   VOID
     45   );
     46 
     47 /**
     48   Returns the next instance of a HOB type from the starting HOB.
     49 
     50   This function searches the first instance of a HOB type from the starting HOB pointer.
     51   If there does not exist such HOB type from the starting HOB pointer, it will return NULL.
     52   In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer
     53   unconditionally: it returns HobStart back if HobStart itself meets the requirement;
     54   caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.
     55 
     56   If HobStart is NULL, then ASSERT().
     57 
     58   @param  Type          The HOB type to return.
     59   @param  HobStart      The starting HOB pointer to search from.
     60 
     61   @return The next instance of a HOB type from the starting HOB.
     62 
     63 **/
     64 VOID *
     65 EFIAPI
     66 GetNextHob (
     67   IN UINT16                 Type,
     68   IN CONST VOID             *HobStart
     69   );
     70 
     71 /**
     72   Returns the first instance of a HOB type among the whole HOB list.
     73 
     74   This function searches the first instance of a HOB type among the whole HOB list.
     75   If there does not exist such HOB type in the HOB list, it will return NULL.
     76 
     77   If the pointer to the HOB list is NULL, then ASSERT().
     78 
     79   @param  Type          The HOB type to return.
     80 
     81   @return The next instance of a HOB type from the starting HOB.
     82 
     83 **/
     84 VOID *
     85 EFIAPI
     86 GetFirstHob (
     87   IN UINT16                 Type
     88   );
     89 
     90 /**
     91   Returns the next instance of the matched GUID HOB from the starting HOB.
     92 
     93   This function searches the first instance of a HOB from the starting HOB pointer.
     94   Such HOB should satisfy two conditions:
     95   its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.
     96   If there does not exist such HOB from the starting HOB pointer, it will return NULL.
     97   Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()
     98   to extract the data section and its size info respectively.
     99   In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer
    100   unconditionally: it returns HobStart back if HobStart itself meets the requirement;
    101   caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.
    102 
    103   If Guid is NULL, then ASSERT().
    104   If HobStart is NULL, then ASSERT().
    105 
    106   @param  Guid          The GUID to match with in the HOB list.
    107   @param  HobStart      A pointer to a Guid.
    108 
    109   @return The next instance of the matched GUID HOB from the starting HOB.
    110 
    111 **/
    112 VOID *
    113 EFIAPI
    114 GetNextGuidHob (
    115   IN CONST EFI_GUID         *Guid,
    116   IN CONST VOID             *HobStart
    117   );
    118 
    119 /**
    120   Returns the first instance of the matched GUID HOB among the whole HOB list.
    121 
    122   This function searches the first instance of a HOB among the whole HOB list.
    123   Such HOB should satisfy two conditions:
    124   its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.
    125   If there does not exist such HOB from the starting HOB pointer, it will return NULL.
    126   Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()
    127   to extract the data section and its size info respectively.
    128 
    129   If the pointer to the HOB list is NULL, then ASSERT().
    130   If Guid is NULL, then ASSERT().
    131 
    132   @param  Guid          The GUID to match with in the HOB list.
    133 
    134   @return The first instance of the matched GUID HOB among the whole HOB list.
    135 
    136 **/
    137 VOID *
    138 EFIAPI
    139 GetFirstGuidHob (
    140   IN CONST EFI_GUID         *Guid
    141   );
    142 
    143 /**
    144   Get the system boot mode from the HOB list.
    145 
    146   This function returns the system boot mode information from the
    147   PHIT HOB in HOB list.
    148 
    149   If the pointer to the HOB list is NULL, then ASSERT().
    150 
    151   @param  VOID
    152 
    153   @return The Boot Mode.
    154 
    155 **/
    156 EFI_BOOT_MODE
    157 EFIAPI
    158 GetBootModeHob (
    159   VOID
    160   );
    161 
    162 /**
    163   Builds a HOB for a loaded PE32 module.
    164 
    165   This function builds a HOB for a loaded PE32 module.
    166   It can only be invoked during PEI phase;
    167   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    168 
    169   If ModuleName is NULL, then ASSERT().
    170   If there is no additional space for HOB creation, then ASSERT().
    171 
    172   @param  ModuleName              The GUID File Name of the module.
    173   @param  MemoryAllocationModule  The 64 bit physical address of the module.
    174   @param  ModuleLength            The length of the module in bytes.
    175   @param  EntryPoint              The 64 bit physical address of the module entry point.
    176 
    177 **/
    178 VOID
    179 EFIAPI
    180 BuildModuleHob (
    181   IN CONST EFI_GUID         *ModuleName,
    182   IN EFI_PHYSICAL_ADDRESS   MemoryAllocationModule,
    183   IN UINT64                 ModuleLength,
    184   IN EFI_PHYSICAL_ADDRESS   EntryPoint
    185   );
    186 
    187 /**
    188   Builds a HOB that describes a chunk of system memory with Owner GUID.
    189 
    190   This function builds a HOB that describes a chunk of system memory.
    191   It can only be invoked during PEI phase;
    192   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    193 
    194   If there is no additional space for HOB creation, then ASSERT().
    195 
    196   @param  ResourceType        The type of resource described by this HOB.
    197   @param  ResourceAttribute   The resource attributes of the memory described by this HOB.
    198   @param  PhysicalStart       The 64 bit physical address of memory described by this HOB.
    199   @param  NumberOfBytes       The length of the memory described by this HOB in bytes.
    200   @param  OwnerGUID           GUID for the owner of this resource.
    201 
    202 **/
    203 VOID
    204 EFIAPI
    205 BuildResourceDescriptorWithOwnerHob (
    206   IN EFI_RESOURCE_TYPE            ResourceType,
    207   IN EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttribute,
    208   IN EFI_PHYSICAL_ADDRESS         PhysicalStart,
    209   IN UINT64                       NumberOfBytes,
    210   IN EFI_GUID                     *OwnerGUID
    211   );
    212 
    213 /**
    214   Builds a HOB that describes a chunk of system memory.
    215 
    216   This function builds a HOB that describes a chunk of system memory.
    217   It can only be invoked during PEI phase;
    218   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    219 
    220   If there is no additional space for HOB creation, then ASSERT().
    221 
    222   @param  ResourceType        The type of resource described by this HOB.
    223   @param  ResourceAttribute   The resource attributes of the memory described by this HOB.
    224   @param  PhysicalStart       The 64 bit physical address of memory described by this HOB.
    225   @param  NumberOfBytes       The length of the memory described by this HOB in bytes.
    226 
    227 **/
    228 VOID
    229 EFIAPI
    230 BuildResourceDescriptorHob (
    231   IN EFI_RESOURCE_TYPE            ResourceType,
    232   IN EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttribute,
    233   IN EFI_PHYSICAL_ADDRESS         PhysicalStart,
    234   IN UINT64                       NumberOfBytes
    235   );
    236 
    237 /**
    238   Builds a customized HOB tagged with a GUID for identification and returns
    239   the start address of GUID HOB data.
    240 
    241   This function builds a customized HOB tagged with a GUID for identification
    242   and returns the start address of GUID HOB data so that caller can fill the customized data.
    243   The HOB Header and Name field is already stripped.
    244   It can only be invoked during PEI phase;
    245   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    246 
    247   If Guid is NULL, then ASSERT().
    248   If there is no additional space for HOB creation, then ASSERT().
    249   If DataLength > (0xFFF8 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().
    250   HobLength is UINT16 and multiples of 8 bytes, so the max HobLength is 0xFFF8.
    251 
    252   @param  Guid          The GUID to tag the customized HOB.
    253   @param  DataLength    The size of the data payload for the GUID HOB.
    254 
    255   @retval  NULL         The GUID HOB could not be allocated.
    256   @retval  others       The start address of GUID HOB data.
    257 
    258 **/
    259 VOID *
    260 EFIAPI
    261 BuildGuidHob (
    262   IN CONST EFI_GUID              *Guid,
    263   IN UINTN                       DataLength
    264   );
    265 
    266 /**
    267   Builds a customized HOB tagged with a GUID for identification, copies the input data to the HOB
    268   data field, and returns the start address of the GUID HOB data.
    269 
    270   This function builds a customized HOB tagged with a GUID for identification and copies the input
    271   data to the HOB data field and returns the start address of the GUID HOB data.  It can only be
    272   invoked during PEI phase; for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    273   The HOB Header and Name field is already stripped.
    274   It can only be invoked during PEI phase;
    275   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    276 
    277   If Guid is NULL, then ASSERT().
    278   If Data is NULL and DataLength > 0, then ASSERT().
    279   If there is no additional space for HOB creation, then ASSERT().
    280   If DataLength > (0xFFF8 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().
    281   HobLength is UINT16 and multiples of 8 bytes, so the max HobLength is 0xFFF8.
    282 
    283   @param  Guid          The GUID to tag the customized HOB.
    284   @param  Data          The data to be copied into the data field of the GUID HOB.
    285   @param  DataLength    The size of the data payload for the GUID HOB.
    286 
    287   @retval  NULL         The GUID HOB could not be allocated.
    288   @retval  others       The start address of GUID HOB data.
    289 
    290 **/
    291 VOID *
    292 EFIAPI
    293 BuildGuidDataHob (
    294   IN CONST EFI_GUID              *Guid,
    295   IN VOID                        *Data,
    296   IN UINTN                       DataLength
    297   );
    298 
    299 /**
    300   Builds a Firmware Volume HOB.
    301 
    302   This function builds a Firmware Volume HOB.
    303   It can only be invoked during PEI phase;
    304   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    305 
    306   If there is no additional space for HOB creation, then ASSERT().
    307   If the FvImage buffer is not at its required alignment, then ASSERT().
    308 
    309   @param  BaseAddress   The base address of the Firmware Volume.
    310   @param  Length        The size of the Firmware Volume in bytes.
    311 
    312 **/
    313 VOID
    314 EFIAPI
    315 BuildFvHob (
    316   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
    317   IN UINT64                      Length
    318   );
    319 
    320 /**
    321   Builds a EFI_HOB_TYPE_FV2 HOB.
    322 
    323   This function builds a EFI_HOB_TYPE_FV2 HOB.
    324   It can only be invoked during PEI phase;
    325   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    326 
    327   If there is no additional space for HOB creation, then ASSERT().
    328   If the FvImage buffer is not at its required alignment, then ASSERT().
    329 
    330   @param  BaseAddress   The base address of the Firmware Volume.
    331   @param  Length        The size of the Firmware Volume in bytes.
    332   @param  FvName        The name of the Firmware Volume.
    333   @param  FileName      The name of the file.
    334 
    335 **/
    336 VOID
    337 EFIAPI
    338 BuildFv2Hob (
    339   IN          EFI_PHYSICAL_ADDRESS        BaseAddress,
    340   IN          UINT64                      Length,
    341   IN CONST    EFI_GUID                    *FvName,
    342   IN CONST    EFI_GUID                    *FileName
    343   );
    344 
    345 /**
    346   Builds a Capsule Volume HOB.
    347 
    348   This function builds a Capsule Volume HOB.
    349   It can only be invoked during PEI phase;
    350   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    351 
    352   If the platform does not support Capsule Volume HOBs, then ASSERT().
    353   If there is no additional space for HOB creation, then ASSERT().
    354 
    355   @param  BaseAddress   The base address of the Capsule Volume.
    356   @param  Length        The size of the Capsule Volume in bytes.
    357 
    358 **/
    359 VOID
    360 EFIAPI
    361 BuildCvHob (
    362   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
    363   IN UINT64                      Length
    364   );
    365 
    366 /**
    367   Builds a HOB for the CPU.
    368 
    369   This function builds a HOB for the CPU.
    370   It can only be invoked during PEI phase;
    371   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    372 
    373   If there is no additional space for HOB creation, then ASSERT().
    374 
    375   @param  SizeOfMemorySpace   The maximum physical memory addressability of the processor.
    376   @param  SizeOfIoSpace       The maximum physical I/O addressability of the processor.
    377 
    378 **/
    379 VOID
    380 EFIAPI
    381 BuildCpuHob (
    382   IN UINT8                       SizeOfMemorySpace,
    383   IN UINT8                       SizeOfIoSpace
    384   );
    385 
    386 /**
    387   Builds a HOB for the Stack.
    388 
    389   This function builds a HOB for the stack.
    390   It can only be invoked during PEI phase;
    391   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    392 
    393   If there is no additional space for HOB creation, then ASSERT().
    394 
    395   @param  BaseAddress   The 64 bit physical address of the Stack.
    396   @param  Length        The length of the stack in bytes.
    397 
    398 **/
    399 VOID
    400 EFIAPI
    401 BuildStackHob (
    402   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
    403   IN UINT64                      Length
    404   );
    405 
    406 /**
    407   Builds a HOB for the BSP store.
    408 
    409   This function builds a HOB for BSP store.
    410   It can only be invoked during PEI phase;
    411   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    412 
    413   If there is no additional space for HOB creation, then ASSERT().
    414 
    415   @param  BaseAddress   The 64 bit physical address of the BSP.
    416   @param  Length        The length of the BSP store in bytes.
    417   @param  MemoryType    Type of memory allocated by this HOB.
    418 
    419 **/
    420 VOID
    421 EFIAPI
    422 BuildBspStoreHob (
    423   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
    424   IN UINT64                      Length,
    425   IN EFI_MEMORY_TYPE             MemoryType
    426   );
    427 
    428 /**
    429   Builds a HOB for the memory allocation.
    430 
    431   This function builds a HOB for the memory allocation.
    432   It can only be invoked during PEI phase;
    433   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
    434 
    435   If there is no additional space for HOB creation, then ASSERT().
    436 
    437   @param  BaseAddress   The 64 bit physical address of the memory.
    438   @param  Length        The length of the memory allocation in bytes.
    439   @param  MemoryType    Type of memory allocated by this HOB.
    440 
    441 **/
    442 VOID
    443 EFIAPI
    444 BuildMemoryAllocationHob (
    445   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
    446   IN UINT64                      Length,
    447   IN EFI_MEMORY_TYPE             MemoryType
    448   );
    449 
    450 /**
    451   Returns the type of a HOB.
    452 
    453   This macro returns the HobType field from the HOB header for the
    454   HOB specified by HobStart.
    455 
    456   @param  HobStart   A pointer to a HOB.
    457 
    458   @return HobType.
    459 
    460 **/
    461 #define GET_HOB_TYPE(HobStart) \
    462   ((*(EFI_HOB_GENERIC_HEADER **)&(HobStart))->HobType)
    463 
    464 /**
    465   Returns the length, in bytes, of a HOB.
    466 
    467   This macro returns the HobLength field from the HOB header for the
    468   HOB specified by HobStart.
    469 
    470   @param  HobStart   A pointer to a HOB.
    471 
    472   @return HobLength.
    473 
    474 **/
    475 #define GET_HOB_LENGTH(HobStart) \
    476   ((*(EFI_HOB_GENERIC_HEADER **)&(HobStart))->HobLength)
    477 
    478 /**
    479   Returns a pointer to the next HOB in the HOB list.
    480 
    481   This macro returns a pointer to HOB that follows the
    482   HOB specified by HobStart in the HOB List.
    483 
    484   @param  HobStart   A pointer to a HOB.
    485 
    486   @return A pointer to the next HOB in the HOB list.
    487 
    488 **/
    489 #define GET_NEXT_HOB(HobStart) \
    490   (VOID *)(*(UINT8 **)&(HobStart) + GET_HOB_LENGTH (HobStart))
    491 
    492 /**
    493   Determines if a HOB is the last HOB in the HOB list.
    494 
    495   This macro determine if the HOB specified by HobStart is the
    496   last HOB in the HOB list.  If HobStart is last HOB in the HOB list,
    497   then TRUE is returned.  Otherwise, FALSE is returned.
    498 
    499   @param  HobStart   A pointer to a HOB.
    500 
    501   @retval TRUE       The HOB specified by HobStart is the last HOB in the HOB list.
    502   @retval FALSE      The HOB specified by HobStart is not the last HOB in the HOB list.
    503 
    504 **/
    505 #define END_OF_HOB_LIST(HobStart)  (GET_HOB_TYPE (HobStart) == (UINT16)EFI_HOB_TYPE_END_OF_HOB_LIST)
    506 
    507 /**
    508   Returns a pointer to data buffer from a HOB of type EFI_HOB_TYPE_GUID_EXTENSION.
    509 
    510   This macro returns a pointer to the data buffer in a HOB specified by HobStart.
    511   HobStart is assumed to be a HOB of type EFI_HOB_TYPE_GUID_EXTENSION.
    512 
    513   @param   GuidHob   A pointer to a HOB.
    514 
    515   @return  A pointer to the data buffer in a HOB.
    516 
    517 **/
    518 #define GET_GUID_HOB_DATA(HobStart) \
    519   (VOID *)(*(UINT8 **)&(HobStart) + sizeof (EFI_HOB_GUID_TYPE))
    520 
    521 /**
    522   Returns the size of the data buffer from a HOB of type EFI_HOB_TYPE_GUID_EXTENSION.
    523 
    524   This macro returns the size, in bytes, of the data buffer in a HOB specified by HobStart.
    525   HobStart is assumed to be a HOB of type EFI_HOB_TYPE_GUID_EXTENSION.
    526 
    527   @param   GuidHob   A pointer to a HOB.
    528 
    529   @return  The size of the data buffer.
    530 **/
    531 #define GET_GUID_HOB_DATA_SIZE(HobStart) \
    532   (UINT16)(GET_HOB_LENGTH (HobStart) - sizeof (EFI_HOB_GUID_TYPE))
    533 
    534 #endif
    535