From 6b3a89a9fdb5003e1b6a511fd4c09429e19b4b2f Mon Sep 17 00:00:00 2001 From: Jiaxin Wu Date: Mon, 8 Apr 2024 09:10:56 +0800 Subject: OvmfPkg/PlatformPei: Relocate SmBases in PEI phase This patch is to consume SmmRelocationInit for SmBase Relocation. Cc: Ard Biesheuvel Cc: Jiewen Yao Cc: Gerd Hoffmann Cc: Ray Ni Signed-off-by: Jiaxin Wu Tested-by: Gerd Hoffmann Acked-by: Gerd Hoffmann Acked-by: Jiewen Yao --- OvmfPkg/PlatformPei/Platform.c | 3 ++ OvmfPkg/PlatformPei/Platform.h | 5 +++ OvmfPkg/PlatformPei/PlatformPei.inf | 5 ++- OvmfPkg/PlatformPei/SmmRelocation.c | 80 +++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 OvmfPkg/PlatformPei/SmmRelocation.c (limited to 'OvmfPkg/PlatformPei') diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c index f5dc41c3a8..df35726ff6 100644 --- a/OvmfPkg/PlatformPei/Platform.c +++ b/OvmfPkg/PlatformPei/Platform.c @@ -367,6 +367,9 @@ InitializePlatform ( IntelTdxInitialize (); InstallFeatureControlCallback (PlatformInfoHob); + if (PlatformInfoHob->SmmSmramRequire) { + RelocateSmBase (); + } return EFI_SUCCESS; } diff --git a/OvmfPkg/PlatformPei/Platform.h b/OvmfPkg/PlatformPei/Platform.h index 1cf44844a7..0a59547cfc 100644 --- a/OvmfPkg/PlatformPei/Platform.h +++ b/OvmfPkg/PlatformPei/Platform.h @@ -78,6 +78,11 @@ InstallClearCacheCallback ( VOID ); +VOID +RelocateSmBase ( + VOID + ); + VOID AmdSevInitialize ( IN EFI_HOB_PLATFORM_INFO *PlatformInfoHob diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf index 20b1b98292..e036018eab 100644 --- a/OvmfPkg/PlatformPei/PlatformPei.inf +++ b/OvmfPkg/PlatformPei/PlatformPei.inf @@ -2,7 +2,7 @@ # Platform PEI driver # # This module provides platform specific function to detect boot mode. -# Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.
+# Copyright (c) 2006 - 2024, Intel Corporation. All rights reserved.
# # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -32,6 +32,7 @@ Platform.c Platform.h IntelTdx.c + SmmRelocation.c [Packages] EmbeddedPkg/EmbeddedPkg.dec @@ -66,6 +67,7 @@ PcdLib CcExitLib PlatformInitLib + SmmRelocationLib [Pcd] gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase @@ -142,6 +144,7 @@ gEfiPeiMasterBootModePpiGuid gEfiPeiMpServicesPpiGuid gEfiPeiReadOnlyVariable2PpiGuid + gEdkiiPeiMpServices2PpiGuid [Depex] TRUE diff --git a/OvmfPkg/PlatformPei/SmmRelocation.c b/OvmfPkg/PlatformPei/SmmRelocation.c new file mode 100644 index 0000000000..1151fc9220 --- /dev/null +++ b/OvmfPkg/PlatformPei/SmmRelocation.c @@ -0,0 +1,80 @@ +/**@file + Install a callback to do smm relocation. + + Copyright (c) 2024, Intel Corporation. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include +#include +#include "Platform.h" + +/** + Notification function called when EDKII_PEI_MP_SERVICES2_PPI becomes available. + + @param[in] PeiServices Indirect reference to the PEI Services Table. + @param[in] NotifyDescriptor Address of the notification descriptor data + structure. + @param[in] Ppi Address of the PPI that was installed. + + @return Status of the notification. The status code returned from this + function is ignored. +**/ +STATIC +EFI_STATUS +EFIAPI +OnMpServices2Available ( + IN EFI_PEI_SERVICES **PeiServices, + IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, + IN VOID *Ppi + ) +{ + EDKII_PEI_MP_SERVICES2_PPI *MpServices2; + EFI_STATUS Status; + + DEBUG ((DEBUG_INFO, "%a: %a\n", gEfiCallerBaseName, __func__)); + + MpServices2 = Ppi; + + // + // Smm Relocation Initialize. + // + Status = SmmRelocationInit (MpServices2); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "OnMpServices2Available: Not able to execute Smm Relocation Init. Status: %r\n", Status)); + } + + return EFI_SUCCESS; +} + +// +// Notification object for registering the callback, for when +// EDKII_PEI_MP_SERVICES2_PPI becomes available. +// +STATIC CONST EFI_PEI_NOTIFY_DESCRIPTOR mMpServices2Notify = { + EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | // Flags + EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST, + &gEdkiiPeiMpServices2PpiGuid, // Guid + OnMpServices2Available // Notify +}; + +VOID +RelocateSmBase ( + VOID + ) +{ + EFI_STATUS Status; + + Status = PeiServicesNotifyPpi (&mMpServices2Notify); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: failed to set up MP Services2 callback: %r\n", + __func__, + Status + )); + } +} -- cgit v1.2.3