]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/SecCore/FindPeiCore.c
UefiCpuPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / UefiCpuPkg / SecCore / FindPeiCore.c
CommitLineData
1921695e
MK
1/** @file\r
2 Locate the entry point for the PEI Core\r
3\r
08283b96 4 Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.<BR>\r
0acd8697 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
1921695e
MK
6\r
7**/\r
8\r
9#include <PiPei.h>\r
1921695e
MK
10\r
11#include "SecMain.h"\r
12\r
13/**\r
14 Find core image base.\r
15\r
08283b96
CC
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
1921695e
MK
19\r
20**/\r
21EFI_STATUS\r
22EFIAPI\r
23FindImageBase (\r
08283b96
CC
24 IN EFI_FIRMWARE_VOLUME_HEADER *FirmwareVolumePtr,\r
25 IN EFI_FV_FILETYPE FileType,\r
26 OUT EFI_PHYSICAL_ADDRESS *CoreImageBase\r
1921695e
MK
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
08283b96 37 *CoreImageBase = 0;\r
1921695e 38\r
08283b96
CC
39 CurrentAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) FirmwareVolumePtr;\r
40 EndOfFirmwareVolume = CurrentAddress + FirmwareVolumePtr->FvLength;\r
1921695e
MK
41\r
42 //\r
43 // Loop through the FFS files in the Boot Firmware Volume\r
44 //\r
08283b96 45 for (EndOfFile = CurrentAddress + FirmwareVolumePtr->HeaderLength; ; ) {\r
1921695e
MK
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
08283b96 71 // Look for particular Core file (either SEC Core or PEI Core)\r
1921695e 72 //\r
08283b96 73 if (File->Type != FileType) {\r
1921695e
MK
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
08283b96 110 if (File->Type == FileType) {\r
1921695e 111 if (IS_SECTION2 (Section)) {\r
08283b96 112 *CoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER2));\r
1921695e 113 } else {\r
08283b96 114 *CoreImageBase = (PHYSICAL_ADDRESS) (UINTN) ((UINT8 *) Section + sizeof (EFI_COMMON_SECTION_HEADER));\r
1921695e
MK
115 }\r
116 }\r
117 break;\r
118 }\r
119 }\r
120\r
121 //\r
08283b96 122 // Either SEC Core or PEI Core images found\r
1921695e 123 //\r
08283b96 124 if (*CoreImageBase != 0) {\r
1921695e
MK
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
08283b96
CC
136 @param SecCoreFirmwareVolumePtr Point to the firmware volume for finding SecCore.\r
137 @param PeiCoreFirmwareVolumePtr Point to the firmware volume for finding PeiCore.\r
1921695e
MK
138 @param PeiCoreEntryPoint The entry point of the PEI core.\r
139\r
140**/\r
141VOID\r
142EFIAPI\r
143FindAndReportEntryPoints (\r
08283b96
CC
144 IN EFI_FIRMWARE_VOLUME_HEADER *SecCoreFirmwareVolumePtr,\r
145 IN EFI_FIRMWARE_VOLUME_HEADER *PeiCoreFirmwareVolumePtr,\r
1921695e
MK
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
08283b96 155 // Find SEC Core image base\r
1921695e 156 //\r
08283b96 157 Status = FindImageBase (SecCoreFirmwareVolumePtr, EFI_FV_FILETYPE_SECURITY_CORE, &SecCoreImageBase);\r
1921695e
MK
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
08283b96
CC
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
1921695e
MK
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