/src/edk2/MdePkg/Library/PeiServicesLib/PeiServicesLib.c
Line | Count | Source |
1 | | /** @file |
2 | | Implementation for PEI Services Library. |
3 | | |
4 | | Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR> |
5 | | SPDX-License-Identifier: BSD-2-Clause-Patent |
6 | | |
7 | | **/ |
8 | | |
9 | | #include <PiPei.h> |
10 | | |
11 | | #include <Ppi/FirmwareVolumeInfo.h> |
12 | | #include <Ppi/FirmwareVolumeInfo2.h> |
13 | | #include <Guid/FirmwareFileSystem2.h> |
14 | | |
15 | | #include <Library/PeiServicesLib.h> |
16 | | #include <Library/PeiServicesTablePointerLib.h> |
17 | | #include <Library/DebugLib.h> |
18 | | #include <Library/MemoryAllocationLib.h> |
19 | | #include <Library/BaseMemoryLib.h> |
20 | | |
21 | | /** |
22 | | This service enables a given PEIM to register an interface into the PEI Foundation. |
23 | | |
24 | | @param PpiList A pointer to the list of interfaces that the caller shall install. |
25 | | |
26 | | @retval EFI_SUCCESS The interface was successfully installed. |
27 | | @retval EFI_INVALID_PARAMETER The PpiList pointer is NULL. |
28 | | @retval EFI_INVALID_PARAMETER Any of the PEI PPI descriptors in the list do not have the |
29 | | EFI_PEI_PPI_DESCRIPTOR_PPI bit set in the Flags field. |
30 | | @retval EFI_OUT_OF_RESOURCES There is no additional space in the PPI database. |
31 | | |
32 | | **/ |
33 | | EFI_STATUS |
34 | | EFIAPI |
35 | | PeiServicesInstallPpi ( |
36 | | IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList |
37 | | ) |
38 | 0 | { |
39 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
40 | |
|
41 | 0 | PeiServices = GetPeiServicesTablePointer (); |
42 | 0 | return (*PeiServices)->InstallPpi (PeiServices, PpiList); |
43 | 0 | } |
44 | | |
45 | | /** |
46 | | This service enables PEIMs to replace an entry in the PPI database with an alternate entry. |
47 | | |
48 | | @param OldPpi The pointer to the old PEI PPI Descriptors. |
49 | | @param NewPpi The pointer to the new PEI PPI Descriptors. |
50 | | |
51 | | @retval EFI_SUCCESS The interface was successfully installed. |
52 | | @retval EFI_INVALID_PARAMETER The OldPpi or NewPpi is NULL. |
53 | | @retval EFI_INVALID_PARAMETER Any of the PEI PPI descriptors in the list do not have the |
54 | | EFI_PEI_PPI_DESCRIPTOR_PPI bit set in the Flags field. |
55 | | @retval EFI_OUT_OF_RESOURCES There is no additional space in the PPI database. |
56 | | @retval EFI_NOT_FOUND The PPI for which the reinstallation was requested has not been |
57 | | installed. |
58 | | |
59 | | **/ |
60 | | EFI_STATUS |
61 | | EFIAPI |
62 | | PeiServicesReInstallPpi ( |
63 | | IN CONST EFI_PEI_PPI_DESCRIPTOR *OldPpi, |
64 | | IN CONST EFI_PEI_PPI_DESCRIPTOR *NewPpi |
65 | | ) |
66 | 0 | { |
67 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
68 | |
|
69 | 0 | PeiServices = GetPeiServicesTablePointer (); |
70 | 0 | return (*PeiServices)->ReInstallPpi (PeiServices, OldPpi, NewPpi); |
71 | 0 | } |
72 | | |
73 | | /** |
74 | | This service enables PEIMs to discover a given instance of an interface. |
75 | | |
76 | | @param Guid A pointer to the GUID whose corresponding interface needs to be |
77 | | found. |
78 | | @param Instance The N-th instance of the interface that is required. |
79 | | @param PpiDescriptor A pointer to instance of the EFI_PEI_PPI_DESCRIPTOR. |
80 | | @param Ppi A pointer to the instance of the interface. |
81 | | |
82 | | @retval EFI_SUCCESS The interface was successfully returned. |
83 | | @retval EFI_NOT_FOUND The PPI descriptor is not found in the database. |
84 | | |
85 | | **/ |
86 | | EFI_STATUS |
87 | | EFIAPI |
88 | | PeiServicesLocatePpi ( |
89 | | IN CONST EFI_GUID *Guid, |
90 | | IN UINTN Instance, |
91 | | IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor OPTIONAL, |
92 | | IN OUT VOID **Ppi |
93 | | ) |
94 | 0 | { |
95 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
96 | |
|
97 | 0 | PeiServices = GetPeiServicesTablePointer (); |
98 | 0 | return (*PeiServices)->LocatePpi (PeiServices, Guid, Instance, PpiDescriptor, Ppi); |
99 | 0 | } |
100 | | |
101 | | /** |
102 | | This service enables PEIMs to register a given service to be invoked when another service is |
103 | | installed or reinstalled. |
104 | | |
105 | | @param NotifyList A pointer to the list of notification interfaces |
106 | | that the caller shall install. |
107 | | |
108 | | @retval EFI_SUCCESS The interface was successfully installed. |
109 | | @retval EFI_INVALID_PARAMETER The NotifyList pointer is NULL. |
110 | | @retval EFI_INVALID_PARAMETER Any of the PEI notify descriptors in the list do |
111 | | not have the EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES |
112 | | bit set in the Flags field. |
113 | | @retval EFI_OUT_OF_RESOURCES There is no additional space in the PPI database. |
114 | | |
115 | | **/ |
116 | | EFI_STATUS |
117 | | EFIAPI |
118 | | PeiServicesNotifyPpi ( |
119 | | IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList |
120 | | ) |
121 | 0 | { |
122 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
123 | |
|
124 | 0 | PeiServices = GetPeiServicesTablePointer (); |
125 | 0 | return (*PeiServices)->NotifyPpi (PeiServices, NotifyList); |
126 | 0 | } |
127 | | |
128 | | /** |
129 | | This service enables PEIMs to ascertain the present value of the boot mode. |
130 | | |
131 | | @param BootMode A pointer to contain the value of the boot mode. |
132 | | |
133 | | @retval EFI_SUCCESS The boot mode was returned successfully. |
134 | | @retval EFI_INVALID_PARAMETER BootMode is NULL. |
135 | | |
136 | | **/ |
137 | | EFI_STATUS |
138 | | EFIAPI |
139 | | PeiServicesGetBootMode ( |
140 | | OUT EFI_BOOT_MODE *BootMode |
141 | | ) |
142 | 0 | { |
143 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
144 | |
|
145 | 0 | PeiServices = GetPeiServicesTablePointer (); |
146 | 0 | return (*PeiServices)->GetBootMode (PeiServices, BootMode); |
147 | 0 | } |
148 | | |
149 | | /** |
150 | | This service enables PEIMs to update the boot mode variable. |
151 | | |
152 | | @param BootMode The value of the boot mode to set. |
153 | | |
154 | | @retval EFI_SUCCESS The value was successfully updated |
155 | | |
156 | | **/ |
157 | | EFI_STATUS |
158 | | EFIAPI |
159 | | PeiServicesSetBootMode ( |
160 | | IN EFI_BOOT_MODE BootMode |
161 | | ) |
162 | 0 | { |
163 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
164 | |
|
165 | 0 | PeiServices = GetPeiServicesTablePointer (); |
166 | 0 | return (*PeiServices)->SetBootMode (PeiServices, BootMode); |
167 | 0 | } |
168 | | |
169 | | /** |
170 | | This service enables a PEIM to ascertain the address of the list of HOBs in memory. |
171 | | |
172 | | @param HobList A pointer to the list of HOBs that the PEI Foundation |
173 | | will initialize. |
174 | | |
175 | | @retval EFI_SUCCESS The list was successfully returned. |
176 | | @retval EFI_NOT_AVAILABLE_YET The HOB list is not yet published. |
177 | | |
178 | | **/ |
179 | | EFI_STATUS |
180 | | EFIAPI |
181 | | PeiServicesGetHobList ( |
182 | | OUT VOID **HobList |
183 | | ) |
184 | 0 | { |
185 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
186 | |
|
187 | 0 | PeiServices = GetPeiServicesTablePointer (); |
188 | 0 | return (*PeiServices)->GetHobList (PeiServices, HobList); |
189 | 0 | } |
190 | | |
191 | | /** |
192 | | This service enables PEIMs to create various types of HOBs. |
193 | | |
194 | | @param Type The type of HOB to be installed. |
195 | | @param Length The length of the HOB to be added. |
196 | | @param Hob The address of a pointer that will contain the |
197 | | HOB header. |
198 | | |
199 | | @retval EFI_SUCCESS The HOB was successfully created. |
200 | | @retval EFI_OUT_OF_RESOURCES There is no additional space for HOB creation. |
201 | | |
202 | | **/ |
203 | | EFI_STATUS |
204 | | EFIAPI |
205 | | PeiServicesCreateHob ( |
206 | | IN UINT16 Type, |
207 | | IN UINT16 Length, |
208 | | OUT VOID **Hob |
209 | | ) |
210 | 0 | { |
211 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
212 | |
|
213 | 0 | PeiServices = GetPeiServicesTablePointer (); |
214 | 0 | return (*PeiServices)->CreateHob (PeiServices, Type, Length, Hob); |
215 | 0 | } |
216 | | |
217 | | /** |
218 | | This service enables PEIMs to discover additional firmware volumes. |
219 | | |
220 | | @param Instance This instance of the firmware volume to find. The |
221 | | value 0 is the Boot Firmware Volume (BFV). |
222 | | @param VolumeHandle Handle of the firmware volume header of the volume |
223 | | to return. |
224 | | |
225 | | @retval EFI_SUCCESS The volume was found. |
226 | | @retval EFI_NOT_FOUND The volume was not found. |
227 | | @retval EFI_INVALID_PARAMETER FwVolHeader is NULL. |
228 | | |
229 | | **/ |
230 | | EFI_STATUS |
231 | | EFIAPI |
232 | | PeiServicesFfsFindNextVolume ( |
233 | | IN UINTN Instance, |
234 | | IN OUT EFI_PEI_FV_HANDLE *VolumeHandle |
235 | | ) |
236 | 0 | { |
237 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
238 | |
|
239 | 0 | PeiServices = GetPeiServicesTablePointer (); |
240 | 0 | return (*PeiServices)->FfsFindNextVolume (PeiServices, Instance, VolumeHandle); |
241 | 0 | } |
242 | | |
243 | | /** |
244 | | This service enables PEIMs to discover additional firmware files. |
245 | | |
246 | | @param SearchType A filter to find files only of this type. |
247 | | @param VolumeHandle The pointer to the firmware volume header of the |
248 | | volume to search. This parameter must point to a |
249 | | valid FFS volume. |
250 | | @param FileHandle Handle of the current file from which to begin searching. |
251 | | |
252 | | @retval EFI_SUCCESS The file was found. |
253 | | @retval EFI_NOT_FOUND The file was not found. |
254 | | @retval EFI_NOT_FOUND The header checksum was not zero. |
255 | | |
256 | | **/ |
257 | | EFI_STATUS |
258 | | EFIAPI |
259 | | PeiServicesFfsFindNextFile ( |
260 | | IN EFI_FV_FILETYPE SearchType, |
261 | | IN EFI_PEI_FV_HANDLE VolumeHandle, |
262 | | IN OUT EFI_PEI_FILE_HANDLE *FileHandle |
263 | | ) |
264 | 0 | { |
265 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
266 | |
|
267 | 0 | PeiServices = GetPeiServicesTablePointer (); |
268 | 0 | return (*PeiServices)->FfsFindNextFile (PeiServices, SearchType, VolumeHandle, FileHandle); |
269 | 0 | } |
270 | | |
271 | | /** |
272 | | This service enables PEIMs to discover sections of a given type within a valid FFS file. |
273 | | |
274 | | @param SectionType The value of the section type to find. |
275 | | @param FileHandle A pointer to the file header that contains the set |
276 | | of sections to be searched. |
277 | | @param SectionData A pointer to the discovered section, if successful. |
278 | | |
279 | | @retval EFI_SUCCESS The section was found. |
280 | | @retval EFI_NOT_FOUND The section was not found. |
281 | | |
282 | | **/ |
283 | | EFI_STATUS |
284 | | EFIAPI |
285 | | PeiServicesFfsFindSectionData ( |
286 | | IN EFI_SECTION_TYPE SectionType, |
287 | | IN EFI_PEI_FILE_HANDLE FileHandle, |
288 | | OUT VOID **SectionData |
289 | | ) |
290 | 0 | { |
291 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
292 | |
|
293 | 0 | PeiServices = GetPeiServicesTablePointer (); |
294 | 0 | return (*PeiServices)->FfsFindSectionData (PeiServices, SectionType, FileHandle, SectionData); |
295 | 0 | } |
296 | | |
297 | | /** |
298 | | This service enables PEIMs to discover sections of a given instance and type within a valid FFS file. |
299 | | |
300 | | @param SectionType The value of the section type to find. |
301 | | @param SectionInstance Section instance to find. |
302 | | @param FileHandle A pointer to the file header that contains the set |
303 | | of sections to be searched. |
304 | | @param SectionData A pointer to the discovered section, if successful. |
305 | | @param AuthenticationStatus A pointer to the authentication status for this section. |
306 | | |
307 | | @retval EFI_SUCCESS The section was found. |
308 | | @retval EFI_NOT_FOUND The section was not found. |
309 | | |
310 | | **/ |
311 | | EFI_STATUS |
312 | | EFIAPI |
313 | | PeiServicesFfsFindSectionData3 ( |
314 | | IN EFI_SECTION_TYPE SectionType, |
315 | | IN UINTN SectionInstance, |
316 | | IN EFI_PEI_FILE_HANDLE FileHandle, |
317 | | OUT VOID **SectionData, |
318 | | OUT UINT32 *AuthenticationStatus |
319 | | ) |
320 | 0 | { |
321 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
322 | |
|
323 | 0 | PeiServices = GetPeiServicesTablePointer (); |
324 | 0 | return (*PeiServices)->FindSectionData3 (PeiServices, SectionType, SectionInstance, FileHandle, SectionData, AuthenticationStatus); |
325 | 0 | } |
326 | | |
327 | | /** |
328 | | This service enables PEIMs to register the permanent memory configuration |
329 | | that has been initialized with the PEI Foundation. |
330 | | |
331 | | @param MemoryBegin The value of a region of installed memory. |
332 | | @param MemoryLength The corresponding length of a region of installed memory. |
333 | | |
334 | | @retval EFI_SUCCESS The region was successfully installed in a HOB. |
335 | | @retval EFI_INVALID_PARAMETER MemoryBegin and MemoryLength are illegal for this system. |
336 | | @retval EFI_OUT_OF_RESOURCES There is no additional space for HOB creation. |
337 | | |
338 | | **/ |
339 | | EFI_STATUS |
340 | | EFIAPI |
341 | | PeiServicesInstallPeiMemory ( |
342 | | IN EFI_PHYSICAL_ADDRESS MemoryBegin, |
343 | | IN UINT64 MemoryLength |
344 | | ) |
345 | 0 | { |
346 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
347 | |
|
348 | 0 | PeiServices = GetPeiServicesTablePointer (); |
349 | 0 | return (*PeiServices)->InstallPeiMemory (PeiServices, MemoryBegin, MemoryLength); |
350 | 0 | } |
351 | | |
352 | | /** |
353 | | This service enables PEIMs to allocate memory. |
354 | | |
355 | | @param MemoryType Type of memory to allocate. |
356 | | @param Pages The number of pages to allocate. |
357 | | @param Memory Pointer of memory allocated. |
358 | | |
359 | | @retval EFI_SUCCESS The memory range was successfully allocated. |
360 | | @retval EFI_INVALID_PARAMETER Type is not equal to EfiLoaderCode, EfiLoaderData, EfiRuntimeServicesCode, |
361 | | EfiRuntimeServicesData, EfiBootServicesCode, EfiBootServicesData, |
362 | | EfiACPIReclaimMemory, EfiReservedMemoryType, or EfiACPIMemoryNVS. |
363 | | @retval EFI_OUT_OF_RESOURCES The pages could not be allocated. |
364 | | |
365 | | **/ |
366 | | EFI_STATUS |
367 | | EFIAPI |
368 | | PeiServicesAllocatePages ( |
369 | | IN EFI_MEMORY_TYPE MemoryType, |
370 | | IN UINTN Pages, |
371 | | OUT EFI_PHYSICAL_ADDRESS *Memory |
372 | | ) |
373 | 0 | { |
374 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
375 | |
|
376 | 0 | PeiServices = GetPeiServicesTablePointer (); |
377 | 0 | return (*PeiServices)->AllocatePages (PeiServices, MemoryType, Pages, Memory); |
378 | 0 | } |
379 | | |
380 | | /** |
381 | | This service enables PEIMs to free memory. |
382 | | |
383 | | @param Memory Memory to be freed. |
384 | | @param Pages The number of pages to free. |
385 | | |
386 | | @retval EFI_SUCCESS The requested pages were freed. |
387 | | @retval EFI_INVALID_PARAMETER Memory is not a page-aligned address or Pages is invalid. |
388 | | @retval EFI_NOT_FOUND The requested memory pages were not allocated with |
389 | | AllocatePages(). |
390 | | |
391 | | **/ |
392 | | EFI_STATUS |
393 | | EFIAPI |
394 | | PeiServicesFreePages ( |
395 | | IN EFI_PHYSICAL_ADDRESS Memory, |
396 | | IN UINTN Pages |
397 | | ) |
398 | 0 | { |
399 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
400 | |
|
401 | 0 | PeiServices = GetPeiServicesTablePointer (); |
402 | 0 | return (*PeiServices)->FreePages (PeiServices, Memory, Pages); |
403 | 0 | } |
404 | | |
405 | | /** |
406 | | This service allocates memory from the Hand-Off Block (HOB) heap. |
407 | | |
408 | | @param Size The number of bytes to allocate from the pool. |
409 | | @param Buffer If the call succeeds, a pointer to a pointer to |
410 | | the allocate buffer; otherwise, undefined. |
411 | | |
412 | | @retval EFI_SUCCESS The allocation was successful |
413 | | @retval EFI_OUT_OF_RESOURCES There is not enough heap to allocate the requested size. |
414 | | |
415 | | **/ |
416 | | EFI_STATUS |
417 | | EFIAPI |
418 | | PeiServicesAllocatePool ( |
419 | | IN UINTN Size, |
420 | | OUT VOID **Buffer |
421 | | ) |
422 | 0 | { |
423 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
424 | |
|
425 | 0 | PeiServices = GetPeiServicesTablePointer (); |
426 | 0 | return (*PeiServices)->AllocatePool (PeiServices, Size, Buffer); |
427 | 0 | } |
428 | | |
429 | | /** |
430 | | Resets the entire platform. |
431 | | |
432 | | @retval EFI_SUCCESS The function completed successfully. |
433 | | @retval EFI_NOT_AVAILABLE_YET The service has not been installed yet. |
434 | | |
435 | | **/ |
436 | | EFI_STATUS |
437 | | EFIAPI |
438 | | PeiServicesResetSystem ( |
439 | | VOID |
440 | | ) |
441 | 0 | { |
442 | 0 | CONST EFI_PEI_SERVICES **PeiServices; |
443 | |
|
444 | 0 | PeiServices = GetPeiServicesTablePointer (); |
445 | 0 | return (*PeiServices)->ResetSystem (PeiServices); |
446 | 0 | } |
447 | | |
448 | | /** |
449 | | This service is a wrapper for the PEI Service RegisterForShadow(), except the |
450 | | pointer to the PEI Services Table has been removed. See the Platform |
451 | | Initialization Pre-EFI Initialization Core Interface Specification for details. |
452 | | |
453 | | @param FileHandle PEIM's file handle. Must be the currently |
454 | | executing PEIM. |
455 | | |
456 | | @retval EFI_SUCCESS The PEIM was successfully registered for |
457 | | shadowing. |
458 | | |
459 | | @retval EFI_ALREADY_STARTED The PEIM was previously |
460 | | registered for shadowing. |
461 | | |
462 | | @retval EFI_NOT_FOUND The FileHandle does not refer to a |
463 | | valid file handle. |
464 | | **/ |
465 | | EFI_STATUS |
466 | | EFIAPI |
467 | | PeiServicesRegisterForShadow ( |
468 | | IN EFI_PEI_FILE_HANDLE FileHandle |
469 | | ) |
470 | 0 | { |
471 | 0 | return (*GetPeiServicesTablePointer ())->RegisterForShadow (FileHandle); |
472 | 0 | } |
473 | | |
474 | | /** |
475 | | This service is a wrapper for the PEI Service FfsGetFileInfo(), except the pointer to the PEI Services |
476 | | Table has been removed. See the Platform Initialization Pre-EFI Initialization Core Interface |
477 | | Specification for details. |
478 | | |
479 | | @param FileHandle The handle of the file. |
480 | | |
481 | | @param FileInfo Upon exit, points to the file's |
482 | | information. |
483 | | |
484 | | @retval EFI_SUCCESS File information returned. |
485 | | |
486 | | @retval EFI_INVALID_PARAMETER If FileHandle does not |
487 | | represent a valid file. |
488 | | |
489 | | @retval EFI_INVALID_PARAMETER FileInfo is NULL. |
490 | | |
491 | | **/ |
492 | | EFI_STATUS |
493 | | EFIAPI |
494 | | PeiServicesFfsGetFileInfo ( |
495 | | IN CONST EFI_PEI_FILE_HANDLE FileHandle, |
496 | | OUT EFI_FV_FILE_INFO *FileInfo |
497 | | ) |
498 | 0 | { |
499 | 0 | return (*GetPeiServicesTablePointer ())->FfsGetFileInfo (FileHandle, FileInfo); |
500 | 0 | } |
501 | | |
502 | | /** |
503 | | This service is a wrapper for the PEI Service FfsGetFileInfo2(), except the pointer to the PEI Services |
504 | | Table has been removed. See the Platform Initialization Pre-EFI Initialization Core Interface |
505 | | Specification for details. |
506 | | |
507 | | @param FileHandle The handle of the file. |
508 | | @param FileInfo Upon exit, points to the file's |
509 | | information. |
510 | | |
511 | | @retval EFI_SUCCESS File information returned. |
512 | | @retval EFI_INVALID_PARAMETER If FileHandle does not |
513 | | represent a valid file. |
514 | | @retval EFI_INVALID_PARAMETER FileInfo is NULL. |
515 | | |
516 | | **/ |
517 | | EFI_STATUS |
518 | | EFIAPI |
519 | | PeiServicesFfsGetFileInfo2 ( |
520 | | IN CONST EFI_PEI_FILE_HANDLE FileHandle, |
521 | | OUT EFI_FV_FILE_INFO2 *FileInfo |
522 | | ) |
523 | 0 | { |
524 | 0 | return (*GetPeiServicesTablePointer ())->FfsGetFileInfo2 (FileHandle, FileInfo); |
525 | 0 | } |
526 | | |
527 | | /** |
528 | | This service is a wrapper for the PEI Service FfsFindByName(), except the pointer to the PEI Services |
529 | | Table has been removed. See the Platform Initialization Pre-EFI Initialization Core Interface |
530 | | Specification for details. |
531 | | |
532 | | @param FileName A pointer to the name of the file to |
533 | | find within the firmware volume. |
534 | | |
535 | | @param VolumeHandle The firmware volume to search FileHandle |
536 | | Upon exit, points to the found file's |
537 | | handle or NULL if it could not be found. |
538 | | @param FileHandle The pointer to found file handle |
539 | | |
540 | | @retval EFI_SUCCESS File was found. |
541 | | |
542 | | @retval EFI_NOT_FOUND File was not found. |
543 | | |
544 | | @retval EFI_INVALID_PARAMETER VolumeHandle or FileHandle or |
545 | | FileName was NULL. |
546 | | |
547 | | **/ |
548 | | EFI_STATUS |
549 | | EFIAPI |
550 | | PeiServicesFfsFindFileByName ( |
551 | | IN CONST EFI_GUID *FileName, |
552 | | IN CONST EFI_PEI_FV_HANDLE VolumeHandle, |
553 | | OUT EFI_PEI_FILE_HANDLE *FileHandle |
554 | | ) |
555 | 0 | { |
556 | 0 | return (*GetPeiServicesTablePointer ())->FfsFindFileByName (FileName, VolumeHandle, FileHandle); |
557 | 0 | } |
558 | | |
559 | | /** |
560 | | This service is a wrapper for the PEI Service FfsGetVolumeInfo(), except the pointer to the PEI Services |
561 | | Table has been removed. See the Platform Initialization Pre-EFI Initialization Core Interface |
562 | | Specification for details. |
563 | | |
564 | | @param VolumeHandle Handle of the volume. |
565 | | |
566 | | @param VolumeInfo Upon exit, points to the volume's |
567 | | information. |
568 | | |
569 | | @retval EFI_SUCCESS File information returned. |
570 | | |
571 | | @retval EFI_INVALID_PARAMETER If FileHandle does not |
572 | | represent a valid file. |
573 | | |
574 | | @retval EFI_INVALID_PARAMETER If FileInfo is NULL. |
575 | | |
576 | | **/ |
577 | | EFI_STATUS |
578 | | EFIAPI |
579 | | PeiServicesFfsGetVolumeInfo ( |
580 | | IN EFI_PEI_FV_HANDLE VolumeHandle, |
581 | | OUT EFI_FV_INFO *VolumeInfo |
582 | | ) |
583 | 0 | { |
584 | 0 | return (*GetPeiServicesTablePointer ())->FfsGetVolumeInfo (VolumeHandle, VolumeInfo); |
585 | 0 | } |
586 | | |
587 | | /** |
588 | | Install a EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI instance so the PEI Core will be notified about a new firmware volume. |
589 | | |
590 | | This function allocates, initializes, and installs a new EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI using |
591 | | the parameters passed in to initialize the fields of the EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI instance. |
592 | | If the resources can not be allocated for EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI, then ASSERT(). |
593 | | If the EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI can not be installed, then ASSERT(). |
594 | | If NULL is specified for FvFormat, but FvInfo does not have the firmware file system 2 format, then ASSERT. |
595 | | |
596 | | @param InstallFvInfoPpi Install FvInfo Ppi if it is TRUE. Otherwise, install FvInfo2 Ppi. |
597 | | @param FvFormat Unique identifier of the format of the memory-mapped |
598 | | firmware volume. This parameter is optional and |
599 | | may be NULL. If NULL is specified, the |
600 | | EFI_FIRMWARE_FILE_SYSTEM2_GUID format is assumed. |
601 | | @param FvInfo Points to a buffer which allows the |
602 | | EFI_PEI_FIRMWARE_VOLUME_PPI to process the volume. |
603 | | The format of this buffer is specific to the FvFormat. |
604 | | For memory-mapped firmware volumes, this typically |
605 | | points to the first byte of the firmware volume. |
606 | | @param FvInfoSize The size, in bytes, of FvInfo. For memory-mapped |
607 | | firmware volumes, this is typically the size of |
608 | | the firmware volume. |
609 | | @param ParentFvName If the new firmware volume originated from a file |
610 | | in a different firmware volume, then this parameter |
611 | | specifies the GUID name of the originating firmware |
612 | | volume. Otherwise, this parameter must be NULL. |
613 | | @param ParentFileName If the new firmware volume originated from a file |
614 | | in a different firmware volume, then this parameter |
615 | | specifies the GUID file name of the originating |
616 | | firmware file. Otherwise, this parameter must be NULL. |
617 | | @param AuthenticationStatus Authentication Status, it will be ignored if InstallFvInfoPpi is TRUE. |
618 | | **/ |
619 | | VOID |
620 | | EFIAPI |
621 | | InternalPeiServicesInstallFvInfoPpi ( |
622 | | IN BOOLEAN InstallFvInfoPpi, |
623 | | IN CONST EFI_GUID *FvFormat OPTIONAL, |
624 | | IN CONST VOID *FvInfo, |
625 | | IN UINT32 FvInfoSize, |
626 | | IN CONST EFI_GUID *ParentFvName OPTIONAL, |
627 | | IN CONST EFI_GUID *ParentFileName OPTIONAL, |
628 | | IN UINT32 AuthenticationStatus |
629 | | ) |
630 | 0 | { |
631 | 0 | EFI_STATUS Status; |
632 | 0 | EFI_PEI_FIRMWARE_VOLUME_INFO_PPI *FvInfoPpi; |
633 | 0 | EFI_PEI_PPI_DESCRIPTOR *FvInfoPpiDescriptor; |
634 | 0 | EFI_GUID *ParentFvNameValue; |
635 | 0 | EFI_GUID *ParentFileNameValue; |
636 | 0 | EFI_GUID *PpiGuid; |
637 | |
|
638 | 0 | ParentFvNameValue = NULL; |
639 | 0 | ParentFileNameValue = NULL; |
640 | 0 | if (InstallFvInfoPpi) { |
641 | | // |
642 | | // To install FvInfo Ppi. |
643 | | // |
644 | 0 | FvInfoPpi = AllocateZeroPool (sizeof (EFI_PEI_FIRMWARE_VOLUME_INFO_PPI)); |
645 | 0 | ASSERT (FvInfoPpi != NULL); |
646 | 0 | PpiGuid = &gEfiPeiFirmwareVolumeInfoPpiGuid; |
647 | 0 | } else { |
648 | | // |
649 | | // To install FvInfo2 Ppi. |
650 | | // |
651 | 0 | FvInfoPpi = AllocateZeroPool (sizeof (EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI)); |
652 | 0 | ASSERT (FvInfoPpi != NULL); |
653 | 0 | ((EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI *)FvInfoPpi)->AuthenticationStatus = AuthenticationStatus; |
654 | 0 | PpiGuid = &gEfiPeiFirmwareVolumeInfo2PpiGuid; |
655 | 0 | } |
656 | |
|
657 | 0 | if (FvFormat != NULL) { |
658 | 0 | CopyGuid (&FvInfoPpi->FvFormat, FvFormat); |
659 | 0 | } else { |
660 | 0 | CopyGuid (&FvInfoPpi->FvFormat, &gEfiFirmwareFileSystem2Guid); |
661 | | // |
662 | | // Since the EFI_FIRMWARE_FILE_SYSTEM2_GUID format is assumed if NULL is specified for FvFormat, |
663 | | // check the FileSystemGuid pointed by FvInfo against EFI_FIRMWARE_FILE_SYSTEM2_GUID to make sure |
664 | | // FvInfo has the firmware file system 2 format. |
665 | | // If the ASSERT really appears, FvFormat needs to be specified correctly, for example, |
666 | | // EFI_FIRMWARE_FILE_SYSTEM3_GUID can be used for firmware file system 3 format, or |
667 | | // ((EFI_FIRMWARE_VOLUME_HEADER *) FvInfo)->FileSystemGuid can be just used for both |
668 | | // firmware file system 2 and 3 format. |
669 | | // |
670 | 0 | ASSERT (CompareGuid (&(((EFI_FIRMWARE_VOLUME_HEADER *)FvInfo)->FileSystemGuid), &gEfiFirmwareFileSystem2Guid)); |
671 | 0 | } |
672 | |
|
673 | 0 | FvInfoPpi->FvInfo = (VOID *)FvInfo; |
674 | 0 | FvInfoPpi->FvInfoSize = FvInfoSize; |
675 | 0 | if (ParentFvName != NULL) { |
676 | 0 | ParentFvNameValue = AllocateCopyPool (sizeof (EFI_GUID), ParentFvName); |
677 | 0 | ASSERT (ParentFvNameValue != NULL); |
678 | 0 | FvInfoPpi->ParentFvName = ParentFvNameValue; |
679 | 0 | } |
680 | |
|
681 | 0 | if (ParentFileName != NULL) { |
682 | 0 | ParentFileNameValue = AllocateCopyPool (sizeof (EFI_GUID), ParentFileName); |
683 | 0 | ASSERT (ParentFileNameValue != NULL); |
684 | 0 | FvInfoPpi->ParentFileName = ParentFileNameValue; |
685 | 0 | } |
686 | |
|
687 | 0 | FvInfoPpiDescriptor = AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR)); |
688 | 0 | if (FvInfoPpiDescriptor == NULL) { |
689 | 0 | ASSERT (FvInfoPpiDescriptor != NULL); |
690 | | // Need to return here, FV may not be published, but we are out of resources anyway... |
691 | 0 | return; |
692 | 0 | } |
693 | | |
694 | 0 | FvInfoPpiDescriptor->Guid = PpiGuid; |
695 | 0 | FvInfoPpiDescriptor->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; |
696 | 0 | FvInfoPpiDescriptor->Ppi = (VOID *)FvInfoPpi; |
697 | 0 | Status = PeiServicesInstallPpi (FvInfoPpiDescriptor); |
698 | 0 | ASSERT_EFI_ERROR (Status); |
699 | 0 | } |
700 | | |
701 | | /** |
702 | | Install a EFI_PEI_FIRMWARE_VOLUME_INFO_PPI instance so the PEI Core will be notified about a new firmware volume. |
703 | | |
704 | | This function allocates, initializes, and installs a new EFI_PEI_FIRMWARE_VOLUME_INFO_PPI using |
705 | | the parameters passed in to initialize the fields of the EFI_PEI_FIRMWARE_VOLUME_INFO_PPI instance. |
706 | | If the resources can not be allocated for EFI_PEI_FIRMWARE_VOLUME_INFO_PPI, then ASSERT(). |
707 | | If the EFI_PEI_FIRMWARE_VOLUME_INFO_PPI can not be installed, then ASSERT(). |
708 | | If NULL is specified for FvFormat, but FvInfo does not have the firmware file system 2 format, then ASSERT. |
709 | | |
710 | | @param FvFormat Unique identifier of the format of the memory-mapped |
711 | | firmware volume. This parameter is optional and |
712 | | may be NULL. If NULL is specified, the |
713 | | EFI_FIRMWARE_FILE_SYSTEM2_GUID format is assumed. |
714 | | @param FvInfo Points to a buffer which allows the |
715 | | EFI_PEI_FIRMWARE_VOLUME_PPI to process the volume. |
716 | | The format of this buffer is specific to the FvFormat. |
717 | | For memory-mapped firmware volumes, this typically |
718 | | points to the first byte of the firmware volume. |
719 | | @param FvInfoSize The size, in bytes, of FvInfo. For memory-mapped |
720 | | firmware volumes, this is typically the size of |
721 | | the firmware volume. |
722 | | @param ParentFvName If the new firmware volume originated from a file |
723 | | in a different firmware volume, then this parameter |
724 | | specifies the GUID name of the originating firmware |
725 | | volume. Otherwise, this parameter must be NULL. |
726 | | @param ParentFileName If the new firmware volume originated from a file |
727 | | in a different firmware volume, then this parameter |
728 | | specifies the GUID file name of the originating |
729 | | firmware file. Otherwise, this parameter must be NULL. |
730 | | **/ |
731 | | VOID |
732 | | EFIAPI |
733 | | PeiServicesInstallFvInfoPpi ( |
734 | | IN CONST EFI_GUID *FvFormat OPTIONAL, |
735 | | IN CONST VOID *FvInfo, |
736 | | IN UINT32 FvInfoSize, |
737 | | IN CONST EFI_GUID *ParentFvName OPTIONAL, |
738 | | IN CONST EFI_GUID *ParentFileName OPTIONAL |
739 | | ) |
740 | 0 | { |
741 | 0 | InternalPeiServicesInstallFvInfoPpi (TRUE, FvFormat, FvInfo, FvInfoSize, ParentFvName, ParentFileName, 0); |
742 | 0 | } |
743 | | |
744 | | /** |
745 | | Install a EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI instance so the PEI Core will be notified about a new firmware volume. |
746 | | |
747 | | This function allocates, initializes, and installs a new EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI using |
748 | | the parameters passed in to initialize the fields of the EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI instance. |
749 | | If the resources can not be allocated for EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI, then ASSERT(). |
750 | | If the EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI can not be installed, then ASSERT(). |
751 | | If NULL is specified for FvFormat, but FvInfo does not have the firmware file system 2 format, then ASSERT. |
752 | | |
753 | | @param FvFormat Unique identifier of the format of the memory-mapped |
754 | | firmware volume. This parameter is optional and |
755 | | may be NULL. If NULL is specified, the |
756 | | EFI_FIRMWARE_FILE_SYSTEM2_GUID format is assumed. |
757 | | @param FvInfo Points to a buffer which allows the |
758 | | EFI_PEI_FIRMWARE_VOLUME_PPI to process the volume. |
759 | | The format of this buffer is specific to the FvFormat. |
760 | | For memory-mapped firmware volumes, this typically |
761 | | points to the first byte of the firmware volume. |
762 | | @param FvInfoSize The size, in bytes, of FvInfo. For memory-mapped |
763 | | firmware volumes, this is typically the size of |
764 | | the firmware volume. |
765 | | @param ParentFvName If the new firmware volume originated from a file |
766 | | in a different firmware volume, then this parameter |
767 | | specifies the GUID name of the originating firmware |
768 | | volume. Otherwise, this parameter must be NULL. |
769 | | @param ParentFileName If the new firmware volume originated from a file |
770 | | in a different firmware volume, then this parameter |
771 | | specifies the GUID file name of the originating |
772 | | firmware file. Otherwise, this parameter must be NULL. |
773 | | @param AuthenticationStatus Authentication Status |
774 | | **/ |
775 | | VOID |
776 | | EFIAPI |
777 | | PeiServicesInstallFvInfo2Ppi ( |
778 | | IN CONST EFI_GUID *FvFormat OPTIONAL, |
779 | | IN CONST VOID *FvInfo, |
780 | | IN UINT32 FvInfoSize, |
781 | | IN CONST EFI_GUID *ParentFvName OPTIONAL, |
782 | | IN CONST EFI_GUID *ParentFileName OPTIONAL, |
783 | | IN UINT32 AuthenticationStatus |
784 | | ) |
785 | 0 | { |
786 | 0 | InternalPeiServicesInstallFvInfoPpi (FALSE, FvFormat, FvInfo, FvInfoSize, ParentFvName, ParentFileName, AuthenticationStatus); |
787 | 0 | } |
788 | | |
789 | | /** |
790 | | Resets the entire platform. |
791 | | |
792 | | @param[in] ResetType The type of reset to perform. |
793 | | @param[in] ResetStatus The status code for the reset. |
794 | | @param[in] DataSize The size, in bytes, of ResetData. |
795 | | @param[in] ResetData For a ResetType of EfiResetCold, EfiResetWarm, or EfiResetShutdown |
796 | | the data buffer starts with a Null-terminated string, optionally |
797 | | followed by additional binary data. The string is a description |
798 | | that the caller may use to further indicate the reason for the |
799 | | system reset. |
800 | | |
801 | | **/ |
802 | | VOID |
803 | | EFIAPI |
804 | | PeiServicesResetSystem2 ( |
805 | | IN EFI_RESET_TYPE ResetType, |
806 | | IN EFI_STATUS ResetStatus, |
807 | | IN UINTN DataSize, |
808 | | IN VOID *ResetData OPTIONAL |
809 | | ) |
810 | 0 | { |
811 | 0 | (*GetPeiServicesTablePointer ())->ResetSystem2 (ResetType, ResetStatus, DataSize, ResetData); |
812 | 0 | } |