X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=StandaloneMmPkg%2FLibrary%2FStandaloneMmCoreEntryPoint%2FAArch64%2FSetPermissions.c;h=00f49c9d05583c99ca6490191858f8105f7c39fa;hb=HEAD;hp=57325c4a5fe38398b6ddc3a8658305f696fe6dc1;hpb=7aa9d75211fad45f6756b93fa2048b483deb0582;p=mirror_edk2.git diff --git a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPermissions.c b/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPermissions.c deleted file mode 100644 index 57325c4a5f..0000000000 --- a/StandaloneMmPkg/Library/StandaloneMmCoreEntryPoint/AArch64/SetPermissions.c +++ /dev/null @@ -1,274 +0,0 @@ -/** @file - Locate, get and update PE/COFF permissions during Standalone MM - Foundation Entry point on ARM platforms. - -Copyright (c) 2017 - 2021, Arm Ltd. All rights reserved.
-SPDX-License-Identifier: BSD-2-Clause-Patent - -**/ - - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -EFI_STATUS -EFIAPI -UpdateMmFoundationPeCoffPermissions ( - IN CONST PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, - IN EFI_PHYSICAL_ADDRESS ImageBase, - IN UINT32 SectionHeaderOffset, - IN CONST UINT16 NumberOfSections, - IN REGION_PERMISSION_UPDATE_FUNC TextUpdater, - IN REGION_PERMISSION_UPDATE_FUNC ReadOnlyUpdater, - IN REGION_PERMISSION_UPDATE_FUNC ReadWriteUpdater - ) -{ - EFI_IMAGE_SECTION_HEADER SectionHeader; - RETURN_STATUS Status; - EFI_PHYSICAL_ADDRESS Base; - UINTN Size; - UINTN ReadSize; - UINTN Index; - - ASSERT (ImageContext != NULL); - - // - // Iterate over the sections - // - for (Index = 0; Index < NumberOfSections; Index++) { - // - // Read section header from file - // - Size = sizeof (EFI_IMAGE_SECTION_HEADER); - ReadSize = Size; - Status = ImageContext->ImageRead ( - ImageContext->Handle, - SectionHeaderOffset, - &Size, - &SectionHeader - ); - - if (RETURN_ERROR (Status) || (Size != ReadSize)) { - DEBUG ((DEBUG_ERROR, - "%a: ImageContext->ImageRead () failed (Status = %r)\n", - __FUNCTION__, Status)); - return Status; - } - - DEBUG ((DEBUG_INFO, - "%a: Section %d of image at 0x%lx has 0x%x permissions\n", - __FUNCTION__, Index, ImageContext->ImageAddress, SectionHeader.Characteristics)); - DEBUG ((DEBUG_INFO, - "%a: Section %d of image at 0x%lx has %a name\n", - __FUNCTION__, Index, ImageContext->ImageAddress, SectionHeader.Name)); - DEBUG ((DEBUG_INFO, - "%a: Section %d of image at 0x%lx has 0x%x address\n", - __FUNCTION__, Index, ImageContext->ImageAddress, - ImageContext->ImageAddress + SectionHeader.VirtualAddress)); - DEBUG ((DEBUG_INFO, - "%a: Section %d of image at 0x%lx has 0x%x data\n", - __FUNCTION__, Index, ImageContext->ImageAddress, SectionHeader.PointerToRawData)); - - // - // If the section is marked as XN then remove the X attribute. Furthermore, - // if it is a writeable section then mark it appropriately as well. - // - if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_EXECUTE) == 0) { - Base = ImageBase + SectionHeader.VirtualAddress; - - TextUpdater (Base, SectionHeader.Misc.VirtualSize); - - if ((SectionHeader.Characteristics & EFI_IMAGE_SCN_MEM_WRITE) != 0) { - ReadWriteUpdater (Base, SectionHeader.Misc.VirtualSize); - DEBUG ((DEBUG_INFO, - "%a: Mapping section %d of image at 0x%lx with RW-XN permissions\n", - __FUNCTION__, Index, ImageContext->ImageAddress)); - } else { - DEBUG ((DEBUG_INFO, - "%a: Mapping section %d of image at 0x%lx with RO-XN permissions\n", - __FUNCTION__, Index, ImageContext->ImageAddress)); - } - } else { - DEBUG ((DEBUG_INFO, - "%a: Ignoring section %d of image at 0x%lx with 0x%x permissions\n", - __FUNCTION__, Index, ImageContext->ImageAddress, SectionHeader.Characteristics)); - } - SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER); - } - - return RETURN_SUCCESS; -} - -EFI_STATUS -EFIAPI -LocateStandaloneMmCorePeCoffData ( - IN EFI_FIRMWARE_VOLUME_HEADER *BfvAddress, - IN OUT VOID **TeData, - IN OUT UINTN *TeDataSize - ) -{ - EFI_FFS_FILE_HEADER *FileHeader; - EFI_STATUS Status; - - FileHeader = NULL; - Status = FfsFindNextFile ( - EFI_FV_FILETYPE_SECURITY_CORE, - BfvAddress, - &FileHeader - ); - - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM FFS file - 0x%x\n", - Status)); - return Status; - } - - Status = FfsFindSectionData (EFI_SECTION_PE32, FileHeader, TeData, TeDataSize); - if (EFI_ERROR (Status)) { - Status = FfsFindSectionData (EFI_SECTION_TE, FileHeader, TeData, TeDataSize); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Section data - %r\n", - Status)); - return Status; - } - } - - DEBUG ((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", *TeData)); - return Status; -} - -STATIC -EFI_STATUS -GetPeCoffSectionInformation ( - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, - OUT EFI_PHYSICAL_ADDRESS *ImageBase, - OUT UINT32 *SectionHeaderOffset, - OUT UINT16 *NumberOfSections - ) -{ - RETURN_STATUS Status; - EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr; - EFI_IMAGE_OPTIONAL_HEADER_UNION HdrData; - UINTN Size; - UINTN ReadSize; - - ASSERT (ImageContext != NULL); - ASSERT (SectionHeaderOffset != NULL); - ASSERT (NumberOfSections != NULL); - - Status = PeCoffLoaderGetImageInfo (ImageContext); - if (RETURN_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, - "%a: PeCoffLoaderGetImageInfo () failed (Status == %r)\n", - __FUNCTION__, Status)); - return Status; - } - - if (ImageContext->SectionAlignment < EFI_PAGE_SIZE) { - // - // The sections need to be at least 4 KB aligned, since that is the - // granularity at which we can tighten permissions. - // - if (!ImageContext->IsTeImage) { - DEBUG ((DEBUG_WARN, - "%a: non-TE Image at 0x%lx has SectionAlignment < 4 KB (%lu)\n", - __FUNCTION__, ImageContext->ImageAddress, ImageContext->SectionAlignment)); - return RETURN_UNSUPPORTED; - } - ImageContext->SectionAlignment = EFI_PAGE_SIZE; - } - - // - // Read the PE/COFF Header. For PE32 (32-bit) this will read in too much - // data, but that should not hurt anything. Hdr.Pe32->OptionalHeader.Magic - // determines if this is a PE32 or PE32+ image. The magic is in the same - // location in both images. - // - Hdr.Union = &HdrData; - Size = sizeof (EFI_IMAGE_OPTIONAL_HEADER_UNION); - ReadSize = Size; - Status = ImageContext->ImageRead ( - ImageContext->Handle, - ImageContext->PeCoffHeaderOffset, - &Size, - Hdr.Pe32 - ); - - if (RETURN_ERROR (Status) || (Size != ReadSize)) { - DEBUG ((DEBUG_ERROR, - "%a: TmpContext->ImageRead () failed (Status = %r)\n", - __FUNCTION__, Status)); - return Status; - } - - *ImageBase = ImageContext->ImageAddress; - if (!ImageContext->IsTeImage) { - ASSERT (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE); - - *SectionHeaderOffset = ImageContext->PeCoffHeaderOffset + sizeof (UINT32) + - sizeof (EFI_IMAGE_FILE_HEADER); - *NumberOfSections = Hdr.Pe32->FileHeader.NumberOfSections; - - switch (Hdr.Pe32->OptionalHeader.Magic) { - case EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC: - *SectionHeaderOffset += Hdr.Pe32->FileHeader.SizeOfOptionalHeader; - break; - case EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC: - *SectionHeaderOffset += Hdr.Pe32Plus->FileHeader.SizeOfOptionalHeader; - break; - default: - ASSERT (FALSE); - } - } else { - *SectionHeaderOffset = (UINTN)(sizeof (EFI_TE_IMAGE_HEADER)); - *NumberOfSections = Hdr.Te->NumberOfSections; - *ImageBase -= (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER); - } - return RETURN_SUCCESS; -} - -EFI_STATUS -EFIAPI -GetStandaloneMmCorePeCoffSections ( - IN VOID *TeData, - IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, - OUT EFI_PHYSICAL_ADDRESS *ImageBase, - IN OUT UINT32 *SectionHeaderOffset, - IN OUT UINT16 *NumberOfSections - ) -{ - EFI_STATUS Status; - - // Initialize the Image Context - ZeroMem (ImageContext, sizeof (PE_COFF_LOADER_IMAGE_CONTEXT)); - ImageContext->Handle = TeData; - ImageContext->ImageRead = PeCoffLoaderImageReadFromMemory; - - DEBUG ((DEBUG_INFO, "Found Standalone MM PE data - 0x%x\n", TeData)); - - Status = GetPeCoffSectionInformation (ImageContext, ImageBase, - SectionHeaderOffset, NumberOfSections); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Unable to locate Standalone MM Core PE-COFF Section information - %r\n", Status)); - return Status; - } - - DEBUG ((DEBUG_INFO, "Standalone MM Core PE-COFF SectionHeaderOffset - 0x%x, NumberOfSections - %d\n", - *SectionHeaderOffset, *NumberOfSections)); - - return Status; -}