]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg/PeiCore: allocate BootServicesCode memory for PE/COFF images
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Thu, 23 Feb 2017 09:57:03 +0000 (09:57 +0000)
committerArd Biesheuvel <ard.biesheuvel@linaro.org>
Tue, 28 Feb 2017 14:59:50 +0000 (14:59 +0000)
Ensure that any memory allocated for PE/COFF images is identifiable as
a boot services code region, so that we know it requires its executable
permissions to be preserved when we tighten mapping permissions later on.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
MdeModulePkg/Core/Pei/Image/Image.c

index d659de8b3e64781b8a3170d187256ec856c57b11..68e40c027e63a1faf60c4de21e4fe16ecebeef2e 100644 (file)
@@ -112,11 +112,12 @@ GetImageReadFunction (
   IN      PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext\r
   )\r
 {\r
-  PEI_CORE_INSTANCE  *Private;\r
-  VOID*  MemoryBuffer;\r
+  PEI_CORE_INSTANCE     *Private;\r
+  EFI_PHYSICAL_ADDRESS  MemoryBuffer;\r
 \r
   Private = PEI_CORE_INSTANCE_FROM_PS_THIS (GetPeiServicesTablePointer ());\r
-  \r
+  MemoryBuffer = 0;\r
+\r
   if (Private->PeiMemoryInstalled  && (((Private->HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME) && PcdGetBool (PcdShadowPeimOnBoot)) || \r
       ((Private->HobList.HandoffInformationTable->BootMode == BOOT_ON_S3_RESUME) && PcdGetBool (PcdShadowPeimOnS3Boot))) &&\r
       (EFI_IMAGE_MACHINE_TYPE_SUPPORTED(EFI_IMAGE_MACHINE_X64) || EFI_IMAGE_MACHINE_TYPE_SUPPORTED(EFI_IMAGE_MACHINE_IA32))) {\r
@@ -125,9 +126,9 @@ GetImageReadFunction (
     //  compilers that have been tested\r
     //\r
     if (Private->ShadowedImageRead == NULL) {\r
-      MemoryBuffer = AllocatePages (0x400 / EFI_PAGE_SIZE + 1);\r
-      ASSERT (MemoryBuffer != NULL);\r
-      CopyMem (MemoryBuffer, (CONST VOID *) (UINTN) PeiImageReadForShadow, 0x400);\r
+      PeiServicesAllocatePages (EfiBootServicesCode, 0x400 / EFI_PAGE_SIZE + 1, &MemoryBuffer);\r
+      ASSERT (MemoryBuffer != 0);\r
+      CopyMem ((VOID *)(UINTN)MemoryBuffer, (CONST VOID *) (UINTN) PeiImageReadForShadow, 0x400);\r
       Private->ShadowedImageRead = (PE_COFF_LOADER_READ_FILE) (UINTN) MemoryBuffer;\r
     }\r
 \r
@@ -453,12 +454,16 @@ LoadAndRelocatePeCoffImage (
         //\r
         // The PEIM is not assiged valid address, try to allocate page to load it.\r
         //\r
-        ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) AllocatePages (EFI_SIZE_TO_PAGES ((UINT32) AlignImageSize));\r
+        Status = PeiServicesAllocatePages (EfiBootServicesCode,\r
+                                           EFI_SIZE_TO_PAGES ((UINT32) AlignImageSize),\r
+                                           &ImageContext.ImageAddress);\r
       }\r
     } else {\r
-      ImageContext.ImageAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) AllocatePages (EFI_SIZE_TO_PAGES ((UINT32) AlignImageSize));\r
+      Status = PeiServicesAllocatePages (EfiBootServicesCode,\r
+                                         EFI_SIZE_TO_PAGES ((UINT32) AlignImageSize),\r
+                                         &ImageContext.ImageAddress);\r
     }\r
-    if (ImageContext.ImageAddress != 0) {\r
+    if (!EFI_ERROR (Status)) {\r
       //\r
       // Adjust the Image Address to make sure it is section alignment.\r
       //\r