OvmfPkg/PlatformPei: Relocate SmBases in PEI phase

This patch is to consume SmmRelocationInit for SmBase
Relocation.

Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Ray Ni <ray.ni@intel.com>
Signed-off-by: Jiaxin Wu <jiaxin.wu@intel.com>
Tested-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Jiewen Yao <Jiewen.yao@intel.com>
diff --git a/OvmfPkg/PlatformPei/Platform.c b/OvmfPkg/PlatformPei/Platform.c
index f5dc41c..df35726 100644
--- a/OvmfPkg/PlatformPei/Platform.c
+++ b/OvmfPkg/PlatformPei/Platform.c
@@ -367,6 +367,9 @@
 

   IntelTdxInitialize ();

   InstallFeatureControlCallback (PlatformInfoHob);

+  if (PlatformInfoHob->SmmSmramRequire) {

+    RelocateSmBase ();

+  }

 

   return EFI_SUCCESS;

 }

diff --git a/OvmfPkg/PlatformPei/Platform.h b/OvmfPkg/PlatformPei/Platform.h
index 1cf4484..0a59547 100644
--- a/OvmfPkg/PlatformPei/Platform.h
+++ b/OvmfPkg/PlatformPei/Platform.h
@@ -79,6 +79,11 @@
   );

 

 VOID

+RelocateSmBase (

+  VOID

+  );

+

+VOID

 AmdSevInitialize (

   IN EFI_HOB_PLATFORM_INFO  *PlatformInfoHob

   );

diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf
index 20b1b98..e036018 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.<BR>

+#  Copyright (c) 2006 - 2024, Intel Corporation. All rights reserved.<BR>

 #

 #  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 0000000..1151fc9
--- /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 <Library/DebugLib.h>

+#include <Library/PeiServicesLib.h>

+#include <Library/SmmRelocationLib.h>

+#include <Ppi/MpServices2.h>

+#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

+      ));

+  }

+}