diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Python/AutoGen/GenC.py index 67aaef70a1..7aa2016196 100644 --- a/BaseTools/Source/Python/AutoGen/GenC.py +++ b/BaseTools/Source/Python/AutoGen/GenC.py @@ -237,6 +237,100 @@ ProcessModuleEntryPointList ( ${END} """) +## MM_CORE_STANDALONE Entry Point Templates +gMmCoreStandaloneEntryPointPrototype = TemplateString(""" +${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN VOID *HobStart + ); +${END} +""") + +gMmCoreStandaloneEntryPointString = TemplateString(""" +${BEGIN} +const UINT32 _gMmRevision = ${PiSpecVersion}; + +VOID +EFIAPI +ProcessModuleEntryPointList ( + IN VOID *HobStart + ) +{ + ${Function} (HobStart); +} +${END} +""") + +## MM_STANDALONE Entry Point Templates +gMmStandaloneEntryPointPrototype = TemplateString(""" +${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_HANDLE ImageHandle, + IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable + ); +${END} +""") + +gMmStandaloneEntryPointString = [ +TemplateString(""" +GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gMmRevision = ${PiSpecVersion}; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable + ) + +{ + return EFI_SUCCESS; +} +"""), +TemplateString(""" +GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gMmRevision = ${PiSpecVersion}; +${BEGIN} +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable + ) + +{ + return ${Function} (ImageHandle, MmSystemTable); +} +${END} +"""), +TemplateString(""" +GLOBAL_REMOVE_IF_UNREFERENCED const UINT32 _gMmRevision = ${PiSpecVersion}; + +EFI_STATUS +EFIAPI +ProcessModuleEntryPointList ( + IN EFI_HANDLE ImageHandle, + IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable + ) + +{ + EFI_STATUS Status; + EFI_STATUS CombinedStatus; + + CombinedStatus = EFI_LOAD_ERROR; +${BEGIN} + Status = ${Function} (ImageHandle, MmSystemTable); + if (!EFI_ERROR (Status) || EFI_ERROR (CombinedStatus)) { + CombinedStatus = Status; + } +${END} + return CombinedStatus; +} +""") +] + ## DXE SMM Entry Point Templates gDxeSmmEntryPointPrototype = TemplateString(""" ${BEGIN} @@ -580,6 +674,15 @@ ${Function} ( IN EFI_SYSTEM_TABLE *SystemTable );${END} """), + +'MM' : TemplateString("""${BEGIN} +EFI_STATUS +EFIAPI +${Function} ( + IN EFI_HANDLE ImageHandle, + IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable + );${END} +"""), } gLibraryStructorCall = { @@ -597,6 +700,11 @@ gLibraryStructorCall = { Status = ${Function} (ImageHandle, SystemTable); ASSERT_EFI_ERROR (Status);${END} """), + +'MM' : TemplateString("""${BEGIN} + Status = ${Function} (ImageHandle, MmSystemTable); + ASSERT_EFI_ERROR (Status);${END} +"""), } ## Library Constructor and Destructor Templates @@ -644,6 +752,21 @@ ${BEGIN} EFI_STATUS Status; ${FunctionCall}${END} } """), + +'MM' : TemplateString(""" +${BEGIN}${FunctionPrototype}${END} + +VOID +EFIAPI +ProcessLibrary${Type}List ( + IN EFI_HANDLE ImageHandle, + IN EFI_SMM_SYSTEM_TABLE2 *MmSystemTable + ) +{ +${BEGIN} EFI_STATUS Status; +${FunctionCall}${END} +} +"""), } gBasicHeaderFile = "Base.h" @@ -661,6 +784,8 @@ gModuleTypeHeaderFile = { "UEFI_DRIVER" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiDriverEntryPoint.h"], "UEFI_APPLICATION" : ["Uefi.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiBootServicesTableLib.h", "Library/UefiApplicationEntryPoint.h"], "SMM_CORE" : ["PiDxe.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/UefiDriverEntryPoint.h"], + "MM_STANDALONE" : ["PiSmm.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/SmmDriverStandaloneEntryPoint.h"], + "MM_CORE_STANDALONE" : ["PiSmm.h", "Library/BaseLib.h", "Library/DebugLib.h", "Library/SmmCoreStandaloneEntryPoint.h"], "USER_DEFINED" : [gBasicHeaderFile] } @@ -1266,6 +1391,9 @@ def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH): 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']: ConstructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict)) ConstructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict)) + elif Lib.ModuleType in ['MM_STANDALONE','MM_CORE_STANDALONE']: + ConstructorPrototypeString.Append(gLibraryStructorPrototype['MM'].Replace(Dict)) + ConstructorCallingString.Append(gLibraryStructorCall['MM'].Replace(Dict)) if str(ConstructorPrototypeString) == '': ConstructorPrototypeList = [] @@ -1291,6 +1419,8 @@ def CreateLibraryConstructorCode(Info, AutoGenC, AutoGenH): elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']: AutoGenC.Append(gLibraryString['DXE'].Replace(Dict)) + elif Info.ModuleType in ['MM_STANDALONE','MM_CORE_STANDALONE']: + AutoGenC.Append(gLibraryString['MM'].Replace(Dict)) ## Create code for library destructor # @@ -1323,6 +1453,9 @@ def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH): 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION', 'SMM_CORE']: DestructorPrototypeString.Append(gLibraryStructorPrototype['DXE'].Replace(Dict)) DestructorCallingString.Append(gLibraryStructorCall['DXE'].Replace(Dict)) + elif Lib.ModuleType in ['MM_STANDALONE','MM_CORE_STANDALONE']: + DestructorPrototypeString.Append(gLibraryStructorPrototype['MM'].Replace(Dict)) + DestructorCallingString.Append(gLibraryStructorCall['MM'].Replace(Dict)) if str(DestructorPrototypeString) == '': DestructorPrototypeList = [] @@ -1348,6 +1481,8 @@ def CreateLibraryDestructorCode(Info, AutoGenC, AutoGenH): elif Info.ModuleType in ['DXE_CORE','DXE_DRIVER','DXE_SMM_DRIVER','DXE_RUNTIME_DRIVER', 'DXE_SAL_DRIVER','UEFI_DRIVER','UEFI_APPLICATION','SMM_CORE']: AutoGenC.Append(gLibraryString['DXE'].Replace(Dict)) + elif Info.ModuleType in ['MM_STANDALONE','MM_CORE_STANDALONE']: + AutoGenC.Append(gLibraryString['MM'].Replace(Dict)) ## Create code for ModuleEntryPoint @@ -1377,7 +1512,7 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): 'UefiSpecVersion': UefiSpecVersion + 'U' } - if Info.ModuleType in ['PEI_CORE', 'DXE_CORE', 'SMM_CORE']: + if Info.ModuleType in ['PEI_CORE', 'DXE_CORE', 'SMM_CORE', 'MM_CORE_STANDALONE']: if Info.SourceFileList <> None and Info.SourceFileList <> []: if NumEntryPoints != 1: EdkLogger.error( @@ -1396,6 +1531,9 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): elif Info.ModuleType == 'SMM_CORE': AutoGenC.Append(gSmmCoreEntryPointString.Replace(Dict)) AutoGenH.Append(gSmmCoreEntryPointPrototype.Replace(Dict)) + elif Info.ModuleType == 'MM_CORE_STANDALONE': + AutoGenC.Append(gMmCoreStandaloneEntryPointString.Replace(Dict)) + AutoGenH.Append(gMmCoreStandaloneEntryPointPrototype.Replace(Dict)) elif Info.ModuleType == 'PEIM': if NumEntryPoints < 2: AutoGenC.Append(gPeimEntryPointString[NumEntryPoints].Replace(Dict)) @@ -1413,7 +1551,13 @@ def CreateModuleEntryPointCode(Info, AutoGenC, AutoGenH): AutoGenC.Append(gDxeSmmEntryPointString[0].Replace(Dict)) else: AutoGenC.Append(gDxeSmmEntryPointString[1].Replace(Dict)) - AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict)) + AutoGenH.Append(gDxeSmmEntryPointPrototype.Replace(Dict)) + elif Info.ModuleType == 'MM_STANDALONE': + if NumEntryPoints < 2: + AutoGenC.Append(gMmStandaloneEntryPointString[NumEntryPoints].Replace(Dict)) + else: + AutoGenC.Append(gMmStandaloneEntryPointString[2].Replace(Dict)) + AutoGenH.Append(gMmStandaloneEntryPointPrototype.Replace(Dict)) elif Info.ModuleType == 'UEFI_APPLICATION': if NumEntryPoints < 2: AutoGenC.Append(gUefiApplicationEntryPointString[NumEntryPoints].Replace(Dict)) diff --git a/BaseTools/Source/Python/AutoGen/GenDepex.py b/BaseTools/Source/Python/AutoGen/GenDepex.py index 5923a75ab7..7aa22bd944 100644 --- a/BaseTools/Source/Python/AutoGen/GenDepex.py +++ b/BaseTools/Source/Python/AutoGen/GenDepex.py @@ -42,6 +42,8 @@ gType2Phase = { "UEFI_DRIVER" : "DXE", "UEFI_APPLICATION" : "DXE", "SMM_CORE" : "DXE", + "MM_STANDALONE" : "MM", + "MM_CORE_STANDALONE" : "MM", } ## Convert dependency expression string into EFI internal representation @@ -98,6 +100,19 @@ class DependencyExpression: "FALSE" : 0x07, "END" : 0x08, "SOR" : 0x09 + }, + + "MM" : { + "BEFORE": 0x00, + "AFTER" : 0x01, + "PUSH" : 0x02, + "AND" : 0x03, + "OR" : 0x04, + "NOT" : 0x05, + "TRUE" : 0x06, + "FALSE" : 0x07, + "END" : 0x08, + "SOR" : 0x09 } } @@ -289,7 +304,7 @@ class DependencyExpression: return # don't generate depex if all operands are architecture protocols - if self.ModuleType in ['UEFI_DRIVER', 'DXE_DRIVER', 'DXE_RUNTIME_DRIVER', 'DXE_SAL_DRIVER', 'DXE_SMM_DRIVER'] and \ + if self.ModuleType in ['UEFI_DRIVER', 'DXE_DRIVER', 'DXE_RUNTIME_DRIVER', 'DXE_SAL_DRIVER', 'DXE_SMM_DRIVER', 'MM_STANDALONE'] and \ Op == 'AND' and \ self.ArchProtocols == set([GuidStructureStringToGuidString(Guid) for Guid in AllOperand]): self.PostfixNotation = []