/** @file\r
+Creates output file that is a properly formed section per the PI spec.\r
\r
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials \r
are licensed and made available under the terms and conditions of the BSD License \r
which accompanies this 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
-Module Name:\r
-\r
- GenSection.c\r
-\r
-Abstract:\r
-\r
- Creates output file that is a properly formed section per the PI spec.\r
-\r
**/\r
\r
#include <stdio.h>\r
\r
STATIC CHAR8 *mAlignName[] = {\r
"1", "2", "4", "8", "16", "32", "64", "128", "256", "512",\r
- "1K", "2K", "4K", "8K", "16K", "32K", "64K"\r
+ "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K",\r
+ "512K", "1M", "2M", "4M", "8M", "16M"\r
};\r
\r
//\r
//\r
// Copyright declaration\r
// \r
- fprintf (stdout, "Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.\n\n");\r
+ fprintf (stdout, "Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.\n\n");\r
\r
//\r
// Details Option\r
used in Ver section.\n");\r
fprintf (stdout, " --sectionalign SectionAlign\n\\r
SectionAlign points to section alignment, which support\n\\r
- the alignment scope 1~64K. It is specified in same\n\\r
+ the alignment scope 1~16M. It is specified in same\n\\r
order that the section file is input.\n");\r
+ fprintf (stdout, " --dummy dummyfile\n\\r
+ compare dummpyfile with input_file to decide whether\n\\r
+ need to set PROCESSING_REQUIRED attribute.\n");\r
fprintf (stdout, " -v, --verbose Turn on verbose output with informational messages.\n");\r
fprintf (stdout, " -q, --quiet Disable all messages except key message and fatal error\n");\r
fprintf (stdout, " -d, --debug level Enable debug messages, at input debug level.\n");\r
STATUS Status;\r
\r
if (InputFileNum > 1) {\r
- Error (NULL, 0, 2000, "Invalid paramter", "more than one input file specified");\r
+ Error (NULL, 0, 2000, "Invalid parameter", "more than one input file specified");\r
return STATUS_ERROR;\r
} else if (InputFileNum < 1) {\r
- Error (NULL, 0, 2000, "Invalid paramter", "no input file specified");\r
+ Error (NULL, 0, 2000, "Invalid parameter", "no input file specified");\r
return STATUS_ERROR;\r
}\r
//\r
// Open the input file\r
//\r
- InFile = fopen (InputFileName[0], "rb");\r
+ InFile = fopen (LongFilePath (InputFileName[0]), "rb");\r
if (InFile == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", InputFileName[0]);\r
return STATUS_ERROR;\r
// Size must fit in 3 bytes\r
//\r
//if (TotalLength >= MAX_SECTION_SIZE) {\r
- // Error (NULL, 0, 2000, "Invalid paramter", "%s file size (0x%X) exceeds section size limit(%uM).", InputFileName[0], (unsigned) TotalLength, MAX_SECTION_SIZE>>20);\r
+ // Error (NULL, 0, 2000, "Invalid parameter", "%s file size (0x%X) exceeds section size limit(%uM).", InputFileName[0], (unsigned) TotalLength, MAX_SECTION_SIZE>>20);\r
// goto Done;\r
//}\r
HeaderLength = sizeof (EFI_COMMON_SECTION_HEADER);\r
\r
Routine Description:\r
\r
- Converts Align String to align value (1~64K). \r
+ Converts Align String to align value (1~16M).\r
\r
Arguments:\r
\r
UINT32 HeaderSize;\r
\r
if (InputFileNum < 1) {\r
- Error (NULL, 0, 2000, "Invalid paramter", "must specify at least one input file");\r
+ Error (NULL, 0, 2000, "Invalid parameter", "must specify at least one input file");\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
if (BufferLength == NULL) {\r
- Error (NULL, 0, 2000, "Invalid paramter", "BufferLength can't be NULL");\r
+ Error (NULL, 0, 2000, "Invalid parameter", "BufferLength can't be NULL");\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
// \r
// Open file and read contents\r
//\r
- InFile = fopen (InputFileName[Index], "rb");\r
+ InFile = fopen (LongFilePath (InputFileName[Index]), "rb");\r
if (InFile == NULL) {\r
Error (NULL, 0, 0001, "Error opening file", InputFileName[Index]);\r
return EFI_ABORTED;\r
return Status;\r
}\r
\r
+ if (FileBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
CompressFunction = NULL;\r
\r
//\r
break;\r
\r
default:\r
- Error (NULL, 0, 2000, "Invalid paramter", "unknown compression type");\r
+ Error (NULL, 0, 2000, "Invalid parameter", "unknown compression type");\r
free (FileBuffer);\r
return EFI_ABORTED;\r
}\r
\r
return Status;\r
}\r
+\r
+ if (FileBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
}\r
\r
DebugMsg (NULL, 0, 9, "comprss file size", \r
"the original section size is %d bytes and the compressed section size is %u bytes", (unsigned) InputLength, (unsigned) CompressedLength);\r
\r
//if (TotalLength >= MAX_SECTION_SIZE) {\r
- // Error (NULL, 0, 2000, "Invalid paramter", "The size of all files exceeds section size limit(%uM).", MAX_SECTION_SIZE>>20);\r
+ // Error (NULL, 0, 2000, "Invalid parameter", "The size of all files exceeds section size limit(%uM).", MAX_SECTION_SIZE>>20);\r
// if (FileBuffer != NULL) {\r
// free (FileBuffer);\r
// }\r
}\r
\r
if (InputLength == 0) {\r
+ if (FileBuffer != NULL) {\r
+ free (FileBuffer);\r
+ }\r
Error (NULL, 0, 2000, "Invalid parameter", "the size of input file %s can't be zero", InputFileName);\r
return EFI_NOT_FOUND;\r
}\r
\r
+ //\r
+ // InputLength != 0, but FileBuffer == NULL means out of resources.\r
+ //\r
+ if (FileBuffer == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
//\r
// Now data is in FileBuffer + Offset\r
//\r
UINT32 *InputFileAlign;\r
UINT32 InputFileAlignNum;\r
EFI_COMMON_SECTION_HEADER *SectionHeader;\r
+ CHAR8 *DummyFileName;\r
+ FILE *DummyFile;\r
+ UINTN DummyFileSize;\r
+ UINT8 *DummyFileBuffer;\r
+ FILE *InFile;\r
+ UINT8 *InFileBuffer;\r
+ UINTN InFileSize;\r
\r
InputFileAlign = NULL;\r
InputFileAlignNum = 0;\r
SectGuidHeaderLength = 0;\r
VersionSect = NULL;\r
UiSect = NULL;\r
+ DummyFileSize = 0;\r
+ DummyFileName = NULL;\r
+ DummyFile = NULL;\r
+ DummyFileBuffer = NULL;\r
+ InFile = NULL;\r
+ InFileSize = 0;\r
+ InFileBuffer = NULL;\r
\r
SetUtilityName (UTILITY_NAME);\r
\r
argv += 2;\r
continue;\r
}\r
+ if (stricmp (argv[0], "--dummy") == 0) {\r
+ DummyFileName = argv[1];\r
+ if (DummyFileName == NULL) {\r
+ Error (NULL, 0, 1003, "Invalid option value", "Dummy file can't be NULL");\r
+ goto Finish;\r
+ }\r
+ argc -= 2;\r
+ argv += 2;\r
+ continue;\r
+ }\r
\r
if ((stricmp (argv[0], "-r") == 0) || (stricmp (argv[0], "--attributes") == 0)) {\r
+ if (argv[1] == NULL) {\r
+ Error (NULL, 0, 1003, "Invalid option value", "Guid section attributes can't be NULL");\r
+ goto Finish;\r
+ }\r
if (stricmp (argv[1], mGUIDedSectionAttribue[EFI_GUIDED_SECTION_PROCESSING_REQUIRED]) == 0) {\r
SectGuidAttribute |= EFI_GUIDED_SECTION_PROCESSING_REQUIRED;\r
} else if (stricmp (argv[1], mGUIDedSectionAttribue[EFI_GUIDED_SECTION_AUTH_STATUS_VALID]) == 0) {\r
InputFileAlign = (UINT32 *) malloc (MAXIMUM_INPUT_FILE_NUM * sizeof (UINT32));\r
if (InputFileAlign == NULL) {\r
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
- return 1;\r
+ goto Finish;\r
}\r
memset (InputFileAlign, 1, MAXIMUM_INPUT_FILE_NUM * sizeof (UINT32));\r
} else if (InputFileAlignNum % MAXIMUM_INPUT_FILE_NUM == 0) {\r
\r
if (InputFileAlign == NULL) {\r
Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
- return 1;\r
+ goto Finish;\r
}\r
memset (&(InputFileAlign[InputFileNum]), 1, (MAXIMUM_INPUT_FILE_NUM * sizeof (UINT32)));\r
}\r
InputFileName = (CHAR8 **) malloc (MAXIMUM_INPUT_FILE_NUM * sizeof (CHAR8 *));\r
if (InputFileName == NULL) {\r
Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
- return 1;\r
+ goto Finish;\r
}\r
memset (InputFileName, 0, (MAXIMUM_INPUT_FILE_NUM * sizeof (CHAR8 *)));\r
} else if (InputFileNum % MAXIMUM_INPUT_FILE_NUM == 0) {\r
\r
if (InputFileName == NULL) {\r
Error (NULL, 0, 4001, "Resource", "memory cannot be allcoated");\r
- return 1;\r
+ goto Finish;\r
}\r
memset (&(InputFileName[InputFileNum]), 0, (MAXIMUM_INPUT_FILE_NUM * sizeof (CHAR8 *)));\r
}\r
\r
VerboseMsg ("%s tool start.", UTILITY_NAME);\r
\r
+ if (DummyFileName != NULL) {\r
+ //\r
+ // Open file and read contents\r
+ //\r
+ DummyFile = fopen (LongFilePath (DummyFileName), "rb");\r
+ if (DummyFile == NULL) {\r
+ Error (NULL, 0, 0001, "Error opening file", DummyFileName);\r
+ goto Finish;\r
+ }\r
+\r
+ fseek (DummyFile, 0, SEEK_END);\r
+ DummyFileSize = ftell (DummyFile);\r
+ fseek (DummyFile, 0, SEEK_SET);\r
+ DummyFileBuffer = (UINT8 *) malloc (DummyFileSize);\r
+ fread(DummyFileBuffer, 1, DummyFileSize, DummyFile);\r
+ fclose(DummyFile);\r
+ DebugMsg (NULL, 0, 9, "Dummy files", "the dummy file name is %s and the size is %u bytes", DummyFileName, (unsigned) DummyFileSize);\r
+\r
+ InFile = fopen(LongFilePath(InputFileName[0]), "rb");\r
+ if (InFile == NULL) {\r
+ Error (NULL, 0, 0001, "Error opening file", InputFileName[0]);\r
+ goto Finish;\r
+ }\r
+\r
+ fseek (InFile, 0, SEEK_END);\r
+ InFileSize = ftell (InFile);\r
+ fseek (InFile, 0, SEEK_SET);\r
+ InFileBuffer = (UINT8 *) malloc (InFileSize);\r
+ fread(InFileBuffer, 1, InFileSize, InFile);\r
+ fclose(InFile);\r
+ DebugMsg (NULL, 0, 9, "Input files", "the input file name is %s and the size is %u bytes", InputFileName[0], (unsigned) InFileSize);\r
+ if (InFileSize > DummyFileSize){\r
+ if (stricmp((CHAR8 *)DummyFileBuffer, (CHAR8 *)(InFileBuffer + (InFileSize - DummyFileSize))) == 0){\r
+ SectGuidHeaderLength = InFileSize - DummyFileSize;\r
+ }\r
+ }\r
+ if (SectGuidHeaderLength == 0) {\r
+ SectGuidAttribute |= EFI_GUIDED_SECTION_PROCESSING_REQUIRED;\r
+ }\r
+ if (DummyFileBuffer != NULL) {\r
+ free (DummyFileBuffer);\r
+ }\r
+ if (InFileBuffer != NULL) {\r
+ free (InFileBuffer);\r
+ }\r
+ }\r
+\r
//\r
// Parse all command line parameters to get the corresponding section type.\r
//\r
//\r
// GuidValue is only required by Guided section.\r
//\r
- if ((SectType != EFI_SECTION_GUID_DEFINED) && (CompareGuid (&VendorGuid, &mZeroGuid) != 0)) {\r
+ if ((SectType != EFI_SECTION_GUID_DEFINED) &&\r
+ (SectionName != NULL) &&\r
+ (CompareGuid (&VendorGuid, &mZeroGuid) != 0)) {\r
fprintf (stdout, "Warning: the input guid value is not required for this section type %s\n", SectionName);\r
}\r
\r
//\r
// Write the output file\r
//\r
- OutFile = fopen (OutputFileName, "wb");\r
+ OutFile = fopen (LongFilePath (OutputFileName), "wb");\r
if (OutFile == NULL) {\r
Error (NULL, 0, 0001, "Error opening file for writing", OutputFileName);\r
goto Finish;\r