#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
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
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
// 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
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
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