-/**\r
+/** @file\r
+This file contains functions required to generate a boot strap file (BSF) also \r
+known as the Volume Top File (VTF)\r
\r
-Copyright (c) 1999-2010 Intel Corporation. All rights reserved\r
+Copyright (c) 1999 - 2017, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials are licensed and made available \r
under the terms and conditions of the BSD License which accompanies this \r
distribution. The full text of the license may be found at\r
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
-\r
-Module Name:\r
-\r
- GenVtf.c\r
-\r
-Abstract:\r
-\r
- This file contains functions required to generate a boot strap file (BSF)\r
- also known as the Volume Top File (VTF)\r
-\r
**/\r
\r
//\r
/*++\r
Routine Description:\r
\r
- This function converts GUID string to GUID\r
+ This function split version to major version and minor version\r
\r
Arguments:\r
\r
Str - String representing in form XX.XX\r
- MajorVer - The major vertion\r
- MinorVer - The minor vertion\r
+ MajorVer - The major version\r
+ MinorVer - The minor version\r
\r
Returns:\r
\r
- EFI_SUCCESS - The fuction completed successfully.\r
+ EFI_SUCCESS - The function completed successfully.\r
\r
--*/\r
{\r
- CHAR8 StrPtr[40];\r
- CHAR8 *Token;\r
- UINTN Length;\r
- unsigned Major;\r
- unsigned Minor;\r
+ CHAR8 TemStr[5] = "0000";\r
+ int Major;\r
+ int Minor;\r
+ UINTN Length;\r
\r
Major = 0;\r
Minor = 0;\r
- memset (StrPtr, 0, 40);\r
- Token = strtok (Str, ".");\r
\r
- while (Token != NULL) {\r
- strcat (StrPtr, Token);\r
- Token = strtok (NULL, ".");\r
+ if (strstr (Str, ".") != NULL) {\r
+ sscanf (\r
+ Str,\r
+ "%02x.%02x",\r
+ &Major,\r
+ &Minor\r
+ );\r
+ } else {\r
+ Length = strlen(Str);\r
+ if (Length < 4) {\r
+ strncpy (TemStr + 4 - Length, Str, Length);\r
+ } else {\r
+ strncpy (TemStr, Str + Length - 4, 4);\r
+ }\r
+ \r
+ sscanf (\r
+ TemStr,\r
+ "%02x%02x",\r
+ &Major,\r
+ &Minor\r
+ );\r
}\r
\r
- Length = strlen (StrPtr);\r
- sscanf (\r
- StrPtr,\r
- "%01x%02x",\r
- &Major,\r
- &Minor\r
- );\r
-\r
*MajorVer = (UINT8) Major;\r
*MinorVer = (UINT8) Minor;\r
return EFI_SUCCESS;\r
\r
TmpFitPtr = (FIT_TABLE *) RelativeAddress;\r
NumFitComponents = TmpFitPtr->CompSize;\r
+ *FitPtr = NULL;\r
\r
for (Index = 0; Index < NumFitComponents; Index++) {\r
if ((TmpFitPtr->CvAndType & FIT_TYPE_MASK) == COMP_TYPE_FIT_UNUSED) {\r
CHAR8 Buff4[10];\r
CHAR8 Buff5[10];\r
CHAR8 Token[50];\r
+ CHAR8 FormatString[MAX_LINE_LEN];\r
\r
- Fp = fopen (VtfInfo->CompSymName, "rb");\r
+ Fp = fopen (LongFilePath (VtfInfo->CompSymName), "rb");\r
\r
if (Fp == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", VtfInfo->CompSymName);\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ //\r
+ // Generate the format string for fscanf\r
+ //\r
+ sprintf (\r
+ FormatString,\r
+ "%%%us %%%us %%%us %%%us %%%us %%%us %%%us",\r
+ (unsigned) sizeof (Buff1) - 1,\r
+ (unsigned) sizeof (Buff2) - 1,\r
+ (unsigned) sizeof (OffsetStr) - 1,\r
+ (unsigned) sizeof (Buff3) - 1,\r
+ (unsigned) sizeof (Buff4) - 1,\r
+ (unsigned) sizeof (Buff5) - 1,\r
+ (unsigned) sizeof (Token) - 1\r
+ );\r
+\r
while (fgets (Buff, sizeof (Buff), Fp) != NULL) {\r
fscanf (\r
Fp,\r
- "%s %s %s %s %s %s %s",\r
+ FormatString,\r
Buff1,\r
Buff2,\r
OffsetStr,\r
EFI_ABORTED - Aborted due to one of the many reasons like:\r
(a) Component Size greater than the specified size.\r
(b) Error opening files.\r
+ (c) Fail to get the FIT table address.\r
\r
EFI_INVALID_PARAMETER Value returned from call to UpdateEntryPoint()\r
EFI_OUT_OF_RESOURCES Memory allocation failure.\r
EFI_STATUS Status;\r
UINT64 CompStartAddress;\r
UINT64 FileSize;\r
- UINT64 NumByteRead;\r
UINT64 NumAdjustByte;\r
UINT8 *Buffer;\r
FILE *Fp;\r
return EFI_SUCCESS;\r
}\r
\r
- Fp = fopen (VtfInfo->CompBinName, "rb");\r
+ Fp = fopen (LongFilePath (VtfInfo->CompBinName), "rb");\r
\r
if (Fp == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", VtfInfo->CompBinName);\r
\r
if (VtfInfo->PreferredSize) {\r
if (FileSize > VtfInfo->CompSize) {\r
+ fclose (Fp);\r
Error (NULL, 0, 2000, "Invalid parameter", "The component size is more than specified size.");\r
return EFI_ABORTED;\r
}\r
\r
Buffer = malloc ((UINTN) FileSize);\r
if (Buffer == NULL) {\r
+ fclose (Fp);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
memset (Buffer, 0, (UINTN) FileSize);\r
//\r
// Read first 64 bytes of PAL header and use it to find version info\r
//\r
- NumByteRead = fread (Buffer, sizeof (UINT8), SIZE_OF_PAL_HEADER, Fp);\r
+ fread (Buffer, sizeof (UINT8), SIZE_OF_PAL_HEADER, Fp);\r
\r
//\r
// PAL header contains the version info. Currently, we will use the header\r
}\r
}\r
\r
- NumByteRead = fread (Buffer, sizeof (UINT8), (UINTN) FileSize, Fp);\r
+ fread (Buffer, sizeof (UINT8), (UINTN) FileSize, Fp);\r
fclose (Fp);\r
\r
//\r
Vtf1TotalSize += (UINT32) (FileSize + NumAdjustByte);\r
Status = UpdateVtfBuffer (CompStartAddress, Buffer, FileSize, FIRST_VTF);\r
} else {\r
+ free (Buffer);\r
Error (NULL, 0, 2000,"Invalid Parameter", "There's component in second VTF so second BaseAddress and Size must be specified!");\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (EFI_ERROR (Status)) {\r
+ free (Buffer);\r
return EFI_ABORTED;\r
}\r
\r
GetNextAvailableFitPtr (&CompFitPtr);\r
+ if (CompFitPtr == NULL) {\r
+ free (Buffer);\r
+ return EFI_ABORTED;\r
+ }\r
\r
CompFitPtr->CompAddress = CompStartAddress | IPF_CACHE_BIT;\r
if ((FileSize % 16) != 0) {\r
+ free (Buffer);\r
Error (NULL, 0, 2000, "Invalid parameter", "Binary FileSize must be a multiple of 16.");\r
return EFI_INVALID_PARAMETER;\r
}\r
UINT64 AbsAddress;\r
UINTN RelativeAddress;\r
UINT64 FileSize;\r
- UINT64 NumByteRead;\r
UINT8 *Buffer;\r
FILE *Fp;\r
FIT_TABLE *PalFitPtr;\r
\r
- Fp = fopen (VtfInfo->CompBinName, "rb");\r
+ Fp = fopen (LongFilePath (VtfInfo->CompBinName), "rb");\r
\r
if (Fp == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", VtfInfo->CompBinName);\r
\r
FileSize = _filelength (fileno (Fp));\r
if (FileSize < 64) {\r
+ fclose (Fp);\r
Error (NULL, 0, 2000, "Invalid parameter", "PAL_A bin header is 64 bytes, so the Bin size must be larger than 64 bytes!");\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (VtfInfo->PreferredSize) {\r
if (FileSize > VtfInfo->CompSize) {\r
+ fclose (Fp);\r
Error (NULL, 0, 2000, "Invalid parameter", "The PAL_A Size is more than the specified size.");\r
return EFI_ABORTED;\r
}\r
\r
Buffer = malloc ((UINTN) FileSize);\r
if (Buffer == NULL) {\r
+ fclose (Fp);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
memset (Buffer, 0, (UINTN) FileSize);\r
//\r
// Read, Get version Info and discard the PAL header.\r
//\r
- NumByteRead = fread (Buffer, sizeof (UINT8), SIZE_OF_PAL_HEADER, Fp);\r
+ fread (Buffer, sizeof (UINT8), SIZE_OF_PAL_HEADER, Fp);\r
\r
//\r
// Extract the version info from header of PAL_A. Once done, discrad this buffer\r
//\r
// Read PAL_A file in a buffer\r
//\r
- NumByteRead = fread (Buffer, sizeof (UINT8), (UINTN) FileSize, Fp);\r
+ fread (Buffer, sizeof (UINT8), (UINTN) FileSize, Fp);\r
fclose (Fp);\r
\r
PalStartAddress = Fv1EndAddress - (SIZE_TO_OFFSET_PAL_A_END + FileSize);\r
PalFitPtr->CompAddress = PalStartAddress | IPF_CACHE_BIT;\r
//assert ((FileSize % 16) == 0);\r
if ((FileSize % 16) != 0) {\r
+ free (Buffer);\r
Error (NULL, 0, 2000, "Invalid parameter", "Binary FileSize must be a multiple of 16.");\r
return EFI_INVALID_PARAMETER;\r
}\r
VtfBuffer = (VOID *) RelativeAddress;\r
}\r
\r
- Fp = fopen (FileName, "wb");\r
+ Fp = fopen (LongFilePath (FileName), "wb");\r
if (Fp == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", FileName);\r
return EFI_ABORTED;\r
\r
--*/\r
{\r
- if ((BaseAddress >= 0) && (FwVolSize > 0x40) && ((BaseAddress + FwVolSize) % 8 == 0)) {\r
+ if ((FwVolSize > 0x40) && ((BaseAddress + FwVolSize) % 8 == 0)) {\r
return EFI_SUCCESS;\r
}\r
\r
UINT8 *Buffer;\r
UINT8 *LocalVtfBuffer;\r
UINTN FileSize;\r
- UINTN NumByteRead;\r
FILE *Fp;\r
\r
if (!strcmp (FileName, "")) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- Fp = fopen (FileName, "rb");\r
+ Fp = fopen (LongFilePath (FileName), "rb");\r
\r
if (Fp == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", FileName);\r
FileSize = _filelength (fileno (Fp));\r
\r
if (FileSize > 16) {\r
+ fclose (Fp);\r
return EFI_ABORTED;\r
}\r
\r
Buffer = malloc (FileSize);\r
if (Buffer == NULL) {\r
+ fclose (Fp);\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- NumByteRead = fread (Buffer, sizeof (UINT8), FileSize, Fp);\r
+ fread (Buffer, sizeof (UINT8), FileSize, Fp);\r
\r
LocalVtfBuffer = (UINT8 *) Vtf1EndBuffer - SIZE_IA32_RESET_VECT;\r
memcpy (LocalVtfBuffer, Buffer, FileSize);\r
FILE *Fp;\r
UINT64 *StartAddressPtr;\r
UINTN FirstFwVSize;\r
- UINTN NumByte;\r
\r
StartAddressPtr = malloc (sizeof (UINT64));\r
if (StartAddressPtr == NULL) {\r
}\r
*StartAddressPtr = StartAddress;\r
\r
- Fp = fopen (OutFileName1, "rb");\r
+ Fp = fopen (LongFilePath (OutFileName1), "rb");\r
\r
if (Fp == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", OutFileName1);\r
\r
FirstFwVSize = _filelength (fileno (Fp));\r
fseek (Fp, (long) (FirstFwVSize - (UINTN) (SIZE_IA32_RESET_VECT + SIZE_SALE_ENTRY_POINT)), SEEK_SET);\r
- NumByte = fwrite ((VOID *) StartAddressPtr, sizeof (UINT64), 1, Fp);\r
+ fwrite ((VOID *) StartAddressPtr, sizeof (UINT64), 1, Fp);\r
\r
if (Fp) {\r
fclose (Fp);\r
{\r
FILE *SourceFile;\r
FILE *DestFile;\r
- CHAR8 Buffer[_MAX_PATH];\r
- CHAR8 Type[_MAX_PATH];\r
- CHAR8 Address[_MAX_PATH];\r
- CHAR8 Section[_MAX_PATH];\r
- CHAR8 Token[_MAX_PATH];\r
- CHAR8 BaseToken[_MAX_PATH];\r
+ CHAR8 Buffer[MAX_LONG_FILE_PATH];\r
+ CHAR8 Type[MAX_LONG_FILE_PATH];\r
+ CHAR8 Address[MAX_LONG_FILE_PATH];\r
+ CHAR8 Section[MAX_LONG_FILE_PATH];\r
+ CHAR8 Token[MAX_LONG_FILE_PATH];\r
+ CHAR8 BaseToken[MAX_LONG_FILE_PATH];\r
+ CHAR8 FormatString[MAX_LINE_LEN];\r
UINT64 TokenAddress;\r
long StartLocation;\r
\r
//\r
// Open the source file\r
//\r
- SourceFile = fopen (SourceFileName, "r");\r
+ SourceFile = fopen (LongFilePath (SourceFileName), "r");\r
if (SourceFile == NULL) {\r
\r
//\r
//\r
// Open the destination file\r
//\r
- DestFile = fopen (DestFileName, "a+");\r
+ DestFile = fopen (LongFilePath (DestFileName), "a+");\r
if (DestFile == NULL) {\r
fclose (SourceFile);\r
Error (NULL, 0, 0001, "Error opening file", DestFileName);\r
//\r
// Read the first line\r
//\r
- if (fgets (Buffer, _MAX_PATH, SourceFile) == NULL) {\r
+ if (fgets (Buffer, MAX_LONG_FILE_PATH, SourceFile) == NULL) {\r
Buffer[0] = 0;\r
}\r
\r
return EFI_ABORTED;\r
}\r
\r
+ //\r
+ // Generate the format string for fscanf\r
+ //\r
+ sprintf (\r
+ FormatString,\r
+ "%%%us | %%%us | %%%us | %%%us\n",\r
+ (unsigned) sizeof (Type) - 1,\r
+ (unsigned) sizeof (Address) - 1,\r
+ (unsigned) sizeof (Section) - 1,\r
+ (unsigned) sizeof (Token) - 1\r
+ );\r
+\r
//\r
// Read in the file\r
//\r
//\r
// Read a line\r
//\r
- if (fscanf (SourceFile, "%s | %s | %s | %s\n", Type, Address, Section, Token) == 4) {\r
+ if (fscanf (SourceFile, FormatString, Type, Address, Section, Token) == 4) {\r
\r
//\r
// Get the token address\r
\r
--*/\r
{\r
- fprintf (stdout, "%s Version %d.%d\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
+ fprintf (stdout, "%s Version %d.%d %s \n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);\r
}\r
\r
VOID\r
//\r
// Copyright declaration\r
//\r
- fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
+ fprintf (stdout, "Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.\n\n");\r
//\r
// Details Option\r
//\r
// Get the input VTF file name\r
//\r
VtfFileName = argv[Index+1];\r
- VtfFP = fopen(VtfFileName, "rb");\r
+ if (VtfFP != NULL) {\r
+ //\r
+ // VTF file name has been given previously, override with the new value\r
+ //\r
+ fclose (VtfFP);\r
+ }\r
+ VtfFP = fopen (LongFilePath (VtfFileName), "rb");\r
if (VtfFP == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", VtfFileName);\r
goto ERROR;\r
}\r
SymFileName = VTF_SYM_FILE;\r
} else {\r
- INTN OutFileNameLen = strlen(OutFileName1);\r
- INTN Index;\r
+ INTN OutFileNameLen;\r
+ INTN NewIndex;\r
+\r
+ assert (OutFileName1);\r
+ OutFileNameLen = strlen(OutFileName1);\r
\r
- for (Index = OutFileNameLen; Index > 0; --Index) {\r
- if (OutFileName1[Index] == '/' || OutFileName1[Index] == '\\') {\r
+ for (NewIndex = OutFileNameLen; NewIndex > 0; --NewIndex) {\r
+ if (OutFileName1[NewIndex] == '/' || OutFileName1[NewIndex] == '\\') {\r
break;\r
}\r
}\r
- if (Index == 0) {\r
+ if (NewIndex == 0) {\r
SymFileName = VTF_SYM_FILE;\r
} else {\r
- INTN SymFileNameLen = Index + 1 + strlen(VTF_SYM_FILE);\r
+ INTN SymFileNameLen = NewIndex + 1 + strlen(VTF_SYM_FILE);\r
SymFileName = malloc(SymFileNameLen + 1);\r
- memcpy(SymFileName, OutFileName1, Index + 1);\r
- memcpy(SymFileName + Index + 1, VTF_SYM_FILE, strlen(VTF_SYM_FILE));\r
+ if (SymFileName == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ goto ERROR;\r
+ }\r
+ memcpy(SymFileName, OutFileName1, NewIndex + 1);\r
+ memcpy(SymFileName + NewIndex + 1, VTF_SYM_FILE, strlen(VTF_SYM_FILE));\r
SymFileName[SymFileNameLen] = '\0';\r
}\r
if (DebugMode) {\r