]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - UefiCpuPkg/SecCore/FindPeiCore.c
UefiCpuPkg/MpInitLib: Always get CPUID & PlatformID in MicrocodeDetect()
[mirror_edk2.git] / UefiCpuPkg / SecCore / FindPeiCore.c
... / ...
CommitLineData
1/** @file\r
2 Locate the entry point for the PEI Core\r
3\r
4 Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include <PiPei.h>\r
10\r
11#include "SecMain.h"\r
12\r
13/**\r
14 Find core image base.\r
15\r
16 @param FirmwareVolumePtr Point to the firmware volume for finding core image.\r
17 @param FileType The FileType for searching, either SecCore or PeiCore.\r
18 @param CoreImageBase The base address of the core image.\r
19\r
20**/\r
21EFI_STATUS\r
22EFIAPI\r
23FindImageBase (\r
24 IN EFI_FIRMWARE_VOLUME_HEADER *FirmwareVolumePtr,\r
25 IN EFI_FV_FILETYPE FileType,\r
26 OUT EFI_PHYSICAL_ADDRESS *CoreImageBase\r
27 )\r
28{\r
29 EFI_PHYSICAL_ADDRESS CurrentAddress;\r
30 EFI_PHYSICAL_ADDRESS EndOfFirmwareVolume;\r
31 EFI_FFS_FILE_HEADER *File;\r
32 UINT32 Size;\r
33 EFI_PHYSICAL_ADDRESS EndOfFile;\r
34 EFI_COMMON_SECTION_HEADER *Section;\r
35 EFI_PHYSICAL_ADDRESS EndOfSection;\r
36\r
37 *CoreImageBase = 0;\r
38\r
39 CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) FirmwareVolumePtr;\r
40 EndOfFirmwareVolume = CurrentAddress + FirmwareVolumePtr->FvLength;\r
41\r
42 //\r
43 // Loop through the FFS files in the Boot Firmware Volume\r
44 //\r
45 for (EndOfFile = CurrentAddress + FirmwareVolumePtr->HeaderLength; ; ) {\r
46\r
47 CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;\r
48 if (CurrentAddress > EndOfFirmwareVolume) {\r
49 return EFI_NOT_FOUND;\r
50 }\r
51\r
52 File = (EFI_FFS_FILE_HEADER*)(UINTN) CurrentAddress;\r
53 if (IS_FFS_FILE2 (File)) {\r
54 Size = FFS_FILE2_SIZE (File);\r
55 if (Size <= 0x00FFFFFF) {\r
56 return EFI_NOT_FOUND;\r
57 }\r
58 } else {\r
59 Size = FFS_FILE_SIZE (File);\r
60 if (Size < sizeof (EFI_FFS_FILE_HEADER)) {\r
61 return EFI_NOT_FOUND;\r
62 }\r
63 }\r
64\r
65 EndOfFile = CurrentAddress + Size;\r
66 if (EndOfFile > EndOfFirmwareVolume) {\r
67 return EFI_NOT_FOUND;\r
68 }\r
69\r
70 //\r
71 // Look for particular Core file (either SEC Core or PEI Core)\r
72 //\r
73 if (File->Type != FileType) {\r
74 continue;\r
75 }\r
76\r
77 //\r
78 // Loop through the FFS file sections within the FFS file\r
79 //\r
80 if (IS_FFS_FILE2 (File)) {\r
81 EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File + sizeof (EFI_FFS_FILE_HEADER2));\r
82 } else {\r
83 EndOfSection = (EFI_PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) File + sizeof (EFI_FFS_FILE_HEADER));\r
84 }\r
85 for (;;) {\r
86 CurrentAddress = (EndOfSection + 3) & 0xfffffffffffffffcULL;\r
87 Section = (EFI_COMMON_SECTION_HEADER*)(UINTN) CurrentAddress;\r
88\r
89 if (IS_SECTION2 (Section)) {\r
90 Size = SECTION2_SIZE (Section);\r
91 if (Size <= 0x00FFFFFF) {\r
92 return EFI_NOT_FOUND;\r
93 }\r
94 } else {\r
95 Size = SECTION_SIZE (Section);\r
96 if (Size < sizeof (EFI_COMMON_SECTION_HEADER)) {\r
97 return EFI_NOT_FOUND;\r
98 }\r
99 }\r
100\r
101 EndOfSection = CurrentAddress + Size;\r
102 if (EndOfSection > EndOfFile) {\r
103 return EFI_NOT_FOUND;\r
104 }\r
105\r
106 //\r
107 // Look for executable sections\r
108 //\r
109 if (Section->Type == EFI_SECTION_PE32 || Section->Type == EFI_SECTION_TE) {\r
110 if (File->Type == FileType) {\r
111 if (IS_SECTION2 (Section)) {\r
112 *CoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));\r
113 } else {\r
114 *CoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));\r
115 }\r
116 }\r
117 break;\r
118 }\r
119 }\r
120\r
121 //\r
122 // Either SEC Core or PEI Core images found\r
123 //\r
124 if (*CoreImageBase != 0) {\r
125 return EFI_SUCCESS;\r
126 }\r
127 }\r
128}\r
129\r
130/**\r
131 Find and return Pei Core entry point.\r
132\r
133 It also find SEC and PEI Core file debug information. It will report them if\r
134 remote debug is enabled.\r
135\r
136 @param SecCoreFirmwareVolumePtr Point to the firmware volume for finding SecCore.\r
137 @param PeiCoreFirmwareVolumePtr Point to the firmware volume for finding PeiCore.\r
138 @param PeiCoreEntryPoint The entry point of the PEI core.\r
139\r
140**/\r
141VOID\r
142EFIAPI\r
143FindAndReportEntryPoints (\r
144 IN EFI_FIRMWARE_VOLUME_HEADER *SecCoreFirmwareVolumePtr,\r
145 IN EFI_FIRMWARE_VOLUME_HEADER *PeiCoreFirmwareVolumePtr,\r
146 OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint\r
147 )\r
148{\r
149 EFI_STATUS Status;\r
150 EFI_PHYSICAL_ADDRESS SecCoreImageBase;\r
151 EFI_PHYSICAL_ADDRESS PeiCoreImageBase;\r
152 PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
153\r
154 //\r
155 // Find SEC Core image base\r
156 //\r
157 Status = FindImageBase (SecCoreFirmwareVolumePtr, EFI_FV_FILETYPE_SECURITY_CORE, &SecCoreImageBase);\r
158 ASSERT_EFI_ERROR (Status);\r
159\r
160 ZeroMem ((VOID *) &ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));\r
161 //\r
162 // Report SEC Core debug information when remote debug is enabled\r
163 //\r
164 ImageContext.ImageAddress = SecCoreImageBase;\r
165 ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);\r
166 PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
167\r
168 //\r
169 // Find PEI Core image base\r
170 //\r
171 Status = FindImageBase (PeiCoreFirmwareVolumePtr, EFI_FV_FILETYPE_PEI_CORE, &PeiCoreImageBase);\r
172 ASSERT_EFI_ERROR (Status);\r
173\r
174 //\r
175 // Report PEI Core debug information when remote debug is enabled\r
176 //\r
177 ImageContext.ImageAddress = PeiCoreImageBase;\r
178 ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID*) (UINTN) ImageContext.ImageAddress);\r
179 PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
180\r
181 //\r
182 // Find PEI Core entry point\r
183 //\r
184 Status = PeCoffLoaderGetEntryPoint ((VOID *) (UINTN) PeiCoreImageBase, (VOID**) PeiCoreEntryPoint);\r
185 if (EFI_ERROR (Status)) {\r
186 *PeiCoreEntryPoint = 0;\r
187 }\r
188\r
189 return;\r
190}\r