]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
Patch to remove STATIC modifier. This is on longer recommended by EFI Framework codin...
[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 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 service instance
25 ///
26 EFI_PEI_SERVICES gPs = {
27 {
28 PEI_SERVICES_SIGNATURE,
29 PEI_SERVICES_REVISION,
30 sizeof (EFI_PEI_SERVICES),
31 0,
32 0
33 },
34 PeiInstallPpi,
35 PeiReInstallPpi,
36 PeiLocatePpi,
37 PeiNotifyPpi,
38
39 PeiGetBootMode,
40 PeiSetBootMode,
41
42 PeiGetHobList,
43 PeiCreateHob,
44
45 PeiFvFindNextVolume,
46 PeiFfsFindNextFile,
47 PeiFfsFindSectionData,
48
49 PeiInstallPeiMemory,
50 PeiAllocatePages,
51 PeiAllocatePool,
52 (EFI_PEI_COPY_MEM)CopyMem,
53 (EFI_PEI_SET_MEM)SetMem,
54
55 PeiReportStatusCode,
56 PeiResetSystem,
57
58 NULL,
59 NULL,
60
61 PeiFfsFindFileByName,
62 PeiFfsGetFileInfo,
63 PeiFfsGetVolumeInfo,
64 PeiRegisterForShadow
65 };
66
67 /**
68
69 This routine is invoked by main entry of PeiMain module during transition
70 from SEC to PEI. After switching stack in the PEI core, it will restart
71 with the old core data.
72
73 @param SecCoreData Points to a data structure containing information about the PEI core's operating
74 environment, such as the size and location of temporary RAM, the stack location and
75 the BFV location.
76 @param PpiList Points to a list of one or more PPI descriptors to be installed initially by the PEI core.
77 An empty PPI list consists of a single descriptor with the end-tag
78 EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST. As part of its initialization
79 phase, the PEI Foundation will add these SEC-hosted PPIs to its PPI database such
80 that both the PEI Foundation and any modules can leverage the associated service
81 calls and/or code in these early PPIs
82 @param Data Pointer to old core data that is used to initialize the
83 core's data areas.
84 If NULL, it is first PeiCore entering.
85
86 @retval EFI_NOT_FOUND Never reach
87
88 **/
89 VOID
90 EFIAPI
91 PeiCore (
92 IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData,
93 IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList,
94 IN VOID *Data
95 )
96 {
97 PEI_CORE_INSTANCE PrivateData;
98 EFI_STATUS Status;
99 PEI_CORE_TEMP_POINTERS TempPtr;
100 UINT64 Tick;
101 PEI_CORE_INSTANCE *OldCoreData;
102 EFI_PEI_CPU_IO_PPI *CpuIo;
103 EFI_PEI_PCI_CFG2_PPI *PciCfg;
104 PEICORE_FUNCTION_POINTER ShadowedPeiCore;
105
106 Tick = 0;
107 OldCoreData = (PEI_CORE_INSTANCE *) Data;
108
109 //
110 // Record the system tick for first entering PeiCore.
111 // This tick is duration of executing platform seccore module.
112 //
113 if (PerformanceMeasurementEnabled()) {
114 if (OldCoreData == NULL) {
115 Tick = GetPerformanceCounter ();
116 }
117 }
118
119 if (OldCoreData != NULL) {
120 ShadowedPeiCore = (PEICORE_FUNCTION_POINTER) (UINTN) OldCoreData->ShadowedPeiCore;
121
122 //
123 // PeiCore has been shadowed to memory for first entering, so
124 // just jump to PeiCore in memory here.
125 //
126 if (ShadowedPeiCore != NULL) {
127 OldCoreData->ShadowedPeiCore = NULL;
128 ShadowedPeiCore (
129 SecCoreData,
130 PpiList,
131 OldCoreData
132 );
133 }
134
135 CopyMem (&PrivateData, OldCoreData, sizeof (PEI_CORE_INSTANCE));
136
137 CpuIo = (VOID*)PrivateData.ServiceTableShadow.CpuIo;
138 PciCfg = (VOID*)PrivateData.ServiceTableShadow.PciCfg;
139
140 CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));
141
142 PrivateData.ServiceTableShadow.CpuIo = CpuIo;
143 PrivateData.ServiceTableShadow.PciCfg = PciCfg;
144 } else {
145 //
146 // If OldCoreData is NULL, means current is first Peicore's entering.
147 //
148
149 ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE));
150 PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE;
151 CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));
152 }
153
154 PrivateData.PS = &PrivateData.ServiceTableShadow;
155
156 //
157 // Initialize libraries that the PeiCore is linked against
158 //
159 ProcessLibraryConstructorList (NULL, (CONST EFI_PEI_SERVICES **)&PrivateData.PS);
160
161 InitializeMemoryServices (&PrivateData, SecCoreData, OldCoreData);
162
163 InitializePpiServices (&PrivateData, OldCoreData);
164
165 //
166 // Save PeiServicePointer so that it can be retrieved anywhere.
167 //
168 SetPeiServicesTablePointer((CONST EFI_PEI_SERVICES **) &PrivateData.PS);
169
170 if (OldCoreData != NULL) {
171
172 PERF_END (NULL,"PreMem", NULL, 0);
173 PERF_START (NULL,"PostMem", NULL, 0);
174
175 //
176 // Alert any listeners that there is permanent memory available
177 //
178
179 PERF_START (NULL,"DisMem", NULL, 0);
180 Status = PeiServicesInstallPpi (&mMemoryDiscoveredPpi);
181 PERF_END (NULL,"DisMem", NULL, 0);
182
183 } else {
184
185 //
186 // Report Status Code EFI_SW_PC_INIT
187 //
188 REPORT_STATUS_CODE (
189 EFI_PROGRESS_CODE,
190 FixedPcdGet32 (PcdStatusCodeValuePeiCoreEntry)
191 );
192
193 PERF_START (NULL, "SEC", NULL, 1);
194 PERF_END (NULL, "SEC", NULL, Tick);
195
196 PERF_START (NULL,"PEI", NULL, Tick);
197 //
198 // If first pass, start performance measurement.
199 //
200 PERF_START (NULL,"PreMem", NULL, Tick);
201
202 //
203 // If SEC provided any PPI services to PEI, install them.
204 //
205 if (PpiList != NULL) {
206 Status = PeiServicesInstallPpi (PpiList);
207 ASSERT_EFI_ERROR (Status);
208 }
209 }
210
211 InitializeSecurityServices (&PrivateData.PS, OldCoreData);
212
213 InitializeDispatcherData (&PrivateData, OldCoreData, SecCoreData);
214
215 //
216 // Install Pei Load File PPI.
217 //
218 InitializeImageServices (&PrivateData, OldCoreData);
219
220 //
221 // Call PEIM dispatcher
222 //
223 PeiDispatcher (SecCoreData, &PrivateData);
224
225 //
226 // Check if InstallPeiMemory service was called.
227 //
228 ASSERT(PrivateData.PeiMemoryInstalled == TRUE);
229
230 //
231 // Till now, PEI phase will be finished, get performace count
232 // for computing duration of PEI phase
233 //
234 PERF_END (NULL, "PostMem", NULL, 0);
235
236 Status = PeiServicesLocatePpi (
237 &gEfiDxeIplPpiGuid,
238 0,
239 NULL,
240 (VOID **)&TempPtr.DxeIpl
241 );
242 ASSERT_EFI_ERROR (Status);
243
244 //
245 // Enter DxeIpl to load Dxe core.
246 //
247 DEBUG ((EFI_D_INFO, "DXE IPL Entry\n"));
248 Status = TempPtr.DxeIpl->Entry (
249 TempPtr.DxeIpl,
250 &PrivateData.PS,
251 PrivateData.HobList
252 );
253 //
254 // Should never reach here.
255 //
256 ASSERT_EFI_ERROR (Status);
257 CpuDeadLoop();
258 }
259
260