1738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/** @file
2738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  Implementation for PEI Services Library.
3738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
4c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
519388d2960b2fe0347da23799e93ccc52f540214hhtian  This program and the accompanying materials
6738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  are licensed and made available under the terms and conditions of the BSD License
7738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  which accompanies this distribution.  The full text of the license may be found at
82fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  http://opensource.org/licenses/bsd-license.php.
9738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
10738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
13738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
14738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
15c892d8464468618b0aa3c7f35edbdfbc7cc24ee5vanjeff
16c7d265a94a3ee2517430e4f19f5b24482e5e7132yshang#include <PiPei.h>
17c892d8464468618b0aa3c7f35edbdfbc7cc24ee5vanjeff
18729675ae6363cda914a6a28d07a21e2cf330967dqhuang#include <Ppi/FirmwareVolumeInfo.h>
19c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng#include <Ppi/FirmwareVolumeInfo2.h>
20729675ae6363cda914a6a28d07a21e2cf330967dqhuang#include <Guid/FirmwareFileSystem2.h>
21c892d8464468618b0aa3c7f35edbdfbc7cc24ee5vanjeff
22c7d265a94a3ee2517430e4f19f5b24482e5e7132yshang#include <Library/PeiServicesLib.h>
23c7d265a94a3ee2517430e4f19f5b24482e5e7132yshang#include <Library/PeiServicesTablePointerLib.h>
24729675ae6363cda914a6a28d07a21e2cf330967dqhuang#include <Library/DebugLib.h>
25729675ae6363cda914a6a28d07a21e2cf330967dqhuang#include <Library/MemoryAllocationLib.h>
26729675ae6363cda914a6a28d07a21e2cf330967dqhuang#include <Library/BaseMemoryLib.h>
27729675ae6363cda914a6a28d07a21e2cf330967dqhuang
28738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
29738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables a given PEIM to register an interface into the PEI Foundation.
30738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
31738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  PpiList               A pointer to the list of interfaces that the caller shall install.
32738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
33738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The interface was successfully installed.
34738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_INVALID_PARAMETER The PpiList pointer is NULL.
35738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_INVALID_PARAMETER Any of the PEI PPI descriptors in the list do not have the
36738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff                                EFI_PEI_PPI_DESCRIPTOR_PPI bit set in the Flags field.
37738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_OUT_OF_RESOURCES  There is no additional space in the PPI database.
38738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
39738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
40738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
41738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
42738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesInstallPpi (
431c280088ec83160a5f190b3d0ba796b224ee23b3qwang  IN CONST EFI_PEI_PPI_DESCRIPTOR     *PpiList
44738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
45738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
461c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES  **PeiServices;
47738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
485240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
49738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->InstallPpi (PeiServices, PpiList);
50738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
51738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
52738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
53738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to replace an entry in the PPI database with an alternate entry.
54738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
552fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  OldPpi                The pointer to the old PEI PPI Descriptors.
562fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  NewPpi                The pointer to the new PEI PPI Descriptors.
57738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
58738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The interface was successfully installed.
59738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_INVALID_PARAMETER The OldPpi or NewPpi is NULL.
60738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_INVALID_PARAMETER Any of the PEI PPI descriptors in the list do not have the
61738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff                                EFI_PEI_PPI_DESCRIPTOR_PPI bit set in the Flags field.
62738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_OUT_OF_RESOURCES  There is no additional space in the PPI database.
63738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_NOT_FOUND         The PPI for which the reinstallation was requested has not been
64738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff                                installed.
65738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
66738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
67738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
68738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
69738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesReInstallPpi (
701c280088ec83160a5f190b3d0ba796b224ee23b3qwang  IN CONST EFI_PEI_PPI_DESCRIPTOR     *OldPpi,
711c280088ec83160a5f190b3d0ba796b224ee23b3qwang  IN CONST EFI_PEI_PPI_DESCRIPTOR     *NewPpi
72738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
73738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
741c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
75738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
765240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
77738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->ReInstallPpi (PeiServices, OldPpi, NewPpi);
78738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
79738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
80738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
81738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to discover a given instance of an interface.
82738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
83738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  Guid                  A pointer to the GUID whose corresponding interface needs to be
84738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff                                found.
85738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  Instance              The N-th instance of the interface that is required.
86738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  PpiDescriptor         A pointer to instance of the EFI_PEI_PPI_DESCRIPTOR.
87738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  Ppi                   A pointer to the instance of the interface.
88738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
89738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The interface was successfully returned.
90738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_NOT_FOUND         The PPI descriptor is not found in the database.
91738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
92738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
93738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
94738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
95738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesLocatePpi (
961c280088ec83160a5f190b3d0ba796b224ee23b3qwang  IN CONST EFI_GUID                   *Guid,
97738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN UINTN                      Instance,
98738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor,
99738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN OUT VOID                   **Ppi
100738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
101738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
1021c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
103738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
1045240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
105738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->LocatePpi (PeiServices, Guid, Instance, PpiDescriptor, Ppi);
106738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
107738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
108738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
109738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to register a given service to be invoked when another service is
110738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  installed or reinstalled.
111738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
11258380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  NotifyList            A pointer to the list of notification interfaces
11358380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                that the caller shall install.
114738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
115738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The interface was successfully installed.
116738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_INVALID_PARAMETER The NotifyList pointer is NULL.
11758380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @retval EFI_INVALID_PARAMETER Any of the PEI notify descriptors in the list do
11858380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                 not have the EFI_PEI_PPI_DESCRIPTOR_NOTIFY_TYPES
11958380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                 bit set in the Flags field.
120738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_OUT_OF_RESOURCES  There is no additional space in the PPI database.
121738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
122738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
123738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
124738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
125738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesNotifyPpi (
1261c280088ec83160a5f190b3d0ba796b224ee23b3qwang  IN CONST EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyList
127738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
128738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
1291c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
130738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
1315240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
132738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->NotifyPpi (PeiServices, NotifyList);
133738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
134738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
135738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
136738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to ascertain the present value of the boot mode.
137738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
138738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  BootMode              A pointer to contain the value of the boot mode.
139738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
140738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The boot mode was returned successfully.
141738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_INVALID_PARAMETER BootMode is NULL.
142738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
143738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
144738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
145738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
146738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesGetBootMode (
147c3363c9235f102977bd31a3332a67da7e268a01djji  OUT EFI_BOOT_MODE          *BootMode
148738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
149738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
1501c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
151738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
1525240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
153738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->GetBootMode (PeiServices, BootMode);
154738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
155738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
156738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
157738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to update the boot mode variable.
158738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
159738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  BootMode              The value of the boot mode to set.
160738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
161738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The value was successfully updated
162738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
163738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
164738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
165738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
166738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesSetBootMode (
167738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN EFI_BOOT_MODE              BootMode
168738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
169738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
1701c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
171738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
1725240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
173738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->SetBootMode (PeiServices, BootMode);
174738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
175738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
176738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
177738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables a PEIM to ascertain the address of the list of HOBs in memory.
178738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
17958380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  HobList               A pointer to the list of HOBs that the PEI Foundation
18058380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                will initialize.
18158380e9c6174f23df78f777b4209c0fd75245cdamyronporter
182738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The list was successfully returned.
183738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_NOT_AVAILABLE_YET The HOB list is not yet published.
184738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
185738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
186738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
187738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
188738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesGetHobList (
189f38fdc749879ff6b9339fded2062e3dac46fa72dklu  OUT VOID                      **HobList
190738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
191738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
1921c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
193738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
1945240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
195738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->GetHobList (PeiServices, HobList);
196738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
197738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
198738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
199738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to create various types of HOBs.
200738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
201738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  Type                  The type of HOB to be installed.
202738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  Length                The length of the HOB to be added.
20358380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  Hob                   The address of a pointer that will contain the
20458380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                HOB header.
205738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
206738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The HOB was successfully created.
207738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_OUT_OF_RESOURCES  There is no additional space for HOB creation.
208738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
209738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
210738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
211738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
212738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesCreateHob (
213738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN UINT16                     Type,
214738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN UINT16                     Length,
215dd6520887821b0fc0019f36bd87d0f570b9b1e37klu  OUT VOID                      **Hob
216738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
217738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
2181c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
219738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
2205240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
221738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->CreateHob (PeiServices, Type, Length, Hob);
222738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
223738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
224738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
225738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to discover additional firmware volumes.
226738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
22758380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  Instance              This instance of the firmware volume to find.  The
22858380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                value 0 is the Boot Firmware Volume (BFV).
22958380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  VolumeHandle          Handle of the firmware volume header of the volume
23058380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                to return.
231738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
232738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The volume was found.
233738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_NOT_FOUND         The volume was not found.
234738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_INVALID_PARAMETER FwVolHeader is NULL.
235738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
236738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
237738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
238738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
239738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesFfsFindNextVolume (
240738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN UINTN                          Instance,
2411c280088ec83160a5f190b3d0ba796b224ee23b3qwang  IN OUT EFI_PEI_FV_HANDLE          *VolumeHandle
242738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
243738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
2441c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
245738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
2465240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
2471c280088ec83160a5f190b3d0ba796b224ee23b3qwang  return (*PeiServices)->FfsFindNextVolume (PeiServices, Instance, VolumeHandle);
248738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
249738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
250738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
251738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to discover additional firmware files.
252738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
253738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  SearchType            A filter to find files only of this type.
25458380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  VolumeHandle          The pointer to the firmware volume header of the
25558380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                volume to search. This parameter must point to a
25658380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                valid FFS volume.
25742eedea958591087603bbacd1c2227d2494026afyshang  @param  FileHandle            Handle of the current file from which to begin searching.
258738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
259738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The file was found.
260738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_NOT_FOUND         The file was not found.
261738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_NOT_FOUND         The header checksum was not zero.
262738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
263738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
264738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
265738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
266738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesFfsFindNextFile (
267738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN EFI_FV_FILETYPE            SearchType,
2681c280088ec83160a5f190b3d0ba796b224ee23b3qwang  IN EFI_PEI_FV_HANDLE          VolumeHandle,
2691c280088ec83160a5f190b3d0ba796b224ee23b3qwang  IN OUT EFI_PEI_FILE_HANDLE    *FileHandle
270738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
271738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
2721c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
273738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
2745240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
2751c280088ec83160a5f190b3d0ba796b224ee23b3qwang  return (*PeiServices)->FfsFindNextFile (PeiServices, SearchType, VolumeHandle, FileHandle);
276738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
277738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
278738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
279738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to discover sections of a given type within a valid FFS file.
280738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
28142eedea958591087603bbacd1c2227d2494026afyshang  @param  SectionType           The value of the section type to find.
28258380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  FileHandle            A pointer to the file header that contains the set
28358380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                of sections to be searched.
284738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  SectionData           A pointer to the discovered section, if successful.
285738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
286738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The section was found.
287738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_NOT_FOUND         The section was not found.
288738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
289738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
290738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
291738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
292738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesFfsFindSectionData (
293738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN EFI_SECTION_TYPE           SectionType,
294122e21915101b8f38d81edc6d4f1fd1dd353e28ajji  IN EFI_PEI_FILE_HANDLE        FileHandle,
29567c89a212705e53508f1f54e611ee9757ce34502qwang  OUT VOID                      **SectionData
296738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
297738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
2981c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
299738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
3005240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
301122e21915101b8f38d81edc6d4f1fd1dd353e28ajji  return (*PeiServices)->FfsFindSectionData (PeiServices, SectionType, FileHandle, SectionData);
302738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
303738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
304738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
305c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  This service enables PEIMs to discover sections of a given instance and type within a valid FFS file.
306c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
307c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  SectionType           The value of the section type to find.
308c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  SectionInstance       Section instance to find.
309c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FileHandle            A pointer to the file header that contains the set
310c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                                of sections to be searched.
311c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  SectionData           A pointer to the discovered section, if successful.
312c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  AuthenticationStatus  A pointer to the authentication status for this section.
313c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
314c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @retval EFI_SUCCESS           The section was found.
315c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @retval EFI_NOT_FOUND         The section was not found.
316c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
317c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng**/
318c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengEFI_STATUS
319c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengEFIAPI
320c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengPeiServicesFfsFindSectionData3 (
321c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN EFI_SECTION_TYPE           SectionType,
322c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN UINTN                      SectionInstance,
323c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN EFI_PEI_FILE_HANDLE        FileHandle,
324c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  OUT VOID                      **SectionData,
325c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  OUT UINT32                    *AuthenticationStatus
326c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  )
327c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng{
328c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  CONST EFI_PEI_SERVICES **PeiServices;
329c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
330c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  PeiServices = GetPeiServicesTablePointer ();
331c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  return (*PeiServices)->FindSectionData3 (PeiServices, SectionType, SectionInstance, FileHandle, SectionData, AuthenticationStatus);
332c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng}
333c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
334c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng/**
335738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service enables PEIMs to register the permanent memory configuration
336738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  that has been initialized with the PEI Foundation.
337738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
338738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  MemoryBegin           The value of a region of installed memory.
339738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  MemoryLength          The corresponding length of a region of installed memory.
340738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
341738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The region was successfully installed in a HOB.
342738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_INVALID_PARAMETER MemoryBegin and MemoryLength are illegal for this system.
343738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_OUT_OF_RESOURCES  There is no additional space for HOB creation.
344738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
345738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
346738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
347738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
348738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesInstallPeiMemory (
349738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN EFI_PHYSICAL_ADDRESS       MemoryBegin,
350738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN UINT64                     MemoryLength
351738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
352738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
3531c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
354738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
3555240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
356738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->InstallPeiMemory (PeiServices, MemoryBegin, MemoryLength);
357738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
358738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
359738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
36058380e9c6174f23df78f777b4209c0fd75245cdamyronporter  This service enables PEIMs to allocate memory after the permanent memory has been
36158380e9c6174f23df78f777b4209c0fd75245cdamyronporter   installed by a PEIM.
362738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
363738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  MemoryType            Type of memory to allocate.
3642fc59a003ed9104f9feebe0e418f2a04a50f3284myronporter  @param  Pages                 The number of pages to allocate.
365738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  Memory                Pointer of memory allocated.
366738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
367738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The memory range was successfully allocated.
368738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_INVALID_PARAMETER Type is not equal to AllocateAnyPages.
369738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_NOT_AVAILABLE_YET Called with permanent memory not available.
370738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_OUT_OF_RESOURCES  The pages could not be allocated.
371738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
372738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
373738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
374738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
375738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesAllocatePages (
376738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN EFI_MEMORY_TYPE            MemoryType,
377738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN UINTN                      Pages,
37867c89a212705e53508f1f54e611ee9757ce34502qwang  OUT EFI_PHYSICAL_ADDRESS      *Memory
379738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
380738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
3811c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
382738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
3835240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
384738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->AllocatePages (PeiServices, MemoryType, Pages, Memory);
385738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
386738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
387738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
388738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  This service allocates memory from the Hand-Off Block (HOB) heap.
389738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
390738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @param  Size                  The number of bytes to allocate from the pool.
39158380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param  Buffer                If the call succeeds, a pointer to a pointer to
39258380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                the allocate buffer; otherwise, undefined.
393738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
394738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_SUCCESS           The allocation was successful
395738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_OUT_OF_RESOURCES  There is not enough heap to allocate the requested size.
396738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
397738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
398738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
399738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
400738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesAllocatePool (
401738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  IN UINTN                      Size,
402738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  OUT VOID                      **Buffer
403738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
404738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
4051c280088ec83160a5f190b3d0ba796b224ee23b3qwang  CONST EFI_PEI_SERVICES **PeiServices;
406738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
4075240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
408738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  return (*PeiServices)->AllocatePool (PeiServices, Size, Buffer);
409738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
410738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
411738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff/**
41267c89a212705e53508f1f54e611ee9757ce34502qwang  Resets the entire platform.
413738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
41467c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_SUCCESS           The function completed successfully.
415738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  @retval EFI_NOT_AVAILABLE_YET The service has not been installed yet.
416738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff
417738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff**/
418738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFI_STATUS
419738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffEFIAPI
420738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeffPeiServicesResetSystem (
421738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  VOID
422738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff  )
423738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff{
424b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  CONST EFI_PEI_SERVICES **PeiServices;
425b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu
4265240b97c9c9e76994e86db11ff7cf140a74f2bd0qwang  PeiServices = GetPeiServicesTablePointer ();
427b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  return (*PeiServices)->ResetSystem (PeiServices);
428b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu}
429b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu
43067c89a212705e53508f1f54e611ee9757ce34502qwang/**
43158380e9c6174f23df78f777b4209c0fd75245cdamyronporter  This service is a wrapper for the PEI Service RegisterForShadow(), except the
43258380e9c6174f23df78f777b4209c0fd75245cdamyronporter  pointer to the PEI Services Table has been removed.  See the Platform
43358380e9c6174f23df78f777b4209c0fd75245cdamyronporter  Initialization Pre-EFI Initialization Core Interface Specification for details.
43467c89a212705e53508f1f54e611ee9757ce34502qwang
43558380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param FileHandle             PEIM's file handle. Must be the currently
43658380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                executing PEIM.
43767c89a212705e53508f1f54e611ee9757ce34502qwang
43858380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @retval EFI_SUCCESS           The PEIM was successfully registered for
43958380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                shadowing.
44067c89a212705e53508f1f54e611ee9757ce34502qwang
44167c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_ALREADY_STARTED   The PEIM was previously
44267c89a212705e53508f1f54e611ee9757ce34502qwang                                registered for shadowing.
44367c89a212705e53508f1f54e611ee9757ce34502qwang
44458380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @retval EFI_NOT_FOUND         The FileHandle does not refer to a
44558380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                valid file handle.
44667c89a212705e53508f1f54e611ee9757ce34502qwang**/
447b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluEFI_STATUS
448b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluEFIAPI
449b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluPeiServicesRegisterForShadow (
450b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  IN  EFI_PEI_FILE_HANDLE FileHandle
451b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  )
452b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu{
453484c77852ea2ba6ccc8e5c3b3ec4548588dd7f01lgao  return (*GetPeiServicesTablePointer())->RegisterForShadow (FileHandle);
454738ec5655985bd75d2eb15cc161a77b46f4abeacvanjeff}
455b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu
45667c89a212705e53508f1f54e611ee9757ce34502qwang/**
45767c89a212705e53508f1f54e611ee9757ce34502qwang  This service is a wrapper for the PEI Service FfsGetFileInfo(), except the pointer to the PEI Services
45867c89a212705e53508f1f54e611ee9757ce34502qwang  Table has been removed.  See the Platform Initialization Pre-EFI Initialization Core Interface
45967c89a212705e53508f1f54e611ee9757ce34502qwang  Specification for details.
46067c89a212705e53508f1f54e611ee9757ce34502qwang
46158380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param FileHandle              The handle of the file.
46267c89a212705e53508f1f54e611ee9757ce34502qwang
46358380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param FileInfo                 Upon exit, points to the file's
46458380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                  information.
46567c89a212705e53508f1f54e611ee9757ce34502qwang
46667c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_SUCCESS             File information returned.
46767c89a212705e53508f1f54e611ee9757ce34502qwang
46867c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_INVALID_PARAMETER   If FileHandle does not
46967c89a212705e53508f1f54e611ee9757ce34502qwang                                  represent a valid file.
47067c89a212705e53508f1f54e611ee9757ce34502qwang
47158380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @retval EFI_INVALID_PARAMETER   FileInfo is NULL.
47267c89a212705e53508f1f54e611ee9757ce34502qwang
47367c89a212705e53508f1f54e611ee9757ce34502qwang**/
474b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluEFI_STATUS
475f38fdc749879ff6b9339fded2062e3dac46fa72dkluEFIAPI
476b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluPeiServicesFfsGetFileInfo (
477b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  IN CONST  EFI_PEI_FILE_HANDLE   FileHandle,
478b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  OUT EFI_FV_FILE_INFO            *FileInfo
479b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  )
480b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu{
481484c77852ea2ba6ccc8e5c3b3ec4548588dd7f01lgao  return (*GetPeiServicesTablePointer())->FfsGetFileInfo (FileHandle, FileInfo);
482b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu}
483b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu
484c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng/**
485c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  This service is a wrapper for the PEI Service FfsGetFileInfo2(), except the pointer to the PEI Services
486c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  Table has been removed. See the Platform Initialization Pre-EFI Initialization Core Interface
487c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  Specification for details.
488c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
489c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param FileHandle               The handle of the file.
490c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param FileInfo                 Upon exit, points to the file's
491c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                                  information.
492c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
493c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @retval EFI_SUCCESS             File information returned.
494c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @retval EFI_INVALID_PARAMETER   If FileHandle does not
495c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                                  represent a valid file.
496c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @retval EFI_INVALID_PARAMETER   FileInfo is NULL.
497c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
498c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng**/
499c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengEFI_STATUS
500c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengEFIAPI
501c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengPeiServicesFfsGetFileInfo2 (
502c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST  EFI_PEI_FILE_HANDLE   FileHandle,
503c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  OUT EFI_FV_FILE_INFO2           *FileInfo
504c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  )
505c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng{
506c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  return (*GetPeiServicesTablePointer())->FfsGetFileInfo2 (FileHandle, FileInfo);
507c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng}
508b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu
50967c89a212705e53508f1f54e611ee9757ce34502qwang/**
51067c89a212705e53508f1f54e611ee9757ce34502qwang  This service is a wrapper for the PEI Service FfsFindByName(), except the pointer to the PEI Services
51167c89a212705e53508f1f54e611ee9757ce34502qwang  Table has been removed.  See the Platform Initialization Pre-EFI Initialization Core Interface
51267c89a212705e53508f1f54e611ee9757ce34502qwang  Specification for details.
51367c89a212705e53508f1f54e611ee9757ce34502qwang
51458380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param FileName                 A pointer to the name of the file to
51558380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                  find within the firmware volume.
51667c89a212705e53508f1f54e611ee9757ce34502qwang
51758380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param VolumeHandle             The firmware volume to search FileHandle
51858380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                  Upon exit, points to the found file's
51958380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                  handle or NULL if it could not be found.
52058380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param FileHandle               The pointer to found file handle
52142eedea958591087603bbacd1c2227d2494026afyshang
52267c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_SUCCESS             File was found.
52367c89a212705e53508f1f54e611ee9757ce34502qwang
52467c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_NOT_FOUND           File was not found.
52567c89a212705e53508f1f54e611ee9757ce34502qwang
52667c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_INVALID_PARAMETER   VolumeHandle or FileHandle or
52767c89a212705e53508f1f54e611ee9757ce34502qwang                                  FileName was NULL.
52867c89a212705e53508f1f54e611ee9757ce34502qwang
52967c89a212705e53508f1f54e611ee9757ce34502qwang**/
530b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluEFI_STATUS
531b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluEFIAPI
532b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluPeiServicesFfsFindFileByName (
533b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  IN CONST  EFI_GUID            *FileName,
534b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  IN CONST  EFI_PEI_FV_HANDLE   VolumeHandle,
535b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  OUT       EFI_PEI_FILE_HANDLE *FileHandle
536b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  )
537b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu{
538b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  return (*GetPeiServicesTablePointer())->FfsFindFileByName (FileName, VolumeHandle, FileHandle);
539b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu}
540b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu
541b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu
54267c89a212705e53508f1f54e611ee9757ce34502qwang/**
54367c89a212705e53508f1f54e611ee9757ce34502qwang  This service is a wrapper for the PEI Service FfsGetVolumeInfo(), except the pointer to the PEI Services
54467c89a212705e53508f1f54e611ee9757ce34502qwang  Table has been removed.  See the Platform Initialization Pre-EFI Initialization Core Interface
54567c89a212705e53508f1f54e611ee9757ce34502qwang  Specification for details.
54667c89a212705e53508f1f54e611ee9757ce34502qwang
54758380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param VolumeHandle             Handle of the volume.
54867c89a212705e53508f1f54e611ee9757ce34502qwang
54958380e9c6174f23df78f777b4209c0fd75245cdamyronporter  @param VolumeInfo               Upon exit, points to the volume's
55058380e9c6174f23df78f777b4209c0fd75245cdamyronporter                                  information.
55167c89a212705e53508f1f54e611ee9757ce34502qwang
55267c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_SUCCESS             File information returned.
55367c89a212705e53508f1f54e611ee9757ce34502qwang
55467c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_INVALID_PARAMETER   If FileHandle does not
55567c89a212705e53508f1f54e611ee9757ce34502qwang                                  represent a valid file.
55667c89a212705e53508f1f54e611ee9757ce34502qwang
55767c89a212705e53508f1f54e611ee9757ce34502qwang  @retval EFI_INVALID_PARAMETER   If FileInfo is NULL.
55867c89a212705e53508f1f54e611ee9757ce34502qwang
55967c89a212705e53508f1f54e611ee9757ce34502qwang**/
560b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluEFI_STATUS
561b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluEFIAPI
562b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3kluPeiServicesFfsGetVolumeInfo (
563b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  IN  EFI_PEI_FV_HANDLE       VolumeHandle,
564b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  OUT EFI_FV_INFO             *VolumeInfo
565b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  )
566b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu{
567b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu  return (*GetPeiServicesTablePointer())->FfsGetVolumeInfo (VolumeHandle, VolumeInfo);
568b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu}
569b0d803fe3e5c55a9a0c75bc90ccf40ebbbc9ffa3klu
570729675ae6363cda914a6a28d07a21e2cf330967dqhuang/**
571c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  Install a EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI instance so the PEI Core will be notified about a new firmware volume.
572b75a165ded750b3113b90c04af2beef09a9c1329lgao
573c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  This function allocates, initializes, and installs a new EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI using
574c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  the parameters passed in to initialize the fields of the EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI instance.
575c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  If the resources can not be allocated for EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI, then ASSERT().
576c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  If the EFI_PEI_FIRMWARE_VOLUME_INFO(2)_PPI can not be installed, then ASSERT().
577c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
578c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  InstallFvInfoPpi     Install FvInfo Ppi if it is TRUE. Otherwise, install FvInfo2 Ppi.
579c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FvFormat             Unique identifier of the format of the memory-mapped
580c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               firmware volume.  This parameter is optional and
581c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               may be NULL.  If NULL is specified, the
58258380e9c6174f23df78f777b4209c0fd75245cdamyronporter                               EFI_FIRMWARE_FILE_SYSTEM2_GUID format is assumed.
583c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FvInfo               Points to a buffer which allows the
584c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               EFI_PEI_FIRMWARE_VOLUME_PPI to process the volume.
585c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               The format of this buffer is specific to the FvFormat.
586c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               For memory-mapped firmware volumes, this typically
58758380e9c6174f23df78f777b4209c0fd75245cdamyronporter                               points to the first byte of the firmware volume.
588c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FvInfoSize           The size, in bytes, of FvInfo. For memory-mapped
589c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               firmware volumes, this is typically the size of
59058380e9c6174f23df78f777b4209c0fd75245cdamyronporter                               the firmware volume.
591c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  ParentFvName         If the new firmware volume originated from a file
592c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               in a different firmware volume, then this parameter
59358380e9c6174f23df78f777b4209c0fd75245cdamyronporter                               specifies the GUID name of the originating firmware
59458380e9c6174f23df78f777b4209c0fd75245cdamyronporter                               volume. Otherwise, this parameter must be NULL.
595c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  ParentFileName       If the new firmware volume originated from a file
596c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               in a different firmware volume, then this parameter
597c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               specifies the GUID file name of the originating
59858380e9c6174f23df78f777b4209c0fd75245cdamyronporter                               firmware file. Otherwise, this parameter must be NULL.
599c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  AuthenticationStatus Authentication Status, it will be ignored if InstallFvInfoPpi is TRUE.
600729675ae6363cda914a6a28d07a21e2cf330967dqhuang**/
601729675ae6363cda914a6a28d07a21e2cf330967dqhuangVOID
602729675ae6363cda914a6a28d07a21e2cf330967dqhuangEFIAPI
603c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengInternalPeiServicesInstallFvInfoPpi (
604c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN       BOOLEAN                 InstallFvInfoPpi,
605729675ae6363cda914a6a28d07a21e2cf330967dqhuang  IN CONST EFI_GUID                *FvFormat, OPTIONAL
606729675ae6363cda914a6a28d07a21e2cf330967dqhuang  IN CONST VOID                    *FvInfo,
607729675ae6363cda914a6a28d07a21e2cf330967dqhuang  IN       UINT32                  FvInfoSize,
608729675ae6363cda914a6a28d07a21e2cf330967dqhuang  IN CONST EFI_GUID                *ParentFvName, OPTIONAL
609c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST EFI_GUID                *ParentFileName, OPTIONAL
610c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN       UINT32                  AuthenticationStatus
611729675ae6363cda914a6a28d07a21e2cf330967dqhuang  )
612729675ae6363cda914a6a28d07a21e2cf330967dqhuang{
613729675ae6363cda914a6a28d07a21e2cf330967dqhuang  EFI_STATUS                       Status;
614729675ae6363cda914a6a28d07a21e2cf330967dqhuang  EFI_PEI_FIRMWARE_VOLUME_INFO_PPI *FvInfoPpi;
615729675ae6363cda914a6a28d07a21e2cf330967dqhuang  EFI_PEI_PPI_DESCRIPTOR           *FvInfoPpiDescriptor;
6163831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao  EFI_GUID                         *ParentFvNameValue;
6173831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao  EFI_GUID                         *ParentFileNameValue;
618c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  EFI_GUID                         *PpiGuid;
619729675ae6363cda914a6a28d07a21e2cf330967dqhuang
6203831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao  ParentFvNameValue   = NULL;
6213831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao  ParentFileNameValue = NULL;
622c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  if (InstallFvInfoPpi) {
623c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    //
624c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    // To install FvInfo Ppi.
625c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    //
626c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    FvInfoPpi = AllocateZeroPool (sizeof (EFI_PEI_FIRMWARE_VOLUME_INFO_PPI));
627ed84519ce846cda4bc175d8d18ee03937090176dStar Zeng    ASSERT (FvInfoPpi != NULL);
628c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    PpiGuid = &gEfiPeiFirmwareVolumeInfoPpiGuid;
629c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  } else {
630c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    //
631c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    // To install FvInfo2 Ppi.
632c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    //
633c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    FvInfoPpi = AllocateZeroPool (sizeof (EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI));
634ed84519ce846cda4bc175d8d18ee03937090176dStar Zeng    ASSERT (FvInfoPpi != NULL);
635c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    ((EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI *) FvInfoPpi)->AuthenticationStatus = AuthenticationStatus;
636c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng    PpiGuid = &gEfiPeiFirmwareVolumeInfo2PpiGuid;
637c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  }
638729675ae6363cda914a6a28d07a21e2cf330967dqhuang
639729675ae6363cda914a6a28d07a21e2cf330967dqhuang  if (FvFormat != NULL) {
640729675ae6363cda914a6a28d07a21e2cf330967dqhuang    CopyGuid (&FvInfoPpi->FvFormat, FvFormat);
641729675ae6363cda914a6a28d07a21e2cf330967dqhuang  } else {
642729675ae6363cda914a6a28d07a21e2cf330967dqhuang    CopyGuid (&FvInfoPpi->FvFormat, &gEfiFirmwareFileSystem2Guid);
643729675ae6363cda914a6a28d07a21e2cf330967dqhuang  }
644729675ae6363cda914a6a28d07a21e2cf330967dqhuang  FvInfoPpi->FvInfo = (VOID *) FvInfo;
645729675ae6363cda914a6a28d07a21e2cf330967dqhuang  FvInfoPpi->FvInfoSize = FvInfoSize;
6463831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao  if (ParentFvName != NULL) {
6473831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao    ParentFvNameValue = AllocateCopyPool (sizeof (EFI_GUID), ParentFvName);
64860bd4ccd45aa4077a0192364a7b97f9066192e58qhuang    ASSERT (ParentFvNameValue != NULL);
6493831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao    FvInfoPpi->ParentFvName = ParentFvNameValue;
6503831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao  }
6513831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao  if (ParentFileName != NULL) {
6523831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao    ParentFileNameValue = AllocateCopyPool (sizeof (EFI_GUID), ParentFileName);
6533831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao    ASSERT (ParentFileNameValue != NULL);
6543831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao    FvInfoPpi->ParentFileName = ParentFileNameValue;
6553831f3e9a921eb7b8dbfcaf06acdf9eef9127204lgao  }
656729675ae6363cda914a6a28d07a21e2cf330967dqhuang
657c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  FvInfoPpiDescriptor = AllocatePool (sizeof (EFI_PEI_PPI_DESCRIPTOR));
658729675ae6363cda914a6a28d07a21e2cf330967dqhuang  ASSERT (FvInfoPpiDescriptor != NULL);
659729675ae6363cda914a6a28d07a21e2cf330967dqhuang
660c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  FvInfoPpiDescriptor->Guid  = PpiGuid;
661c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  FvInfoPpiDescriptor->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
662729675ae6363cda914a6a28d07a21e2cf330967dqhuang  FvInfoPpiDescriptor->Ppi   = (VOID *) FvInfoPpi;
663729675ae6363cda914a6a28d07a21e2cf330967dqhuang  Status = PeiServicesInstallPpi (FvInfoPpiDescriptor);
664729675ae6363cda914a6a28d07a21e2cf330967dqhuang  ASSERT_EFI_ERROR (Status);
665729675ae6363cda914a6a28d07a21e2cf330967dqhuang
666729675ae6363cda914a6a28d07a21e2cf330967dqhuang}
667729675ae6363cda914a6a28d07a21e2cf330967dqhuang
668c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng/**
669c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  Install a EFI_PEI_FIRMWARE_VOLUME_INFO_PPI instance so the PEI Core will be notified about a new firmware volume.
670c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
671c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  This function allocates, initializes, and installs a new EFI_PEI_FIRMWARE_VOLUME_INFO_PPI using
672c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  the parameters passed in to initialize the fields of the EFI_PEI_FIRMWARE_VOLUME_INFO_PPI instance.
673c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  If the resources can not be allocated for EFI_PEI_FIRMWARE_VOLUME_INFO_PPI, then ASSERT().
674c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  If the EFI_PEI_FIRMWARE_VOLUME_INFO_PPI can not be installed, then ASSERT().
675c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
676c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FvFormat             Unique identifier of the format of the memory-mapped
677c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               firmware volume.  This parameter is optional and
678c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               may be NULL.  If NULL is specified, the
679c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               EFI_FIRMWARE_FILE_SYSTEM2_GUID format is assumed.
680c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FvInfo               Points to a buffer which allows the
681c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               EFI_PEI_FIRMWARE_VOLUME_PPI to process the volume.
682c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               The format of this buffer is specific to the FvFormat.
683c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               For memory-mapped firmware volumes, this typically
684c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               points to the first byte of the firmware volume.
685c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FvInfoSize           The size, in bytes, of FvInfo. For memory-mapped
686c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               firmware volumes, this is typically the size of
687c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               the firmware volume.
688c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  ParentFvName         If the new firmware volume originated from a file
689c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               in a different firmware volume, then this parameter
690c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               specifies the GUID name of the originating firmware
691c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               volume. Otherwise, this parameter must be NULL.
692c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  ParentFileName       If the new firmware volume originated from a file
693c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               in a different firmware volume, then this parameter
694c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               specifies the GUID file name of the originating
695c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               firmware file. Otherwise, this parameter must be NULL.
696c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng**/
697c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengVOID
698c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengEFIAPI
699c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengPeiServicesInstallFvInfoPpi (
700c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST EFI_GUID                *FvFormat, OPTIONAL
701c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST VOID                    *FvInfo,
702c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN       UINT32                  FvInfoSize,
703c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST EFI_GUID                *ParentFvName, OPTIONAL
704c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST EFI_GUID                *ParentFileName OPTIONAL
705c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  )
706c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng{
707c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  InternalPeiServicesInstallFvInfoPpi (TRUE, FvFormat, FvInfo, FvInfoSize, ParentFvName, ParentFileName, 0);
708c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng}
709c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
710c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng/**
711c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  Install a EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI instance so the PEI Core will be notified about a new firmware volume.
712c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
713c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  This function allocates, initializes, and installs a new EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI using
714c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  the parameters passed in to initialize the fields of the EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI instance.
715c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  If the resources can not be allocated for EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI, then ASSERT().
716c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  If the EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI can not be installed, then ASSERT().
717c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
718c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FvFormat             Unique identifier of the format of the memory-mapped
719c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               firmware volume.  This parameter is optional and
720c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               may be NULL.  If NULL is specified, the
721c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               EFI_FIRMWARE_FILE_SYSTEM2_GUID format is assumed.
722c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FvInfo               Points to a buffer which allows the
723c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               EFI_PEI_FIRMWARE_VOLUME_PPI to process the volume.
724c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               The format of this buffer is specific to the FvFormat.
725c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               For memory-mapped firmware volumes, this typically
726c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               points to the first byte of the firmware volume.
727c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  FvInfoSize           The size, in bytes, of FvInfo. For memory-mapped
728c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               firmware volumes, this is typically the size of
729c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               the firmware volume.
730c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  ParentFvName         If the new firmware volume originated from a file
731c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               in a different firmware volume, then this parameter
732c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               specifies the GUID name of the originating firmware
733c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               volume. Otherwise, this parameter must be NULL.
734c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  ParentFileName       If the new firmware volume originated from a file
735c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               in a different firmware volume, then this parameter
736c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               specifies the GUID file name of the originating
737c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng                               firmware file. Otherwise, this parameter must be NULL.
738c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  @param  AuthenticationStatus Authentication Status
739c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng**/
740c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengVOID
741c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengEFIAPI
742c79351059ee7ee24ebed312413cb5e57076c5b56Star ZengPeiServicesInstallFvInfo2Ppi (
743c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST EFI_GUID                *FvFormat, OPTIONAL
744c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST VOID                    *FvInfo,
745c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN       UINT32                  FvInfoSize,
746c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST EFI_GUID                *ParentFvName, OPTIONAL
747c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN CONST EFI_GUID                *ParentFileName, OPTIONAL
748c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  IN       UINT32                  AuthenticationStatus
749c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  )
750c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng{
751c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng  InternalPeiServicesInstallFvInfoPpi (FALSE, FvFormat, FvInfo, FvInfoSize, ParentFvName, ParentFileName, AuthenticationStatus);
752c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng}
753c79351059ee7ee24ebed312413cb5e57076c5b56Star Zeng
754