]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/BdsLib: Allocate memory with AnyPage type if it failed with the one initially...
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 18 Aug 2011 21:11:27 +0000 (21:11 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 18 Aug 2011 21:11:27 +0000 (21:11 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12170 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Library/BdsLib/BdsFilePath.c

index 69aa25561c293210e288fdf3a48618a14729ea3e..785ad64419982671c205dcec14c4908a80ffa154 100644 (file)
@@ -424,7 +424,7 @@ BdsFileSystemLoadImage (
     return Status;
   }
 
-  //Try to Open the volume and get root directory
+  // Try to Open the volume and get root directory
   Status = FsProtocol->OpenVolume (FsProtocol, &Fs);
   if (EFI_ERROR(Status)) {
     return Status;
@@ -451,7 +451,11 @@ BdsFileSystemLoadImage (
   }
   FreePool(FileInfo);
 
-  Status = gBS->AllocatePages (Type, EfiBootServicesCode, EFI_SIZE_TO_PAGES(Size),Image);
+  Status = gBS->AllocatePages (Type, EfiBootServicesCode, EFI_SIZE_TO_PAGES(Size), Image);
+  // Try to allocate in any pages if failed to allocate memory at the defined location
+  if ((Status == EFI_OUT_OF_RESOURCES) && (Type != AllocateAnyPages)) {
+    Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesCode, EFI_SIZE_TO_PAGES(Size), Image);
+  }
   if (!EFI_ERROR(Status)) {
     Status = File->Read (File, &Size, (VOID*)(UINTN)(*Image));
   }
@@ -492,7 +496,11 @@ BdsMemoryMapLoadImage (
       return EFI_INVALID_PARAMETER;
   }
 
-  Status = gBS->AllocatePages (Type, EfiBootServicesCode, EFI_SIZE_TO_PAGES(Size),Image);
+  Status = gBS->AllocatePages (Type, EfiBootServicesCode, EFI_SIZE_TO_PAGES(Size), Image);
+  // Try to allocate in any pages if failed to allocate memory at the defined location
+  if ((Status == EFI_OUT_OF_RESOURCES) && (Type != AllocateAnyPages)) {
+    Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesCode, EFI_SIZE_TO_PAGES(Size), Image);
+  }
   if (!EFI_ERROR(Status)) {
     CopyMem ((VOID*)(UINTN)(*Image), (CONST VOID*)(UINTN)MemMapPathDevicePath->StartingAddress, Size);
 
@@ -571,6 +579,10 @@ BdsFirmwareVolumeLoadImage (
 #else
     // We must copy the buffer into a page allocations. Otherwise, the caller could call gBS->FreePages() on the pool allocation
     Status = gBS->AllocatePages (Type, EfiBootServicesCode, EFI_SIZE_TO_PAGES(*ImageSize), Image);
+    // Try to allocate in any pages if failed to allocate memory at the defined location
+    if ((Status == EFI_OUT_OF_RESOURCES) && (Type != AllocateAnyPages)) {
+      Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesCode, EFI_SIZE_TO_PAGES(Size), Image);
+    }
     if (!EFI_ERROR(Status)) {
       CopyMem ((VOID*)(UINTN)(*Image), ImageBuffer, *ImageSize);
       FreePool (ImageBuffer);
@@ -588,7 +600,11 @@ BdsFirmwareVolumeLoadImage (
                         &AuthenticationStatus
                         );
     if (!EFI_ERROR(Status)) {
-      Status = gBS->AllocatePages (Type, EfiBootServicesCode, EFI_SIZE_TO_PAGES(*ImageSize),Image);
+      Status = gBS->AllocatePages (Type, EfiBootServicesCode, EFI_SIZE_TO_PAGES(*ImageSize), Image);
+      // Try to allocate in any pages if failed to allocate memory at the defined location
+      if ((Status == EFI_OUT_OF_RESOURCES) && (Type != AllocateAnyPages)) {
+        Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesCode, EFI_SIZE_TO_PAGES(Size), Image);
+      }
       if (!EFI_ERROR(Status)) {
         Status = FwVol->ReadFile (
                                 FwVol,