[edk2-devel] [PATCH v1 06/41] PrmPkg: Add initial PrmSampleMemoryAllocationModule

Michael Kubacki mikuback at linux.microsoft.com
Tue Mar 22 16:19:12 UTC 2022


From: Michael Kubacki <michael.kubacki at microsoft.com>

REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3812

DEPRECATED: This module is no longer relevant since OS Services that
allow memory allocation have been removed. It is still present in the
source tree in the event dynamic memory allocation at OS runtime is
needed again.

  Adds a sample PRM module that demonstrates:
  1. How to write a PRM module
  2. How to use a basic PRM OS service
  3. How to dynamically allocate memory at OS runtime

Cc: Andrew Fish <afish at apple.com>
Cc: Kang Gao <kang.gao at intel.com>
Cc: Michael D Kinney <michael.d.kinney at intel.com>
Cc: Michael Kubacki <michael.kubacki at microsoft.com>
Cc: Leif Lindholm <leif at nuviainc.com>
Cc: Benjamin You <benjamin.you at intel.com>
Cc: Liu Yun <yun.y.liu at intel.com>
Cc: Ankit Sinha <ankit.sinha at intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone at intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki at microsoft.com>
---
 PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.c   | 115 ++++++++++++++++++++
 PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.inf |  41 +++++++
 2 files changed, 156 insertions(+)

diff --git a/PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.c b/PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.c
new file mode 100644
index 000000000000..f1245664ab9c
--- /dev/null
+++ b/PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.c
@@ -0,0 +1,115 @@
+/** @file
+
+  A sample PRM Module implementation. This PRM Module provides 3 PRM handlers that simply take a DEBUG print
+  function from the OS and invoke it with a debug message internal the PRM handler.
+
+  Copyright (c) Microsoft Corporation
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <PrmModule.h>
+
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/PrintLib.h>
+#include <Library/UefiLib.h>
+
+//
+// PRM Handler GUIDs
+//
+
+// {149a5cb3-6a9c-403f-940a-156abf63938a}
+#define PRM_HANDLER_1_GUID {0x149a5cb3, 0x6a9c, 0x403f, {0x94, 0x0a, 0x15, 0x6a, 0xbf, 0x63, 0x93, 0x8a}}
+
+// Note: If the signature size is modified, the PRM Handler test code in this module needs to be updated.
+#define MEMORY_ALLOCATION_TEST_DATA_SIGNATURE     SIGNATURE_32('T','E','S','T')
+#define MEMORY_ALLOCATION_TEST_DATA_SIZE          sizeof(UINT32)
+#define MEMORY_ALLOCATION_TEST_DATA_BUFFER_SIZE   256
+
+/**
+  A sample Platform Runtime Mechanism (PRM) handler.
+
+  This sample handler currently uses the OS_SERVICES to write a debug message
+  indicating this is PRM handler 1.
+
+  @param[in]  ParameterBuffer    A pointer to the PRM handler parameter buffer
+  @param[in]  ContextBuffer      A pointer to the PRM handler context buffer
+
+  @retval EFI_STATUS              The PRM handler executed successfully.
+  @retval Others                  An error occurred in the PRM handler.
+
+**/
+EFI_STATUS
+PRM_EXPORT_API
+EFIAPI
+PrmHandler1 (
+  IN VOID                         *ParameterBuffer,
+  IN PRM_CONTEXT_BUFFER           *ContextBUffer
+  )
+{
+  EFI_STATUS                      Status;
+  UINTN                           Index;
+  VOID                            *NonPagedPool;
+  CHAR8                           DebugMessage[256];
+
+  if (OsServices == NULL || OsServices->DebugPrint == NULL || OsServices->AllocateMemory == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  OsServices->DebugPrint ("Memory Allocation PrmHandler1 entry.\n");
+  OsServices->DebugPrint ("  Requesting allocation of a 256 byte non-paged pool...\n");
+
+  NonPagedPool = NULL;
+  NonPagedPool = OsServices->AllocateMemory (MEMORY_ALLOCATION_TEST_DATA_BUFFER_SIZE, FALSE);
+  if (NonPagedPool == NULL) {
+    OsServices->DebugPrint ("  NULL was returned from AllocateMemory()...\n");
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  AsciiSPrint (
+    &DebugMessage[0],
+    ARRAY_SIZE (DebugMessage),
+    "  Buffer address returned from AllocateMemory() = 0x%016lx.\n",
+    (UINTN) NonPagedPool
+    );
+  OsServices->DebugPrint (&DebugMessage[0]);
+
+  // Write the test data
+  OsServices->DebugPrint ("  Beginning memory buffer write and read back test...\n");
+  SetMem32 (NonPagedPool, MEMORY_ALLOCATION_TEST_DATA_BUFFER_SIZE, MEMORY_ALLOCATION_TEST_DATA_SIGNATURE);
+
+  // Read back and verify the test data is valid
+  for (Index = 0, Status = EFI_SUCCESS; Index < (MEMORY_ALLOCATION_TEST_DATA_BUFFER_SIZE / MEMORY_ALLOCATION_TEST_DATA_SIZE); Index++) {
+    if (((UINT32 *) NonPagedPool)[Index] != MEMORY_ALLOCATION_TEST_DATA_SIGNATURE) {
+      Status = EFI_DEVICE_ERROR;
+      break;
+    }
+  }
+  if (EFI_ERROR (Status)) {
+    OsServices->DebugPrint ("    Memory write & read test failed.\n");
+  } else {
+    OsServices->DebugPrint ("    Memory write & read test passed.\n");
+  }
+
+  OsServices->DebugPrint ("Memory Allocation PrmHandler1 exit.\n");
+
+  return EFI_SUCCESS;
+}
+
+//
+// Register the PRM export information for this PRM Module
+//
+PRM_MODULE_EXPORT (
+  PRM_HANDLER_EXPORT_ENTRY (PRM_HANDLER_1_GUID, PrmHandler1)
+  );
+
+EFI_STATUS
+EFIAPI
+PrmSampleMemoryAllocationModuleInit (
+  IN  EFI_HANDLE                  ImageHandle,
+  IN  EFI_SYSTEM_TABLE            *SystemTable
+  )
+{
+  return EFI_SUCCESS;
+}
diff --git a/PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.inf b/PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.inf
new file mode 100644
index 000000000000..e6798afe19e8
--- /dev/null
+++ b/PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.inf
@@ -0,0 +1,41 @@
+## @file
+#  Sample PRM Driver
+#
+#  This driver simply uses an OS-provided debug message print service to write
+#  a debug message. Three PRM handlers are provided that each print a unique
+#  debug message.
+#
+#  Copyright (c) Microsoft Corporation
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = PrmSampleMemoryAllocationModule
+  FILE_GUID                      = C6B3E74A-12E3-4364-8FB4-8C8B34DD153B
+  MODULE_TYPE                    = DXE_RUNTIME_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = PrmSampleMemoryAllocationModuleInit
+
+[Sources]
+  PrmSampleMemoryAllocationModule.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  PrmPkg/PrmPkg.dec
+
+[LibraryClasses]
+  BaseLib
+  BaseMemoryLib
+  PrintLib
+  UefiDriverEntryPoint
+  UefiLib
+
+[Depex]
+  TRUE
+
+[BuildOptions.common]
+  MSFT:*_*_*_DLINK_FLAGS  = /DLL /SUBSYSTEM:CONSOLE
-- 
2.28.0.windows.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#87848): https://edk2.groups.io/g/devel/message/87848
Mute This Topic: https://groups.io/mt/89955961/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list