]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/FwVol/FwVolRead.c
MdeModulePkg DxeCore: Don't cache memory mapped IO FV.
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / FwVol / FwVolRead.c
index f2c0dd5de42e0593211750d299de93d39f17d680..1acac5d8fd79ff30e31f1b937865578e6f8c5f9e 100644 (file)
@@ -280,6 +280,7 @@ FvReadFile (
   UINT8                             *SrcPtr;\r
   EFI_FFS_FILE_HEADER               *FfsHeader;\r
   UINTN                             InputBufferSize;\r
+  UINTN                             WholeFileSize;\r
 \r
   if (NameGuid == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -290,7 +291,7 @@ FvReadFile (
 \r
   //\r
   // Keep looking until we find the matching NameGuid.\r
-  // The Key is really an FfsFileEntry\r
+  // The Key is really a FfsFileEntry\r
   //\r
   FvDevice->LastKey = 0;\r
   do {\r
@@ -312,6 +313,26 @@ FvReadFile (
   // Get a pointer to the header\r
   //\r
   FfsHeader = FvDevice->LastKey->FfsHeader;\r
+  if (FvDevice->IsMemoryMapped) {\r
+    //\r
+    // Memory mapped FV has not been cached, so here is to cache by file.\r
+    //\r
+    if (!FvDevice->LastKey->FileCached) {\r
+      //\r
+      // Cache FFS file to memory buffer.\r
+      //\r
+      WholeFileSize = IS_FFS_FILE2 (FfsHeader) ? FFS_FILE2_SIZE (FfsHeader): FFS_FILE_SIZE (FfsHeader);\r
+      FfsHeader = AllocateCopyPool (WholeFileSize, FfsHeader);\r
+      if (FfsHeader == NULL) {\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+      //\r
+      // Let FfsHeader in FfsFileEntry point to the cached file buffer.\r
+      //\r
+      FvDevice->LastKey->FfsHeader = FfsHeader;\r
+      FvDevice->LastKey->FileCached = TRUE;\r
+    }\r
+  }\r
 \r
   //\r
   // Remember callers buffer size\r
@@ -427,13 +448,12 @@ FvReadFileSection (
   FvDevice = FV_DEVICE_FROM_THIS (This);\r
 \r
   //\r
-  // Read the whole file into buffer\r
+  // Read the file\r
   //\r
-  FileBuffer = NULL;\r
   Status = FvReadFile (\r
             This,\r
             NameGuid,\r
-            (VOID **)&FileBuffer,\r
+            NULL,\r
             &FileSize,\r
             &FileType,\r
             &FileAttributes,\r
@@ -447,8 +467,11 @@ FvReadFileSection (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
-  ASSERT (FileBuffer != NULL);\r
-\r
+  if (IS_FFS_FILE2 (FfsEntry->FfsHeader)) {\r
+    FileBuffer = ((UINT8 *) FfsEntry->FfsHeader) + sizeof (EFI_FFS_FILE_HEADER2);\r
+  } else {\r
+    FileBuffer = ((UINT8 *) FfsEntry->FfsHeader) + sizeof (EFI_FFS_FILE_HEADER);\r
+  }\r
   //\r
   // Check to see that the file actually HAS sections before we go any further.\r
   //\r
@@ -497,8 +520,6 @@ FvReadFileSection (
   //\r
 \r
 Done:\r
-  CoreFreePool (FileBuffer);\r
-\r
   return Status;\r
 }\r
 \r