• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Provide Hob Library functions for Pei phase.
3 
4 Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php.
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #include <PiPei.h>
16 
17 #include <Guid/MemoryAllocationHob.h>
18 
19 #include <Library/HobLib.h>
20 #include <Library/DebugLib.h>
21 #include <Library/PeiServicesLib.h>
22 #include <Library/BaseMemoryLib.h>
23 
24 /**
25   Returns the pointer to the HOB list.
26 
27   This function returns the pointer to first HOB in the list.
28   For PEI phase, the PEI service GetHobList() can be used to retrieve the pointer
29   to the HOB list.  For the DXE phase, the HOB list pointer can be retrieved through
30   the EFI System Table by looking up theHOB list GUID in the System Configuration Table.
31   Since the System Configuration Table does not exist that the time the DXE Core is
32   launched, the DXE Core uses a global variable from the DXE Core Entry Point Library
33   to manage the pointer to the HOB list.
34 
35   If the pointer to the HOB list is NULL, then ASSERT().
36 
37   @return The pointer to the HOB list.
38 
39 **/
40 VOID *
41 EFIAPI
GetHobList(VOID)42 GetHobList (
43   VOID
44   )
45 {
46   EFI_STATUS            Status;
47   VOID                  *HobList;
48 
49   Status = PeiServicesGetHobList (&HobList);
50   ASSERT_EFI_ERROR (Status);
51   ASSERT (HobList != NULL);
52 
53   return HobList;
54 }
55 
56 /**
57   Returns the next instance of a HOB type from the starting HOB.
58 
59   This function searches the first instance of a HOB type from the starting HOB pointer.
60   If there does not exist such HOB type from the starting HOB pointer, it will return NULL.
61   In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer
62   unconditionally: it returns HobStart back if HobStart itself meets the requirement;
63   caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.
64 
65   If HobStart is NULL, then ASSERT().
66 
67   @param  Type          The HOB type to return.
68   @param  HobStart      The starting HOB pointer to search from.
69 
70   @return The next instance of a HOB type from the starting HOB.
71 
72 **/
73 VOID *
74 EFIAPI
GetNextHob(IN UINT16 Type,IN CONST VOID * HobStart)75 GetNextHob (
76   IN UINT16                 Type,
77   IN CONST VOID             *HobStart
78   )
79 {
80   EFI_PEI_HOB_POINTERS  Hob;
81 
82   ASSERT (HobStart != NULL);
83 
84   Hob.Raw = (UINT8 *) HobStart;
85   //
86   // Parse the HOB list until end of list or matching type is found.
87   //
88   while (!END_OF_HOB_LIST (Hob)) {
89     if (Hob.Header->HobType == Type) {
90       return Hob.Raw;
91     }
92     Hob.Raw = GET_NEXT_HOB (Hob);
93   }
94   return NULL;
95 }
96 
97 /**
98   Returns the first instance of a HOB type among the whole HOB list.
99 
100   This function searches the first instance of a HOB type among the whole HOB list.
101   If there does not exist such HOB type in the HOB list, it will return NULL.
102 
103   If the pointer to the HOB list is NULL, then ASSERT().
104 
105   @param  Type          The HOB type to return.
106 
107   @return The next instance of a HOB type from the starting HOB.
108 
109 **/
110 VOID *
111 EFIAPI
GetFirstHob(IN UINT16 Type)112 GetFirstHob (
113   IN UINT16                 Type
114   )
115 {
116   VOID      *HobList;
117 
118   HobList = GetHobList ();
119   return GetNextHob (Type, HobList);
120 }
121 
122 /**
123   Returns the next instance of the matched GUID HOB from the starting HOB.
124 
125   This function searches the first instance of a HOB from the starting HOB pointer.
126   Such HOB should satisfy two conditions:
127   its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.
128   If there does not exist such HOB from the starting HOB pointer, it will return NULL.
129   Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()
130   to extract the data section and its size information, respectively.
131   In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer
132   unconditionally: it returns HobStart back if HobStart itself meets the requirement;
133   caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.
134 
135   If Guid is NULL, then ASSERT().
136   If HobStart is NULL, then ASSERT().
137 
138   @param  Guid          The GUID to match with in the HOB list.
139   @param  HobStart      A pointer to a Guid.
140 
141   @return The next instance of the matched GUID HOB from the starting HOB.
142 
143 **/
144 VOID *
145 EFIAPI
GetNextGuidHob(IN CONST EFI_GUID * Guid,IN CONST VOID * HobStart)146 GetNextGuidHob (
147   IN CONST EFI_GUID         *Guid,
148   IN CONST VOID             *HobStart
149   )
150 {
151   EFI_PEI_HOB_POINTERS  GuidHob;
152 
153   GuidHob.Raw = (UINT8 *) HobStart;
154   while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {
155     if (CompareGuid (Guid, &GuidHob.Guid->Name)) {
156       break;
157     }
158     GuidHob.Raw = GET_NEXT_HOB (GuidHob);
159   }
160   return GuidHob.Raw;
161 }
162 
163 /**
164   Returns the first instance of the matched GUID HOB among the whole HOB list.
165 
166   This function searches the first instance of a HOB among the whole HOB list.
167   Such HOB should satisfy two conditions:
168   its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.
169   If there does not exist such HOB from the starting HOB pointer, it will return NULL.
170   Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()
171   to extract the data section and its size information, respectively.
172 
173   If the pointer to the HOB list is NULL, then ASSERT().
174   If Guid is NULL, then ASSERT().
175 
176   @param  Guid          The GUID to match with in the HOB list.
177 
178   @return The first instance of the matched GUID HOB among the whole HOB list.
179 
180 **/
181 VOID *
182 EFIAPI
GetFirstGuidHob(IN CONST EFI_GUID * Guid)183 GetFirstGuidHob (
184   IN CONST EFI_GUID         *Guid
185   )
186 {
187   VOID      *HobList;
188 
189   HobList = GetHobList ();
190   return GetNextGuidHob (Guid, HobList);
191 }
192 
193 /**
194   Get the system boot mode from the HOB list.
195 
196   This function returns the system boot mode information from the
197   PHIT HOB in HOB list.
198 
199   If the pointer to the HOB list is NULL, then ASSERT().
200 
201   @param  VOID.
202 
203   @return The Boot Mode.
204 
205 **/
206 EFI_BOOT_MODE
207 EFIAPI
GetBootModeHob(VOID)208 GetBootModeHob (
209   VOID
210   )
211 {
212   EFI_STATUS             Status;
213   EFI_BOOT_MODE          BootMode;
214 
215   Status = PeiServicesGetBootMode (&BootMode);
216   ASSERT_EFI_ERROR (Status);
217 
218   return BootMode;
219 }
220 
221 /**
222   Adds a new HOB to the HOB List.
223 
224   This internal function enables PEIMs to create various types of HOBs.
225 
226   @param  Type          Type of the new HOB.
227   @param  Length        Length of the new HOB to allocate.
228 
229   @retval  NULL         The HOB could not be allocated.
230   @retval  others       The address of new HOB.
231 
232 **/
233 VOID *
234 EFIAPI
InternalPeiCreateHob(IN UINT16 Type,IN UINT16 Length)235 InternalPeiCreateHob (
236   IN UINT16                      Type,
237   IN UINT16                      Length
238   )
239 {
240   EFI_STATUS        Status;
241   VOID              *Hob;
242 
243   Status = PeiServicesCreateHob (Type, Length, &Hob);
244   if (EFI_ERROR (Status)) {
245     Hob = NULL;
246   }
247   //
248   // Assume the process of HOB building is always successful.
249   //
250   ASSERT (Hob != NULL);
251   return Hob;
252 }
253 
254 /**
255   Builds a HOB for a loaded PE32 module.
256 
257   This function builds a HOB for a loaded PE32 module.
258   It can only be invoked during PEI phase;
259   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
260 
261   If ModuleName is NULL, then ASSERT().
262   If there is no additional space for HOB creation, then ASSERT().
263 
264   @param  ModuleName              The GUID File Name of the module.
265   @param  MemoryAllocationModule  The 64 bit physical address of the module.
266   @param  ModuleLength            The length of the module in bytes.
267   @param  EntryPoint              The 64 bit physical address of the module entry point.
268 
269 **/
270 VOID
271 EFIAPI
BuildModuleHob(IN CONST EFI_GUID * ModuleName,IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,IN UINT64 ModuleLength,IN EFI_PHYSICAL_ADDRESS EntryPoint)272 BuildModuleHob (
273   IN CONST EFI_GUID         *ModuleName,
274   IN EFI_PHYSICAL_ADDRESS   MemoryAllocationModule,
275   IN UINT64                 ModuleLength,
276   IN EFI_PHYSICAL_ADDRESS   EntryPoint
277   )
278 {
279   EFI_HOB_MEMORY_ALLOCATION_MODULE  *Hob;
280 
281   ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&
282           ((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0));
283 
284   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));
285   if (Hob == NULL) {
286     return;
287   }
288 
289   CopyGuid (&(Hob->MemoryAllocationHeader.Name), &gEfiHobMemoryAllocModuleGuid);
290   Hob->MemoryAllocationHeader.MemoryBaseAddress = MemoryAllocationModule;
291   Hob->MemoryAllocationHeader.MemoryLength      = ModuleLength;
292   Hob->MemoryAllocationHeader.MemoryType        = EfiBootServicesCode;
293 
294   //
295   // Zero the reserved space to match HOB spec
296   //
297   ZeroMem (Hob->MemoryAllocationHeader.Reserved, sizeof (Hob->MemoryAllocationHeader.Reserved));
298 
299   CopyGuid (&Hob->ModuleName, ModuleName);
300   Hob->EntryPoint = EntryPoint;
301 }
302 
303 /**
304   Builds a HOB that describes a chunk of system memory with Owner GUID.
305 
306   This function builds a HOB that describes a chunk of system memory.
307   It can only be invoked during PEI phase;
308   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
309 
310   If there is no additional space for HOB creation, then ASSERT().
311 
312   @param  ResourceType        The type of resource described by this HOB.
313   @param  ResourceAttribute   The resource attributes of the memory described by this HOB.
314   @param  PhysicalStart       The 64 bit physical address of memory described by this HOB.
315   @param  NumberOfBytes       The length of the memory described by this HOB in bytes.
316   @param  OwnerGUID           GUID for the owner of this resource.
317 
318 **/
319 VOID
320 EFIAPI
BuildResourceDescriptorWithOwnerHob(IN EFI_RESOURCE_TYPE ResourceType,IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute,IN EFI_PHYSICAL_ADDRESS PhysicalStart,IN UINT64 NumberOfBytes,IN EFI_GUID * OwnerGUID)321 BuildResourceDescriptorWithOwnerHob (
322   IN EFI_RESOURCE_TYPE            ResourceType,
323   IN EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttribute,
324   IN EFI_PHYSICAL_ADDRESS         PhysicalStart,
325   IN UINT64                       NumberOfBytes,
326   IN EFI_GUID                     *OwnerGUID
327   )
328 {
329   EFI_HOB_RESOURCE_DESCRIPTOR  *Hob;
330 
331   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, (UINT16) sizeof (EFI_HOB_RESOURCE_DESCRIPTOR));
332   if (Hob == NULL) {
333     return;
334   }
335 
336   Hob->ResourceType      = ResourceType;
337   Hob->ResourceAttribute = ResourceAttribute;
338   Hob->PhysicalStart     = PhysicalStart;
339   Hob->ResourceLength    = NumberOfBytes;
340 
341   CopyGuid (&Hob->Owner, OwnerGUID);
342 }
343 
344 /**
345   Builds a HOB that describes a chunk of system memory.
346 
347   This function builds a HOB that describes a chunk of system memory.
348   It can only be invoked during PEI phase;
349   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
350 
351   If there is no additional space for HOB creation, then ASSERT().
352 
353   @param  ResourceType        The type of resource described by this HOB.
354   @param  ResourceAttribute   The resource attributes of the memory described by this HOB.
355   @param  PhysicalStart       The 64 bit physical address of memory described by this HOB.
356   @param  NumberOfBytes       The length of the memory described by this HOB in bytes.
357 
358 **/
359 VOID
360 EFIAPI
BuildResourceDescriptorHob(IN EFI_RESOURCE_TYPE ResourceType,IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute,IN EFI_PHYSICAL_ADDRESS PhysicalStart,IN UINT64 NumberOfBytes)361 BuildResourceDescriptorHob (
362   IN EFI_RESOURCE_TYPE            ResourceType,
363   IN EFI_RESOURCE_ATTRIBUTE_TYPE  ResourceAttribute,
364   IN EFI_PHYSICAL_ADDRESS         PhysicalStart,
365   IN UINT64                       NumberOfBytes
366   )
367 {
368   EFI_HOB_RESOURCE_DESCRIPTOR  *Hob;
369 
370   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, (UINT16) sizeof (EFI_HOB_RESOURCE_DESCRIPTOR));
371   if (Hob == NULL) {
372     return;
373   }
374 
375   Hob->ResourceType      = ResourceType;
376   Hob->ResourceAttribute = ResourceAttribute;
377   Hob->PhysicalStart     = PhysicalStart;
378   Hob->ResourceLength    = NumberOfBytes;
379   ZeroMem (&(Hob->Owner), sizeof (EFI_GUID));
380 }
381 
382 /**
383   Builds a customized HOB tagged with a GUID for identification and returns
384   the start address of GUID HOB data.
385 
386   This function builds a customized HOB tagged with a GUID for identification
387   and returns the start address of GUID HOB data so that caller can fill the customized data.
388   The HOB Header and Name field is already stripped.
389   It can only be invoked during PEI phase;
390   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
391 
392   If Guid is NULL, then ASSERT().
393   If there is no additional space for HOB creation, then ASSERT().
394   If DataLength > (0xFFF8 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().
395   HobLength is UINT16 and multiples of 8 bytes, so the max HobLength is 0xFFF8.
396 
397   @param  Guid          The GUID to tag the customized HOB.
398   @param  DataLength    The size of the data payload for the GUID HOB.
399 
400   @retval  NULL         The GUID HOB could not be allocated.
401   @retval  others       The start address of GUID HOB data.
402 
403 **/
404 VOID *
405 EFIAPI
BuildGuidHob(IN CONST EFI_GUID * Guid,IN UINTN DataLength)406 BuildGuidHob (
407   IN CONST EFI_GUID              *Guid,
408   IN UINTN                       DataLength
409   )
410 {
411   EFI_HOB_GUID_TYPE *Hob;
412 
413   //
414   // Make sure Guid is valid
415   //
416   ASSERT (Guid != NULL);
417 
418   //
419   // Make sure that data length is not too long.
420   //
421   ASSERT (DataLength <= (0xFFF8 - sizeof (EFI_HOB_GUID_TYPE)));
422 
423   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16) (sizeof (EFI_HOB_GUID_TYPE) + DataLength));
424   if (Hob == NULL) {
425     return Hob;
426   }
427   CopyGuid (&Hob->Name, Guid);
428   return Hob + 1;
429 }
430 
431 /**
432   Builds a customized HOB tagged with a GUID for identification, copies the input data to the HOB
433   data field, and returns the start address of the GUID HOB data.
434 
435   This function builds a customized HOB tagged with a GUID for identification and copies the input
436   data to the HOB data field and returns the start address of the GUID HOB data.  It can only be
437   invoked during PEI phase; for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
438   The HOB Header and Name field is already stripped.
439   It can only be invoked during PEI phase;
440   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
441 
442   If Guid is NULL, then ASSERT().
443   If Data is NULL and DataLength > 0, then ASSERT().
444   If there is no additional space for HOB creation, then ASSERT().
445   If DataLength > (0xFFF8 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().
446   HobLength is UINT16 and multiples of 8 bytes, so the max HobLength is 0xFFF8.
447 
448   @param  Guid          The GUID to tag the customized HOB.
449   @param  Data          The data to be copied into the data field of the GUID HOB.
450   @param  DataLength    The size of the data payload for the GUID HOB.
451 
452   @retval  NULL         The GUID HOB could not be allocated.
453   @retval  others       The start address of GUID HOB data.
454 
455 **/
456 VOID *
457 EFIAPI
BuildGuidDataHob(IN CONST EFI_GUID * Guid,IN VOID * Data,IN UINTN DataLength)458 BuildGuidDataHob (
459   IN CONST EFI_GUID              *Guid,
460   IN VOID                        *Data,
461   IN UINTN                       DataLength
462   )
463 {
464   VOID  *HobData;
465 
466   ASSERT (Data != NULL || DataLength == 0);
467 
468   HobData = BuildGuidHob (Guid, DataLength);
469   if (HobData == NULL) {
470     return HobData;
471   }
472 
473   return CopyMem (HobData, Data, DataLength);
474 }
475 
476 /**
477   Check FV alignment.
478 
479   @param  BaseAddress   The base address of the Firmware Volume.
480   @param  Length        The size of the Firmware Volume in bytes.
481 
482   @retval TRUE          FvImage buffer is at its required alignment.
483   @retval FALSE         FvImage buffer is not at its required alignment.
484 
485 **/
486 BOOLEAN
InternalCheckFvAlignment(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length)487 InternalCheckFvAlignment (
488   IN EFI_PHYSICAL_ADDRESS       BaseAddress,
489   IN UINT64                     Length
490   )
491 {
492   EFI_FIRMWARE_VOLUME_HEADER    *FwVolHeader;
493   UINT32                        FvAlignment;
494 
495   FvAlignment = 0;
496   FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) BaseAddress;
497 
498   //
499   // If EFI_FVB2_WEAK_ALIGNMENT is set in the volume header then the first byte of the volume
500   // can be aligned on any power-of-two boundary. A weakly aligned volume can not be moved from
501   // its initial linked location and maintain its alignment.
502   //
503   if ((FwVolHeader->Attributes & EFI_FVB2_WEAK_ALIGNMENT) != EFI_FVB2_WEAK_ALIGNMENT) {
504     //
505     // Get FvHeader alignment
506     //
507     FvAlignment = 1 << ((FwVolHeader->Attributes & EFI_FVB2_ALIGNMENT) >> 16);
508     //
509     // FvAlignment must be greater than or equal to 8 bytes of the minimum FFS alignment value.
510     //
511     if (FvAlignment < 8) {
512       FvAlignment = 8;
513     }
514     if ((UINTN)BaseAddress % FvAlignment != 0) {
515       //
516       // FvImage buffer is not at its required alignment.
517       //
518       DEBUG ((
519         DEBUG_ERROR,
520         "Unaligned FvImage found at 0x%lx:0x%lx, the required alignment is 0x%x\n",
521         BaseAddress,
522         Length,
523         FvAlignment
524         ));
525       return FALSE;
526     }
527   }
528 
529   return TRUE;
530 }
531 
532 /**
533   Builds a Firmware Volume HOB.
534 
535   This function builds a Firmware Volume HOB.
536   It can only be invoked during PEI phase;
537   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
538 
539   If there is no additional space for HOB creation, then ASSERT().
540   If the FvImage buffer is not at its required alignment, then ASSERT().
541 
542   @param  BaseAddress   The base address of the Firmware Volume.
543   @param  Length        The size of the Firmware Volume in bytes.
544 
545 **/
546 VOID
547 EFIAPI
BuildFvHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length)548 BuildFvHob (
549   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
550   IN UINT64                      Length
551   )
552 {
553   EFI_HOB_FIRMWARE_VOLUME  *Hob;
554 
555   if (!InternalCheckFvAlignment (BaseAddress, Length)) {
556     ASSERT (FALSE);
557     return;
558   }
559 
560   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_FV, (UINT16) sizeof (EFI_HOB_FIRMWARE_VOLUME));
561   if (Hob == NULL) {
562     return;
563   }
564 
565   Hob->BaseAddress = BaseAddress;
566   Hob->Length      = Length;
567 }
568 
569 /**
570   Builds a EFI_HOB_TYPE_FV2 HOB.
571 
572   This function builds a EFI_HOB_TYPE_FV2 HOB.
573   It can only be invoked during PEI phase;
574   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
575 
576   If there is no additional space for HOB creation, then ASSERT().
577   If the FvImage buffer is not at its required alignment, then ASSERT().
578 
579   @param  BaseAddress   The base address of the Firmware Volume.
580   @param  Length        The size of the Firmware Volume in bytes.
581   @param  FvName        The name of the Firmware Volume.
582   @param  FileName      The name of the file.
583 
584 **/
585 VOID
586 EFIAPI
BuildFv2Hob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length,IN CONST EFI_GUID * FvName,IN CONST EFI_GUID * FileName)587 BuildFv2Hob (
588   IN          EFI_PHYSICAL_ADDRESS        BaseAddress,
589   IN          UINT64                      Length,
590   IN CONST    EFI_GUID                    *FvName,
591   IN CONST    EFI_GUID                    *FileName
592   )
593 {
594   EFI_HOB_FIRMWARE_VOLUME2  *Hob;
595 
596   if (!InternalCheckFvAlignment (BaseAddress, Length)) {
597     ASSERT (FALSE);
598     return;
599   }
600 
601   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_FV2, (UINT16) sizeof (EFI_HOB_FIRMWARE_VOLUME2));
602   if (Hob == NULL) {
603     return;
604   }
605 
606   Hob->BaseAddress = BaseAddress;
607   Hob->Length      = Length;
608   CopyGuid (&Hob->FvName, FvName);
609   CopyGuid (&Hob->FileName, FileName);
610 }
611 
612 /**
613   Builds a Capsule Volume HOB.
614 
615   This function builds a Capsule Volume HOB.
616   It can only be invoked during PEI phase;
617   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
618 
619   If the platform does not support Capsule Volume HOBs, then ASSERT().
620   If there is no additional space for HOB creation, then ASSERT().
621 
622   @param  BaseAddress   The base address of the Capsule Volume.
623   @param  Length        The size of the Capsule Volume in bytes.
624 
625 **/
626 VOID
627 EFIAPI
BuildCvHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length)628 BuildCvHob (
629   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
630   IN UINT64                      Length
631   )
632 {
633   EFI_HOB_UEFI_CAPSULE  *Hob;
634 
635   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_UEFI_CAPSULE, (UINT16) sizeof (EFI_HOB_UEFI_CAPSULE));
636   if (Hob == NULL) {
637     return;
638   }
639 
640   Hob->BaseAddress  = BaseAddress;
641   Hob->Length       = Length;
642 }
643 
644 /**
645   Builds a HOB for the CPU.
646 
647   This function builds a HOB for the CPU.
648   It can only be invoked during PEI phase;
649   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
650 
651   If there is no additional space for HOB creation, then ASSERT().
652 
653   @param  SizeOfMemorySpace   The maximum physical memory addressability of the processor.
654   @param  SizeOfIoSpace       The maximum physical I/O addressability of the processor.
655 
656 **/
657 VOID
658 EFIAPI
BuildCpuHob(IN UINT8 SizeOfMemorySpace,IN UINT8 SizeOfIoSpace)659 BuildCpuHob (
660   IN UINT8                       SizeOfMemorySpace,
661   IN UINT8                       SizeOfIoSpace
662   )
663 {
664   EFI_HOB_CPU  *Hob;
665 
666   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_CPU, (UINT16) sizeof (EFI_HOB_CPU));
667   if (Hob == NULL) {
668     return;
669   }
670 
671   Hob->SizeOfMemorySpace = SizeOfMemorySpace;
672   Hob->SizeOfIoSpace     = SizeOfIoSpace;
673 
674   //
675   // Zero the reserved space to match HOB spec
676   //
677   ZeroMem (Hob->Reserved, sizeof (Hob->Reserved));
678 }
679 
680 /**
681   Builds a HOB for the Stack.
682 
683   This function builds a HOB for the stack.
684   It can only be invoked during PEI phase;
685   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
686 
687   If there is no additional space for HOB creation, then ASSERT().
688 
689   @param  BaseAddress   The 64 bit physical address of the Stack.
690   @param  Length        The length of the stack in bytes.
691 
692 **/
693 VOID
694 EFIAPI
BuildStackHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length)695 BuildStackHob (
696   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
697   IN UINT64                      Length
698   )
699 {
700   EFI_HOB_MEMORY_ALLOCATION_STACK  *Hob;
701 
702   ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
703           ((Length & (EFI_PAGE_SIZE - 1)) == 0));
704 
705   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK));
706   if (Hob == NULL) {
707     return;
708   }
709 
710   CopyGuid (&(Hob->AllocDescriptor.Name), &gEfiHobMemoryAllocStackGuid);
711   Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;
712   Hob->AllocDescriptor.MemoryLength      = Length;
713   Hob->AllocDescriptor.MemoryType        = EfiBootServicesData;
714 
715   //
716   // Zero the reserved space to match HOB spec
717   //
718   ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
719 }
720 
721 /**
722   Builds a HOB for the BSP store.
723 
724   This function builds a HOB for BSP store.
725   It can only be invoked during PEI phase;
726   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
727 
728   If there is no additional space for HOB creation, then ASSERT().
729 
730   @param  BaseAddress   The 64 bit physical address of the BSP.
731   @param  Length        The length of the BSP store in bytes.
732   @param  MemoryType    The type of memory allocated by this HOB.
733 
734 **/
735 VOID
736 EFIAPI
BuildBspStoreHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length,IN EFI_MEMORY_TYPE MemoryType)737 BuildBspStoreHob (
738   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
739   IN UINT64                      Length,
740   IN EFI_MEMORY_TYPE             MemoryType
741   )
742 {
743   EFI_HOB_MEMORY_ALLOCATION_BSP_STORE  *Hob;
744 
745   ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
746           ((Length & (EFI_PAGE_SIZE - 1)) == 0));
747 
748   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION_BSP_STORE));
749   if (Hob == NULL) {
750     return;
751   }
752 
753   CopyGuid (&(Hob->AllocDescriptor.Name), &gEfiHobMemoryAllocBspStoreGuid);
754   Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;
755   Hob->AllocDescriptor.MemoryLength      = Length;
756   Hob->AllocDescriptor.MemoryType        = MemoryType;
757 
758   //
759   // Zero the reserved space to match HOB spec
760   //
761   ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
762 }
763 
764 /**
765   Builds a HOB for the memory allocation.
766 
767   This function builds a HOB for the memory allocation.
768   It can only be invoked during PEI phase;
769   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
770 
771   If there is no additional space for HOB creation, then ASSERT().
772 
773   @param  BaseAddress   The 64 bit physical address of the memory.
774   @param  Length        The length of the memory allocation in bytes.
775   @param  MemoryType    The type of memory allocated by this HOB.
776 
777 **/
778 VOID
779 EFIAPI
BuildMemoryAllocationHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length,IN EFI_MEMORY_TYPE MemoryType)780 BuildMemoryAllocationHob (
781   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
782   IN UINT64                      Length,
783   IN EFI_MEMORY_TYPE             MemoryType
784   )
785 {
786   EFI_HOB_MEMORY_ALLOCATION  *Hob;
787 
788   ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
789           ((Length & (EFI_PAGE_SIZE - 1)) == 0));
790 
791   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION));
792   if (Hob == NULL) {
793     return;
794   }
795 
796   ZeroMem (&(Hob->AllocDescriptor.Name), sizeof (EFI_GUID));
797   Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;
798   Hob->AllocDescriptor.MemoryLength      = Length;
799   Hob->AllocDescriptor.MemoryType        = MemoryType;
800   //
801   // Zero the reserved space to match HOB spec
802   //
803   ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
804 }
805