From 4afc6a7bf2e75801630c298a312a0ab552a1369f Mon Sep 17 00:00:00 2001 From: lgao4 Date: Thu, 7 Dec 2006 11:32:26 +0000 Subject: [PATCH] (1) Using EfiCompress in place of TianoCompress as EFI_STANDARD_COMPRESSION type to conform to spec. (2) Remove unused library class EdkPeCoffLoaderX64Lib and library instance EdkPeCoffLoaderX64Lib, because current BasePeCoffLib can supports IA32, EBC, & X64 images all. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2069 6f19259b-4bc3-4df7-8a09-765794883524 --- .../SectionExtraction/CoreSectionExtraction.c | 2 +- EdkModulePkg/Core/DxeIplPeim/DxeLoad.c | 108 +++++++----- EdkModulePkg/EdkModulePkg.spd | 9 - .../Include/Library/EdkPeCoffLoaderX64Lib.h | 33 ---- .../Common/{EfiDecompress.c => Decompress.c} | 155 ++++++++++++++++-- .../Common/{EfiDecompress.h => Decompress.h} | 76 +++++++-- Tools/CCode/Source/CompressDll/CompressDll.c | 10 +- Tools/CCode/Source/GenFfsFile/GenFfsFile.c | 4 +- Tools/CCode/Source/GenSection/GenSection.c | 2 +- 9 files changed, 287 insertions(+), 112 deletions(-) delete mode 100644 EdkModulePkg/Include/Library/EdkPeCoffLoaderX64Lib.h rename Tools/CCode/Source/Common/{EfiDecompress.c => Decompress.c} (75%) rename Tools/CCode/Source/Common/{EfiDecompress.h => Decompress.h} (58%) diff --git a/EdkModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c b/EdkModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c index e98b80cddf..89dd9afcc1 100644 --- a/EdkModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c +++ b/EdkModulePkg/Core/Dxe/SectionExtraction/CoreSectionExtraction.c @@ -805,7 +805,7 @@ Returns: // Decompress the stream // if (CompressionHeader->CompressionType == EFI_STANDARD_COMPRESSION) { - Status = CoreLocateProtocol (&gEfiTianoDecompressProtocolGuid, NULL, (VOID **)&Decompress); + Status = CoreLocateProtocol (&gEfiDecompressProtocolGuid, NULL, (VOID **)&Decompress); } else { Status = CoreLocateProtocol (&gEfiCustomizedDecompressProtocolGuid, NULL, (VOID **)&Decompress); } diff --git a/EdkModulePkg/Core/DxeIplPeim/DxeLoad.c b/EdkModulePkg/Core/DxeIplPeim/DxeLoad.c index 8dbc3763d6..6a4c53b922 100644 --- a/EdkModulePkg/Core/DxeIplPeim/DxeLoad.c +++ b/EdkModulePkg/Core/DxeIplPeim/DxeLoad.c @@ -669,6 +669,13 @@ Returns: EFI_COMPRESSION_SECTION *CompressionSection; UINT32 FvAlignment; + // + // Initialize local variables. + // + DecompressLibrary = NULL; + DstBuffer = NULL; + DstBufferSize = 0; + Status = PeiServicesFfsFindSectionData ( EFI_SECTION_COMPRESSION, FfsFileHeader, @@ -784,8 +791,11 @@ Returns: switch (CompressionSection->CompressionType) { case EFI_STANDARD_COMPRESSION: + // + // Load EFI standard compression. + // if (FeaturePcdGet (PcdDxeIplSupportTianoDecompress)) { - DecompressLibrary = &gTianoDecompress; + DecompressLibrary = &gEfiDecompress; } else { ASSERT (FALSE); return EFI_NOT_FOUND; @@ -794,7 +804,7 @@ Returns: case EFI_CUSTOMIZED_COMPRESSION: // - // Load user customized compression protocol. + // Load user customized compression. // if (FeaturePcdGet (PcdDxeIplSupportCustomDecompress)) { DecompressLibrary = &gCustomDecompress; @@ -805,52 +815,71 @@ Returns: break; case EFI_NOT_COMPRESSED: + // + // Allocate destination buffer + // + DstBufferSize = CompressionSection->UncompressedLength; + DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize)); + if (DstBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + // + // stream is not actually compressed, just encapsulated. So just copy it. + // + CopyMem (DstBuffer, CompressionSection + 1, DstBufferSize); + break; + default: // - // Need to support not compressed file + // Don't support other unknown compression type. // ASSERT_EFI_ERROR (Status); return EFI_NOT_FOUND; } - - Status = DecompressLibrary->GetInfo ( - (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1), - (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION), - &DstBufferSize, - &ScratchBufferSize - ); - if (EFI_ERROR (Status)) { + + if (CompressionSection->CompressionType != EFI_NOT_COMPRESSED) { // - // GetInfo failed + // For compressed data, decompress them to dstbuffer. // - return EFI_NOT_FOUND; - } - - // - // Allocate scratch buffer - // - ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize)); - if (ScratchBuffer == NULL) { - return EFI_OUT_OF_RESOURCES; - } - - // - // Allocate destination buffer - // - DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize)); - if (DstBuffer == NULL) { - return EFI_OUT_OF_RESOURCES; + Status = DecompressLibrary->GetInfo ( + (UINT8 *) ((EFI_COMPRESSION_SECTION *) Section + 1), + (UINT32) SectionLength - sizeof (EFI_COMPRESSION_SECTION), + &DstBufferSize, + &ScratchBufferSize + ); + if (EFI_ERROR (Status)) { + // + // GetInfo failed + // + return EFI_NOT_FOUND; + } + + // + // Allocate scratch buffer + // + ScratchBuffer = AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize)); + if (ScratchBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Allocate destination buffer + // + DstBuffer = AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize)); + if (DstBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Call decompress function + // + Status = DecompressLibrary->Decompress ( + (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1), + DstBuffer, + ScratchBuffer + ); } - - // - // Call decompress function - // - Status = DecompressLibrary->Decompress ( - (CHAR8 *) ((EFI_COMPRESSION_SECTION *) Section + 1), - DstBuffer, - ScratchBuffer - ); - + CmpSection = (EFI_COMMON_SECTION_HEADER *) DstBuffer; if (CmpSection->Type == EFI_SECTION_FIRMWARE_VOLUME_IMAGE) { // @@ -909,7 +938,6 @@ Returns: } else { return EFI_NOT_FOUND; } - } } // diff --git a/EdkModulePkg/EdkModulePkg.spd b/EdkModulePkg/EdkModulePkg.spd index f720d1a94d..e63427f955 100644 --- a/EdkModulePkg/EdkModulePkg.spd +++ b/EdkModulePkg/EdkModulePkg.spd @@ -44,10 +44,6 @@ Include/Library/EdkPeCoffLoaderLib.h - - Include/Library/EdkPeCoffLoaderX64Lib.h - - Include/Library/EdkScsiLib.h @@ -210,10 +206,6 @@ Include/Library/EdkPeCoffLoaderLib.h - - Include/Library/EdkPeCoffLoaderX64Lib.h - - Include/Library/EdkScsiLib.h @@ -399,7 +391,6 @@ Library/EdkIfrSupportLib/EdkIfrSupportLib.msa Library/EdkNullCustomizedDecompressLib/EdkNullCustomizedDecompressLib.msa Library/EdkPeCoffLoaderLib/EdkPeCoffLoaderLib.msa - Library/EdkPeCoffLoaderX64Lib/EdkPeCoffLoaderX64Lib.msa Library/PeiPerformanceLib/PeiPerformanceLib.msa Library/EdkScsiLib/EdkScsiLib.msa Library/EdkUefiDebugLibConOut/EdkUefiDebugLibConOut.msa diff --git a/EdkModulePkg/Include/Library/EdkPeCoffLoaderX64Lib.h b/EdkModulePkg/Include/Library/EdkPeCoffLoaderX64Lib.h deleted file mode 100644 index 47756d3cf5..0000000000 --- a/EdkModulePkg/Include/Library/EdkPeCoffLoaderX64Lib.h +++ /dev/null @@ -1,33 +0,0 @@ -/*++ - -Copyright (c) 2006, Intel Corporation -All rights reserved. This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -Module Name: - - EdkPeCoffLoaderX64Lib.h - -Abstract: - Wrap the Base PE/COFF loader with the PE COFF Protocol - - - ---*/ - -#ifndef __EDK_PE_COFF_LOADER_X64_LIB__ -#define __EDK_PE_COFF_LOADER_X64_LIB__ - -EFI_PEI_PE_COFF_LOADER_PROTOCOL * -EFIAPI -GetPeCoffLoaderX64Protocol ( - VOID - ); - -#endif - diff --git a/Tools/CCode/Source/Common/EfiDecompress.c b/Tools/CCode/Source/Common/Decompress.c similarity index 75% rename from Tools/CCode/Source/Common/EfiDecompress.c rename to Tools/CCode/Source/Common/Decompress.c index 288c42579e..07b2b8c883 100644 --- a/Tools/CCode/Source/Common/EfiDecompress.c +++ b/Tools/CCode/Source/Common/Decompress.c @@ -11,15 +11,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: - EfiDecompress.c + Decompress.c Abstract: - Decompressor. Algorithm Ported from OPSD code (Decomp.asm) + Decompressor. Algorithm Ported from OPSD code (Decomp.asm) + for Efi and Tiano compress algorithm. --*/ -#include "EfiDecompress.h" +#include "Decompress.h" // // Decompression algorithm begins here @@ -33,11 +34,12 @@ Abstract: // // C: Char&Len Set; P: Position Set; T: exTra Set // -#define NC (0xff + MAXMATCH + 2 - THRESHOLD) -#define CBIT 9 -#define PBIT 5 -#define TBIT 5 -#define MAXNP ((1U << PBIT) - 1) +#define NC (0xff + MAXMATCH + 2 - THRESHOLD) +#define CBIT 9 +#define EFIPBIT 4 +#define MAXPBIT 5 +#define TBIT 5 +#define MAXNP ((1U << MAXPBIT) - 1) #define NT (CODE_BIT + 3) #if NT > MAXNP #define NPT NT @@ -68,6 +70,8 @@ typedef struct { UINT16 mPTTable[256]; } SCRATCH_DATA; +STATIC UINT16 mPbit = EFIPBIT; + STATIC VOID FillBuf ( @@ -556,7 +560,7 @@ Returns: ReadCLen (Sd); - Sd->mBadTableFlag = ReadPTLen (Sd, MAXNP, PBIT, (UINT16) (-1)); + Sd->mBadTableFlag = ReadPTLen (Sd, MAXNP, mPbit, (UINT16) (-1)); if (Sd->mBadTableFlag != 0) { return 0; } @@ -706,11 +710,10 @@ Decompress ( Routine Description: - The implementation of EFI_DECOMPRESS_PROTOCOL.Decompress(). + The implementation Efi and Tiano Decompress(). Arguments: - This - The protocol instance pointer Source - The source buffer containing the compressed data. SrcSize - The size of source buffer Destination - The destination buffer to store the decompressed data @@ -788,3 +791,133 @@ Returns: return Status; } + +EFI_STATUS +EfiGetInfo ( + IN VOID *Source, + IN UINT32 SrcSize, + OUT UINT32 *DstSize, + OUT UINT32 *ScratchSize + ) +/*++ + +Routine Description: + + The implementation Efi Decompress GetInfo(). + +Arguments: + + Source - The source buffer containing the compressed data. + SrcSize - The size of source buffer + DstSize - The size of destination buffer. + ScratchSize - The size of scratch buffer. + +Returns: + + EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved. + EFI_INVALID_PARAMETER - The source data is corrupted + +--*/ +{ + return GetInfo (Source, SrcSize, DstSize, ScratchSize); +} + +EFI_STATUS +TianoGetInfo ( + IN VOID *Source, + IN UINT32 SrcSize, + OUT UINT32 *DstSize, + OUT UINT32 *ScratchSize + ) +/*++ + +Routine Description: + + The implementation Tiano Decompress GetInfo(). + +Arguments: + + Source - The source buffer containing the compressed data. + SrcSize - The size of source buffer + DstSize - The size of destination buffer. + ScratchSize - The size of scratch buffer. + +Returns: + + EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved. + EFI_INVALID_PARAMETER - The source data is corrupted + +--*/ +{ + return GetInfo (Source, SrcSize, DstSize, ScratchSize); +} + +EFI_STATUS +EfiDecompress ( + IN VOID *Source, + IN UINT32 SrcSize, + IN OUT VOID *Destination, + IN UINT32 DstSize, + IN OUT VOID *Scratch, + IN UINT32 ScratchSize + ) +/*++ + +Routine Description: + + The implementation of Efi Decompress(). + +Arguments: + + Source - The source buffer containing the compressed data. + SrcSize - The size of source buffer + Destination - The destination buffer to store the decompressed data + DstSize - The size of destination buffer. + Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. + ScratchSize - The size of scratch buffer. + +Returns: + + EFI_SUCCESS - Decompression is successfull + EFI_INVALID_PARAMETER - The source data is corrupted + +--*/ +{ + mPbit = EFIPBIT; + return Decompress (Source, SrcSize, Destination, DstSize, Scratch, ScratchSize); +} + +EFI_STATUS +TianoDecompress ( + IN VOID *Source, + IN UINT32 SrcSize, + IN OUT VOID *Destination, + IN UINT32 DstSize, + IN OUT VOID *Scratch, + IN UINT32 ScratchSize + ) +/*++ + +Routine Description: + + The implementation of Tiano Decompress(). + +Arguments: + + Source - The source buffer containing the compressed data. + SrcSize - The size of source buffer + Destination - The destination buffer to store the decompressed data + DstSize - The size of destination buffer. + Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. + ScratchSize - The size of scratch buffer. + +Returns: + + EFI_SUCCESS - Decompression is successfull + EFI_INVALID_PARAMETER - The source data is corrupted + +--*/ +{ + mPbit = MAXPBIT; + return Decompress (Source, SrcSize, Destination, DstSize, Scratch, ScratchSize); +} diff --git a/Tools/CCode/Source/Common/EfiDecompress.h b/Tools/CCode/Source/Common/Decompress.h similarity index 58% rename from Tools/CCode/Source/Common/EfiDecompress.h rename to Tools/CCode/Source/Common/Decompress.h index 3f82ac6872..5984e0be35 100644 --- a/Tools/CCode/Source/Common/EfiDecompress.h +++ b/Tools/CCode/Source/Common/Decompress.h @@ -1,6 +1,6 @@ /*++ -Copyright (c) 2004, Intel Corporation +Copyright (c) 2006, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -11,7 +11,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Module Name: - EfiDecompress.h + Decompress.h Abstract: @@ -25,18 +25,17 @@ Abstract: #include EFI_STATUS -GetInfo ( +EfiGetInfo ( IN VOID *Source, IN UINT32 SrcSize, OUT UINT32 *DstSize, OUT UINT32 *ScratchSize ); - /*++ Routine Description: - The implementation of EFI_DECOMPRESS_PROTOCOL.GetInfo(). + The implementation Efi Decompress GetInfo(). Arguments: @@ -51,26 +50,82 @@ Returns: EFI_INVALID_PARAMETER - The source data is corrupted --*/ + EFI_STATUS -Decompress ( +EfiDecompress ( IN VOID *Source, IN UINT32 SrcSize, IN OUT VOID *Destination, IN UINT32 DstSize, IN OUT VOID *Scratch, IN UINT32 ScratchSize - ) -; + ); +/*++ +Routine Description: + + The implementation of Efi Decompress(). + +Arguments: + + Source - The source buffer containing the compressed data. + SrcSize - The size of source buffer + Destination - The destination buffer to store the decompressed data + DstSize - The size of destination buffer. + Scratch - The buffer used internally by the decompress routine. This buffer is needed to store intermediate data. + ScratchSize - The size of scratch buffer. + +Returns: + + EFI_SUCCESS - Decompression is successfull + EFI_INVALID_PARAMETER - The source data is corrupted + +--*/ + +EFI_STATUS +TianoGetInfo ( + IN VOID *Source, + IN UINT32 SrcSize, + OUT UINT32 *DstSize, + OUT UINT32 *ScratchSize + ); /*++ Routine Description: - The implementation of EFI_DECOMPRESS_PROTOCOL.Decompress(). + The implementation Tiano Decompress GetInfo(). + +Arguments: + + Source - The source buffer containing the compressed data. + SrcSize - The size of source buffer + DstSize - The size of destination buffer. + ScratchSize - The size of scratch buffer. + +Returns: + + EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved. + EFI_INVALID_PARAMETER - The source data is corrupted + +--*/ + +EFI_STATUS +TianoDecompress ( + IN VOID *Source, + IN UINT32 SrcSize, + IN OUT VOID *Destination, + IN UINT32 DstSize, + IN OUT VOID *Scratch, + IN UINT32 ScratchSize + ); +/*++ + +Routine Description: + + The implementation of Tiano Decompress(). Arguments: - This - The protocol instance pointer Source - The source buffer containing the compressed data. SrcSize - The size of source buffer Destination - The destination buffer to store the decompressed data @@ -84,6 +139,7 @@ Returns: EFI_INVALID_PARAMETER - The source data is corrupted --*/ + typedef EFI_STATUS (*GETINFO_FUNCTION) ( diff --git a/Tools/CCode/Source/CompressDll/CompressDll.c b/Tools/CCode/Source/CompressDll/CompressDll.c index f46e603283..00cff5649f 100644 --- a/Tools/CCode/Source/CompressDll/CompressDll.c +++ b/Tools/CCode/Source/CompressDll/CompressDll.c @@ -19,7 +19,7 @@ typedef long long __int64;/*For cygwin build*/ extern EFI_STATUS -TianoCompress ( +EfiCompress ( IN UINT8 *SrcBuffer, IN UINT32 SrcSize, IN UINT8 *DstBuffer, @@ -47,7 +47,7 @@ JNIEXPORT jbyteArray JNICALL Java_org_tianocore_framework_tasks_Compress_CallCo // First call compress function and get need buffer size // - Result = TianoCompress ( + Result = EfiCompress ( (char*) InputBuffer, SourceSize, DestBuffer, @@ -61,12 +61,12 @@ JNIEXPORT jbyteArray JNICALL Java_org_tianocore_framework_tasks_Compress_CallCo // // Second call compress and get the DestBuffer value // - Result = TianoCompress( - (char*) InputBuffer, + Result = EfiCompress( + (char*) InputBuffer, SourceSize, DestBuffer, &DestSize - ); + ); // // new a MV array to store the return compressed buffer diff --git a/Tools/CCode/Source/GenFfsFile/GenFfsFile.c b/Tools/CCode/Source/GenFfsFile/GenFfsFile.c index 2ee7c444e6..d4e5468343 100644 --- a/Tools/CCode/Source/GenFfsFile/GenFfsFile.c +++ b/Tools/CCode/Source/GenFfsFile/GenFfsFile.c @@ -591,14 +591,14 @@ Returns: // Added "Dummy" to keep backward compatibility. // CompressionType = EFI_STANDARD_COMPRESSION; - CompressFunction = (COMPRESS_FUNCTION) TianoCompress; + CompressFunction = (COMPRESS_FUNCTION) EfiCompress; } else if (strcmpi (Type, "LZH") == 0) { // // EFI stardard compression (LZH) // CompressionType = EFI_STANDARD_COMPRESSION; - CompressFunction = (COMPRESS_FUNCTION) TianoCompress; + CompressFunction = (COMPRESS_FUNCTION) EfiCompress; } else { // diff --git a/Tools/CCode/Source/GenSection/GenSection.c b/Tools/CCode/Source/GenSection/GenSection.c index 8599346388..3209b1e3d0 100644 --- a/Tools/CCode/Source/GenSection/GenSection.c +++ b/Tools/CCode/Source/GenSection/GenSection.c @@ -429,7 +429,7 @@ Returns: break; case EFI_STANDARD_COMPRESSION: - CompressFunction = (COMPRESS_FUNCTION) TianoCompress; + CompressFunction = (COMPRESS_FUNCTION) EfiCompress; break; case EFI_CUSTOMIZED_COMPRESSION: -- 2.39.2