/** @file Memory profile data structure. Copyright (c) 2014, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. **/ #ifndef _MEMORY_PROFILE_H_ #define _MEMORY_PROFILE_H_ // // For BIOS MemoryType (0 ~ EfiMaxMemoryType), it is recorded in UsageByType[MemoryType]. (Each valid entry has one entry) // For OS MemoryType (0x80000000 ~ 0xFFFFFFFF), it is recorded in UsageByType[EfiMaxMemoryType]. (All types are combined into one entry) // typedef struct { UINT32 Signature; UINT16 Length; UINT16 Revision; } MEMORY_PROFILE_COMMON_HEADER; #define MEMORY_PROFILE_CONTEXT_SIGNATURE SIGNATURE_32 ('M','P','C','T') #define MEMORY_PROFILE_CONTEXT_REVISION 0x0001 typedef struct { MEMORY_PROFILE_COMMON_HEADER Header; UINT64 CurrentTotalUsage; UINT64 PeakTotalUsage; UINT64 CurrentTotalUsageByType[EfiMaxMemoryType + 1]; UINT64 PeakTotalUsageByType[EfiMaxMemoryType + 1]; UINT64 TotalImageSize; UINT32 ImageCount; UINT32 SequenceCount; } MEMORY_PROFILE_CONTEXT; #define MEMORY_PROFILE_DRIVER_INFO_SIGNATURE SIGNATURE_32 ('M','P','D','I') #define MEMORY_PROFILE_DRIVER_INFO_REVISION 0x0001 typedef struct { MEMORY_PROFILE_COMMON_HEADER Header; EFI_GUID FileName; PHYSICAL_ADDRESS ImageBase; UINT64 ImageSize; PHYSICAL_ADDRESS EntryPoint; UINT16 ImageSubsystem; EFI_FV_FILETYPE FileType; UINT8 Reserved[1]; UINT32 AllocRecordCount; UINT64 CurrentUsage; UINT64 PeakUsage; UINT64 CurrentUsageByType[EfiMaxMemoryType + 1]; UINT64 PeakUsageByType[EfiMaxMemoryType + 1]; } MEMORY_PROFILE_DRIVER_INFO; typedef enum { MemoryProfileActionAllocatePages = 1, MemoryProfileActionFreePages = 2, MemoryProfileActionAllocatePool = 3, MemoryProfileActionFreePool = 4, } MEMORY_PROFILE_ACTION; #define MEMORY_PROFILE_ALLOC_INFO_SIGNATURE SIGNATURE_32 ('M','P','A','I') #define MEMORY_PROFILE_ALLOC_INFO_REVISION 0x0001 typedef struct { MEMORY_PROFILE_COMMON_HEADER Header; PHYSICAL_ADDRESS CallerAddress; UINT32 SequenceId; UINT8 Reserved[4]; MEMORY_PROFILE_ACTION Action; EFI_MEMORY_TYPE MemoryType; PHYSICAL_ADDRESS Buffer; UINT64 Size; } MEMORY_PROFILE_ALLOC_INFO; #define MEMORY_PROFILE_DESCRIPTOR_SIGNATURE SIGNATURE_32 ('M','P','D','R') #define MEMORY_PROFILE_DESCRIPTOR_REVISION 0x0001 typedef struct { MEMORY_PROFILE_COMMON_HEADER Header; PHYSICAL_ADDRESS Address; UINT64 Size; } MEMORY_PROFILE_DESCRIPTOR; #define MEMORY_PROFILE_FREE_MEMORY_SIGNATURE SIGNATURE_32 ('M','P','R','M') #define MEMORY_PROFILE_FREE_MEMORY_REVISION 0x0001 typedef struct { MEMORY_PROFILE_COMMON_HEADER Header; UINT64 TotalFreeMemoryPages; UINT32 FreeMemoryEntryCount; UINT8 Reserved[4]; //MEMORY_PROFILE_DESCRIPTOR MemoryDescriptor[FreeMemoryEntryCount]; } MEMORY_PROFILE_FREE_MEMORY; #define MEMORY_PROFILE_MEMORY_RANGE_SIGNATURE SIGNATURE_32 ('M','P','M','R') #define MEMORY_PROFILE_MEMORY_RANGE_REVISION 0x0001 typedef struct { MEMORY_PROFILE_COMMON_HEADER Header; UINT32 MemoryRangeCount; UINT8 Reserved[4]; //MEMORY_PROFILE_DESCRIPTOR MemoryDescriptor[MemoryRangeCount]; } MEMORY_PROFILE_MEMORY_RANGE; // // UEFI memory profile layout: // +--------------------------------+ // | CONTEXT | // +--------------------------------+ // | DRIVER_INFO(1) | // +--------------------------------+ // | ALLOC_INFO(1, 1) | // +--------------------------------+ // | ALLOC_INFO(1, m1) | // +--------------------------------+ // | DRIVER_INFO(n) | // +--------------------------------+ // | ALLOC_INFO(n, 1) | // +--------------------------------+ // | ALLOC_INFO(n, mn) | // +--------------------------------+ // typedef struct _EDKII_MEMORY_PROFILE_PROTOCOL EDKII_MEMORY_PROFILE_PROTOCOL; /** Get memory profile data. @param[in] This The EDKII_MEMORY_PROFILE_PROTOCOL instance. @param[in, out] ProfileSize On entry, points to the size in bytes of the ProfileBuffer. On return, points to the size of the data returned in ProfileBuffer. @param[out] ProfileBuffer Profile buffer. @return EFI_SUCCESS Get the memory profile data successfully. @return EFI_BUFFER_TO_SMALL The ProfileSize is too small for the resulting data. ProfileSize is updated with the size required. **/ typedef EFI_STATUS (EFIAPI *EDKII_MEMORY_PROFILE_GET_DATA)( IN EDKII_MEMORY_PROFILE_PROTOCOL *This, IN OUT UINT64 *ProfileSize, OUT VOID *ProfileBuffer ); /** Register image to memory profile. @param[in] This The EDKII_MEMORY_PROFILE_PROTOCOL instance. @param[in] FilePath File path of the image. @param[in] ImageBase Image base address. @param[in] ImageSize Image size. @param[in] FileType File type of the image. @return EFI_SUCCESS Register success. @return EFI_OUT_OF_RESOURCE No enough resource for this register. **/ typedef EFI_STATUS (EFIAPI *EDKII_MEMORY_PROFILE_REGISTER_IMAGE)( IN EDKII_MEMORY_PROFILE_PROTOCOL *This, IN EFI_DEVICE_PATH_PROTOCOL *FilePath, IN PHYSICAL_ADDRESS ImageBase, IN UINT64 ImageSize, IN EFI_FV_FILETYPE FileType ); /** Unregister image from memory profile. @param[in] This The EDKII_MEMORY_PROFILE_PROTOCOL instance. @param[in] FilePath File path of the image. @param[in] ImageBase Image base address. @param[in] ImageSize Image size. @return EFI_SUCCESS Unregister success. @return EFI_NOT_FOUND The image is not found. **/ typedef EFI_STATUS (EFIAPI *EDKII_MEMORY_PROFILE_UNREGISTER_IMAGE)( IN EDKII_MEMORY_PROFILE_PROTOCOL *This, IN EFI_DEVICE_PATH_PROTOCOL *FilePath, IN PHYSICAL_ADDRESS ImageBase, IN UINT64 ImageSize ); struct _EDKII_MEMORY_PROFILE_PROTOCOL { EDKII_MEMORY_PROFILE_GET_DATA GetData; EDKII_MEMORY_PROFILE_REGISTER_IMAGE RegisterImage; EDKII_MEMORY_PROFILE_UNREGISTER_IMAGE UnregisterImage; }; // // SMRAM profile layout: // +--------------------------------+ // | CONTEXT | // +--------------------------------+ // | DRIVER_INFO(1) | // +--------------------------------+ // | ALLOC_INFO(1, 1) | // +--------------------------------+ // | ALLOC_INFO(1, m1) | // +--------------------------------+ // | DRIVER_INFO(n) | // +--------------------------------+ // | ALLOC_INFO(n, 1) | // +--------------------------------+ // | ALLOC_INFO(n, mn) | // +--------------------------------+ // | FREE_MEMORY | // +--------------------------------+ // | FREE MEMORY DESCRIPTOR(1) | // +--------------------------------+ // | FREE MEMORY DESCRIPTOR(p) | // +--------------------------------+ // | MEMORY_RANGE | // +--------------------------------+ // | MEMORY RANGE DESCRIPTOR(1) | // +--------------------------------+ // | MEMORY RANGE DESCRIPTOR(q) | // +--------------------------------+ // // // SMRAM profile command // #define SMRAM_PROFILE_COMMAND_GET_PROFILE_INFO 0x1 #define SMRAM_PROFILE_COMMAND_GET_PROFILE_DATA 0x2 // // Below 2 commands are now used by ECP only and only valid before SmmReadyToLock // #define SMRAM_PROFILE_COMMAND_REGISTER_IMAGE 0x3 #define SMRAM_PROFILE_COMMAND_UNREGISTER_IMAGE 0x4 typedef struct { UINT32 Command; UINT32 DataLength; UINT64 ReturnStatus; } SMRAM_PROFILE_PARAMETER_HEADER; typedef struct { SMRAM_PROFILE_PARAMETER_HEADER Header; UINT64 ProfileSize; } SMRAM_PROFILE_PARAMETER_GET_PROFILE_INFO; typedef struct { SMRAM_PROFILE_PARAMETER_HEADER Header; UINT64 ProfileSize; PHYSICAL_ADDRESS ProfileBuffer; } SMRAM_PROFILE_PARAMETER_GET_PROFILE_DATA; typedef struct { SMRAM_PROFILE_PARAMETER_HEADER Header; EFI_GUID FileName; PHYSICAL_ADDRESS ImageBuffer; UINT64 NumberOfPage; } SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE; typedef struct { SMRAM_PROFILE_PARAMETER_HEADER Header; EFI_GUID FileName; PHYSICAL_ADDRESS ImageBuffer; UINT64 NumberOfPage; } SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE; #define EDKII_MEMORY_PROFILE_GUID { \ 0x821c9a09, 0x541a, 0x40f6, 0x9f, 0x43, 0xa, 0xd1, 0x93, 0xa1, 0x2c, 0xfe \ } extern EFI_GUID gEdkiiMemoryProfileGuid; #endif