From b80c17b62d989ec00e528c6307c726ce6800bcc4 Mon Sep 17 00:00:00 2001 From: Guo Dong Date: Thu, 23 Sep 2021 21:54:23 -0700 Subject: [PATCH] UefiPayloadPkg: Add SMM support and SMM variable support Add SMM variable support for universal UEFI payload. By default they are disabled. Signed-off-by: Guo Dong Cc: Ray Ni Cc: Maurice Ma Cc: Benjamin You Reviewed-by: Ray Ni Reviewed-by: Benjamin You --- UefiPayloadPkg/UefiPayloadPkg.dsc | 101 +++++++++++++++++++++++++++--- UefiPayloadPkg/UefiPayloadPkg.fdf | 38 ++++++++++- 2 files changed, 128 insertions(+), 11 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 5aaae94eec..0df5f827c9 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -32,11 +32,12 @@ DEFINE SIO_BUS_ENABLE = FALSE DEFINE UNIVERSAL_PAYLOAD = FALSE DEFINE SECURITY_STUB_ENABLE = TRUE + DEFINE SMM_SUPPORT = FALSE # # SBL: UEFI payload for Slim Bootloader # COREBOOT: UEFI payload for coreboot # - DEFINE BOOTLOADER = SBL + DEFINE BOOTLOADER = SBL # # CPU options @@ -90,7 +91,13 @@ # DEFINE SHELL_TYPE = BUILD_SHELL - DEFINE EMU_VARIABLE_ENABLE = TRUE + # + # EMU: UEFI payload with EMU variable + # SPI: UEFI payload with SPI NV variable support + # NONE: UEFI payload with no variable modules + # + DEFINE VARIABLE_SUPPORT = EMU + DEFINE DISABLE_RESET_SYSTEM = FALSE DEFINE NETWORK_DRIVER_ENABLE = FALSE @@ -241,10 +248,18 @@ LockBoxLib|MdeModulePkg/Library/LockBoxNullLib/LockBoxNullLib.inf FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf AuthVariableLib|MdeModulePkg/Library/AuthVariableLibNull/AuthVariableLibNull.inf +!if $(VARIABLE_SUPPORT) == "EMU" TpmMeasurementLib|MdeModulePkg/Library/TpmMeasurementLibNull/TpmMeasurementLibNull.inf +!elseif $(VARIABLE_SUPPORT) == "SPI" + PlatformSecureLib|SecurityPkg/Library/PlatformSecureLibNull/PlatformSecureLibNull.inf + TpmMeasurementLib|SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.inf + S3BootScriptLib|MdePkg/Library/BaseS3BootScriptLibNull/BaseS3BootScriptLibNull.inf + MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockMemoryLibNull.inf +!endif VarCheckLib|MdeModulePkg/Library/VarCheckLib/VarCheckLib.inf VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLib.inf VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/VariablePolicyHelperLib.inf + VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf [LibraryClasses.common.SEC] HobLib|UefiPayloadPkg/Library/PayloadEntryHobLib/HobLib.inf @@ -262,7 +277,6 @@ DebugAgentLib|SourceLevelDebugPkg/Library/DebugAgent/DxeDebugAgentLib.inf !endif CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf - VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf [LibraryClasses.common.DXE_DRIVER] PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf @@ -274,7 +288,6 @@ !endif CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/DxeCpuExceptionHandlerLib.inf MpInitLib|UefiCpuPkg/Library/MpInitLib/DxeMpInitLib.inf - VmgExitLib|UefiCpuPkg/Library/VmgExitLibNull/VmgExitLibNull.inf [LibraryClasses.common.DXE_RUNTIME_DRIVER] PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf @@ -287,6 +300,37 @@ MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf +[LibraryClasses.common.SMM_CORE] +!if $(SMM_SUPPORT) == TRUE + PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf + SmmServicesTableLib|MdeModulePkg/Library/PiSmmCoreSmmServicesTableLib/PiSmmCoreSmmServicesTableLib.inf + + MemoryAllocationLib|MdeModulePkg/Library/PiSmmCoreMemoryAllocationLib/PiSmmCoreMemoryAllocationLib.inf + SmmCorePlatformHookLib|MdeModulePkg/Library/SmmCorePlatformHookLibNull/SmmCorePlatformHookLibNull.inf + SmmMemLib|MdePkg/Library/SmmMemLib/SmmMemLib.inf + ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf +!endif + +[LibraryClasses.common.DXE_SMM_DRIVER] +!if $(SMM_SUPPORT) == TRUE + PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf + + MemoryAllocationLib|MdePkg/Library/SmmMemoryAllocationLib/SmmMemoryAllocationLib.inf + SmmServicesTableLib|MdePkg/Library/SmmServicesTableLib/SmmServicesTableLib.inf + SmmMemLib|MdePkg/Library/SmmMemLib/SmmMemLib.inf + MmServicesTableLib|MdePkg/Library/MmServicesTableLib/MmServicesTableLib.inf + DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf + SmmCpuPlatformHookLib|UefiCpuPkg/Library/SmmCpuPlatformHookLibNull/SmmCpuPlatformHookLibNull.inf + SmmCpuFeaturesLib|UefiCpuPkg/Library/SmmCpuFeaturesLib/SmmCpuFeaturesLib.inf + CpuExceptionHandlerLib|UefiCpuPkg/Library/CpuExceptionHandlerLib/SmmCpuExceptionHandlerLib.inf + ReportStatusCodeLib|MdePkg/Library/BaseReportStatusCodeLibNull/BaseReportStatusCodeLibNull.inf +!endif +!if $(VARIABLE_SUPPORT) == "SPI" + SpiFlashLib|UefiPayloadPkg/Library/SpiFlashLib/SpiFlashLib.inf + FlashDeviceLib|UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.inf + BaseCryptLib|CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf +!endif + ################################################################################ # # Pcd Section - list of all EDK II PCD Entries defined by this Platform. @@ -300,15 +344,17 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol|TRUE gEfiMdeModulePkgTokenSpaceGuid.PcdHiiOsRuntimeSupport|FALSE gEfiMdeModulePkgTokenSpaceGuid.PcdPciDegradeResourceForOptionRom|FALSE + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmEnableBspElection|FALSE [PcdsFixedAtBuild] gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x10000 gEfiMdeModulePkgTokenSpaceGuid.PcdMaxHardwareErrorVariableSize|0x8000 gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize|0x10000 - # - # Make VariableRuntimeDxe work at emulated non-volatile variable mode. - # - gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable|TRUE +!if $(VARIABLE_SUPPORT) == "EMU" + gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable |TRUE +!else + gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvModeEnable |FALSE +!endif gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0 gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE @@ -319,6 +365,7 @@ !if $(SOURCE_DEBUG_ENABLE) gEfiSourceLevelDebugPkgTokenSpaceGuid.PcdDebugLoadImageMethod|0x2 !endif + gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmStackSize|0x4000 [PcdsPatchableInModule.X64] gPcAtChipsetPkgTokenSpaceGuid.PcdRtcIndexRegister|$(RTC_INDEX_REGISTER) @@ -390,6 +437,14 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|0 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0 gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|3 +!if $(VARIABLE_SUPPORT) == "SPI" + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize |0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize|0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize |0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase |0 +!endif + # Disable SMM S3 script + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiS3Enable|FALSE ## This PCD defines the video horizontal resolution. # This PCD could be set to 0 then video resolution could be at highest resolution. @@ -579,6 +634,36 @@ !endif UefiPayloadPkg/GraphicsOutputDxe/GraphicsOutputDxe.inf + # + # SMM Support + # +!if $(SMM_SUPPORT) == TRUE + UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.inf + UefiPayloadPkg/SmmControlRuntimeDxe/SmmControlRuntimeDxe.inf + UefiPayloadPkg/BlSupportSmm/BlSupportSmm.inf + MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf + MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf + UefiPayloadPkg/PchSmiDispatchSmm/PchSmiDispatchSmm.inf + UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf + UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf +!endif + +!if $(VARIABLE_SUPPORT) == "EMU" + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf +!elseif $(VARIABLE_SUPPORT) == "SPI" + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf { + + NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf + NULL|MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiLib.inf + NULL|MdeModulePkg/Library/VarCheckPcdLib/VarCheckPcdLib.inf + NULL|MdeModulePkg/Library/VarCheckPolicyLib/VarCheckPolicyLib.inf + } + + UefiPayloadPkg/FvbRuntimeDxe/FvbSmm.inf + MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf + MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf +!endif + #------------------------------ # Build the shell #------------------------------ diff --git a/UefiPayloadPkg/UefiPayloadPkg.fdf b/UefiPayloadPkg/UefiPayloadPkg.fdf index 72e4c70467..2f5cb17f62 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.fdf +++ b/UefiPayloadPkg/UefiPayloadPkg.fdf @@ -114,11 +114,29 @@ INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe !if $(DISABLE_RESET_SYSTEM) == FALSE INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf !endif - INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf -!if $(EMU_VARIABLE_ENABLE) == TRUE -INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf +# +# SMM Support +# +!if $(SMM_SUPPORT) == TRUE + INF UefiPayloadPkg/SmmAccessDxe/SmmAccessDxe.inf + INF UefiPayloadPkg/SmmControlRuntimeDxe/SmmControlRuntimeDxe.inf + INF UefiPayloadPkg/BlSupportSmm/BlSupportSmm.inf + INF MdeModulePkg/Core/PiSmmCore/PiSmmIpl.inf + INF MdeModulePkg/Core/PiSmmCore/PiSmmCore.inf + INF UefiCpuPkg/CpuIo2Smm/CpuIo2Smm.inf + INF UefiCpuPkg/PiSmmCpuDxeSmm/PiSmmCpuDxeSmm.inf + INF UefiPayloadPkg/PchSmiDispatchSmm/PchSmiDispatchSmm.inf +!endif + +!if $(VARIABLE_SUPPORT) == "EMU" + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf +!elseif $(VARIABLE_SUPPORT) == "SPI" + INF UefiPayloadPkg/FvbRuntimeDxe/FvbSmm.inf + INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf + INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmmRuntimeDxe.inf !endif INF UefiCpuPkg/CpuIo2Dxe/CpuIo2Dxe.inf @@ -271,6 +289,20 @@ INF ShellPkg/Application/Shell/Shell.inf UI STRING="$(MODULE_NAME)" Optional VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) } +[Rule.Common.DXE_SMM_DRIVER] + FILE SMM = $(NAMED_GUID) { + SMM_DEPEX SMM_DEPEX Optional $(INF_OUTPUT)/$(MODULE_NAME).depex + PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi + UI STRING="$(MODULE_NAME)" Optional + VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) + } + +[Rule.Common.SMM_CORE] + FILE SMM_CORE = $(NAMED_GUID) { + PE32 PE32 $(INF_OUTPUT)/$(MODULE_NAME).efi + UI STRING="$(MODULE_NAME)" Optional + VERSION STRING="$(INF_VERSION)" Optional BUILD_NUM=$(BUILD_NUMBER) + } [Rule.Common.UEFI_DRIVER] FILE DRIVER = $(NAMED_GUID) {