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 - 2014, 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 
308   @param  BaseAddress   The base address of the Firmware Volume.
309   @param  Length        The size of the Firmware Volume in bytes.
310 
311 **/
312 VOID
313 EFIAPI
314 BuildFvHob (
315   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
316   IN UINT64                      Length
317   );
318 
319 /**
320   Builds a EFI_HOB_TYPE_FV2 HOB.
321 
322   This function builds a EFI_HOB_TYPE_FV2 HOB.
323   It can only be invoked during PEI phase;
324   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
325 
326   If there is no additional space for HOB creation, then ASSERT().
327 
328   @param  BaseAddress   The base address of the Firmware Volume.
329   @param  Length        The size of the Firmware Volume in bytes.
330   @param  FvName        The name of the Firmware Volume.
331   @param  FileName      The name of the file.
332 
333 **/
334 VOID
335 EFIAPI
336 BuildFv2Hob (
337   IN          EFI_PHYSICAL_ADDRESS        BaseAddress,
338   IN          UINT64                      Length,
339   IN CONST    EFI_GUID                    *FvName,
340   IN CONST    EFI_GUID                    *FileName
341   );
342 
343 /**
344   Builds a Capsule Volume HOB.
345 
346   This function builds a Capsule Volume HOB.
347   It can only be invoked during PEI phase;
348   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
349 
350   If the platform does not support Capsule Volume HOBs, then ASSERT().
351   If there is no additional space for HOB creation, then ASSERT().
352 
353   @param  BaseAddress   The base address of the Capsule Volume.
354   @param  Length        The size of the Capsule Volume in bytes.
355 
356 **/
357 VOID
358 EFIAPI
359 BuildCvHob (
360   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
361   IN UINT64                      Length
362   );
363 
364 /**
365   Builds a HOB for the CPU.
366 
367   This function builds a HOB for the CPU.
368   It can only be invoked during PEI phase;
369   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
370 
371   If there is no additional space for HOB creation, then ASSERT().
372 
373   @param  SizeOfMemorySpace   The maximum physical memory addressability of the processor.
374   @param  SizeOfIoSpace       The maximum physical I/O addressability of the processor.
375 
376 **/
377 VOID
378 EFIAPI
379 BuildCpuHob (
380   IN UINT8                       SizeOfMemorySpace,
381   IN UINT8                       SizeOfIoSpace
382   );
383 
384 /**
385   Builds a HOB for the Stack.
386 
387   This function builds a HOB for the stack.
388   It can only be invoked during PEI phase;
389   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
390 
391   If there is no additional space for HOB creation, then ASSERT().
392 
393   @param  BaseAddress   The 64 bit physical address of the Stack.
394   @param  Length        The length of the stack in bytes.
395 
396 **/
397 VOID
398 EFIAPI
399 BuildStackHob (
400   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
401   IN UINT64                      Length
402   );
403 
404 /**
405   Builds a HOB for the BSP store.
406 
407   This function builds a HOB for BSP store.
408   It can only be invoked during PEI phase;
409   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
410 
411   If there is no additional space for HOB creation, then ASSERT().
412 
413   @param  BaseAddress   The 64 bit physical address of the BSP.
414   @param  Length        The length of the BSP store in bytes.
415   @param  MemoryType    Type of memory allocated by this HOB.
416 
417 **/
418 VOID
419 EFIAPI
420 BuildBspStoreHob (
421   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
422   IN UINT64                      Length,
423   IN EFI_MEMORY_TYPE             MemoryType
424   );
425 
426 /**
427   Builds a HOB for the memory allocation.
428 
429   This function builds a HOB for the memory allocation.
430   It can only be invoked during PEI phase;
431   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
432 
433   If there is no additional space for HOB creation, then ASSERT().
434 
435   @param  BaseAddress   The 64 bit physical address of the memory.
436   @param  Length        The length of the memory allocation in bytes.
437   @param  MemoryType    Type of memory allocated by this HOB.
438 
439 **/
440 VOID
441 EFIAPI
442 BuildMemoryAllocationHob (
443   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
444   IN UINT64                      Length,
445   IN EFI_MEMORY_TYPE             MemoryType
446   );
447 
448 /**
449   Returns the type of a HOB.
450 
451   This macro returns the HobType field from the HOB header for the
452   HOB specified by HobStart.
453 
454   @param  HobStart   A pointer to a HOB.
455 
456   @return HobType.
457 
458 **/
459 #define GET_HOB_TYPE(HobStart) \
460   ((*(EFI_HOB_GENERIC_HEADER **)&(HobStart))->HobType)
461 
462 /**
463   Returns the length, in bytes, of a HOB.
464 
465   This macro returns the HobLength field from the HOB header for the
466   HOB specified by HobStart.
467 
468   @param  HobStart   A pointer to a HOB.
469 
470   @return HobLength.
471 
472 **/
473 #define GET_HOB_LENGTH(HobStart) \
474   ((*(EFI_HOB_GENERIC_HEADER **)&(HobStart))->HobLength)
475 
476 /**
477   Returns a pointer to the next HOB in the HOB list.
478 
479   This macro returns a pointer to HOB that follows the
480   HOB specified by HobStart in the HOB List.
481 
482   @param  HobStart   A pointer to a HOB.
483 
484   @return A pointer to the next HOB in the HOB list.
485 
486 **/
487 #define GET_NEXT_HOB(HobStart) \
488   (VOID *)(*(UINT8 **)&(HobStart) + GET_HOB_LENGTH (HobStart))
489 
490 /**
491   Determines if a HOB is the last HOB in the HOB list.
492 
493   This macro determine if the HOB specified by HobStart is the
494   last HOB in the HOB list.  If HobStart is last HOB in the HOB list,
495   then TRUE is returned.  Otherwise, FALSE is returned.
496 
497   @param  HobStart   A pointer to a HOB.
498 
499   @retval TRUE       The HOB specified by HobStart is the last HOB in the HOB list.
500   @retval FALSE      The HOB specified by HobStart is not the last HOB in the HOB list.
501 
502 **/
503 #define END_OF_HOB_LIST(HobStart)  (GET_HOB_TYPE (HobStart) == (UINT16)EFI_HOB_TYPE_END_OF_HOB_LIST)
504 
505 /**
506   Returns a pointer to data buffer from a HOB of type EFI_HOB_TYPE_GUID_EXTENSION.
507 
508   This macro returns a pointer to the data buffer in a HOB specified by HobStart.
509   HobStart is assumed to be a HOB of type EFI_HOB_TYPE_GUID_EXTENSION.
510 
511   @param   GuidHob   A pointer to a HOB.
512 
513   @return  A pointer to the data buffer in a HOB.
514 
515 **/
516 #define GET_GUID_HOB_DATA(HobStart) \
517   (VOID *)(*(UINT8 **)&(HobStart) + sizeof (EFI_HOB_GUID_TYPE))
518 
519 /**
520   Returns the size of the data buffer from a HOB of type EFI_HOB_TYPE_GUID_EXTENSION.
521 
522   This macro returns the size, in bytes, of the data buffer in a HOB specified by HobStart.
523   HobStart is assumed to be a HOB of type EFI_HOB_TYPE_GUID_EXTENSION.
524 
525   @param   GuidHob   A pointer to a HOB.
526 
527   @return  The size of the data buffer.
528 **/
529 #define GET_GUID_HOB_DATA_SIZE(HobStart) \
530   (UINT16)(GET_HOB_LENGTH (HobStart) - sizeof (EFI_HOB_GUID_TYPE))
531 
532 #endif
533