def SetModuleType(self, ModuleType, Comments): # # Value has been set before. # if self.ModuleType != None: ErrorInInf(ST.ERR_INF_PARSER_DEFINE_ITEM_MORE_THAN_ONE_FOUND\ %(DT.TAB_INF_DEFINES_MODULE_TYPE), LineInfo=self.CurrentLine) return False # # Valid Module Type or not # if (IsValidInfMoudleType(ModuleType)): self.ModuleType = InfDefMember() self.ModuleType.SetValue(ModuleType) self.ModuleType.CurrentLine = CurrentLine() self.ModuleType.CurrentLine.SetLineNo(self.CurrentLine[1]) self.ModuleType.CurrentLine.SetLineString(self.CurrentLine[2]) self.ModuleType.CurrentLine.SetFileName(self.CurrentLine[0]) self.ModuleType.Comments = Comments return True else: ErrorInInf(ST.ERR_INF_PARSER_DEFINE_MODULETYPE_INVALID%\ (ModuleType), LineInfo=self.CurrentLine) return False
def ValidateMS2(Module, TopXmlTreeLevel): # # Check Header # XmlTreeLevel = TopXmlTreeLevel + ['Header'] CheckDict = Sdict() CheckDict['Name'] = Module.GetName() CheckDict['BaseName'] = Module.GetBaseName() CheckDict['GUID'] = Module.GetGuid() CheckDict['Version'] = Module.GetVersion() IsRequiredItemListNull(CheckDict, XmlTreeLevel) # # Check ModuleProperties # XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] CheckDict = { 'ModuleType': Module.GetModuleType(), 'Path': Module.GetModulePath() } IsRequiredItemListNull(CheckDict, XmlTreeLevel) if not IsValidInstallPath(Module.GetModulePath()): Logger.Error("UPT", FORMAT_INVALID, ERR_FILE_NAME_INVALIDE % Module.GetModulePath()) # # Check ModuleProperties->BootMode # XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] + ['BootMode'] for Item in Module.GetBootModeList(): CheckDict = { 'Usage': Item.GetUsage(), 'SupportedBootModes': Item.GetSupportedBootModes() } IsRequiredItemListNull(CheckDict, XmlTreeLevel) # # Check ModuleProperties->Event # XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] + ['Event'] for Item in Module.GetEventList(): CheckDict = { 'Usage': Item.GetUsage(), 'EventType': Item.GetEventType() } IsRequiredItemListNull(CheckDict, XmlTreeLevel) # # Check ModuleProperties->Hob # XmlTreeLevel = TopXmlTreeLevel + ['ModuleProperties'] + ['HOB'] for Item in Module.GetHobList(): CheckDict = {'Usage': Item.GetUsage(), 'HobType': Item.GetHobType()} IsRequiredItemListNull(CheckDict, XmlTreeLevel) # # The UDP Specification supports the module type of UEFI_RUNTIME_DRIVER, which is not present in the EDK II INF # File Specification v. 1.23, so UPT must perform the following translation that include the generation of a # [Depex] section. # if Module.ModuleType == "UEFI_RUNTIME_DRIVER": Module.ModuleType = "DXE_RUNTIME_DRIVER" DxeObj = DepexObject() DxeObj.SetDepex("gEfiBdsArchProtocolGuid AND \ngEfiCpuArchProtocolGuid AND\n" + \ "gEfiMetronomeArchProtocolGuid AND \ngEfiMonotonicCounterArchProtocolGuid AND\n" + \ "gEfiRealTimeClockArchProtocolGuid AND \ngEfiResetArchProtocolGuid AND\n" + \ "gEfiRuntimeArchProtocolGuid AND \ngEfiSecurityArchProtocolGuid AND\n" + \ "gEfiTimerArchProtocolGuid AND \ngEfiVariableWriteArchProtocolGuid AND\n" + \ "gEfiVariableArchProtocolGuid AND \ngEfiWatchdogTimerArchProtocolGuid") DxeObj.SetModuleType(['DXE_RUNTIME_DRIVER']) Module.PeiDepex = [] Module.DxeDepex = [] Module.SmmDepex = [] Module.DxeDepex.append(DxeObj) # # Check LibraryClassDefinitions -> LibraryClass # XmlTreeLevel = TopXmlTreeLevel + ['LibraryClassDefinitions'] for Item in Module.GetLibraryClassList(): if Item is None: CheckDict = {'LibraryClass': ''} IsRequiredItemListNull(CheckDict, XmlTreeLevel) XmlTreeLevel = TopXmlTreeLevel + [ 'LibraryClassDefinitions', 'LibraryClass' ] IsLibraryModule = False LibrarySupModList = [] for Item in Module.GetLibraryClassList(): CheckDict = { 'Keyword': Item.GetLibraryClass(), 'Usage': Item.GetUsage() } IsRequiredItemListNull(CheckDict, XmlTreeLevel) # # If the LibraryClass:SupModList is not "UNDEFINED" the LIBRARY_CLASS entry must have the list # appended using the format: # LIBRARY_CLASS = <ClassName> ["|" <Edk2ModuleTypeList>] # # Edk2ModuleTypeList ::= <ModuleType> [" " <ModuleType>]{0,} # <ModuleTypes> ::= {"BASE"} {"SEC"} {"PEI_CORE"} {"PEIM"} # {"DXE_CORE"} {"DXE_DRIVER"} {"SMM_CORE"} # {"DXE_SMM_DRIVER"} {"DXE_RUNTIME_DRIVER"} # {"DXE_SAL_DRIVER"} {"UEFI_DRIVER"} # {"UEFI_APPLICATION"} {"USER_DEFINED"} # if len(Item.SupModuleList) > 0: for SupModule in Item.SupModuleList: if not IsValidInfMoudleType(SupModule): Logger.Error('\nUPT', PARSER_ERROR, ERR_XML_INVALID_LIB_SUPMODLIST % (Item.LibraryClass, str(SupModule)), RaiseError=True) if Item.Usage == 'PRODUCES' or Item.Usage == 'SOMETIMES_PRODUCES': IsLibraryModule = True LibrarySupModList = Item.SupModuleList # # For Library modules (indicated by a LIBRARY_CLASS statement in the [Defines] section) # If the SupModList attribute of the CONSTRUCTOR or DESTRUCTOR element does not match the Supported Module # Types listed after "LIBRARY_CLASS = <Keyword> |", the tool should gracefully exit with an error message # stating that there is a conflict in the module types the CONSTRUCTOR/DESTRUCTOR is to be used with and # the Module types this Library supports. # if IsLibraryModule: for Item in Module.GetExternList(): if Item.Constructor or Item.Destructor: if hasattr(Item, 'SupModList') and len(Item.SupModList) > 0 and \ not IsEqualList(Item.SupModList, LibrarySupModList): Logger.Error( '\nUPT', PARSER_ERROR, ERR_XML_INVALID_EXTERN_SUPMODLIST % (str(Item.SupModList), str(LibrarySupModList)), RaiseError=True) # # If the module is not a library module, the MODULE_TYPE listed in the ModuleSurfaceArea.Header must match the # SupModList attribute. If these conditions cannot be met, the tool must exit gracefully, informing the user # that the EDK II Build system does not currently support the features required by this Module. # if not IsLibraryModule: for Item in Module.GetExternList(): if hasattr(Item, 'SupModList') and len(Item.SupModList) > 0 and \ not IsEqualList(Item.SupModList, [Module.ModuleType]): Logger.Error('\nUPT', PARSER_ERROR, ERR_XML_INVALID_EXTERN_SUPMODLIST_NOT_LIB % (str(Module.ModuleType), str(Item.SupModList)), RaiseError=True) # # Check SourceFiles # XmlTreeLevel = TopXmlTreeLevel + ['SourceFiles'] for Item in Module.GetSourceFileList(): if Item is None: CheckDict = {'Filename': ''} IsRequiredItemListNull(CheckDict, XmlTreeLevel) XmlTreeLevel = TopXmlTreeLevel + ['SourceFiles'] for Item in Module.GetSourceFileList(): CheckDict = {'Filename': Item.GetSourceFile()} IsRequiredItemListNull(CheckDict, XmlTreeLevel) for ItemCount in range(len(Module.GetBinaryFileList())): Item = Module.GetBinaryFileList()[ItemCount] if Item and len(Item.FileNamList ) > 0 and Item.FileNamList[0].FileType == 'FREEFORM': Item.FileNamList[0].FileType = 'SUBTYPE_GUID' Module.GetBinaryFileList()[ItemCount] = Item