BaseTools: extend FFS alignment to 16M

Current FFS only supports 64KiB alignment for data, Per PI 1.6
requirement, we extend FFS alignment to 16M.

Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yonghong Zhu <yonghong.zhu@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Yonghong Zhu
2017-09-20 14:10:04 +08:00
parent 79777358cd
commit e921f58d44
12 changed files with 140 additions and 56 deletions

View File

@ -50,14 +50,17 @@ STATIC CHAR8 *mFfsFileType[] = {
STATIC CHAR8 *mAlignName[] = { STATIC CHAR8 *mAlignName[] = {
"1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512",
"1K", "2K", "4K", "8K", "16K", "32K", "64K" "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K",
"512K", "1M", "2M", "4M", "8M", "16M"
}; };
STATIC CHAR8 *mFfsValidAlignName[] = { STATIC CHAR8 *mFfsValidAlignName[] = {
"8", "16", "128", "512", "1K", "4K", "32K", "64K" "8", "16", "128", "512", "1K", "4K", "32K", "64K", "128K","256K",
"512K", "1M", "2M", "4M", "8M", "16M"
}; };
STATIC UINT32 mFfsValidAlign[] = {0, 8, 16, 128, 512, 1024, 4096, 32768, 65536}; STATIC UINT32 mFfsValidAlign[] = {0, 8, 16, 128, 512, 1024, 4096, 32768, 65536, 131072, 262144,
524288, 1048576, 2097152, 4194304, 8388608, 16777216};
STATIC EFI_GUID mZeroGuid = {0}; STATIC EFI_GUID mZeroGuid = {0};
@ -144,12 +147,13 @@ Returns:
fprintf (stdout, " -s, --checksum Indicates to calculate file checksum.\n"); fprintf (stdout, " -s, --checksum Indicates to calculate file checksum.\n");
fprintf (stdout, " -a FileAlign, --align FileAlign\n\ fprintf (stdout, " -a FileAlign, --align FileAlign\n\
FileAlign points to file alignment, which only support\n\ FileAlign points to file alignment, which only support\n\
the following align: 1,2,4,8,16,128,512,1K,4K,32K,64K\n"); the following align: 1,2,4,8,16,128,512,1K,4K,32K,64K\n\
128K,256K,512K,1M,2M,4M,8M,16M\n");
fprintf (stdout, " -i SectionFile, --sectionfile SectionFile\n\ fprintf (stdout, " -i SectionFile, --sectionfile SectionFile\n\
Section file will be contained in this FFS file.\n"); Section file will be contained in this FFS file.\n");
fprintf (stdout, " -n SectionAlign, --sectionalign SectionAlign\n\ fprintf (stdout, " -n SectionAlign, --sectionalign SectionAlign\n\
SectionAlign points to section alignment, which support\n\ SectionAlign points to section alignment, which support\n\
the alignment scope 1~64K. It is specified together\n\ the alignment scope 1~16M. It is specified together\n\
with sectionfile to point its alignment in FFS file.\n"); with sectionfile to point its alignment in FFS file.\n");
fprintf (stdout, " -v, --verbose Turn on verbose output with informational messages.\n"); fprintf (stdout, " -v, --verbose Turn on verbose output with informational messages.\n");
fprintf (stdout, " -q, --quiet Disable all messages except key message and fatal error\n"); fprintf (stdout, " -q, --quiet Disable all messages except key message and fatal error\n");
@ -168,7 +172,7 @@ StringtoAlignment (
Routine Description: Routine Description:
Converts Align String to align value (1~64K). Converts Align String to align value (1~16M).
Arguments: Arguments:
@ -893,7 +897,12 @@ Returns:
} }
VerboseMsg ("the size of the generated FFS file is %u bytes", (unsigned) FileSize); VerboseMsg ("the size of the generated FFS file is %u bytes", (unsigned) FileSize);
FfsFileHeader.Attributes = (EFI_FFS_FILE_ATTRIBUTES) (FfsAttrib | (FfsAlign << 3)); //FfsAlign larger than 7, set FFS_ATTRIB_DATA_ALIGNMENT2
if (FfsAlign < 8) {
FfsFileHeader.Attributes = (EFI_FFS_FILE_ATTRIBUTES) (FfsAttrib | (FfsAlign << 3));
} else {
FfsFileHeader.Attributes = (EFI_FFS_FILE_ATTRIBUTES) (FfsAttrib | ((FfsAlign & 0x7) << 3) | FFS_ATTRIB_DATA_ALIGNMENT2);
}
// //
// Fill in checksums and state, these must be zero for checksumming // Fill in checksums and state, these must be zero for checksumming

View File

@ -1,7 +1,7 @@
/** @file /** @file
This file contains the internal functions required to generate a Firmware Volume. This file contains the internal functions required to generate a Firmware Volume.
Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR> Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
Portions Copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR> Portions Copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>
Portions Copyright (c) 2016 HP Development Company, L.P.<BR> Portions Copyright (c) 2016 HP Development Company, L.P.<BR>
This program and the accompanying materials This program and the accompanying materials
@ -464,57 +464,97 @@ Returns:
case 0: case 0:
// //
// 1 byte alignment // 1 byte alignment
//if bit 1 have set, 128K byte alignmnet
// //
*Alignment = 0; if (FfsFile->Attributes & FFS_ATTRIB_DATA_ALIGNMENT2) {
*Alignment = 17;
} else {
*Alignment = 0;
}
break; break;
case 1: case 1:
// //
// 16 byte alignment // 16 byte alignment
//if bit 1 have set, 256K byte alignment
// //
*Alignment = 4; if (FfsFile->Attributes & FFS_ATTRIB_DATA_ALIGNMENT2) {
*Alignment = 18;
} else {
*Alignment = 4;
}
break; break;
case 2: case 2:
// //
// 128 byte alignment // 128 byte alignment
//if bit 1 have set, 512K byte alignment
// //
*Alignment = 7; if (FfsFile->Attributes & FFS_ATTRIB_DATA_ALIGNMENT2) {
*Alignment = 19;
} else {
*Alignment = 7;
}
break; break;
case 3: case 3:
// //
// 512 byte alignment // 512 byte alignment
//if bit 1 have set, 1M byte alignment
// //
*Alignment = 9; if (FfsFile->Attributes & FFS_ATTRIB_DATA_ALIGNMENT2) {
*Alignment = 20;
} else {
*Alignment = 9;
}
break; break;
case 4: case 4:
// //
// 1K byte alignment // 1K byte alignment
//if bit 1 have set, 2M byte alignment
// //
*Alignment = 10; if (FfsFile->Attributes & FFS_ATTRIB_DATA_ALIGNMENT2) {
*Alignment = 21;
} else {
*Alignment = 10;
}
break; break;
case 5: case 5:
// //
// 4K byte alignment // 4K byte alignment
//if bit 1 have set, 4M byte alignment
// //
*Alignment = 12; if (FfsFile->Attributes & FFS_ATTRIB_DATA_ALIGNMENT2) {
*Alignment = 22;
} else {
*Alignment = 12;
}
break; break;
case 6: case 6:
// //
// 32K byte alignment // 32K byte alignment
//if bit 1 have set , 8M byte alignment
// //
*Alignment = 15; if (FfsFile->Attributes & FFS_ATTRIB_DATA_ALIGNMENT2) {
*Alignment = 23;
} else {
*Alignment = 15;
}
break; break;
case 7: case 7:
// //
// 64K byte alignment // 64K byte alignment
//if bit 1 have set, 16M alignment
// //
*Alignment = 16; if (FfsFile->Attributes & FFS_ATTRIB_DATA_ALIGNMENT2) {
*Alignment = 24;
} else {
*Alignment = 16;
}
break; break;
default: default:
@ -1060,7 +1100,7 @@ Returns:
// Clear the alignment bits: these have become meaningless now that we have // Clear the alignment bits: these have become meaningless now that we have
// adjusted the padding section. // adjusted the padding section.
// //
FfsFile->Attributes &= ~FFS_ATTRIB_DATA_ALIGNMENT; FfsFile->Attributes &= ~(FFS_ATTRIB_DATA_ALIGNMENT | FFS_ATTRIB_DATA_ALIGNMENT2);
// //
// Recalculate the FFS header checksum. Instead of setting Header and State // Recalculate the FFS header checksum. Instead of setting Header and State

View File

@ -74,7 +74,8 @@ STATIC CHAR8 *mGUIDedSectionAttribue[] = { "NONE", "PROCESSING_REQUIRED",
STATIC CHAR8 *mAlignName[] = { STATIC CHAR8 *mAlignName[] = {
"1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1", "2", "4", "8", "16", "32", "64", "128", "256", "512",
"1K", "2K", "4K", "8K", "16K", "32K", "64K" "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K",
"512K", "1M", "2M", "4M", "8M", "16M"
}; };
// //
@ -184,7 +185,7 @@ Returns:
used in Ver section.\n"); used in Ver section.\n");
fprintf (stdout, " --sectionalign SectionAlign\n\ fprintf (stdout, " --sectionalign SectionAlign\n\
SectionAlign points to section alignment, which support\n\ SectionAlign points to section alignment, which support\n\
the alignment scope 1~64K. It is specified in same\n\ the alignment scope 1~16M. It is specified in same\n\
order that the section file is input.\n"); order that the section file is input.\n");
fprintf (stdout, " -v, --verbose Turn on verbose output with informational messages.\n"); fprintf (stdout, " -v, --verbose Turn on verbose output with informational messages.\n");
fprintf (stdout, " -q, --quiet Disable all messages except key message and fatal error\n"); fprintf (stdout, " -q, --quiet Disable all messages except key message and fatal error\n");
@ -356,7 +357,7 @@ StringtoAlignment (
Routine Description: Routine Description:
Converts Align String to align value (1~64K). Converts Align String to align value (1~16M).
Arguments: Arguments:

View File

@ -4,7 +4,7 @@
@par Revision Reference: @par Revision Reference:
Version 1.4. Version 1.4.
Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available This program and the accompanying materials are licensed and made available
under the terms and conditions of the BSD License which accompanies this under the terms and conditions of the BSD License which accompanies this
@ -65,6 +65,7 @@ typedef UINT8 EFI_FFS_FILE_STATE;
// FFS File Attributes. // FFS File Attributes.
// //
#define FFS_ATTRIB_LARGE_FILE 0x01 #define FFS_ATTRIB_LARGE_FILE 0x01
#define FFS_ATTRIB_DATA_ALIGNMENT2 0x02
#define FFS_ATTRIB_FIXED 0x04 #define FFS_ATTRIB_FIXED 0x04
#define FFS_ATTRIB_DATA_ALIGNMENT 0x38 #define FFS_ATTRIB_DATA_ALIGNMENT 0x38
#define FFS_ATTRIB_CHECKSUM 0x40 #define FFS_ATTRIB_CHECKSUM 0x40

View File

@ -1,7 +1,7 @@
## @file ## @file
# parse FDF file # parse FDF file
# #
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -2340,7 +2340,8 @@ class FdfParser(object):
AlignValue = None AlignValue = None
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
AlignValue = self.__Token AlignValue = self.__Token
@ -2608,7 +2609,8 @@ class FdfParser(object):
AlignValue = None AlignValue = None
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
AlignValue = self.__Token AlignValue = self.__Token
@ -2924,7 +2926,8 @@ class FdfParser(object):
AlignValue = "" AlignValue = ""
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)
AlignValue = self.__Token AlignValue = self.__Token
@ -2988,7 +2991,8 @@ class FdfParser(object):
CheckSum = True CheckSum = True
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)
if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'): if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
@ -3062,7 +3066,8 @@ class FdfParser(object):
FvImageSectionObj.FvFileType = self.__Token FvImageSectionObj.FvFileType = self.__Token
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)
FvImageSectionObj.Alignment = self.__Token FvImageSectionObj.Alignment = self.__Token
@ -3129,7 +3134,8 @@ class FdfParser(object):
EfiSectionObj.BuildNum = self.__Token EfiSectionObj.BuildNum = self.__Token
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'): if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)

View File

@ -1,7 +1,7 @@
## @file ## @file
# process data section generation # process data section generation
# #
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -79,8 +79,10 @@ class DataSection (DataSectionClassObject):
ImageObj = PeImageClass (Filename) ImageObj = PeImageClass (Filename)
if ImageObj.SectionAlignment < 0x400: if ImageObj.SectionAlignment < 0x400:
self.Alignment = str (ImageObj.SectionAlignment) self.Alignment = str (ImageObj.SectionAlignment)
else: elif ImageObj.SectionAlignment < 0x100000:
self.Alignment = str (ImageObj.SectionAlignment / 0x400) + 'K' self.Alignment = str (ImageObj.SectionAlignment / 0x400) + 'K'
else:
self.Alignment = str (ImageObj.SectionAlignment / 0x100000) + 'M'
NoStrip = True NoStrip = True
if self.SecType in ('TE', 'PE32'): if self.SecType in ('TE', 'PE32'):

View File

@ -1,7 +1,7 @@
## @file ## @file
# process rule section generation # process rule section generation
# #
# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -231,8 +231,10 @@ class EfiSection (EfiSectionClassObject):
ImageObj = PeImageClass (File) ImageObj = PeImageClass (File)
if ImageObj.SectionAlignment < 0x400: if ImageObj.SectionAlignment < 0x400:
Align = str (ImageObj.SectionAlignment) Align = str (ImageObj.SectionAlignment)
else: elif ImageObj.SectionAlignment < 0x100000:
Align = str (ImageObj.SectionAlignment / 0x400) + 'K' Align = str (ImageObj.SectionAlignment / 0x400) + 'K'
else:
Align = str (ImageObj.SectionAlignment / 0x100000) + 'M'
if File[(len(File)-4):] == '.efi': if File[(len(File)-4):] == '.efi':
MapFile = File.replace('.efi', '.map') MapFile = File.replace('.efi', '.map')

View File

@ -2767,7 +2767,8 @@ class FdfParser:
while True: while True:
AlignValue = None AlignValue = None
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
#For FFS, Auto is default option same to "" #For FFS, Auto is default option same to ""
if not self.__Token == "Auto": if not self.__Token == "Auto":
@ -2826,7 +2827,8 @@ class FdfParser:
FfsFileObj.CheckSum = True FfsFileObj.CheckSum = True
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
#For FFS, Auto is default option same to "" #For FFS, Auto is default option same to ""
if not self.__Token == "Auto": if not self.__Token == "Auto":
@ -2897,7 +2899,8 @@ class FdfParser:
AlignValue = None AlignValue = None
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
AlignValue = self.__Token AlignValue = self.__Token
@ -3186,7 +3189,8 @@ class FdfParser:
AlignValue = None AlignValue = None
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
AlignValue = self.__Token AlignValue = self.__Token
@ -3777,7 +3781,8 @@ class FdfParser:
AlignValue = "" AlignValue = ""
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
#For FFS, Auto is default option same to "" #For FFS, Auto is default option same to ""
if not self.__Token == "Auto": if not self.__Token == "Auto":
@ -3826,7 +3831,8 @@ class FdfParser:
SectAlignment = "" SectAlignment = ""
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'): if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
@ -3905,7 +3911,8 @@ class FdfParser:
FvImageSectionObj.FvFileType = self.__Token FvImageSectionObj.FvFileType = self.__Token
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
FvImageSectionObj.Alignment = self.__Token FvImageSectionObj.Alignment = self.__Token
@ -3972,7 +3979,8 @@ class FdfParser:
EfiSectionObj.BuildNum = self.__Token EfiSectionObj.BuildNum = self.__Token
if self.__GetAlignment(): if self.__GetAlignment():
if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K"): if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
"256K", "512K", "1M", "2M", "4M", "8M", "16M"):
raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber) raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'): if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):
raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber) raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)

View File

@ -1,7 +1,7 @@
## @file ## @file
# process FFS generation from INF statement # process FFS generation from INF statement
# #
# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2014-2016 Hewlett-Packard Development Company, L.P.<BR> # Copyright (c) 2014-2016 Hewlett-Packard Development Company, L.P.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
@ -731,8 +731,10 @@ class FfsInfStatement(FfsInfStatementClassObject):
ImageObj = PeImageClass (File) ImageObj = PeImageClass (File)
if ImageObj.SectionAlignment < 0x400: if ImageObj.SectionAlignment < 0x400:
self.Alignment = str (ImageObj.SectionAlignment) self.Alignment = str (ImageObj.SectionAlignment)
else: elif ImageObj.SectionAlignment < 0x100000:
self.Alignment = str (ImageObj.SectionAlignment / 0x400) + 'K' self.Alignment = str (ImageObj.SectionAlignment / 0x400) + 'K'
else:
self.Alignment = str (ImageObj.SectionAlignment / 0x100000) + 'M'
if not NoStrip: if not NoStrip:
FileBeforeStrip = os.path.join(self.OutputPath, ModuleName + '.reloc') FileBeforeStrip = os.path.join(self.OutputPath, ModuleName + '.reloc')
@ -770,8 +772,10 @@ class FfsInfStatement(FfsInfStatementClassObject):
ImageObj = PeImageClass (GenSecInputFile) ImageObj = PeImageClass (GenSecInputFile)
if ImageObj.SectionAlignment < 0x400: if ImageObj.SectionAlignment < 0x400:
self.Alignment = str (ImageObj.SectionAlignment) self.Alignment = str (ImageObj.SectionAlignment)
else: elif ImageObj.SectionAlignment < 0x100000:
self.Alignment = str (ImageObj.SectionAlignment / 0x400) + 'K' self.Alignment = str (ImageObj.SectionAlignment / 0x400) + 'K'
else:
self.Alignment = str (ImageObj.SectionAlignment / 0x100000) + 'M'
if not NoStrip: if not NoStrip:
FileBeforeStrip = os.path.join(self.OutputPath, ModuleName + '.reloc') FileBeforeStrip = os.path.join(self.OutputPath, ModuleName + '.reloc')

View File

@ -196,9 +196,12 @@ class FV (FvClassObject):
FvAlignmentValue = 1 << (ord (FvHeaderBuffer[0x2E]) & 0x1F) FvAlignmentValue = 1 << (ord (FvHeaderBuffer[0x2E]) & 0x1F)
# FvAlignmentValue is larger than or equal to 1K # FvAlignmentValue is larger than or equal to 1K
if FvAlignmentValue >= 0x400: if FvAlignmentValue >= 0x400:
if FvAlignmentValue >= 0x10000: if FvAlignmentValue >= 0x100000:
#The max alignment supported by FFS is 64K. #The max alignment supported by FFS is 16M.
self.FvAlignment = "64K" if FvAlignmentValue >= 0x1000000:
self.FvAlignment = "16M"
else:
self.FvAlignment = str(FvAlignmentValue / 0x100000) + "M"
else: else:
self.FvAlignment = str (FvAlignmentValue / 0x400) + "K" self.FvAlignment = str (FvAlignmentValue / 0x400) + "K"
else: else:

View File

@ -1,7 +1,7 @@
## @file ## @file
# process FV image section generation # process FV image section generation
# #
# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -80,9 +80,12 @@ class FvImageSection(FvImageSectionClassObject):
# MaxFvAlignment is larger than or equal to 1K # MaxFvAlignment is larger than or equal to 1K
if MaxFvAlignment >= 0x400: if MaxFvAlignment >= 0x400:
if MaxFvAlignment >= 0x10000: if MaxFvAlignment >= 0x100000:
#The max alignment supported by FFS is 64K. #The max alignment supported by FFS is 16M.
self.Alignment = "64K" if MaxFvAlignment >=1000000:
self.Alignment = "16M"
else:
self.Alignment = str(MaxFvAlignment / 0x100000) + "M"
else: else:
self.Alignment = str (MaxFvAlignment / 0x400) + "K" self.Alignment = str (MaxFvAlignment / 0x400) + "K"
else: else:
@ -117,9 +120,12 @@ class FvImageSection(FvImageSectionClassObject):
FvAlignmentValue = 1 << (ord (FvHeaderBuffer[0x2E]) & 0x1F) FvAlignmentValue = 1 << (ord (FvHeaderBuffer[0x2E]) & 0x1F)
# FvAlignmentValue is larger than or equal to 1K # FvAlignmentValue is larger than or equal to 1K
if FvAlignmentValue >= 0x400: if FvAlignmentValue >= 0x400:
if FvAlignmentValue >= 0x10000: if FvAlignmentValue >= 0x100000:
#The max alignment supported by FFS is 64K. #The max alignment supported by FFS is 16M.
self.Alignment = "64K" if FvAlignmentValue >= 0x1000000:
self.Alignment = "16M"
else:
self.Alignment = str(FvAlignmentValue / 0x100000) + "M"
else: else:
self.Alignment = str (FvAlignmentValue / 0x400) + "K" self.Alignment = str (FvAlignmentValue / 0x400) + "K"
else: else:

View File

@ -1,7 +1,7 @@
## @file ## @file
# Global variables for GenFds # Global variables for GenFds
# #
# Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials # This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
@ -420,8 +420,10 @@ class GenFdsGlobalVariable:
def GetAlignment (AlignString): def GetAlignment (AlignString):
if AlignString == None: if AlignString == None:
return 0 return 0
if AlignString in ("1K", "2K", "4K", "8K", "16K", "32K", "64K"): if AlignString in ("1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K"):
return int (AlignString.rstrip('K')) * 1024 return int (AlignString.rstrip('K')) * 1024
elif AlignString in ("1M", "2M", "4M", "8M", "16M"):
return int (AlignString.rstrip('M')) * 1024 * 1024
else: else:
return int (AlignString) return int (AlignString)
@ -429,7 +431,7 @@ class GenFdsGlobalVariable:
def GenerateFfs(Output, Input, Type, Guid, Fixed=False, CheckSum=False, Align=None, def GenerateFfs(Output, Input, Type, Guid, Fixed=False, CheckSum=False, Align=None,
SectionAlign=None): SectionAlign=None):
Cmd = ["GenFfs", "-t", Type, "-g", Guid] Cmd = ["GenFfs", "-t", Type, "-g", Guid]
mFfsValidAlign = ["0", "8", "16", "128", "512", "1K", "4K", "32K", "64K"] mFfsValidAlign = ["0", "8", "16", "128", "512", "1K", "4K", "32K", "64K", "128K", "256K", "512K", "1M", "2M", "4M", "8M", "16M"]
if Fixed == True: if Fixed == True:
Cmd += ["-x"] Cmd += ["-x"]
if CheckSum: if CheckSum: