• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Provide Hob Library functions for Pei phase.
3 
4 Copyright (c) 2007 - 2014, 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   Builds a Firmware Volume HOB.
478 
479   This function builds a Firmware Volume HOB.
480   It can only be invoked during PEI phase;
481   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
482 
483   If there is no additional space for HOB creation, then ASSERT().
484 
485   @param  BaseAddress   The base address of the Firmware Volume.
486   @param  Length        The size of the Firmware Volume in bytes.
487 
488 **/
489 VOID
490 EFIAPI
BuildFvHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length)491 BuildFvHob (
492   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
493   IN UINT64                      Length
494   )
495 {
496   EFI_HOB_FIRMWARE_VOLUME  *Hob;
497 
498   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_FV, (UINT16) sizeof (EFI_HOB_FIRMWARE_VOLUME));
499   if (Hob == NULL) {
500     return;
501   }
502 
503   Hob->BaseAddress = BaseAddress;
504   Hob->Length      = Length;
505 }
506 
507 /**
508   Builds a EFI_HOB_TYPE_FV2 HOB.
509 
510   This function builds a EFI_HOB_TYPE_FV2 HOB.
511   It can only be invoked during PEI phase;
512   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
513 
514   If there is no additional space for HOB creation, then ASSERT().
515 
516   @param  BaseAddress   The base address of the Firmware Volume.
517   @param  Length        The size of the Firmware Volume in bytes.
518   @param  FvName        The name of the Firmware Volume.
519   @param  FileName      The name of the file.
520 
521 **/
522 VOID
523 EFIAPI
BuildFv2Hob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length,IN CONST EFI_GUID * FvName,IN CONST EFI_GUID * FileName)524 BuildFv2Hob (
525   IN          EFI_PHYSICAL_ADDRESS        BaseAddress,
526   IN          UINT64                      Length,
527   IN CONST    EFI_GUID                    *FvName,
528   IN CONST    EFI_GUID                    *FileName
529   )
530 {
531   EFI_HOB_FIRMWARE_VOLUME2  *Hob;
532 
533   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_FV2, (UINT16) sizeof (EFI_HOB_FIRMWARE_VOLUME2));
534   if (Hob == NULL) {
535     return;
536   }
537 
538   Hob->BaseAddress = BaseAddress;
539   Hob->Length      = Length;
540   CopyGuid (&Hob->FvName, FvName);
541   CopyGuid (&Hob->FileName, FileName);
542 }
543 
544 /**
545   Builds a Capsule Volume HOB.
546 
547   This function builds a Capsule Volume HOB.
548   It can only be invoked during PEI phase;
549   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
550 
551   If the platform does not support Capsule Volume HOBs, then ASSERT().
552   If there is no additional space for HOB creation, then ASSERT().
553 
554   @param  BaseAddress   The base address of the Capsule Volume.
555   @param  Length        The size of the Capsule Volume in bytes.
556 
557 **/
558 VOID
559 EFIAPI
BuildCvHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length)560 BuildCvHob (
561   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
562   IN UINT64                      Length
563   )
564 {
565   EFI_HOB_UEFI_CAPSULE  *Hob;
566 
567   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_UEFI_CAPSULE, (UINT16) sizeof (EFI_HOB_UEFI_CAPSULE));
568   if (Hob == NULL) {
569     return;
570   }
571 
572   Hob->BaseAddress  = BaseAddress;
573   Hob->Length       = Length;
574 }
575 
576 /**
577   Builds a HOB for the CPU.
578 
579   This function builds a HOB for the CPU.
580   It can only be invoked during PEI phase;
581   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
582 
583   If there is no additional space for HOB creation, then ASSERT().
584 
585   @param  SizeOfMemorySpace   The maximum physical memory addressability of the processor.
586   @param  SizeOfIoSpace       The maximum physical I/O addressability of the processor.
587 
588 **/
589 VOID
590 EFIAPI
BuildCpuHob(IN UINT8 SizeOfMemorySpace,IN UINT8 SizeOfIoSpace)591 BuildCpuHob (
592   IN UINT8                       SizeOfMemorySpace,
593   IN UINT8                       SizeOfIoSpace
594   )
595 {
596   EFI_HOB_CPU  *Hob;
597 
598   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_CPU, (UINT16) sizeof (EFI_HOB_CPU));
599   if (Hob == NULL) {
600     return;
601   }
602 
603   Hob->SizeOfMemorySpace = SizeOfMemorySpace;
604   Hob->SizeOfIoSpace     = SizeOfIoSpace;
605 
606   //
607   // Zero the reserved space to match HOB spec
608   //
609   ZeroMem (Hob->Reserved, sizeof (Hob->Reserved));
610 }
611 
612 /**
613   Builds a HOB for the Stack.
614 
615   This function builds a HOB for the stack.
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 there is no additional space for HOB creation, then ASSERT().
620 
621   @param  BaseAddress   The 64 bit physical address of the Stack.
622   @param  Length        The length of the stack in bytes.
623 
624 **/
625 VOID
626 EFIAPI
BuildStackHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length)627 BuildStackHob (
628   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
629   IN UINT64                      Length
630   )
631 {
632   EFI_HOB_MEMORY_ALLOCATION_STACK  *Hob;
633 
634   ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
635           ((Length & (EFI_PAGE_SIZE - 1)) == 0));
636 
637   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK));
638   if (Hob == NULL) {
639     return;
640   }
641 
642   CopyGuid (&(Hob->AllocDescriptor.Name), &gEfiHobMemoryAllocStackGuid);
643   Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;
644   Hob->AllocDescriptor.MemoryLength      = Length;
645   Hob->AllocDescriptor.MemoryType        = EfiBootServicesData;
646 
647   //
648   // Zero the reserved space to match HOB spec
649   //
650   ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
651 }
652 
653 /**
654   Builds a HOB for the BSP store.
655 
656   This function builds a HOB for BSP store.
657   It can only be invoked during PEI phase;
658   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
659 
660   If there is no additional space for HOB creation, then ASSERT().
661 
662   @param  BaseAddress   The 64 bit physical address of the BSP.
663   @param  Length        The length of the BSP store in bytes.
664   @param  MemoryType    The type of memory allocated by this HOB.
665 
666 **/
667 VOID
668 EFIAPI
BuildBspStoreHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length,IN EFI_MEMORY_TYPE MemoryType)669 BuildBspStoreHob (
670   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
671   IN UINT64                      Length,
672   IN EFI_MEMORY_TYPE             MemoryType
673   )
674 {
675   EFI_HOB_MEMORY_ALLOCATION_BSP_STORE  *Hob;
676 
677   ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
678           ((Length & (EFI_PAGE_SIZE - 1)) == 0));
679 
680   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION_BSP_STORE));
681   if (Hob == NULL) {
682     return;
683   }
684 
685   CopyGuid (&(Hob->AllocDescriptor.Name), &gEfiHobMemoryAllocBspStoreGuid);
686   Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;
687   Hob->AllocDescriptor.MemoryLength      = Length;
688   Hob->AllocDescriptor.MemoryType        = MemoryType;
689 
690   //
691   // Zero the reserved space to match HOB spec
692   //
693   ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
694 }
695 
696 /**
697   Builds a HOB for the memory allocation.
698 
699   This function builds a HOB for the memory allocation.
700   It can only be invoked during PEI phase;
701   for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.
702 
703   If there is no additional space for HOB creation, then ASSERT().
704 
705   @param  BaseAddress   The 64 bit physical address of the memory.
706   @param  Length        The length of the memory allocation in bytes.
707   @param  MemoryType    The type of memory allocated by this HOB.
708 
709 **/
710 VOID
711 EFIAPI
BuildMemoryAllocationHob(IN EFI_PHYSICAL_ADDRESS BaseAddress,IN UINT64 Length,IN EFI_MEMORY_TYPE MemoryType)712 BuildMemoryAllocationHob (
713   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
714   IN UINT64                      Length,
715   IN EFI_MEMORY_TYPE             MemoryType
716   )
717 {
718   EFI_HOB_MEMORY_ALLOCATION  *Hob;
719 
720   ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&
721           ((Length & (EFI_PAGE_SIZE - 1)) == 0));
722 
723   Hob = InternalPeiCreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, (UINT16) sizeof (EFI_HOB_MEMORY_ALLOCATION));
724   if (Hob == NULL) {
725     return;
726   }
727 
728   ZeroMem (&(Hob->AllocDescriptor.Name), sizeof (EFI_GUID));
729   Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;
730   Hob->AllocDescriptor.MemoryLength      = Length;
731   Hob->AllocDescriptor.MemoryType        = MemoryType;
732   //
733   // Zero the reserved space to match HOB spec
734   //
735   ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));
736 }
737