summaryrefslogtreecommitdiffstats
path: root/PrmPkg
diff options
context:
space:
mode:
authorMichael Kubacki <michael.kubacki@microsoft.com>2020-04-07 11:30:21 -0700
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2022-04-05 00:42:38 +0000
commitc63905aba7fda2f16bc6a68cba13b167a47e868c (patch)
tree75c4fd54527f94a76e5d8340b2618dba62763272 /PrmPkg
parent9276e0d2b9847705c5fceda290641ddff7a79524 (diff)
downloadedk2-c63905aba7fda2f16bc6a68cba13b167a47e868c.tar.gz
edk2-c63905aba7fda2f16bc6a68cba13b167a47e868c.tar.bz2
edk2-c63905aba7fda2f16bc6a68cba13b167a47e868c.zip
PrmPkg: Add initial PrmSampleMemoryAllocationModule
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@apple.com> Cc: Kang Gao <kang.gao@intel.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Michael Kubacki <michael.kubacki@microsoft.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Benjamin You <benjamin.you@intel.com> Cc: Liu Yun <yun.y.liu@intel.com> Cc: Ankit Sinha <ankit.sinha@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Acked-by: Michael D Kinney <michael.d.kinney@intel.com> Acked-by: Liming Gao <gaoliming@byosoft.com.cn> Acked-by: Leif Lindholm <quic_llindhol@quicinc.com> Reviewed-by: Ankit Sinha <ankit.sinha@intel.com>
Diffstat (limited to 'PrmPkg')
-rw-r--r--PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.c115
-rw-r--r--PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.inf41
2 files changed, 156 insertions, 0 deletions
diff --git a/PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.c b/PrmPkg/Samples/PrmSampleMemoryAllocationModule/PrmSampleMemoryAllocationModule.c
new file mode 100644
index 0000000000..f1245664ab
--- /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 0000000000..e6798afe19
--- /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