**/\r
\r
#include "DxeMain.h"\r
+#include "Image.h"\r
+\r
//\r
// Module Globals\r
//\r
-\r
LOADED_IMAGE_PRIVATE_DATA *mCurrentImage = NULL;\r
\r
LOAD_PE32_IMAGE_PRIVATE_DATA mLoadPe32PrivateData = {\r
EFI_STATUS Status;\r
BOOLEAN DstBufAlocated;\r
UINTN Size;\r
- UINTN LinkTimeBase;\r
- EFI_TCG_PLATFORM_PROTOCOL *TcgPlatformProtocol;\r
- IMAGE_FILE_HANDLE *FHandle;\r
\r
- FHandle = NULL;\r
ZeroMem (&Image->ImageContext, sizeof (Image->ImageContext));\r
\r
Image->ImageContext.Handle = Pe32Handle;\r
Image->ImageContext.ImageError = IMAGE_ERROR_INVALID_SUBSYSTEM;\r
return EFI_UNSUPPORTED;\r
}\r
- //\r
- // Get the image base address in the original PeImage.\r
- //\r
- LinkTimeBase = (UINTN) Image->ImageContext.ImageAddress;\r
\r
//\r
// Allocate memory of the correct memory type aligned on the required image boundry\r
}\r
\r
Image->ImageBasePage = Image->ImageContext.ImageAddress;\r
- Image->ImageContext.ImageAddress =\r
- (Image->ImageContext.ImageAddress + Image->ImageContext.SectionAlignment - 1) &\r
- ~((UINTN)Image->ImageContext.SectionAlignment - 1);\r
+ if (!Image->ImageContext.IsTeImage) {\r
+ Image->ImageContext.ImageAddress =\r
+ (Image->ImageContext.ImageAddress + Image->ImageContext.SectionAlignment - 1) &\r
+ ~((UINTN)Image->ImageContext.SectionAlignment - 1);\r
+ }\r
\r
//\r
// Load the image from the file into the allocated memory\r
}\r
}\r
\r
- //\r
- // Measure the image before applying fixup\r
- //\r
- Status = CoreLocateProtocol (\r
- &gEfiTcgPlatformProtocolGuid,\r
- NULL,\r
- (VOID **) &TcgPlatformProtocol\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- FHandle = (IMAGE_FILE_HANDLE *) Image->ImageContext.Handle;\r
- Status = TcgPlatformProtocol->MeasurePeImage (\r
- BootPolicy,\r
- (EFI_PHYSICAL_ADDRESS) (UINTN) FHandle->Source,\r
- FHandle->SourceSize,\r
- LinkTimeBase,\r
- Image->ImageContext.ImageType,\r
- Image->Info.DeviceHandle,\r
- Image->Info.FilePath\r
- );\r
-\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
-\r
//\r
// Relocate the image in memory\r
//\r
DEBUG ((DEBUG_INFO | DEBUG_LOAD,\r
"Loading driver at 0x%11p EntryPoint=0x%11p ",\r
(VOID *)(UINTN) Image->ImageContext.ImageAddress,\r
- FUNCTION_ENTRY_POINT ((UINTN) Image->ImageContext.EntryPoint)));\r
+ FUNCTION_ENTRY_POINT (Image->ImageContext.EntryPoint)));\r
\r
\r
//\r
- // Print Module Name by Pdb file path\r
+ // Print Module Name by Pdb file path.\r
+ // Windows and Unix style file path are all trimmed correctly.\r
//\r
if (Image->ImageContext.PdbPointer != NULL) {\r
StartIndex = 0;\r
for (Index = 0; Image->ImageContext.PdbPointer[Index] != 0; Index++) {\r
- if (Image->ImageContext.PdbPointer[Index] == '\\') {\r
+ if ((Image->ImageContext.PdbPointer[Index] == '\\') || (Image->ImageContext.PdbPointer[Index] == '/')) {\r
StartIndex = Index + 1;\r
}\r
}\r
//\r
// Copy the PDB file name to our temporary string, and replace .pdb with .efi\r
+ // The PDB file name is limited in the range of 0~255.\r
+ // If the length is bigger than 255, trim the redudant characters to avoid overflow in array boundary.\r
//\r
- for (Index = 0; Index < sizeof (EfiFileName); Index++) {\r
+ for (Index = 0; Index < sizeof (EfiFileName) - 4; Index++) {\r
EfiFileName[Index] = Image->ImageContext.PdbPointer[Index + StartIndex];\r
if (EfiFileName[Index] == 0) {\r
EfiFileName[Index] = '.';\r
break;\r
}\r
}\r
+\r
+ if (Index == sizeof (EfiFileName) - 4) {\r
+ EfiFileName[Index] = 0;\r
+ }\r
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "%a", EfiFileName)); // &Image->ImageContext.PdbPointer[StartIndex]));\r
}\r
DEBUG ((DEBUG_INFO | DEBUG_LOAD, "\n"));\r
&Image->Info\r
);\r
\r
+ if (Image->ImageContext.HiiResourceData != 0) {\r
+ Status = CoreUninstallProtocolInterface (\r
+ Image->Handle,\r
+ &gEfiHiiPackageListProtocolGuid,\r
+ (VOID *) (UINTN) Image->ImageContext.HiiResourceData\r
+ );\r
+ }\r
+\r
}\r
\r
if (Image->RuntimeData != NULL) {\r
goto Done;\r
}\r
\r
+ //\r
+ // Install HII Package List Protocol onto the image handle\r
+ //\r
+ if (Image->ImageContext.HiiResourceData != 0) {\r
+ Status = CoreInstallProtocolInterface (\r
+ &Image->Handle,\r
+ &gEfiHiiPackageListProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ (VOID *) (UINTN) Image->ImageContext.HiiResourceData\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+ }\r
+\r
//\r
// Success. Return the image handle\r
//\r
)\r
{\r
EFI_STATUS Status;\r
+ UINT64 Tick;\r
\r
- PERF_START (NULL, "LoadImage", NULL, 0);\r
+ Tick = 0;\r
+ PERF_CODE (\r
+ Tick = GetPerformanceCounter ();\r
+ );\r
\r
Status = CoreLoadImageCommon (\r
BootPolicy,\r
EFI_LOAD_PE_IMAGE_ATTRIBUTE_RUNTIME_REGISTRATION | EFI_LOAD_PE_IMAGE_ATTRIBUTE_DEBUG_IMAGE_INFO_TABLE_REGISTRATION\r
);\r
\r
- PERF_END (NULL, "LoadImage", NULL, 0);\r
+ PERF_START (*ImageHandle, "LoadImage:", NULL, Tick);\r
+ PERF_END (*ImageHandle, "LoadImage:", NULL, 0);\r
\r
return Status;\r
}\r
//\r
// Don't profile Objects or invalid start requests\r
//\r
- PERF_START (ImageHandle, START_IMAGE_TOK, NULL, 0);\r
+ PERF_START (ImageHandle, "StartImage:", NULL, 0);\r
\r
\r
//\r
//\r
Image->JumpBuffer = AllocatePool (sizeof (BASE_LIBRARY_JUMP_BUFFER) + BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT);\r
if (Image->JumpBuffer == NULL) {\r
- PERF_END (ImageHandle, START_IMAGE_TOK, NULL, 0);\r
+ PERF_END (ImageHandle, "StartImage:", NULL, 0);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
Image->JumpContext = ALIGN_POINTER (Image->JumpBuffer, BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT);\r
DEBUG_CODE_BEGIN ();\r
if (Image->ExitDataSize != 0 || Image->ExitData != NULL) {\r
\r
- DEBUG ((DEBUG_LOAD, "StartImage: ExitDataSize %d, ExitData %x", Image->ExitDataSize, Image->ExitData));\r
+ DEBUG ((DEBUG_LOAD, "StartImage: ExitDataSize %d, ExitData %p", (UINT32)Image->ExitDataSize, Image->ExitData));\r
if (Image->ExitData != NULL) {\r
DEBUG ((DEBUG_LOAD, " (%hs)", Image->ExitData));\r
}\r
//\r
// Done\r
//\r
- PERF_END (ImageHandle, START_IMAGE_TOK, NULL, 0);\r
+ PERF_END (ImageHandle, "StartImage:", NULL, 0);\r
return Status;\r
}\r
\r