public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Abdul Lateef Attar via groups.io" <AbdulLateef.Attar=amd.com@groups.io>
To: <devel@edk2.groups.io>
Cc: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>,
	Abner Chang <abner.chang@amd.com>,
	Paul Grimes <paul.grimes@amd.com>
Subject: [edk2-devel] [edk2-platforms 2/3] AmdPlatformPkg: Implements SmmCorePlatformHookLib library
Date: Tue, 28 May 2024 19:37:51 +0530	[thread overview]
Message-ID: <cf3111309816aab01e9f284ee27eb71a94f0c773.1716905162.git.AbdulLateef.Attar@amd.com> (raw)
In-Reply-To: <cover.1716905162.git.AbdulLateef.Attar@amd.com>

Implements SmmCorePlatformHookLib library for AMD platform.

Cc: Abner Chang <abner.chang@amd.com>
Cc: Paul Grimes <paul.grimes@amd.com>
Signed-off-by: Abdul Lateef Attar <AbdulLateef.Attar@amd.com>
---
 .../AMD/AmdPlatformPkg/AmdPlatformPkg.dec     |   5 +
 .../AMD/AmdPlatformPkg/AmdPlatformPkg.dsc     |   6 +
 .../Library/AmdSmmCorePlatformHookLib.h       |  68 +++++++
 .../SmmCorePlatformHookLib.c                  | 169 ++++++++++++++++++
 .../SmmCorePlatformHookLib.inf                |  39 ++++
 .../SmmCorePlatformHookLib.uni                |  11 ++
 6 files changed, 298 insertions(+)
 create mode 100644 Platform/AMD/AmdPlatformPkg/Include/Library/AmdSmmCorePlatformHookLib.h
 create mode 100644 Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.c
 create mode 100644 Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.inf
 create mode 100644 Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.uni

diff --git a/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dec b/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dec
index 106820dc85..3020e628a3 100644
--- a/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dec
+++ b/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dec
@@ -21,6 +21,11 @@
   ##  @libraryclass  Defines a get/set interface for platform specific data.
   PlatformSocLib|Include/Library/AmdPlatformSocLib.h
 
+  ##  @libraryclass AMD SMM core platform hook library
+  #   Provide the functions to register hook before and
+  #   after SMM dispatcher.
+  SmmCorePlatformHookLib|Include/Library/AmdSmmCorePlatformHookLib.h
+
 [Guids]
   gAmdPlatformPkgTokenSpaceGuid   = { 0x663DE733, 0x70E0, 0x4D37, { 0xBB, 0x30, 0x7D, 0x9E, 0xAF, 0x9B, 0xDA, 0xE9 }}
 
diff --git a/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dsc b/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dsc
index d11d3594e3..482e6f2f30 100644
--- a/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dsc
+++ b/Platform/AMD/AmdPlatformPkg/AmdPlatformPkg.dsc
@@ -62,6 +62,9 @@
   MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
   PlatformSocLib|AmdPlatformPkg/Library/DxePlatformSocLib/DxePlatformSocLibNull.inf
 
+[LibraryClasses.common.SMM_CORE]
+  SmmCorePlatformHookLib|AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.inf
+
 [Components]
   AmdPlatformPkg/Library/BaseAlwaysFalseDepexLib/BaseAlwaysFalseDepexLib.inf
   AmdPlatformPkg/Library/DxePlatformSocLib/DxePlatformSocLibNull.inf
@@ -73,3 +76,6 @@
   AmdPlatformPkg/Universal/LogoDxe/LogoDxe.inf                                               # Server platfrom Bitmap logo driver
   AmdPlatformPkg/Universal/LogoDxe/S3LogoDxe.inf
   AmdPlatformPkg/Universal/SmbiosCommonDxe/SmbiosCommonDxe.inf
+
+[Components.common.SMM_CORE]
+  AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.inf
diff --git a/Platform/AMD/AmdPlatformPkg/Include/Library/AmdSmmCorePlatformHookLib.h b/Platform/AMD/AmdPlatformPkg/Include/Library/AmdSmmCorePlatformHookLib.h
new file mode 100644
index 0000000000..6ae76920b4
--- /dev/null
+++ b/Platform/AMD/AmdPlatformPkg/Include/Library/AmdSmmCorePlatformHookLib.h
@@ -0,0 +1,68 @@
+/** @file
+  AMD Smm Core Platform Hook Library
+
+  Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef AMD_SMM_CORE_PLATFORM_HOOK_LIB_
+#define AMD_SMM_CORE_PLATFORM_HOOK_LIB_
+
+/**
+  This is the prototype of SMM Dispatcher hook before.
+
+  @retval EFI_STATUS
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *AMD_SMM_DISPATCH_HOOK_BEFORE)(
+  VOID
+  );
+
+/**
+  This is the prototype of SMM Dispatcher after before.
+
+  @retval EFI_STATUS
+
+**/
+typedef
+EFI_STATUS
+(EFIAPI *AMD_SMM_DISPATCH_HOOK_AFTER)(
+  VOID
+  );
+
+typedef  UINT32 AMD_SMM_DISPATCH_HOOK_PRIORITY;
+
+///
+/// This is the structure of the SMM Dispatcher hook record
+///
+typedef struct {
+  LIST_ENTRY                        NextList;                 ///< Point to next AMD_SMM_DISPATCH_HOOK.
+  AMD_SMM_DISPATCH_HOOK_BEFORE      AmdSmmDispatchHookBefore; ///< The hook before function.
+  AMD_SMM_DISPATCH_HOOK_AFTER       AmdSmmDispatchHookAfter;  ///< The hook after function.
+  AMD_SMM_DISPATCH_HOOK_PRIORITY    Priority;                 ///< The priority of this hook instance.
+                                                              ///< Priority could be implemented for
+                                                              ///< future usage.
+} AMD_SMM_DISPATCH_HOOK;
+
+/**
+  Register a SMM dispatcher hook.
+
+  @param[in] SmmDispatchHookBefore  Function hook to SMM Dispatch before.
+  @param[in] SmmDispatchHookAfter   Function hook to SMM Dispatch after.
+  @param[in] Priority               The priority to execute the hook.
+
+  @retval EFI_SUCCESS       The hook is registered successfully.
+
+**/
+EFI_STATUS
+RegisterSmmDispatcherHook (
+  IN  AMD_SMM_DISPATCH_HOOK_BEFORE    SmmDispatchHookBefore OPTIONAL,
+  IN  AMD_SMM_DISPATCH_HOOK_AFTER     SmmDispatchHookAfter OPTIONAL,
+  IN  AMD_SMM_DISPATCH_HOOK_PRIORITY  Priority
+  );
+
+#endif // AMD_SMM_CORE_PLATFORM_HOOK_LIB_
diff --git a/Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.c b/Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.c
new file mode 100644
index 0000000000..ad6a40749f
--- /dev/null
+++ b/Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.c
@@ -0,0 +1,169 @@
+/** @file
+  AMD SMM core hook library
+
+  Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <PiSmm.h>
+#include <Library/SmmServicesTableLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/SmmCorePlatformHookLib.h>
+#include <Library/AmdSmmCorePlatformHookLib.h>
+
+LIST_ENTRY  *RegisteredHookPtr = NULL;
+LIST_ENTRY  RegisteredHook;
+
+/**
+  Register a SMM dispatcher hook.
+
+  @param[in] SmmDispatchHookBefore  Function hook to SMM Dispatch before.
+  @param[in] SmmDispatchHookAfter   Function hook to SMM Dispatch after.
+  @param[in] Priority               The priority to execute the hook.
+
+  @retval EFI_SUCCESS       The hook is registered successfully.
+
+**/
+EFI_STATUS
+RegisterSmmDispatcherHook (
+  IN  AMD_SMM_DISPATCH_HOOK_BEFORE    SmmDispatchHookBefore OPTIONAL,
+  IN  AMD_SMM_DISPATCH_HOOK_AFTER     SmmDispatchHookAfter OPTIONAL,
+  IN  AMD_SMM_DISPATCH_HOOK_PRIORITY  Priority
+  )
+{
+  AMD_SMM_DISPATCH_HOOK  *ThisHook;
+
+  if ((SmmDispatchHookBefore == NULL) && (SmmDispatchHookAfter == NULL)) {
+    DEBUG ((DEBUG_ERROR, "%a: Both SmmDispatchHookBefore and SmmDispatchHookAfter are NULL.\n", __func__));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (RegisteredHookPtr == NULL) {
+    InitializeListHead (&RegisteredHook);
+    RegisteredHookPtr = &RegisteredHook;
+  }
+
+  ThisHook = (AMD_SMM_DISPATCH_HOOK *)AllocateZeroPool (sizeof (AMD_SMM_DISPATCH_HOOK));
+  if (ThisHook == NULL) {
+    DEBUG ((DEBUG_ERROR, "%a: Insufficient memory for AMD_SMM_DISPATCH_HOOK.\n", __func__));
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  InitializeListHead (&ThisHook->NextList);
+  ThisHook->AmdSmmDispatchHookBefore = SmmDispatchHookBefore;
+  ThisHook->AmdSmmDispatchHookAfter  = SmmDispatchHookAfter;
+  ThisHook->Priority                 = Priority;
+  InsertHeadList (&RegisteredHook, &ThisHook->NextList);
+  DEBUG ((DEBUG_VERBOSE, "%a: New AMD_SMM_DISPATCH_HOOK is inserted.\n", __func__));
+  return EFI_SUCCESS;
+}
+
+/**
+  Performs platform specific tasks before invoking registered SMI handlers.
+
+  This function performs platform specific tasks before invoking registered SMI handlers.
+
+  @retval EFI_SUCCESS       The platform hook completes successfully.
+  @retval Other values      The platform hook cannot complete due to some error.
+
+**/
+EFI_STATUS
+EFIAPI
+PlatformHookBeforeSmmDispatch (
+  VOID
+  )
+{
+  AMD_SMM_DISPATCH_HOOK  *ThisHook;
+
+  if (IsListEmpty (&RegisteredHook)) {
+    return EFI_NOT_FOUND;
+  }
+
+  ThisHook = (AMD_SMM_DISPATCH_HOOK *)GetFirstNode (&RegisteredHook);
+  while (TRUE) {
+    //
+    // We can handle priority in the future when needed.
+    //
+    if (ThisHook->AmdSmmDispatchHookBefore != NULL) {
+      ThisHook->AmdSmmDispatchHookBefore ();
+    }
+
+    if (IsNodeAtEnd (&RegisteredHook, &ThisHook->NextList)) {
+      break;
+    }
+
+    ThisHook = (AMD_SMM_DISPATCH_HOOK *)GetNextNode (&RegisteredHook, &ThisHook->NextList);
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Performs platform specific tasks after invoking registered SMI handlers.
+
+  This function performs platform specific tasks after invoking registered SMI handlers.
+
+  @retval EFI_SUCCESS       The platform hook completes successfully.
+  @retval Other values      The platform hook cannot complete due to some error.
+
+**/
+EFI_STATUS
+EFIAPI
+PlatformHookAfterSmmDispatch (
+  VOID
+  )
+{
+  AMD_SMM_DISPATCH_HOOK  *ThisHook;
+
+  if (IsListEmpty (&RegisteredHook)) {
+    return EFI_NOT_FOUND;
+  }
+
+  ThisHook = (AMD_SMM_DISPATCH_HOOK *)GetFirstNode (&RegisteredHook);
+  while (TRUE) {
+    //
+    // We can handle priority in the future when needed.
+    //
+    if (ThisHook->AmdSmmDispatchHookAfter != NULL) {
+      ThisHook->AmdSmmDispatchHookAfter ();
+    }
+
+    if (IsNodeAtEnd (&RegisteredHook, &ThisHook->NextList)) {
+      break;
+    }
+
+    ThisHook = (AMD_SMM_DISPATCH_HOOK *)GetNextNode (&RegisteredHook, &ThisHook->NextList);
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Constructor for SmmLockBox library.
+  This is used to set SmmLockBox context, which will be used in PEI phase in S3 boot path later.
+
+  @param[in] ImageHandle  Image handle of this driver.
+  @param[in] SystemTable  A Pointer to the EFI System Table.
+
+  @retval EFI_SUCCESS
+  @return Others          Some error occurs.
+**/
+EFI_STATUS
+EFIAPI
+SmmCorePlatformHookConstructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  if (RegisteredHookPtr == NULL) {
+    InitializeListHead (&RegisteredHook);
+    RegisteredHookPtr = &RegisteredHook;
+  }
+
+  return EFI_SUCCESS;
+}
diff --git a/Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.inf b/Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.inf
new file mode 100644
index 0000000000..a79fc56077
--- /dev/null
+++ b/Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.inf
@@ -0,0 +1,39 @@
+## @file
+#  INF of SMM Core hook library INF file.
+#
+#  Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = SmmCorePlatformHookLib
+  MODULE_UNI_FILE                = SmmCorePlatformHookLib.uni
+  FILE_GUID                      = 70ACB6CA-80D2-46a9-A0EB-0C83DFC476C9
+  MODULE_TYPE                    = SMM_CORE
+  VERSION_STRING                 = 1.0
+  PI_SPECIFICATION_VERSION       = 0x0001000A
+  LIBRARY_CLASS                  = SmmCorePlatformHookLib|SMM_CORE
+  CONSTRUCTOR                    = SmmCorePlatformHookConstructor
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64
+#
+
+[Sources]
+  SmmCorePlatformHookLib.c
+
+[Packages]
+  AmdPlatformPkg/AmdPlatformPkg.dec
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+  BaseLib
+  BaseMemoryLib
+  DebugLib
+  MemoryAllocationLib
+  SmmServicesTableLib
+
diff --git a/Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.uni b/Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.uni
new file mode 100644
index 0000000000..0b326c159b
--- /dev/null
+++ b/Platform/AMD/AmdPlatformPkg/Library/SmmCorePlatformHookLib/SmmCorePlatformHookLib.uni
@@ -0,0 +1,11 @@
+## @file
+#  UNI file of SMM Core hook library module
+#
+#  Copyright (C) 2023 - 2024 Advanced Micro Devices, Inc. All rights reserved.
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+#string STR_MODULE_ABSTRACT             #language en-US "SMM Core Platform Hook Library instance"
+
+#string STR_MODULE_DESCRIPTION          #language en-US "SMM Core Platform Hook Library instance"
-- 
2.34.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119307): https://edk2.groups.io/g/devel/message/119307
Mute This Topic: https://groups.io/mt/106349081/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



  parent reply	other threads:[~2024-05-28 14:08 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-05-28 14:07 [edk2-devel] [edk2-platforms 0/3] AmdPlatformPkg: SmbiosDxe and SPI supporting libraries Abdul Lateef Attar via groups.io
2024-05-28 14:07 ` [edk2-devel] [edk2-platforms 1/3] AmdPlatformPkg: Removes unused gBoardBdsBootFromDevicePathProtocolGuid Abdul Lateef Attar via groups.io
2024-05-29  8:56   ` Chang, Abner via groups.io
2024-05-28 14:07 ` Abdul Lateef Attar via groups.io [this message]
2024-05-29  8:57   ` [edk2-devel] [edk2-platforms 2/3] AmdPlatformPkg: Implements SmmCorePlatformHookLib library Chang, Abner via groups.io
2024-05-28 14:07 ` [edk2-devel] [edk2-platforms 3/3] AmdPlatformPkg: Adds SPI smm core platform hook Abdul Lateef Attar via groups.io
2024-05-29  8:57   ` Chang, Abner via groups.io

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=cf3111309816aab01e9f284ee27eb71a94f0c773.1716905162.git.AbdulLateef.Attar@amd.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox