]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Library/LzmaCustomDecompressLib/LzmaDecompress.c
Remove usage of MemoryAllocationLib, and use a simplistic allocation
[mirror_edk2.git] / IntelFrameworkModulePkg / Library / LzmaCustomDecompressLib / LzmaDecompress.c
index 439e15beaba74b594dc9167b6a62c7c53032beb6..8497440f3f602b9ea4641f7c16e6cf9833521bb1 100644 (file)
@@ -20,7 +20,6 @@
 #include <Library/BaseLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/DebugLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiDecompressLib.h>\r
 #include <Library/ExtractGuidedSectionLib.h>\r
 #include <Guid/LzmaDecompress.h>\r
 #include "Sdk/C/7zVersion.h"\r
 #include "Sdk/C/LzmaDec.h"\r
 \r
+//\r
+// Global data\r
+//\r
+\r
+STATIC CONST VOID  *mSourceLastUsedWithGetInfo;\r
+STATIC UINT32      mSizeOfLastSource;\r
+STATIC UINT32      mDecompressedSizeForLastSource;\r
+STATIC VOID        *mScratchBuffer;\r
+STATIC UINTN       mScratchBufferSize;\r
+#define SCRATCH_BUFFER_REQUEST_SIZE SIZE_64KB\r
+\r
 /**\r
   Allocation routine used by LZMA decompression.\r
 \r
@@ -44,7 +54,17 @@ SzAlloc (
   size_t size\r
   )\r
 {\r
-  return AllocatePool (size);\r
+  VOID *addr;\r
+\r
+  if (mScratchBufferSize >= size) {\r
+    addr = mScratchBuffer;\r
+    mScratchBuffer = (VOID*) ((UINT8*)addr + size);\r
+    mScratchBufferSize -= size;\r
+    return addr;\r
+  } else {\r
+    ASSERT (FALSE);\r
+    return NULL;\r
+  }\r
 }\r
 \r
 /**\r
@@ -60,9 +80,11 @@ SzFree (
   void *address\r
   )\r
 {\r
-  if (address != NULL) {\r
-    FreePool (address);\r
-  }\r
+  //\r
+  // We use the 'scratch buffer' for allocations, so there is no free\r
+  // operation required.  The scratch buffer will be freed by the caller\r
+  // of the decompression code.\r
+  //\r
 }\r
 \r
 STATIC ISzAlloc g_Alloc = { SzAlloc, SzFree };\r
@@ -90,10 +112,6 @@ GetDecodedSizeOfBuf(
 // LZMA functions and data as defined in local LzmaDecompress.h\r
 //\r
 \r
-STATIC CONST VOID  *mSourceLastUsedWithGetInfo;\r
-STATIC UINT32      mSizeOfLastSource;\r
-STATIC UINT32      mDecompressedSizeForLastSource;\r
-\r
 /**\r
   The internal implementation of *_DECOMPRESS_PROTOCOL.GetInfo().\r
   \r
@@ -124,7 +142,7 @@ LzmaUefiDecompressGetInfo (
   mSizeOfLastSource = SourceSize;\r
   mDecompressedSizeForLastSource = (UInt32)DecodedSize;\r
   *DestinationSize = mDecompressedSizeForLastSource;\r
-  *ScratchSize = 0x10;\r
+  *ScratchSize = SCRATCH_BUFFER_REQUEST_SIZE;\r
   return RETURN_SUCCESS;\r
 }\r
 \r
@@ -159,6 +177,9 @@ LzmaUefiDecompress (
   decodedBufSize = (SizeT)mDecompressedSizeForLastSource;\r
   encodedDataSize = (SizeT)(mSizeOfLastSource - LZMA_HEADER_SIZE);\r
 \r
+  mScratchBuffer = Scratch;\r
+  mScratchBufferSize = SCRATCH_BUFFER_REQUEST_SIZE;\r
+\r
   lzmaResult = LzmaDecode(\r
     Destination,\r
     &decodedBufSize,\r