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