]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
Fix function comment to follows doxygen format.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / PeiMain / PeiMain.c
1 /** @file
2 Pei Core Main Entry Point
3
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include <PeiMain.h>
16
17 STATIC EFI_PEI_PPI_DESCRIPTOR mMemoryDiscoveredPpi = {
18 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
19 &gEfiPeiMemoryDiscoveredPpiGuid,
20 NULL
21 };
22
23 //
24 // Pei Core Module Variables
25 //
26 //
27 STATIC EFI_PEI_SERVICES gPs = {
28 {
29 PEI_SERVICES_SIGNATURE,
30 PEI_SERVICES_REVISION,
31 sizeof (EFI_PEI_SERVICES),
32 0,
33 0
34 },
35 PeiInstallPpi,
36 PeiReInstallPpi,
37 PeiLocatePpi,
38 PeiNotifyPpi,
39
40 PeiGetBootMode,
41 PeiSetBootMode,
42
43 PeiGetHobList,
44 PeiCreateHob,
45
46 PeiFvFindNextVolume,
47 PeiFfsFindNextFile,
48 PeiFfsFindSectionData,
49
50 PeiInstallPeiMemory,
51 PeiAllocatePages,
52 PeiAllocatePool,
53 (EFI_PEI_COPY_MEM)CopyMem,
54 (EFI_PEI_SET_MEM)SetMem,
55
56 PeiReportStatusCode,
57 PeiResetSystem,
58
59 NULL,
60 NULL,
61
62 PeiFfsFindFileByName,
63 PeiFfsGetFileInfo,
64 PeiFfsGetVolumeInfo,
65 PeiRegisterForShadow
66 };
67
68 /**
69
70 The entry routine to Pei Core, invoked by PeiMain during transition
71 from SEC to PEI. After switching stack in the PEI core, it will restart
72 with the old core data.
73
74
75 @param SecCoreData Points to a data structure containing information about the PEI core's operating
76 environment, such as the size and location of temporary RAM, the stack location and
77 the BFV location.
78 @param PpiList Points to a list of one or more PPI descriptors to be installed initially by the PEI core.
79 An empty PPI list consists of a single descriptor with the end-tag
80 EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST. As part of its initialization
81 phase, the PEI Foundation will add these SEC-hosted PPIs to its PPI database such
82 that both the PEI Foundation and any modules can leverage the associated service
83 calls and/or code in these early PPIs
84 @param Data Pointer to old core data that is used to initialize the
85 core's data areas.
86
87 @retval EFI_NOT_FOUND Never reach
88
89 **/
90 EFI_STATUS
91 EFIAPI
92 PeiCore (
93 IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,
94 IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList,
95 IN VOID *Data
96 )
97 {
98 PEI_CORE_INSTANCE PrivateData;
99 EFI_STATUS Status;
100 PEI_CORE_TEMP_POINTERS TempPtr;
101 UINT64 mTick;
102 PEI_CORE_INSTANCE *OldCoreData;
103 EFI_PEI_CPU_IO_PPI *CpuIo;
104 EFI_PEI_PCI_CFG2_PPI *PciCfg;
105 PEI_CORE_ENTRY_POINT ShadowedPeiCore;
106
107 mTick = 0;
108 OldCoreData = (PEI_CORE_INSTANCE *) Data;
109
110 if (PerformanceMeasurementEnabled()) {
111 if (OldCoreData == NULL) {
112 mTick = GetPerformanceCounter ();
113 }
114 }
115
116 if (OldCoreData != NULL) {
117 ShadowedPeiCore = (PEI_CORE_ENTRY_POINT) (UINTN) OldCoreData->ShadowedPeiCore;
118 if (ShadowedPeiCore != NULL) {
119 OldCoreData->ShadowedPeiCore = NULL;
120 ShadowedPeiCore (
121 SecCoreData,
122 PpiList,
123 OldCoreData
124 );
125 }
126
127 CopyMem (&PrivateData, OldCoreData, sizeof (PEI_CORE_INSTANCE));
128
129 CpuIo = (VOID*)PrivateData.ServiceTableShadow.CpuIo;
130 PciCfg = (VOID*)PrivateData.ServiceTableShadow.PciCfg;
131
132 CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));
133
134 PrivateData.ServiceTableShadow.CpuIo = CpuIo;
135 PrivateData.ServiceTableShadow.PciCfg = PciCfg;
136 } else {
137 ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE));
138 PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE;
139 CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));
140 }
141
142 PrivateData.PS = &PrivateData.ServiceTableShadow;
143
144 //
145 // Initialize libraries that the PeiCore is linked against
146 // BUGBUG: The FileHandle is passed in as NULL. Do we look it up or remove it from the lib init?
147 //
148 ProcessLibraryConstructorList (NULL, &PrivateData.PS);
149
150 InitializeMemoryServices (&PrivateData, SecCoreData, OldCoreData);
151
152 InitializePpiServices (&PrivateData, OldCoreData);
153
154 //
155 // Save PeiServicePointer so that it can be retrieved anywhere.
156 //
157 SetPeiServicesTablePointer(&PrivateData.PS);
158
159 if (OldCoreData != NULL) {
160
161 PERF_END (NULL,"PreMem", NULL, 0);
162 PERF_START (NULL,"PostMem", NULL, 0);
163
164 //
165 // Alert any listeners that there is permanent memory available
166 //
167
168 PERF_START (NULL,"DisMem", NULL, 0);
169 Status = PeiServicesInstallPpi (&mMemoryDiscoveredPpi);
170 PERF_END (NULL,"DisMem", NULL, 0);
171
172 } else {
173
174 //
175 // Report Status Code EFI_SW_PC_INIT
176 //
177 REPORT_STATUS_CODE (
178 EFI_PROGRESS_CODE,
179 FixedPcdGet32 (PcdStatusCodeValuePeiCoreEntry)
180 );
181
182 PERF_START (NULL,"PEI", NULL, mTick);
183 //
184 // If first pass, start performance measurement.
185 //
186 PERF_START (NULL,"PreMem", NULL, mTick);
187
188 //
189 // If SEC provided any PPI services to PEI, install them.
190 //
191 if (PpiList != NULL) {
192 Status = PeiServicesInstallPpi (PpiList);
193 ASSERT_EFI_ERROR (Status);
194 }
195 }
196
197 InitializeSecurityServices (&PrivateData.PS, OldCoreData);
198
199 InitializeDispatcherData (&PrivateData, OldCoreData, SecCoreData);
200
201 //
202 // Install Pei Load File PPI.
203 //
204 InitializeImageServices (&PrivateData, OldCoreData);
205
206 //
207 // Call PEIM dispatcher
208 //
209 PeiDispatcher (SecCoreData, &PrivateData);
210
211 //
212 // Check if InstallPeiMemory service was called.
213 //
214 ASSERT(PrivateData.PeiMemoryInstalled == TRUE);
215
216 PERF_END (NULL, "PostMem", NULL, 0);
217
218 Status = PeiServicesLocatePpi (
219 &gEfiDxeIplPpiGuid,
220 0,
221 NULL,
222 (VOID **)&TempPtr.DxeIpl
223 );
224 ASSERT_EFI_ERROR (Status);
225
226 DEBUG ((EFI_D_INFO, "DXE IPL Entry\n"));
227 Status = TempPtr.DxeIpl->Entry (
228 TempPtr.DxeIpl,
229 &PrivateData.PS,
230 PrivateData.HobList
231 );
232
233 ASSERT_EFI_ERROR (Status);
234
235 return EFI_NOT_FOUND;
236 }
237
238