BaseTools: Add --uefi option to enable UefiCompress method

Add one new option --uefi to enable UefiCompress.
(re-add this patch since it be reverted in Python3 migration patches,
but this patch is not related with Python3)

Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
This commit is contained in:
Yunhua Feng 2018-09-30 11:07:18 +08:00 committed by Yonghong Zhu
parent f88113789b
commit f1400101a7
2 changed files with 58 additions and 25 deletions

View File

@ -17,6 +17,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/ **/
#include "Compress.h" #include "Compress.h"
#include "Decompress.h"
#include "TianoCompress.h" #include "TianoCompress.h"
#include "EfiUtilityMsgs.h" #include "EfiUtilityMsgs.h"
#include "ParseInf.h" #include "ParseInf.h"
@ -65,6 +66,7 @@ static BOOLEAN QuietMode = FALSE;
// //
STATIC BOOLEAN ENCODE = FALSE; STATIC BOOLEAN ENCODE = FALSE;
STATIC BOOLEAN DECODE = FALSE; STATIC BOOLEAN DECODE = FALSE;
STATIC BOOLEAN UEFIMODE = FALSE;
STATIC UINT8 *mSrc, *mDst, *mSrcUpperLimit, *mDstUpperLimit; STATIC UINT8 *mSrc, *mDst, *mSrcUpperLimit, *mDstUpperLimit;
STATIC UINT8 *mLevel, *mText, *mChildCount, *mBuf, mCLen[NC], mPTLen[NPT], *mLen; STATIC UINT8 *mLevel, *mText, *mChildCount, *mBuf, mCLen[NC], mPTLen[NPT], *mLen;
STATIC INT16 mHeap[NC + 1]; STATIC INT16 mHeap[NC + 1];
@ -1703,6 +1705,8 @@ Returns:
// Details Option // Details Option
// //
fprintf (stdout, "Options:\n"); fprintf (stdout, "Options:\n");
fprintf (stdout, " --uefi\n\
Enable UefiCompress, use TianoCompress when without this option\n");
fprintf (stdout, " -o FileName, --output FileName\n\ fprintf (stdout, " -o FileName, --output FileName\n\
File will be created to store the ouput content.\n"); File will be created to store the ouput content.\n");
fprintf (stdout, " -v, --verbose\n\ fprintf (stdout, " -v, --verbose\n\
@ -1822,6 +1826,13 @@ Returns:
continue; continue;
} }
if (stricmp(argv[0], "--uefi") == 0) {
UEFIMODE = TRUE;
argc--;
argv++;
continue;
}
if (stricmp (argv[0], "--debug") == 0) { if (stricmp (argv[0], "--debug") == 0) {
argc-=2; argc-=2;
argv++; argv++;
@ -1939,7 +1950,11 @@ Returns:
if (DebugMode) { if (DebugMode) {
DebugMsg(UTILITY_NAME, 0, DebugLevel, "Encoding", NULL); DebugMsg(UTILITY_NAME, 0, DebugLevel, "Encoding", NULL);
} }
Status = TianoCompress ((UINT8 *)FileBuffer, InputLength, OutBuffer, &DstSize); if (UEFIMODE) {
Status = EfiCompress ((UINT8 *)FileBuffer, InputLength, OutBuffer, &DstSize);
} else {
Status = TianoCompress ((UINT8 *)FileBuffer, InputLength, OutBuffer, &DstSize);
}
if (Status == EFI_BUFFER_TOO_SMALL) { if (Status == EFI_BUFFER_TOO_SMALL) {
OutBuffer = (UINT8 *) malloc (DstSize); OutBuffer = (UINT8 *) malloc (DstSize);
@ -1949,7 +1964,11 @@ Returns:
} }
} }
Status = TianoCompress ((UINT8 *)FileBuffer, InputLength, OutBuffer, &DstSize); if (UEFIMODE) {
Status = EfiCompress ((UINT8 *)FileBuffer, InputLength, OutBuffer, &DstSize);
} else {
Status = TianoCompress ((UINT8 *)FileBuffer, InputLength, OutBuffer, &DstSize);
}
if (Status != EFI_SUCCESS) { if (Status != EFI_SUCCESS) {
Error (NULL, 0, 0007, "Error compressing file", NULL); Error (NULL, 0, 0007, "Error compressing file", NULL);
goto ERROR; goto ERROR;
@ -1979,32 +1998,46 @@ Returns:
if (DebugMode) { if (DebugMode) {
DebugMsg(UTILITY_NAME, 0, DebugLevel, "Decoding\n", NULL); DebugMsg(UTILITY_NAME, 0, DebugLevel, "Decoding\n", NULL);
} }
//
// Get Compressed file original size
//
Src = (UINT8 *)FileBuffer;
OrigSize = Src[4] + (Src[5] << 8) + (Src[6] << 16) + (Src[7] << 24);
// if (UEFIMODE) {
// Allocate OutputBuffer Status = Extract((VOID *)FileBuffer, InputLength, (VOID *)&OutBuffer, &DstSize, 1);
// if (Status != EFI_SUCCESS) {
OutBuffer = (UINT8 *)malloc(OrigSize); goto ERROR;
if (OutBuffer == NULL) { }
Error (NULL, 0, 4001, "Resource:", "Memory cannot be allocated!"); fwrite(OutBuffer, (size_t)(DstSize), 1, OutputFile);
goto ERROR; } else {
} //
// Get Compressed file original size
//
Src = (UINT8 *)FileBuffer;
OrigSize = Src[4] + (Src[5] << 8) + (Src[6] << 16) + (Src[7] << 24);
Status = Decompress((VOID *)FileBuffer, (VOID *)OutBuffer, (VOID *)Scratch, 2); //
if (Status != EFI_SUCCESS) { // Allocate OutputBuffer
goto ERROR; //
OutBuffer = (UINT8 *)malloc(OrigSize);
if (OutBuffer == NULL) {
Error (NULL, 0, 4001, "Resource:", "Memory cannot be allocated!");
goto ERROR;
}
Status = TDecompress((VOID *)FileBuffer, (VOID *)OutBuffer, (VOID *)Scratch, 2);
if (Status != EFI_SUCCESS) {
goto ERROR;
}
fwrite(OutBuffer, (size_t)(Scratch->mOrigSize), 1, OutputFile);
} }
fwrite(OutBuffer, (size_t)(Scratch->mOrigSize), 1, OutputFile);
fclose(OutputFile); fclose(OutputFile);
fclose(InputFile); fclose(InputFile);
free(Scratch); if (Scratch != NULL) {
free(FileBuffer); free(Scratch);
free(OutBuffer); }
if (FileBuffer != NULL) {
free(FileBuffer);
}
if (OutBuffer != NULL) {
free(OutBuffer);
}
if (DebugMode) { if (DebugMode) {
DebugMsg(UTILITY_NAME, 0, DebugLevel, "Encoding successful!\n", NULL); DebugMsg(UTILITY_NAME, 0, DebugLevel, "Encoding successful!\n", NULL);
@ -2634,7 +2667,7 @@ Done:
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
Decompress ( TDecompress (
IN VOID *Source, IN VOID *Source,
IN OUT VOID *Destination, IN OUT VOID *Destination,
IN OUT VOID *Scratch, IN OUT VOID *Scratch,

View File

@ -427,7 +427,7 @@ Decode (
RETURN_STATUS RETURN_STATUS
EFIAPI EFIAPI
Decompress ( TDecompress (
IN VOID *Source, IN VOID *Source,
IN OUT VOID *Destination, IN OUT VOID *Destination,
IN OUT VOID *Scratch, IN OUT VOID *Scratch,