|
From: <lg...@us...> - 2010-01-28 01:46:39
|
Revision: 1819
http://edk2-buildtools.svn.sourceforge.net/edk2-buildtools/?rev=1819&view=rev
Author: lgao4
Date: 2010-01-28 01:46:33 +0000 (Thu, 28 Jan 2010)
Log Message:
-----------
1. Extend Platform Build Options only for EDK module, or only for EDKII module, or for both.
2. Support negative value setting for PCD value.
3. Check whether PCD value is valid for its data type.
4. Correct the generation for patchable PCD in AutoGen code.
Modified Paths:
--------------
trunk/BaseTools/Source/Python/AutoGen/AutoGen.py
trunk/BaseTools/Source/Python/AutoGen/GenC.py
trunk/BaseTools/Source/Python/Common/BuildToolError.py
trunk/BaseTools/Source/Python/Common/DataType.py
trunk/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
Modified: trunk/BaseTools/Source/Python/AutoGen/AutoGen.py
===================================================================
--- trunk/BaseTools/Source/Python/AutoGen/AutoGen.py 2010-01-26 14:22:57 UTC (rev 1818)
+++ trunk/BaseTools/Source/Python/AutoGen/AutoGen.py 2010-01-28 01:46:33 UTC (rev 1819)
@@ -355,6 +355,8 @@
self._ToolChainFamily = None
self._BuildRuleFamily = None
self._BuildOption = None # toolcode : option
+ self._EdkBuildOption = None # edktoolcode : option
+ self._EdkIIBuildOption = None # edkiitoolcode : option
self._PackageList = None
self._ModuleAutoGenList = None
self._LibraryAutoGenList = None
@@ -661,12 +663,24 @@
self._BuildRuleFamily = ToolDefinition[TAB_TOD_DEFINES_BUILDRULEFAMILY][self.ToolChain]
return self._BuildRuleFamily
- ## Return the build options specific to this platform
+ ## Return the build options specific for all modules in this platform
def _GetBuildOptions(self):
if self._BuildOption == None:
self._BuildOption = self._ExpandBuildOption(self.Platform.BuildOptions)
return self._BuildOption
+ ## Return the build options specific for EDK modules in this platform
+ def _GetEdkBuildOptions(self):
+ if self._EdkBuildOption == None:
+ self._EdkBuildOption = self._ExpandBuildOption(self.Platform.BuildOptions, EDK_NAME)
+ return self._EdkBuildOption
+
+ ## Return the build options specific for EDKII modules in this platform
+ def _GetEdkIIBuildOptions(self):
+ if self._EdkIIBuildOption == None:
+ self._EdkIIBuildOption = self._ExpandBuildOption(self.Platform.BuildOptions, EDKII_NAME)
+ return self._EdkIIBuildOption
+
## Parse build_rule.txt in $(WORKSPACE)/Conf/build_rule.txt
#
# @retval BuildRule object
@@ -1072,11 +1086,18 @@
#
# @retval options Options expanded
#
- def _ExpandBuildOption(self, Options):
+ def _ExpandBuildOption(self, Options, ModuleStyle=None):
BuildOptions = {}
FamilyMatch = False
FamilyIsNull = True
for Key in Options:
+ if ModuleStyle != None and len (Key) > 2:
+ # Check Module style is EDK or EDKII.
+ # Only append build option for the matched style module.
+ if ModuleStyle == EDK_NAME and Key[2] != EDK_NAME:
+ continue
+ elif ModuleStyle == EDKII_NAME and Key[2] != EDKII_NAME:
+ continue
Family = Key[0]
Target, Tag, Arch, Tool, Attr = Key[1].split("_")
# if tool chain family doesn't match, skip it
@@ -1104,6 +1125,13 @@
return BuildOptions
for Key in Options:
+ if ModuleStyle != None and len (Key) > 2:
+ # Check Module style is EDK or EDKII.
+ # Only append build option for the matched style module.
+ if ModuleStyle == EDK_NAME and Key[2] != EDK_NAME:
+ continue
+ elif ModuleStyle == EDKII_NAME and Key[2] != EDKII_NAME:
+ continue
Family = Key[0]
Target, Tag, Arch, Tool, Attr = Key[1].split("_")
# if tool chain family doesn't match, skip it
@@ -1133,7 +1161,11 @@
# @retval options The options appended with build options in platform
#
def ApplyBuildOption(self, Module):
- PlatformOptions = self.BuildOption
+ # Get the different options for the different style module
+ if Module.AutoGenVersion < 0x00010005:
+ PlatformOptions = self.EdkBuildOption
+ else:
+ PlatformOptions = self.EdkIIBuildOption
ModuleOptions = self._ExpandBuildOption(Module.BuildOptions)
if Module in self.Platform.Modules:
PlatformModule = self.Platform.Modules[str(Module)]
@@ -1181,6 +1213,8 @@
ToolChainFamily = property(_GetToolChainFamily)
BuildRuleFamily = property(_GetBuildRuleFamily)
BuildOption = property(_GetBuildOptions) # toolcode : option
+ EdkBuildOption = property(_GetEdkBuildOptions) # edktoolcode : option
+ EdkIIBuildOption = property(_GetEdkIIBuildOptions) # edkiitoolcode : option
BuildCommand = property(_GetBuildCommand)
BuildRule = property(_GetBuildRule)
Modified: trunk/BaseTools/Source/Python/AutoGen/GenC.py
===================================================================
--- trunk/BaseTools/Source/Python/AutoGen/GenC.py 2010-01-26 14:22:57 UTC (rev 1818)
+++ trunk/BaseTools/Source/Python/AutoGen/GenC.py 2010-01-28 01:46:33 UTC (rev 1819)
@@ -961,9 +961,46 @@
Array = ''
Value = Pcd.DefaultValue
Unicode = False
- if Pcd.DatumType == 'UINT64':
- if not Value.endswith('ULL'):
- Value += 'ULL'
+ ValueNumber = 0
+ if Pcd.DatumType in ['UINT64', 'UINT32', 'UINT16', 'UINT8']:
+ if Value.upper().startswith('0X'):
+ ValueNumber = int (Value, 16)
+ else:
+ ValueNumber = int (Value)
+ if Pcd.DatumType == 'UINT64':
+ if abs (ValueNumber) >= 0x10000000000000000:
+ EdkLogger.error("build", AUTOGEN_ERROR,
+ "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+ ExtraData="[%s]" % str(Info))
+ if ValueNumber < 0:
+ ValueNumber = 0x10000000000000000 + ValueNumber
+ Value = str (ValueNumber)
+ if not Value.endswith('ULL'):
+ Value += 'ULL'
+ elif Pcd.DatumType == 'UINT32':
+ if abs (ValueNumber) >= 0x100000000:
+ EdkLogger.error("build", AUTOGEN_ERROR,
+ "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+ ExtraData="[%s]" % str(Info))
+ if ValueNumber < 0:
+ ValueNumber = 0x100000000 + ValueNumber
+ Value = str (ValueNumber)
+ elif Pcd.DatumType == 'UINT16':
+ if abs (ValueNumber) >= 0x10000:
+ EdkLogger.error("build", AUTOGEN_ERROR,
+ "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+ ExtraData="[%s]" % str(Info))
+ if ValueNumber < 0:
+ ValueNumber = 0x10000 + ValueNumber
+ Value = str (ValueNumber)
+ elif Pcd.DatumType == 'UINT8':
+ if abs (ValueNumber) >= 0x100:
+ EdkLogger.error("build", AUTOGEN_ERROR,
+ "Too large PCD value for datum type [%s] of PCD %s.%s" % (Pcd.DatumType, Pcd.TokenSpaceGuidCName, Pcd.TokenCName),
+ ExtraData="[%s]" % str(Info))
+ if ValueNumber < 0:
+ ValueNumber = 0x100 + ValueNumber
+ Value = str (ValueNumber)
if Pcd.DatumType == 'VOID*':
if Pcd.MaxDatumSize == None or Pcd.MaxDatumSize == '':
EdkLogger.error("build", AUTOGEN_ERROR,
@@ -1021,7 +1058,7 @@
AutoGenH.Append('#define %s %s%s\n' %(GetModeName, Type, PcdVariableName))
elif Pcd.Type == TAB_PCDS_PATCHABLE_IN_MODULE:
AutoGenH.Append('#define %s %s\n' %(PcdValueName, Value))
- AutoGenC.Append('GLOBAL_REMOVE_IF_UNREFERENCED volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))
+ AutoGenC.Append('volatile %s %s %s = %s;\n' %(Const, Pcd.DatumType, PcdVariableName, PcdValueName))
AutoGenH.Append('extern volatile %s %s %s%s;\n' % (Const, Pcd.DatumType, PcdVariableName, Array))
AutoGenH.Append('#define %s %s%s\n' % (GetModeName, Type, PcdVariableName))
else:
Modified: trunk/BaseTools/Source/Python/Common/BuildToolError.py
===================================================================
--- trunk/BaseTools/Source/Python/Common/BuildToolError.py 2010-01-26 14:22:57 UTC (rev 1818)
+++ trunk/BaseTools/Source/Python/Common/BuildToolError.py 2010-01-28 01:46:33 UTC (rev 1819)
@@ -84,7 +84,7 @@
## Error message of each error code
gErrorMessage = {
- FILE_NOT_FOUND : "File/directory not found",
+ FILE_NOT_FOUND : "File/directory not found in workspace",
FILE_OPEN_FAILURE : "File open failure",
FILE_WRITE_FAILURE : "File write failure",
FILE_PARSE_FAILURE : "File parse failure",
Modified: trunk/BaseTools/Source/Python/Common/DataType.py
===================================================================
--- trunk/BaseTools/Source/Python/Common/DataType.py 2010-01-26 14:22:57 UTC (rev 1818)
+++ trunk/BaseTools/Source/Python/Common/DataType.py 2010-01-28 01:46:33 UTC (rev 1819)
@@ -73,6 +73,8 @@
EDK_COMPONENT_TYPE_RT_DRIVER = 'RT_DRIVER'
EDK_COMPONENT_TYPE_SAL_RT_DRIVER = 'SAL_RT_DRIVER'
EDK_COMPONENT_TYPE_APPLICATION = 'APPLICATION'
+EDK_NAME = 'EDK'
+EDKII_NAME = 'EDKII'
BINARY_FILE_TYPE_FW = 'FW'
BINARY_FILE_TYPE_GUID = 'GUID'
@@ -230,6 +232,19 @@
TAB_PCD_DYNAMIC_TYPE_LIST = [TAB_PCDS_DYNAMIC_DEFAULT_NULL, TAB_PCDS_DYNAMIC_VPD_NULL, TAB_PCDS_DYNAMIC_HII_NULL]
TAB_PCD_DYNAMIC_EX_TYPE_LIST = [TAB_PCDS_DYNAMIC_EX_DEFAULT_NULL, TAB_PCDS_DYNAMIC_EX_VPD_NULL, TAB_PCDS_DYNAMIC_EX_HII_NULL]
+TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_PEI_PAGE_SIZE = 'PcdLoadFixAddressPeiCodePageNumber'
+TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_PEI_PAGE_SIZE_DATA_TYPE = 'UINT32'
+TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_DXE_PAGE_SIZE = 'PcdLoadFixAddressBootTimeCodePageNumber'
+TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_DXE_PAGE_SIZE_DATA_TYPE = 'UINT32'
+TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_RUNTIME_PAGE_SIZE = 'PcdLoadFixAddressRuntimeCodePageNumber'
+TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_RUNTIME_PAGE_SIZE_DATA_TYPE = 'UINT32'
+TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_SMM_PAGE_SIZE = 'PcdLoadFixAddressSmmCodePageNumber'
+TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_SMM_PAGE_SIZE_DATA_TYPE = 'UINT32'
+TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_LIST = [TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_PEI_PAGE_SIZE, \
+ TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_DXE_PAGE_SIZE, \
+ TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_RUNTIME_PAGE_SIZE, \
+ TAB_PCDS_PATCHABLE_LOAD_FIX_ADDRESS_SMM_PAGE_SIZE]
+
TAB_DEPEX = 'Depex'
TAB_DEPEX_COMMON = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_COMMON
TAB_DEPEX_IA32 = TAB_DEPEX + TAB_SPLIT + TAB_ARCH_IA32
@@ -338,6 +353,7 @@
TAB_DSC_DEFINES_BS_BASE_ADDRESS = 'BsBaseAddress'
TAB_DSC_DEFINES_RT_BASE_ADDRESS = 'RtBaseAddress'
TAB_DSC_DEFINES_DEFINE = 'DEFINE'
+TAB_FIX_LOAD_TOP_MEMORY_ADDRESS = 'FIX_LOAD_TOP_MEMORY_ADDRESS'
#
# TargetTxt Definitions
Modified: trunk/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
===================================================================
--- trunk/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py 2010-01-26 14:22:57 UTC (rev 1818)
+++ trunk/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py 2010-01-28 01:46:33 UTC (rev 1819)
@@ -134,6 +134,7 @@
self._LibraryClasses = None
self._Pcds = None
self._BuildOptions = None
+ self._LoadFixAddress = None
## Get architecture
def _GetArch(self):
@@ -185,6 +186,8 @@
elif Name == TAB_DSC_DEFINES_SKUID_IDENTIFIER:
if self._SkuName == None:
self._SkuName = Record[1]
+ elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS:
+ self._LoadFixAddress = Record[1]
# set _Header to non-None in order to avoid database re-querying
self._Header = 'DUMMY'
@@ -309,6 +312,15 @@
self._RtBaseAddress = ''
return self._RtBaseAddress
+ ## Retrieve the top address for the load fix address
+ def _GetLoadFixAddress(self):
+ if self._LoadFixAddress == None:
+ if self._Header == None:
+ self._GetHeaderInfo()
+ if self._LoadFixAddress == None:
+ self._LoadFixAddress = ''
+ return self._LoadFixAddress
+
## Retrieve [SkuIds] section information
def _GetSkuIds(self):
if self._SkuIds == None:
@@ -513,9 +525,18 @@
def _GetBuildOptions(self):
if self._BuildOptions == None:
self._BuildOptions = {}
- RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION]
+ #
+ # Retrieve build option for EDKII style module
+ #
+ RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, 'COMMON', EDKII_NAME]
for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList:
- self._BuildOptions[ToolChainFamily, ToolChain] = Option
+ self._BuildOptions[ToolChainFamily, ToolChain, EDKII_NAME] = Option
+ #
+ # Retrieve build option for EDK style module
+ #
+ RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, 'COMMON', EDK_NAME]
+ for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4 in RecordList:
+ self._BuildOptions[ToolChainFamily, ToolChain, EDK_NAME] = Option
return self._BuildOptions
## Retrieve non-dynamic PCD settings
@@ -730,6 +751,7 @@
MakefileName = property(_GetMakefileName)
BsBaseAddress = property(_GetBsBaseAddress)
RtBaseAddress = property(_GetRtBaseAddress)
+ LoadFixAddress = property(_GetLoadFixAddress)
SkuIds = property(_GetSkuIds)
Modules = property(_GetModules)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|