/** @file Copyright (c) 2023-2024, Mario Bălănică SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include "MemoryAttributeManagerDxe.h" extern UINT8 MemoryAttributeManagerDxeHiiBin[]; extern UINT8 MemoryAttributeManagerDxeStrings[]; typedef struct { VENDOR_DEVICE_PATH VendorDevicePath; EFI_DEVICE_PATH_PROTOCOL End; } HII_VENDOR_DEVICE_PATH; STATIC HII_VENDOR_DEVICE_PATH mVendorDevicePath = { { { HARDWARE_DEVICE_PATH, HW_VENDOR_DP, { (UINT8)(sizeof (VENDOR_DEVICE_PATH)), (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8) } }, MEMORY_ATTRIBUTE_MANAGER_FORMSET_GUID }, { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { (UINT8)(END_DEVICE_PATH_LENGTH), (UINT8)((END_DEVICE_PATH_LENGTH) >> 8) } } }; /** Installs HII page for user configuration. @retval EFI_SUCCESS The operation completed successfully. **/ STATIC EFI_STATUS EFIAPI InstallHiiPages ( VOID ) { EFI_STATUS Status; EFI_HII_HANDLE HiiHandle; EFI_HANDLE DriverHandle; DriverHandle = NULL; Status = gBS->InstallMultipleProtocolInterfaces ( &DriverHandle, &gEfiDevicePathProtocolGuid, &mVendorDevicePath, NULL ); if (EFI_ERROR (Status)) { return Status; } HiiHandle = HiiAddPackages ( &gMemoryAttributeManagerFormSetGuid, DriverHandle, MemoryAttributeManagerDxeStrings, MemoryAttributeManagerDxeHiiBin, NULL ); if (HiiHandle == NULL) { gBS->UninstallMultipleProtocolInterfaces ( DriverHandle, &gEfiDevicePathProtocolGuid, &mVendorDevicePath, NULL ); return EFI_OUT_OF_RESOURCES; } return EFI_SUCCESS; } /** This function uninstalls the EFI_MEMORY_ATTRIBUTE_PROTOCOL from CpuDxe's handle. **/ STATIC VOID UninstallEfiMemoryAttributeProtocol ( VOID ) { EFI_STATUS Status; EFI_HANDLE Handle; UINTN Size; VOID *MemoryAttributeProtocol; Size = sizeof (Handle); Status = gBS->LocateHandle ( ByProtocol, &gEfiMemoryAttributeProtocolGuid, NULL, &Size, &Handle ); if (EFI_ERROR (Status)) { ASSERT (Status == EFI_NOT_FOUND); return; } Status = gBS->HandleProtocol ( Handle, &gEfiMemoryAttributeProtocolGuid, &MemoryAttributeProtocol ); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } Status = gBS->UninstallProtocolInterface ( Handle, &gEfiMemoryAttributeProtocolGuid, MemoryAttributeProtocol ); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } DEBUG (( DEBUG_INFO, "EFI Memory Attribute Protocol disabled due to user/platform preference!\n" )); } /** The entry point for MemoryAttributeManagerDxe driver. @param[in] ImageHandle The image handle of the driver. @param[in] SystemTable The system table. @retval EFI_SUCCESS The operation completed successfully. **/ EFI_STATUS EFIAPI MemoryAttributeManagerInitialize ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; UINTN Size; MEMORY_ATTRIBUTE_MANAGER_VARSTORE_DATA Config; Config.Enabled = PROTOCOL_ENABLED_DEFAULT; Size = sizeof (MEMORY_ATTRIBUTE_MANAGER_VARSTORE_DATA); Status = gRT->GetVariable ( MEMORY_ATTRIBUTE_MANAGER_DATA_VAR_NAME, &gMemoryAttributeManagerFormSetGuid, NULL, &Size, &Config ); if (EFI_ERROR (Status)) { Status = gRT->SetVariable ( MEMORY_ATTRIBUTE_MANAGER_DATA_VAR_NAME, &gMemoryAttributeManagerFormSetGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS, Size, &Config ); ASSERT_EFI_ERROR (Status); } if (!Config.Enabled) { UninstallEfiMemoryAttributeProtocol (); } return InstallHiiPages (); }