[edk2-devel] [PATCH] StandaloneMmPkg/StandaloneMmCore: Drop unused fixed address feature

Marvin Häuser posted 1 patch 2 years, 8 months ago
Failed in applying to current master (apply log)
StandaloneMmPkg/Core/Dispatcher.c | 167 --------------------
1 file changed, 167 deletions(-)
[edk2-devel] [PATCH] StandaloneMmPkg/StandaloneMmCore: Drop unused fixed address feature
Posted by Marvin Häuser 2 years, 8 months ago
StandaloneMmCore does not support fixed load addresses for modules.
Remove the unreferenced functions that are used in other dispatchers
to implement this feature.

Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Sami Mujawar <sami.mujawar@arm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Supreeth Venkatesh <supreeth.venkatesh@arm.com>
Cc: Vitaly Cheptsov <vit9696@protonmail.com>
Signed-off-by: Marvin Häuser <mhaeuser@posteo.de>
---
 StandaloneMmPkg/Core/Dispatcher.c | 167 --------------------
 1 file changed, 167 deletions(-)

diff --git a/StandaloneMmPkg/Core/Dispatcher.c b/StandaloneMmPkg/Core/Dispatcher.c
index 7e4bf5e94025..d5631f47be68 100644
--- a/StandaloneMmPkg/Core/Dispatcher.c
+++ b/StandaloneMmPkg/Core/Dispatcher.c
@@ -109,173 +109,6 @@ BOOLEAN  gRequestDispatch = FALSE;
 //

 GLOBAL_REMOVE_IF_UNREFERENCED    UINT64                *mMmCodeMemoryRangeUsageBitMap=NULL;

 

-/**

-  To check memory usage bit map array to figure out if the memory range in which the image will be loaded

-  is available or not. If memory range is avaliable, the function will mark the corresponding bits to 1

-  which indicates the memory range is used. The function is only invoked when load modules at fixed address

-  feature is enabled.

-

-  @param  ImageBase                The base addres the image will be loaded at.

-  @param  ImageSize                The size of the image

-

-  @retval EFI_SUCCESS              The memory range the image will be loaded in is available

-  @retval EFI_NOT_FOUND            The memory range the image will be loaded in is not available

-**/

-EFI_STATUS

-CheckAndMarkFixLoadingMemoryUsageBitMap (

-  IN  EFI_PHYSICAL_ADDRESS          ImageBase,

-  IN  UINTN                         ImageSize

-  )

-{

-  UINT32                             MmCodePageNumber;

-  UINT64                             MmCodeSize;

-  EFI_PHYSICAL_ADDRESS               MmCodeBase;

-  UINTN                              BaseOffsetPageNumber;

-  UINTN                              TopOffsetPageNumber;

-  UINTN                              Index;

-

-  //

-  // Build tool will calculate the smm code size and then patch the PcdLoadFixAddressMmCodePageNumber

-  //

-  MmCodePageNumber = 0;

-  MmCodeSize = EFI_PAGES_TO_SIZE (MmCodePageNumber);

-  MmCodeBase = gLoadModuleAtFixAddressMmramBase;

-

-  //

-  // If the memory usage bit map is not initialized,  do it. Every bit in the array

-  // indicate the status of the corresponding memory page, available or not

-  //

-  if (mMmCodeMemoryRangeUsageBitMap == NULL) {

-    mMmCodeMemoryRangeUsageBitMap = AllocateZeroPool (((MmCodePageNumber / 64) + 1) * sizeof (UINT64));

-  }

-

-  //

-  // If the Dxe code memory range is not allocated or the bit map array allocation failed, return EFI_NOT_FOUND

-  //

-  if (mMmCodeMemoryRangeUsageBitMap == NULL) {

-    return EFI_NOT_FOUND;

-  }

-

-  //

-  // see if the memory range for loading the image is in the MM code range.

-  //

-  if (MmCodeBase + MmCodeSize <  ImageBase + ImageSize || MmCodeBase >  ImageBase) {

-    return EFI_NOT_FOUND;

-  }

-

-  //

-  // Test if the memory is available or not.

-  //

-  BaseOffsetPageNumber = (UINTN)EFI_SIZE_TO_PAGES ((UINT32)(ImageBase - MmCodeBase));

-  TopOffsetPageNumber  = (UINTN)EFI_SIZE_TO_PAGES ((UINT32)(ImageBase + ImageSize - MmCodeBase));

-  for (Index = BaseOffsetPageNumber; Index < TopOffsetPageNumber; Index ++) {

-    if ((mMmCodeMemoryRangeUsageBitMap[Index / 64] & LShiftU64 (1, (Index % 64))) != 0) {

-      //

-      // This page is already used.

-      //

-      return EFI_NOT_FOUND;

-    }

-  }

-

-  //

-  // Being here means the memory range is available.  So mark the bits for the memory range

-  //

-  for (Index = BaseOffsetPageNumber; Index < TopOffsetPageNumber; Index ++) {

-    mMmCodeMemoryRangeUsageBitMap[Index / 64] |= LShiftU64 (1, (Index % 64));

-  }

-  return  EFI_SUCCESS;

-}

-

-/**

-  Get the fixed loading address from image header assigned by build tool. This function only be called

-  when Loading module at Fixed address feature enabled.

-

-  @param  ImageContext              Pointer to the image context structure that describes the PE/COFF

-                                    image that needs to be examined by this function.

-  @retval EFI_SUCCESS               An fixed loading address is assigned to this image by build tools .

-  @retval EFI_NOT_FOUND             The image has no assigned fixed loadding address.

-

-**/

-EFI_STATUS

-GetPeCoffImageFixLoadingAssignedAddress(

-  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext

-  )

-{

-  UINTN                              SectionHeaderOffset;

-  EFI_STATUS                         Status;

-  EFI_IMAGE_SECTION_HEADER           SectionHeader;

-  EFI_IMAGE_OPTIONAL_HEADER_UNION    *ImgHdr;

-  EFI_PHYSICAL_ADDRESS               FixLoadingAddress;

-  UINT16                             Index;

-  UINTN                              Size;

-  UINT16                             NumberOfSections;

-  UINT64                             ValueInSectionHeader;

-

-  FixLoadingAddress = 0;

-  Status = EFI_NOT_FOUND;

-

-  //

-  // Get PeHeader pointer

-  //

-  ImgHdr = (EFI_IMAGE_OPTIONAL_HEADER_UNION *)((CHAR8* )ImageContext->Handle + ImageContext->PeCoffHeaderOffset);

-  SectionHeaderOffset = ImageContext->PeCoffHeaderOffset + sizeof (UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) +

-    ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader;

-  NumberOfSections = ImgHdr->Pe32.FileHeader.NumberOfSections;

-

-  //

-  // Get base address from the first section header that doesn't point to code section.

-  //

-  for (Index = 0; Index < NumberOfSections; Index++) {

-    //

-    // Read section header from file

-    //

-    Size = sizeof (EFI_IMAGE_SECTION_HEADER);

-    Status = ImageContext->ImageRead (

-                             ImageContext->Handle,

-                             SectionHeaderOffset,

-                             &Size,

-                             &SectionHeader

-                             );

-    if (EFI_ERROR (Status)) {

-      return Status;

-    }

-

-    Status = EFI_NOT_FOUND;

-

-    if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_CNT_CODE) == 0) {

-      //

-      // Build tool will save the address in PointerToRelocations & PointerToLineNumbers fields

-      // in the first section header that doesn't point to code section in image header. So there

-      // is an assumption that when the feature is enabled, if a module with a loading address

-      // assigned by tools, the PointerToRelocations & PointerToLineNumbers fields should not be

-      // Zero, or else, these 2 fields should be set to Zero

-      //

-      ValueInSectionHeader = ReadUnaligned64 ((UINT64*)&SectionHeader.PointerToRelocations);

-      if (ValueInSectionHeader != 0) {

-        //

-        // Found first section header that doesn't point to code section in which build tool saves the

-        // offset to SMRAM base as image base in PointerToRelocations & PointerToLineNumbers fields

-        //

-        FixLoadingAddress = (EFI_PHYSICAL_ADDRESS)(gLoadModuleAtFixAddressMmramBase + (INT64)ValueInSectionHeader);

-        //

-        // Check if the memory range is available.

-        //

-        Status = CheckAndMarkFixLoadingMemoryUsageBitMap (FixLoadingAddress, (UINTN)(ImageContext->ImageSize + ImageContext->SectionAlignment));

-        if (!EFI_ERROR(Status)) {

-          //

-          // The assigned address is valid. Return the specified loading address

-          //

-          ImageContext->ImageAddress = FixLoadingAddress;

-        }

-      }

-      break;

-    }

-    SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);

-  }

-  DEBUG ((DEBUG_INFO|DEBUG_LOAD, "LOADING MODULE FIXED INFO: Loading module at fixed address %x, Status = %r\n",

-          FixLoadingAddress, Status));

-  return Status;

-}

 /**

   Loads an EFI image into SMRAM.

 

-- 
2.31.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#78893): https://edk2.groups.io/g/devel/message/78893
Mute This Topic: https://groups.io/mt/84754067/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-