From 398b646f5bcd3714685eb537f749edb2966d12dc Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Thu, 5 Mar 2009 09:20:08 +0000 Subject: [PATCH] Remove PeiPeCoffLoader.h and gPeiPeCoffLoaderGuid, and Add PeCoffExtraActionLib class and instances. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7812 6f19259b-4bc3-4df7-8a09-765794883524 --- UnixPkg/Include/Protocol/UnixThunk.h | 17 ++ .../DxeUnixPeCoffExtraActionLib.c | 132 +++++++++ .../DxeUnixPeCoffExtraActionLib.inf} | 102 +++---- .../DxeUnixPeCoffLib/DxeUnixPeCoffLib.c | 225 --------------- .../PeiCoreUnixPeCoffLib.c | 262 ------------------ .../PeiCoreUnixPeCoffLib.inf | 49 ---- .../PeiUnixPeCoffExtraActionLib.c | 137 +++++++++ .../PeiUnixPeCoffExtraActionLib.inf} | 100 ++++--- .../PeiUnixPeCoffLib/PeiUnixPeCoffLib.c | 254 ----------------- UnixPkg/Sec/SecMain.c | 90 +----- UnixPkg/Sec/SecMain.h | 34 --- UnixPkg/Sec/SecMain.inf | 4 - UnixPkg/Sec/UgaX11.c | 1 - UnixPkg/Sec/UnixThunk.c | 5 +- UnixPkg/UnixPkg.dsc | 11 +- 15 files changed, 407 insertions(+), 1016 deletions(-) create mode 100644 UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.c rename UnixPkg/Library/{DxeUnixPeCoffLib/DxeUnixPeCoffLib.inf => DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.inf} (60%) delete mode 100644 UnixPkg/Library/DxeUnixPeCoffLib/DxeUnixPeCoffLib.c delete mode 100644 UnixPkg/Library/PeiCoreUnixPeCoffLib/PeiCoreUnixPeCoffLib.c delete mode 100644 UnixPkg/Library/PeiCoreUnixPeCoffLib/PeiCoreUnixPeCoffLib.inf create mode 100644 UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c rename UnixPkg/Library/{PeiUnixPeCoffLib/PeiUnixPeCoffLib.inf => PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.inf} (65%) delete mode 100644 UnixPkg/Library/PeiUnixPeCoffLib/PeiUnixPeCoffLib.c diff --git a/UnixPkg/Include/Protocol/UnixThunk.h b/UnixPkg/Include/Protocol/UnixThunk.h index ddddf1a036..ba325bff87 100644 --- a/UnixPkg/Include/Protocol/UnixThunk.h +++ b/UnixPkg/Include/Protocol/UnixThunk.h @@ -46,6 +46,7 @@ Abstract: #include #include #include +#include #define EFI_UNIX_THUNK_PROTOCOL_GUID \ { \ @@ -189,6 +190,19 @@ int (*UnixTcsetattr) (int __fd, int __optional_actions, __const struct termios *__termios_p); +typedef +VOID * +(*UnixDlopen) (const char *FileName, int Flag); + +typedef +char * +(*UnixDlerror) (VOID); + +typedef +VOID * +(*UnixDlsym) (VOID* Handle, const char* Symbol); + + // // // @@ -237,6 +251,9 @@ typedef struct _EFI_UNIX_THUNK_PROTOCOL { UnixCfsetospeed Cfsetospeed; UnixTcgetattr Tcgetattr; UnixTcsetattr Tcsetattr; + UnixDlopen Dlopen; + UnixDlerror Dlerror; + UnixDlsym Dlsym; } EFI_UNIX_THUNK_PROTOCOL; extern EFI_GUID gEfiUnixThunkProtocolGuid; diff --git a/UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.c b/UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.c new file mode 100644 index 0000000000..a28fde8ebc --- /dev/null +++ b/UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.c @@ -0,0 +1,132 @@ +/**@file + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + PeiUnixPeCoffExtraActionLib.c + +Abstract: + + Provides services to perform additional actions to relocate and unload + PE/Coff image for Unix environment specific purpose such as souce level debug. + This version only works for DXE phase + + +**/ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +// +// Cache of UnixThunk protocol +// +EFI_UNIX_THUNK_PROTOCOL *mUnix; + + +/** + The constructor function gets the pointer of the WinNT thunk functions + It will ASSERT() if Unix thunk protocol is not installed. + + @retval EFI_SUCCESS Unix thunk protocol is found and cached. + +**/ +EFI_STATUS +EFIAPI +DxeUnixPeCoffLibExtraActionConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + + // + // Retrieve UnixThunkProtocol from GUID'ed HOB + // + GuidHob = GetFirstGuidHob (&gEfiUnixThunkProtocolGuid); + ASSERT (GuidHob != NULL); + mUnix = (EFI_UNIX_THUNK_PROTOCOL *)(*(UINTN *)(GET_GUID_HOB_DATA (GuidHob))); + ASSERT (mUnix != NULL); + + return EFI_SUCCESS; +} + +/** + Applies additional actions to relocate fixups to a PE/COFF image. + + Generally this function is called after sucessfully Applying relocation fixups + to a PE/COFF image for some specicial purpose. + + @param ImageContext Pointer to the image context structure that describes the PE/COFF + image that is being relocated. + +**/ +VOID +EFIAPI +PeCoffLoaderRelocateImageExtraAction ( + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext + ) +{ + VOID * Handle; + VOID * Entry; + + Handle = NULL; + Entry = NULL; + + DEBUG ((EFI_D_ERROR, "Loading %s 0x%08lx - entry point 0x%08lx\n", + ImageContext->PdbPointer, + (UINTN)ImageContext->ImageAddress, + (UINTN)ImageContext->EntryPoint)); + + Handle = mUnix->Dlopen(ImageContext->PdbPointer, RTLD_NOW); + + if (Handle) { + Entry = mUnix->Dlsym(Handle, "_ModuleEntryPoint"); + } else { + DEBUG ((EFI_D_ERROR, "%s\n", mUnix->Dlerror())); + } + + if (Entry != NULL) { + ImageContext->EntryPoint = Entry; + DEBUG ((EFI_D_ERROR, "Change %s Entrypoint to :0x%08lx\n", ImageContext->PdbPointer, Entry)); + } + + + return; + } + +/** + Unloads a loaded PE/COFF image from memory and releases its taken resource. + + Releases any environment specific resources that were allocated when the image + specified by ImageContext was loaded using PeCoffLoaderLoadImage(). + + If ImageContext is NULL, then ASSERT(). + + @param ImageContext Pointer to the image context structure that describes the PE/COFF + image to be unloaded. + +**/ +VOID +EFIAPI +PeCoffLoaderUnloadImageExtraAction ( + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext + ) +{ +} \ No newline at end of file diff --git a/UnixPkg/Library/DxeUnixPeCoffLib/DxeUnixPeCoffLib.inf b/UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.inf similarity index 60% rename from UnixPkg/Library/DxeUnixPeCoffLib/DxeUnixPeCoffLib.inf rename to UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.inf index b5fd4732cb..93c514692c 100644 --- a/UnixPkg/Library/DxeUnixPeCoffLib/DxeUnixPeCoffLib.inf +++ b/UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.inf @@ -1,50 +1,52 @@ -#/** @file -# PeCoff libary for Dxe modules that run Unix emulator. -# -# Lib to provide memory journal status code reporting Routines -# Copyright (c) 2007 - 2008, Intel Corporation -# All rights reserved. This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -# -# -#**/ - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = DxeUnixPeCoffLib - FILE_GUID = 624571b0-4b69-40e3-bd13-78fae0e84270 - MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 - LIBRARY_CLASS = PeCoffLib|DXE_CORE DXE_DRIVER - EDK_RELEASE_VERSION = 0x00020000 - EFI_SPECIFICATION_VERSION = 0x00020000 - - CONSTRUCTOR = DxeUnixPeCoffLibConstructor - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 -# - -[Sources.common] - DxeUnixPeCoffLib.c - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - UnixPkg/UnixPkg.dec - -[LibraryClasses] - DebugLib - HobLib - -[Guids] - gEfiPeiPeCoffLoaderGuid # ALWAYS_CONSUMED - +#/** @file +# PeCoff extra action libary for DXE phase that run Unix emulator. +# +# Lib to provide memory journal status code reporting Routines +# Copyright (c) 2007, Intel Corporation +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeUnixPeCoffExtraActionLib + FILE_GUID = C6F96971-39D2-49a5-93FC-5D42FB4D7DD2 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + + CONSTRUCTOR = DxeUnixPeCoffLibExtraActionConstructor + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 +# + +[Sources.common] + DxeUnixPeCoffExtraActionLib.c + +[Packages] + UnixPkg/UnixPkg.dec + MdePkg/MdePkg.dec + IntelFrameworkPkg/IntelFrameworkPkg.dec + IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec + +[LibraryClasses] + DebugLib + HobLib + BaseMemoryLib + +[Protocols] + gEfiUnixThunkProtocolGuid # PROTOCOL ALWAYS_CONSUMED + diff --git a/UnixPkg/Library/DxeUnixPeCoffLib/DxeUnixPeCoffLib.c b/UnixPkg/Library/DxeUnixPeCoffLib/DxeUnixPeCoffLib.c deleted file mode 100644 index 48a62549be..0000000000 --- a/UnixPkg/Library/DxeUnixPeCoffLib/DxeUnixPeCoffLib.c +++ /dev/null @@ -1,225 +0,0 @@ -/**@file - -Copyright (c) 2006 - 2008, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -Module Name: - - DxeUnixPeCoffLib.c - -Abstract: - - Wrap the Unix PE/COFF loader with the PE COFF LOADER guid structure - to produce PeCoff library class. - - -**/ - -#include -#include -#include -#include -#include - -EFI_PEI_PE_COFF_LOADER_PROTOCOL *mPeiEfiPeiPeCoffLoader; - -/** - The constructor function gets the pointer to PeCofferLoader guid structure - from the guid data hob. - - It will ASSERT() if the guid hob of PeCofferLoader guid structure doesn't exist. - - @param ImageHandle The firmware allocated handle for the EFI image. - @param SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. - -**/ -EFI_STATUS -EFIAPI -DxeUnixPeCoffLibConstructor ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_HOB_GUID_TYPE *GuidHob; - - // - // Find guid data hob that contains PeCoffLoader guid structure. - // - GuidHob = GetFirstGuidHob (&gEfiPeiPeCoffLoaderGuid); - ASSERT (GuidHob != NULL); - - // - // Get PeCofferLoader guid structure from guid hob data. - // - mPeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)(*(UINTN *)(GET_GUID_HOB_DATA (GuidHob))); - - return EFI_SUCCESS; -} - -/** - Retrieves information about a PE/COFF image. - - Computes the PeCoffHeaderOffset, ImageAddress, ImageSize, DestinationAddress, CodeView, - PdbPointer, RelocationsStripped, SectionAlignment, SizeOfHeaders, and DebugDirectoryEntryRva - fields of the ImageContext structure. If ImageContext is NULL, then return RETURN_INVALID_PARAMETER. - If the PE/COFF image accessed through the ImageRead service in the ImageContext structure is not - a supported PE/COFF image type, then return RETURN_UNSUPPORTED. If any errors occur while - computing the fields of ImageContext, then the error status is returned in the ImageError field of - ImageContext. - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image that needs to be examined by this function. - - @retval RETURN_SUCCESS The information on the PE/COFF image was collected. - @retval RETURN_INVALID_PARAMETER ImageContext is NULL. - @retval RETURN_UNSUPPORTED The PE/COFF image is not supported. - -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderGetImageInfo ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - return mPeiEfiPeiPeCoffLoader->GetImageInfo (mPeiEfiPeiPeCoffLoader, ImageContext); -} - -/** - Applies relocation fixups to a PE/COFF image that was loaded with PeCoffLoaderLoadImage(). - - If the DestinationAddress field of ImageContext is 0, then use the ImageAddress field of - ImageContext as the relocation base address. Otherwise, use the DestinationAddress field - of ImageContext as the relocation base address. The caller must allocate the relocation - fixup log buffer and fill in the FixupData field of ImageContext prior to calling this function. - If ImageContext is NULL, then ASSERT(). - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image that is being relocated. - - @retval RETURN_SUCCESS The PE/COFF image was relocated. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_LOAD_ERROR The image in not a valid PE/COFF image. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_UNSUPPORTED A relocation record type is not supported. - Extended status information is in the ImageError field of ImageContext. - -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderRelocateImage ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - return mPeiEfiPeiPeCoffLoader->RelocateImage (mPeiEfiPeiPeCoffLoader, ImageContext); -} - -/** - Loads a PE/COFF image into memory. - - Loads the PE/COFF image accessed through the ImageRead service of ImageContext into the buffer - specified by the ImageAddress and ImageSize fields of ImageContext. The caller must allocate - the load buffer and fill in the ImageAddress and ImageSize fields prior to calling this function. - The EntryPoint, FixupDataSize, CodeView, and PdbPointer fields of ImageContext are computed. - If ImageContext is NULL, then ASSERT(). - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image that is being loaded. - - @retval RETURN_SUCCESS The PE/COFF image was loaded into the buffer specified by - the ImageAddress and ImageSize fields of ImageContext. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_BUFFER_TOO_SMALL The caller did not provide a large enough buffer. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_LOAD_ERROR The PE/COFF image is an EFI Runtime image with no relocations. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_INVALID_PARAMETER The image address is invalid. - Extended status information is in the ImageError field of ImageContext. - -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderLoadImage ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - return mPeiEfiPeiPeCoffLoader->LoadImage (mPeiEfiPeiPeCoffLoader, ImageContext); -} - -/** - ImageRead function that operates on a memory buffer whos base is passed into - FileHandle. - - @param FileHandle Ponter to baes of the input stream - @param FileOffset Offset to the start of the buffer - @param ReadSize Number of bytes to copy into the buffer - @param Buffer Location to place results of read - - @retval RETURN_SUCCESS Data is read from FileOffset from the Handle into - the buffer. -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderImageReadFromMemory ( - IN VOID *FileHandle, - IN UINTN FileOffset, - IN OUT UINTN *ReadSize, - OUT VOID *Buffer - ) -{ - return RETURN_UNSUPPORTED; -} - - -/** - Reapply fixups on a fixed up PE32/PE32+ image to allow virutal calling at EFI - runtime. - - PE_COFF_LOADER_IMAGE_CONTEXT.FixupData stores information needed to reapply - the fixups with a virtual mapping. - - - @param ImageBase Base address of relocated image - @param VirtImageBase Virtual mapping for ImageBase - @param ImageSize Size of the image to relocate - @param RelocationData Location to place results of read - -**/ -VOID -EFIAPI -PeCoffLoaderRelocateImageForRuntime ( - IN PHYSICAL_ADDRESS ImageBase, - IN PHYSICAL_ADDRESS VirtImageBase, - IN UINTN ImageSize, - IN VOID *RelocationData - ) -{ -} - -/** - Unloads a loaded PE/COFF image from memory and releases its taken resource. - - For Unix emulator, the PE/COFF image loaded by system needs to release. - For real platform, the PE/COFF image loaded by Core doesn't needs to be unloaded, - this function can simply return RETURN_SUCCESS. - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image to be unloaded. - - @retval RETURN_SUCCESS The PE/COFF image was unloaded successfully. -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderUnloadImage ( - IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - return mPeiEfiPeiPeCoffLoader->UnloadImage (mPeiEfiPeiPeCoffLoader, ImageContext); -} diff --git a/UnixPkg/Library/PeiCoreUnixPeCoffLib/PeiCoreUnixPeCoffLib.c b/UnixPkg/Library/PeiCoreUnixPeCoffLib/PeiCoreUnixPeCoffLib.c deleted file mode 100644 index 77b9106037..0000000000 --- a/UnixPkg/Library/PeiCoreUnixPeCoffLib/PeiCoreUnixPeCoffLib.c +++ /dev/null @@ -1,262 +0,0 @@ -/**@file - -Copyright (c) 2006 - 2008, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -Module Name: - - PeiCoreUnixPeCoffLib.c - -Abstract: - - Wrap the Unix PE/COFF loader with the PE COFF LOADER guid structure - to produce PeCoff library class. - - -**/ - -#include -#include -#include -#include -#include -#include - -EFI_PEI_PE_COFF_LOADER_PROTOCOL *mPeiEfiPeiPeCoffLoader = NULL; - -/** - The function caches the pointer of PeCofferLoader guid structure - into the guid data hob. - - The funtion must be called after PeCofferLoader guid structure is installed. - It will ASSERT() if PeCofferLoader guid structure is not installed. - - @retval EFI_SUCCESS PeCofferLoader guid structure is found. - -**/ -EFI_STATUS -EFIAPI -GetPeCoffLoaderStucture ( - ) -{ - EFI_STATUS Status; - EFI_HOB_GUID_TYPE *GuidHob; - - Status = EFI_NOT_FOUND; - - // - // Try to get guid data hob that contains PeCoffLoader guid structure. - // - GuidHob = GetFirstGuidHob (&gEfiPeiPeCoffLoaderGuid); - - if (GuidHob == NULL) { - // - // GuidHob is not ready, try to locate PeCoffLoader guid structure. - // - Status = PeiServicesLocatePpi ( - &gEfiPeiPeCoffLoaderGuid, - 0, - NULL, - (VOID**) &mPeiEfiPeiPeCoffLoader - ); - - // - // PeCofferLoader guid structure must be installed before this library runs. - // - ASSERT_EFI_ERROR (Status); - - // - // Build guid data hob of PeCofferLoader guid structure for DXE module use. - // - BuildGuidDataHob ( - &gEfiPeiPeCoffLoaderGuid, - (VOID *) &mPeiEfiPeiPeCoffLoader, - sizeof (VOID *) - ); - } else { - // - // Get PeCofferLoader guid structure directly from guid hob data. - // - mPeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)(*(UINTN *)(GET_GUID_HOB_DATA (GuidHob))); - } - - return EFI_SUCCESS; -} - -/** - Retrieves information about a PE/COFF image. - - Computes the PeCoffHeaderOffset, ImageAddress, ImageSize, DestinationAddress, CodeView, - PdbPointer, RelocationsStripped, SectionAlignment, SizeOfHeaders, and DebugDirectoryEntryRva - fields of the ImageContext structure. If ImageContext is NULL, then return RETURN_INVALID_PARAMETER. - If the PE/COFF image accessed through the ImageRead service in the ImageContext structure is not - a supported PE/COFF image type, then return RETURN_UNSUPPORTED. If any errors occur while - computing the fields of ImageContext, then the error status is returned in the ImageError field of - ImageContext. - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image that needs to be examined by this function. - - @retval RETURN_SUCCESS The information on the PE/COFF image was collected. - @retval RETURN_INVALID_PARAMETER ImageContext is NULL. - @retval RETURN_UNSUPPORTED The PE/COFF image is not supported. - -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderGetImageInfo ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - if (mPeiEfiPeiPeCoffLoader == NULL) { - GetPeCoffLoaderStucture (); - } - return mPeiEfiPeiPeCoffLoader->GetImageInfo (mPeiEfiPeiPeCoffLoader, ImageContext); -} - -/** - Applies relocation fixups to a PE/COFF image that was loaded with PeCoffLoaderLoadImage(). - - If the DestinationAddress field of ImageContext is 0, then use the ImageAddress field of - ImageContext as the relocation base address. Otherwise, use the DestinationAddress field - of ImageContext as the relocation base address. The caller must allocate the relocation - fixup log buffer and fill in the FixupData field of ImageContext prior to calling this function. - If ImageContext is NULL, then ASSERT(). - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image that is being relocated. - - @retval RETURN_SUCCESS The PE/COFF image was relocated. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_LOAD_ERROR The image in not a valid PE/COFF image. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_UNSUPPORTED A relocation record type is not supported. - Extended status information is in the ImageError field of ImageContext. - -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderRelocateImage ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - if (mPeiEfiPeiPeCoffLoader == NULL) { - GetPeCoffLoaderStucture (); - } - return mPeiEfiPeiPeCoffLoader->RelocateImage (mPeiEfiPeiPeCoffLoader, ImageContext); -} - -/** - Loads a PE/COFF image into memory. - - Loads the PE/COFF image accessed through the ImageRead service of ImageContext into the buffer - specified by the ImageAddress and ImageSize fields of ImageContext. The caller must allocate - the load buffer and fill in the ImageAddress and ImageSize fields prior to calling this function. - The EntryPoint, FixupDataSize, CodeView, and PdbPointer fields of ImageContext are computed. - If ImageContext is NULL, then ASSERT(). - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image that is being loaded. - - @retval RETURN_SUCCESS The PE/COFF image was loaded into the buffer specified by - the ImageAddress and ImageSize fields of ImageContext. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_BUFFER_TOO_SMALL The caller did not provide a large enough buffer. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_LOAD_ERROR The PE/COFF image is an EFI Runtime image with no relocations. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_INVALID_PARAMETER The image address is invalid. - Extended status information is in the ImageError field of ImageContext. - -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderLoadImage ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - if (mPeiEfiPeiPeCoffLoader == NULL) { - GetPeCoffLoaderStucture (); - } - return mPeiEfiPeiPeCoffLoader->LoadImage (mPeiEfiPeiPeCoffLoader, ImageContext); -} - -/** - ImageRead function that operates on a memory buffer whos base is passed into - FileHandle. - - @param FileHandle Ponter to baes of the input stream - @param FileOffset Offset to the start of the buffer - @param ReadSize Number of bytes to copy into the buffer - @param Buffer Location to place results of read - - @retval RETURN_SUCCESS Data is read from FileOffset from the Handle into - the buffer. -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderImageReadFromMemory ( - IN VOID *FileHandle, - IN UINTN FileOffset, - IN OUT UINTN *ReadSize, - OUT VOID *Buffer - ) -{ - return RETURN_UNSUPPORTED; -} - - -/** - Reapply fixups on a fixed up PE32/PE32+ image to allow virutal calling at EFI - runtime. - - PE_COFF_LOADER_IMAGE_CONTEXT.FixupData stores information needed to reapply - the fixups with a virtual mapping. - - - @param ImageBase Base address of relocated image - @param VirtImageBase Virtual mapping for ImageBase - @param ImageSize Size of the image to relocate - @param RelocationData Location to place results of read - -**/ -VOID -EFIAPI -PeCoffLoaderRelocateImageForRuntime ( - IN PHYSICAL_ADDRESS ImageBase, - IN PHYSICAL_ADDRESS VirtImageBase, - IN UINTN ImageSize, - IN VOID *RelocationData - ) -{ -} - -/** - Unloads a loaded PE/COFF image from memory and releases its taken resource. - - For Unix emulator, the PE/COFF image loaded by system needs to release. - For real platform, the PE/COFF image loaded by Core doesn't needs to be unloaded, - this function can simply return RETURN_SUCCESS. - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image to be unloaded. - - @retval RETURN_SUCCESS The PE/COFF image was unloaded successfully. -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderUnloadImage ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - if (mPeiEfiPeiPeCoffLoader == NULL) { - GetPeCoffLoaderStucture (); - } - return mPeiEfiPeiPeCoffLoader->UnloadImage (mPeiEfiPeiPeCoffLoader, ImageContext); -} diff --git a/UnixPkg/Library/PeiCoreUnixPeCoffLib/PeiCoreUnixPeCoffLib.inf b/UnixPkg/Library/PeiCoreUnixPeCoffLib/PeiCoreUnixPeCoffLib.inf deleted file mode 100644 index 12b2188685..0000000000 --- a/UnixPkg/Library/PeiCoreUnixPeCoffLib/PeiCoreUnixPeCoffLib.inf +++ /dev/null @@ -1,49 +0,0 @@ -#/** @file -# PeCoff libary for PeiCore modules that run Unix emulator. -# -# Lib to provide memory journal status code reporting Routines -# Copyright (c) 2007 - 2008, Intel Corporation -# All rights reserved. This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -# -# -#**/ - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = PeiCoreUnixPeCoffLib - FILE_GUID = ef9fd7ee-3181-4b16-adc1-8615f88b58b8 - MODULE_TYPE = PEI_CORE - VERSION_STRING = 1.0 - LIBRARY_CLASS = PeCoffLib|PEI_CORE - EDK_RELEASE_VERSION = 0x00020000 - EFI_SPECIFICATION_VERSION = 0x00020000 - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 -# - -[Sources.common] - PeiCoreUnixPeCoffLib.c - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - UnixPkg/UnixPkg.dec - -[LibraryClasses] - PeiServicesLib - DebugLib - HobLib - -[Guids] - gEfiPeiPeCoffLoaderGuid # ALWAYS_CONSUMED - diff --git a/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c b/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c new file mode 100644 index 0000000000..c878b224da --- /dev/null +++ b/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.c @@ -0,0 +1,137 @@ +/**@file + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + PeiUnixPeCoffExtraActionLib.c + +Abstract: + + Provides services to perform additional actions to relocate and unload + PE/Coff image for UNIX environment specific purpose such as souce level debug. + This version only works for PEI phase + + +**/ +#include +#include +#include + +#include +#include +#include +#include +#include + +// +// Cache of UnixThunk protocol +// +EFI_UNIX_THUNK_PROTOCOL *mUnix = NULL; + +/** + The function caches the pointer of the WinNT thunk functions + It will ASSERT() if Unix thunk ppi is not installed. + + @retval EFI_SUCCESS WinNT thunk protocol is found and cached. + +**/ +EFI_STATUS +EFIAPI +UnixPeCoffGetUnixThunkStucture ( + ) +{ + PEI_UNIX_THUNK_PPI *UnixThunkPpi; + EFI_STATUS Status; + + + // + // Locate Unix ThunkPpi for retrieving standard output handle + // + Status = PeiServicesLocatePpi ( + &gPeiUnixThunkPpiGuid, + 0, + NULL, + (VOID **) &UnixThunkPpi + ); + + ASSERT_EFI_ERROR (Status); + + mUnix = (EFI_UNIX_THUNK_PROTOCOL *) UnixThunkPpi->UnixThunk (); + + return EFI_SUCCESS; +} + +/** + Applies additional actions to relocate fixups to a PE/COFF image. + + Generally this function is called after sucessfully Applying relocation fixups + to a PE/COFF image for some specicial purpose. + + @param ImageContext Pointer to the image context structure that describes the PE/COFF + image that is being relocated. + +**/ +VOID +EFIAPI +PeCoffLoaderRelocateImageExtraAction ( + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext + ) +{ + VOID * Handle; + VOID * Entry; + + Handle = NULL; + Entry = NULL; + + if (mUnix == NULL) { + UnixPeCoffGetUnixThunkStucture (); + } + DEBUG ((EFI_D_ERROR, "Loading %s 0x%08lx - entry point 0x%08lx\n", + ImageContext->PdbPointer, + (UINTN)ImageContext->ImageAddress, + (UINTN)ImageContext->EntryPoint)); + + Handle = mUnix->Dlopen (ImageContext->PdbPointer, RTLD_NOW); + + if (Handle) { + Entry = mUnix->Dlsym(Handle, "_ModuleEntryPoint"); + } else { + DEBUG ((EFI_D_ERROR, "%s\n", mUnix->Dlerror())); + } + + if (Entry != NULL) { + ImageContext->EntryPoint = Entry; + DEBUG ((EFI_D_ERROR, "Change %s Entrypoint to :0x%08lx\n", ImageContext->PdbPointer, Entry)); + } + + + return; + } + +/** + Unloads a loaded PE/COFF image from memory and releases its taken resource. + + Releases any environment specific resources that were allocated when the image + specified by ImageContext was loaded using PeCoffLoaderLoadImage(). + + If ImageContext is NULL, then ASSERT(). + + @param ImageContext Pointer to the image context structure that describes the PE/COFF + image to be unloaded. + +**/ +VOID +EFIAPI +PeCoffLoaderUnloadImageExtraAction ( + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext + ) +{ +} \ No newline at end of file diff --git a/UnixPkg/Library/PeiUnixPeCoffLib/PeiUnixPeCoffLib.inf b/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.inf similarity index 65% rename from UnixPkg/Library/PeiUnixPeCoffLib/PeiUnixPeCoffLib.inf rename to UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.inf index 6be755fd1a..1ecdd29681 100644 --- a/UnixPkg/Library/PeiUnixPeCoffLib/PeiUnixPeCoffLib.inf +++ b/UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.inf @@ -1,51 +1,49 @@ -#/** @file -# PeCoff libary for PEIM modules that run Unix emulator. -# -# Lib to provide memory journal status code reporting Routines -# Copyright (c) 2007 - 2008, Intel Corporation -# All rights reserved. This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -# -# -#**/ - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = PeiUnixPeCoffLib - FILE_GUID = 91404129-c58a-40bb-8a2b-f05bc05a961c - MODULE_TYPE = PEIM - VERSION_STRING = 1.0 - LIBRARY_CLASS = PeCoffLib|PEIM - EDK_RELEASE_VERSION = 0x00020000 - EFI_SPECIFICATION_VERSION = 0x00020000 - - CONSTRUCTOR = PeiUnixPeCoffLibConstructor - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 -# - -[Sources.common] - PeiUnixPeCoffLib.c - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - UnixPkg/UnixPkg.dec - -[LibraryClasses] - DebugLib - HobLib - PeiServicesLib - -[Guids] - gEfiPeiPeCoffLoaderGuid # ALWAYS_CONSUMED - +#/** @file +# PeCoff extra action libary for Pei phase that run UNIX emulator. +# +# Lib to provide memory journal status code reporting Routines +# Copyright (c) 2007, Intel Corporation +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +# +# +#**/ + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PeiUnixPeCoffExtraActionLib + FILE_GUID = 1D0D29DE-A5EC-46aa-AE8A-1A5A1F71F202 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = PeCoffExtraActionLib|PEI_CORE PEIM + EDK_RELEASE_VERSION = 0x00020000 + EFI_SPECIFICATION_VERSION = 0x00020000 + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 +# + +[Sources.common] + PeiUnixPeCoffExtraActionLib.c + +[Packages] + MdePkg/MdePkg.dec + UnixPkg/UnixPkg.dec + IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec + IntelFrameworkPkg/IntelFrameworkPkg.dec + +[LibraryClasses] + BaseLib + PeiServicesLib + DebugLib + +[Ppis] + gPeiUnixThunkPpiGuid # PPI ALWAYS_CONSUMED diff --git a/UnixPkg/Library/PeiUnixPeCoffLib/PeiUnixPeCoffLib.c b/UnixPkg/Library/PeiUnixPeCoffLib/PeiUnixPeCoffLib.c deleted file mode 100644 index bb88bc210f..0000000000 --- a/UnixPkg/Library/PeiUnixPeCoffLib/PeiUnixPeCoffLib.c +++ /dev/null @@ -1,254 +0,0 @@ -/**@file - -Copyright (c) 2006 - 2008, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -Module Name: - - PeiUnixPeCoffLib.c - -Abstract: - - Wrap the Unix PE/COFF loader with the PE COFF LOADER guid structure - to produce PeCoff library class. - - -**/ - -#include -#include -#include -#include -#include -#include - -EFI_PEI_PE_COFF_LOADER_PROTOCOL *mPeiEfiPeiPeCoffLoader; - -/** - The constructor function caches the pointer of PeCofferLoader guid structure - into the guid data hob. - - The constructor must be called after PeCofferLoader guid structure is installed. - It will ASSERT() if PeCofferLoader guid structure is not installed. - - @param FfsHeader Pointer to FFS header the loaded driver. - @param PeiServices Pointer to the PEI services. - - @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS. - -**/ -EFI_STATUS -EFIAPI -PeiUnixPeCoffLibConstructor ( - IN EFI_PEI_FILE_HANDLE FileHandle, - IN CONST EFI_PEI_SERVICES **PeiServices - ) -{ - EFI_STATUS Status; - EFI_HOB_GUID_TYPE *GuidHob; - - Status = EFI_NOT_FOUND; - - // - // Try to get guid data hob that contains PeCoffLoader guid structure. - // - GuidHob = GetFirstGuidHob (&gEfiPeiPeCoffLoaderGuid); - - if (GuidHob == NULL) { - // - // GuidHob is not ready, try to locate PeCoffLoader guid structure. - // - Status = PeiServicesLocatePpi ( - &gEfiPeiPeCoffLoaderGuid, - 0, - NULL, - (VOID **) &mPeiEfiPeiPeCoffLoader - ); - // - // PeCofferLoader guid structure must be installed before this library runs. - // - ASSERT_EFI_ERROR (Status); - - // - // Build guid data hob of PeCofferLoader guid structure for DXE module use. - // - BuildGuidDataHob ( - &gEfiPeiPeCoffLoaderGuid, - (VOID *) &mPeiEfiPeiPeCoffLoader, - sizeof (VOID *) - ); - } else { - // - // Get PeCofferLoader guid structure directly from guid hob data. - // - mPeiEfiPeiPeCoffLoader = (EFI_PEI_PE_COFF_LOADER_PROTOCOL *)(*(UINTN *)(GET_GUID_HOB_DATA (GuidHob))); - } - - return EFI_SUCCESS; -} - -/** - Retrieves information about a PE/COFF image. - - Computes the PeCoffHeaderOffset, ImageAddress, ImageSize, DestinationAddress, CodeView, - PdbPointer, RelocationsStripped, SectionAlignment, SizeOfHeaders, and DebugDirectoryEntryRva - fields of the ImageContext structure. If ImageContext is NULL, then return RETURN_INVALID_PARAMETER. - If the PE/COFF image accessed through the ImageRead service in the ImageContext structure is not - a supported PE/COFF image type, then return RETURN_UNSUPPORTED. If any errors occur while - computing the fields of ImageContext, then the error status is returned in the ImageError field of - ImageContext. - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image that needs to be examined by this function. - - @retval RETURN_SUCCESS The information on the PE/COFF image was collected. - @retval RETURN_INVALID_PARAMETER ImageContext is NULL. - @retval RETURN_UNSUPPORTED The PE/COFF image is not supported. - -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderGetImageInfo ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - return mPeiEfiPeiPeCoffLoader->GetImageInfo (mPeiEfiPeiPeCoffLoader, ImageContext); -} - -/** - Applies relocation fixups to a PE/COFF image that was loaded with PeCoffLoaderLoadImage(). - - If the DestinationAddress field of ImageContext is 0, then use the ImageAddress field of - ImageContext as the relocation base address. Otherwise, use the DestinationAddress field - of ImageContext as the relocation base address. The caller must allocate the relocation - fixup log buffer and fill in the FixupData field of ImageContext prior to calling this function. - If ImageContext is NULL, then ASSERT(). - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image that is being relocated. - - @retval RETURN_SUCCESS The PE/COFF image was relocated. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_LOAD_ERROR The image in not a valid PE/COFF image. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_UNSUPPORTED A relocation record type is not supported. - Extended status information is in the ImageError field of ImageContext. - -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderRelocateImage ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - return mPeiEfiPeiPeCoffLoader->RelocateImage (mPeiEfiPeiPeCoffLoader, ImageContext); -} - -/** - Loads a PE/COFF image into memory. - - Loads the PE/COFF image accessed through the ImageRead service of ImageContext into the buffer - specified by the ImageAddress and ImageSize fields of ImageContext. The caller must allocate - the load buffer and fill in the ImageAddress and ImageSize fields prior to calling this function. - The EntryPoint, FixupDataSize, CodeView, and PdbPointer fields of ImageContext are computed. - If ImageContext is NULL, then ASSERT(). - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image that is being loaded. - - @retval RETURN_SUCCESS The PE/COFF image was loaded into the buffer specified by - the ImageAddress and ImageSize fields of ImageContext. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_BUFFER_TOO_SMALL The caller did not provide a large enough buffer. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_LOAD_ERROR The PE/COFF image is an EFI Runtime image with no relocations. - Extended status information is in the ImageError field of ImageContext. - @retval RETURN_INVALID_PARAMETER The image address is invalid. - Extended status information is in the ImageError field of ImageContext. - -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderLoadImage ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - return mPeiEfiPeiPeCoffLoader->LoadImage (mPeiEfiPeiPeCoffLoader, ImageContext); -} - -/** - ImageRead function that operates on a memory buffer whos base is passed into - FileHandle. - - @param FileHandle Ponter to baes of the input stream - @param FileOffset Offset to the start of the buffer - @param ReadSize Number of bytes to copy into the buffer - @param Buffer Location to place results of read - - @retval RETURN_SUCCESS Data is read from FileOffset from the Handle into - the buffer. -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderImageReadFromMemory ( - IN VOID *FileHandle, - IN UINTN FileOffset, - IN OUT UINTN *ReadSize, - OUT VOID *Buffer - ) -{ - return RETURN_UNSUPPORTED; -} - - -/** - Reapply fixups on a fixed up PE32/PE32+ image to allow virutal calling at EFI - runtime. - - PE_COFF_LOADER_IMAGE_CONTEXT.FixupData stores information needed to reapply - the fixups with a virtual mapping. - - - @param ImageBase Base address of relocated image - @param VirtImageBase Virtual mapping for ImageBase - @param ImageSize Size of the image to relocate - @param RelocationData Location to place results of read - -**/ -VOID -EFIAPI -PeCoffLoaderRelocateImageForRuntime ( - IN PHYSICAL_ADDRESS ImageBase, - IN PHYSICAL_ADDRESS VirtImageBase, - IN UINTN ImageSize, - IN VOID *RelocationData - ) -{ -} - -/** - Unloads a loaded PE/COFF image from memory and releases its taken resource. - - For Unix emulator, the PE/COFF image loaded by system needs to release. - For real platform, the PE/COFF image loaded by Core doesn't needs to be unloaded, - this function can simply return RETURN_SUCCESS. - - @param ImageContext Pointer to the image context structure that describes the PE/COFF - image to be unloaded. - - @retval RETURN_SUCCESS The PE/COFF image was unloaded successfully. -**/ -RETURN_STATUS -EFIAPI -PeCoffLoaderUnloadImage ( - IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - return mPeiEfiPeiPeCoffLoader->UnloadImage (mPeiEfiPeiPeCoffLoader, ImageContext); -} diff --git a/UnixPkg/Sec/SecMain.c b/UnixPkg/Sec/SecMain.c index 599859e58e..b49f37bfcf 100644 --- a/UnixPkg/Sec/SecMain.c +++ b/UnixPkg/Sec/SecMain.c @@ -41,19 +41,6 @@ Abstract: // // Globals // -EFI_PEI_PE_COFF_LOADER_PROTOCOL_INSTANCE mPeiEfiPeiPeCoffLoaderInstance = { - { - SecNt32PeCoffGetImageInfo, - SecNt32PeCoffLoadImage, - SecNt32PeCoffRelocateImage, - SecNt32PeCoffUnloadimage - }, - NULL -}; - - - -EFI_PEI_PE_COFF_LOADER_PROTOCOL *gPeiEfiPeiPeCoffLoader = &mPeiEfiPeiPeCoffLoaderInstance.PeCoff; UNIX_PEI_LOAD_FILE_PPI mSecNtLoadFilePpi = { SecWinNtPeiLoadFile }; @@ -68,11 +55,6 @@ UNIX_FWH_PPI mSecFwhInformationPpi = { SecWinN TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {SecTemporaryRamSupport}; EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = { - { - EFI_PEI_PPI_DESCRIPTOR_PPI, - &gEfiPeiPeCoffLoaderGuid, - NULL - }, { EFI_PEI_PPI_DESCRIPTOR_PPI, &gUnixPeiLoadFilePpiGuid, @@ -146,6 +128,11 @@ MapFile ( IN OUT EFI_PHYSICAL_ADDRESS *BaseAddress, OUT UINT64 *Length ); +EFI_STATUS +EFIAPI +SecNt32PeCoffRelocateImage ( + IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext + ); INTN @@ -601,11 +588,7 @@ Returns: TopOfStack = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT); TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT); - // - // Patch value in dispatch table values - // - gPrivateDispatchTable[0].Ppi = gPeiEfiPeiPeCoffLoader; - + // // Bind this information into the SEC hand-off state // @@ -754,7 +737,7 @@ Returns: ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) SecImageRead; - Status = gPeiEfiPeiPeCoffLoader->GetImageInfo (gPeiEfiPeiPeCoffLoader, &ImageContext); + Status = PeCoffLoaderGetImageInfo (&ImageContext); if (EFI_ERROR (Status)) { return Status; } @@ -772,12 +755,12 @@ Returns: ImageContext.ImageAddress &= ~(ImageContext.SectionAlignment - 1); - Status = gPeiEfiPeiPeCoffLoader->LoadImage (gPeiEfiPeiPeCoffLoader, &ImageContext); + Status = PeCoffLoaderLoadImage (&ImageContext); if (EFI_ERROR (Status)) { return Status; } - Status = gPeiEfiPeiPeCoffLoader->RelocateImage (gPeiEfiPeiPeCoffLoader, &ImageContext); + Status = SecNt32PeCoffRelocateImage(&ImageContext); if (EFI_ERROR (Status)) { return Status; } @@ -901,59 +884,6 @@ Returns: -EFI_STATUS -EFIAPI -SecNt32PeCoffGetImageInfo ( - IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This, - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - EFI_STATUS Status; - - Status = PeCoffLoaderGetImageInfo (ImageContext); - if (EFI_ERROR (Status)) { - return Status; - } - - switch (ImageContext->ImageType) { - - case EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION: - ImageContext->ImageCodeMemoryType = EfiLoaderCode; - ImageContext->ImageDataMemoryType = EfiLoaderData; - break; - - case EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER: - ImageContext->ImageCodeMemoryType = EfiBootServicesCode; - ImageContext->ImageDataMemoryType = EfiBootServicesData; - break; - - case EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER: - case EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER: - ImageContext->ImageCodeMemoryType = EfiRuntimeServicesCode; - ImageContext->ImageDataMemoryType = EfiRuntimeServicesData; - break; - - default: - ImageContext->ImageError = IMAGE_ERROR_INVALID_SUBSYSTEM; - return RETURN_UNSUPPORTED; - } - - return Status; -} - -EFI_STATUS -EFIAPI -SecNt32PeCoffLoadImage ( - IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This, - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ) -{ - EFI_STATUS Status; - - Status = PeCoffLoaderLoadImage (ImageContext); - return Status; -} - VOID SecUnixLoaderBreak ( VOID @@ -964,7 +894,6 @@ SecUnixLoaderBreak ( EFI_STATUS EFIAPI SecNt32PeCoffRelocateImage ( - IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This, IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext ) { @@ -1003,7 +932,6 @@ SecNt32PeCoffRelocateImage ( EFI_STATUS EFIAPI SecNt32PeCoffUnloadimage ( - IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This, IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext ) { diff --git a/UnixPkg/Sec/SecMain.h b/UnixPkg/Sec/SecMain.h index 9714b5a4b9..d80d6b44b4 100644 --- a/UnixPkg/Sec/SecMain.h +++ b/UnixPkg/Sec/SecMain.h @@ -22,7 +22,6 @@ Abstract: #include #include -#include #include #include @@ -503,34 +502,6 @@ Returns: --*/ ; -EFI_STATUS -EFIAPI -SecNt32PeCoffGetImageInfo ( - IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This, - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - -EFI_STATUS -EFIAPI -SecNt32PeCoffLoadImage ( - IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This, - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - -EFI_STATUS -EFIAPI -SecNt32PeCoffRelocateImage ( - IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This, - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - -EFI_STATUS -EFIAPI -SecNt32PeCoffUnloadimage ( - IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This, - IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext - ); - EFI_STATUS EFIAPI SecTemporaryRamSupport ( @@ -540,9 +511,4 @@ SecTemporaryRamSupport ( IN UINTN CopySize ); -typedef struct { - EFI_PEI_PE_COFF_LOADER_PROTOCOL PeCoff; - VOID *ModHandle; -} EFI_PEI_PE_COFF_LOADER_PROTOCOL_INSTANCE; - extern EFI_UNIX_THUNK_PROTOCOL *gUnix; diff --git a/UnixPkg/Sec/SecMain.inf b/UnixPkg/Sec/SecMain.inf index 7048f68212..b2980b857b 100644 --- a/UnixPkg/Sec/SecMain.inf +++ b/UnixPkg/Sec/SecMain.inf @@ -53,10 +53,6 @@ ReportStatusCodeLib -[Guids] - gEfiPeiPeCoffLoaderGuid # ALWAYS_PRODUCED - - [Ppis] gUnixPeiLoadFilePpiGuid # PPI ALWAYS_PRODUCED gEfiPeiStatusCodePpiGuid # PPI ALWAYS_PRODUCED diff --git a/UnixPkg/Sec/UgaX11.c b/UnixPkg/Sec/UgaX11.c index a3c152dac3..a6cac78c51 100644 --- a/UnixPkg/Sec/UgaX11.c +++ b/UnixPkg/Sec/UgaX11.c @@ -15,7 +15,6 @@ #include #include -#include #include #include diff --git a/UnixPkg/Sec/UnixThunk.c b/UnixPkg/Sec/UnixThunk.c index 905cd80d27..d634de6408 100644 --- a/UnixPkg/Sec/UnixThunk.c +++ b/UnixPkg/Sec/UnixThunk.c @@ -191,7 +191,10 @@ EFI_UNIX_THUNK_PROTOCOL mUnixThunkTable = { cfsetispeed, cfsetospeed, tcgetattr, - tcsetattr + tcsetattr, + dlopen, + dlerror, + dlsym }; diff --git a/UnixPkg/UnixPkg.dsc b/UnixPkg/UnixPkg.dsc index 53fef6e706..3efcc226f4 100644 --- a/UnixPkg/UnixPkg.dsc +++ b/UnixPkg/UnixPkg.dsc @@ -3,7 +3,7 @@ # EFI/Framework Emulation Platform with UEFI HII interface supported. # # The Emulation Platform can be used to debug individual modules, prior to creating -# a real platform. This also provides an example for how an FPD is created. +# a real platform. This also provides an example for how an DSC is created. # Copyright (c) 2006 - 2008, Intel Corporation # # All rights reserved. This program and the accompanying materials @@ -75,6 +75,7 @@ [LibraryClasses.common.USER_DEFINED] DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf + PeCoffExtraActionLib|MdePkg/Library/PeCoffExtraActionLibNull/PeCoffExtraActionLibNull.inf ReportStatusCodeLib|IntelFrameworkModulePkg/Library/PeiReportStatusCodeLib/PeiReportStatusCodeLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf OemHookStatusCodeLib|UnixPkg/Library/PeiUnixOemHookStatusCodeLib/PeiUnixOemHookStatusCodeLib.inf @@ -92,7 +93,7 @@ UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf DebugLib|IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf - PeCoffLib|UnixPkg/Library/DxeUnixPeCoffLib/DxeUnixPeCoffLib.inf + PeCoffExtraActionLib|UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.inf ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf [LibraryClasses.common.DXE_SMM_DRIVER] @@ -123,7 +124,7 @@ OemHookStatusCodeLib|UnixPkg/Library/PeiUnixOemHookStatusCodeLib/PeiUnixOemHookStatusCodeLib.inf PeCoffGetEntryPointLib|UnixPkg/Library/EdkUnixPeiPeCoffGetEntryPointLib/EdkUnixPeiPeCoffGetEntryPointLib.inf DebugLib|IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf - PeCoffLib|UnixPkg/Library/PeiUnixPeCoffLib/PeiUnixPeCoffLib.inf + PeCoffExtraActionLib|UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.inf ExtractGuidedSectionLib|MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.inf [LibraryClasses.common.PEI_CORE] @@ -139,7 +140,7 @@ PeCoffGetEntryPointLib|UnixPkg/Library/EdkUnixPeiPeCoffGetEntryPointLib/EdkUnixPeiPeCoffGetEntryPointLib.inf PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf DebugLib|IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf - PeCoffLib|UnixPkg/Library/PeiCoreUnixPeCoffLib/PeiCoreUnixPeCoffLib.inf + PeCoffExtraActionLib|UnixPkg/Library/PeiUnixPeCoffExtraActionLib/PeiUnixPeCoffExtraActionLib.inf [LibraryClasses.common.DXE_RUNTIME_DRIVER] UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf @@ -157,6 +158,7 @@ UnixLib|UnixPkg/Library/DxeUnixLib/DxeUnixLib.inf OemHookStatusCodeLib|UnixPkg/Library/DxeUnixOemHookStatusCodeLib/DxeUnixOemHookStatusCodeLib.inf DebugLib|IntelFrameworkModulePkg/Library/PeiDxeDebugLibReportStatusCode/PeiDxeDebugLibReportStatusCode.inf + PeCoffExtraActionLib|UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.inf [LibraryClasses.common.UEFI_DRIVER] UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf @@ -177,6 +179,7 @@ UdpIoLib|MdeModulePkg/Library/DxeUdpIoLib/DxeUdpIoLib.inf IpIoLib|MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.inf DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf + PeCoffExtraActionLib|UnixPkg/Library/DxeUnixPeCoffExtraActionLib/DxeUnixPeCoffExtraActionLib.inf [LibraryClasses.common.DXE_DRIVER] UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf