]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - UefiCpuPkg/SecCore/FindPeiCore.c
UefiCpuPkg: Apply uncrustify changes
[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 CurrentAddress = (EndOfFile + 7) & 0xfffffffffffffff8ULL;\r
47 if (CurrentAddress > EndOfFirmwareVolume) {\r
48 return EFI_NOT_FOUND;\r
49 }\r
50\r
51 File = (EFI_FFS_FILE_HEADER *)(UINTN)CurrentAddress;\r
52 if (IS_FFS_FILE2 (File)) {\r
53 Size = FFS_FILE2_SIZE (File);\r
54 if (Size <= 0x00FFFFFF) {\r
55 return EFI_NOT_FOUND;\r
56 }\r
57 } else {\r
58 Size = FFS_FILE_SIZE (File);\r
59 if (Size < sizeof (EFI_FFS_FILE_HEADER)) {\r
60 return EFI_NOT_FOUND;\r
61 }\r
62 }\r
63\r
64 EndOfFile = CurrentAddress + Size;\r
65 if (EndOfFile > EndOfFirmwareVolume) {\r
66 return EFI_NOT_FOUND;\r
67 }\r
68\r
69 //\r
70 // Look for particular Core file (either SEC Core or PEI Core)\r
71 //\r
72 if (File->Type != FileType) {\r
73 continue;\r
74 }\r
75\r
76 //\r
77 // Loop through the FFS file sections within the FFS file\r
78 //\r
79 if (IS_FFS_FILE2 (File)) {\r
80 EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)((UINT8 *)File + sizeof (EFI_FFS_FILE_HEADER2));\r
81 } else {\r
82 EndOfSection = (EFI_PHYSICAL_ADDRESS)(UINTN)((UINT8 *)File + sizeof (EFI_FFS_FILE_HEADER));\r
83 }\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\r
118 break;\r
119 }\r
120 }\r
121\r
122 //\r
123 // Either SEC Core or PEI Core images found\r
124 //\r
125 if (*CoreImageBase != 0) {\r
126 return EFI_SUCCESS;\r
127 }\r
128 }\r
129}\r
130\r
131/**\r
132 Find and return Pei Core entry point.\r
133\r
134 It also find SEC and PEI Core file debug information. It will report them if\r
135 remote debug is enabled.\r
136\r
137 @param SecCoreFirmwareVolumePtr Point to the firmware volume for finding SecCore.\r
138 @param PeiCoreFirmwareVolumePtr Point to the firmware volume for finding PeiCore.\r
139 @param PeiCoreEntryPoint The entry point of the PEI core.\r
140\r
141**/\r
142VOID\r
143EFIAPI\r
144FindAndReportEntryPoints (\r
145 IN EFI_FIRMWARE_VOLUME_HEADER *SecCoreFirmwareVolumePtr,\r
146 IN EFI_FIRMWARE_VOLUME_HEADER *PeiCoreFirmwareVolumePtr,\r
147 OUT EFI_PEI_CORE_ENTRY_POINT *PeiCoreEntryPoint\r
148 )\r
149{\r
150 EFI_STATUS Status;\r
151 EFI_PHYSICAL_ADDRESS SecCoreImageBase;\r
152 EFI_PHYSICAL_ADDRESS PeiCoreImageBase;\r
153 PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
154\r
155 //\r
156 // Find SEC Core image base\r
157 //\r
158 Status = FindImageBase (SecCoreFirmwareVolumePtr, EFI_FV_FILETYPE_SECURITY_CORE, &SecCoreImageBase);\r
159 ASSERT_EFI_ERROR (Status);\r
160\r
161 ZeroMem ((VOID *)&ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT));\r
162 //\r
163 // Report SEC Core debug information when remote debug is enabled\r
164 //\r
165 ImageContext.ImageAddress = SecCoreImageBase;\r
166 ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)ImageContext.ImageAddress);\r
167 PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
168\r
169 //\r
170 // Find PEI Core image base\r
171 //\r
172 Status = FindImageBase (PeiCoreFirmwareVolumePtr, EFI_FV_FILETYPE_PEI_CORE, &PeiCoreImageBase);\r
173 ASSERT_EFI_ERROR (Status);\r
174\r
175 //\r
176 // Report PEI Core debug information when remote debug is enabled\r
177 //\r
178 ImageContext.ImageAddress = PeiCoreImageBase;\r
179 ImageContext.PdbPointer = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)ImageContext.ImageAddress);\r
180 PeCoffLoaderRelocateImageExtraAction (&ImageContext);\r
181\r
182 //\r
183 // Find PEI Core entry point\r
184 //\r
185 Status = PeCoffLoaderGetEntryPoint ((VOID *)(UINTN)PeiCoreImageBase, (VOID **)PeiCoreEntryPoint);\r
186 if (EFI_ERROR (Status)) {\r
187 *PeiCoreEntryPoint = 0;\r
188 }\r
189\r
190 return;\r
191}\r