From 84edd20bd0756ef5719835498d4283435d6b5e77 Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Wed, 12 Nov 2014 03:27:48 +0000 Subject: MdeModulePkg DxeCore/PiSmmCore: Add UEFI memory and SMRAM profile support. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Star Zeng Reviewed-by: Jiewen Yao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16335 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Include/Guid/MemoryProfile.h | 286 ++++++++++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 MdeModulePkg/Include/Guid/MemoryProfile.h (limited to 'MdeModulePkg/Include') diff --git a/MdeModulePkg/Include/Guid/MemoryProfile.h b/MdeModulePkg/Include/Guid/MemoryProfile.h new file mode 100644 index 0000000000..3c1e5e79ca --- /dev/null +++ b/MdeModulePkg/Include/Guid/MemoryProfile.h @@ -0,0 +1,286 @@ +/** @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 + -- cgit v1.2.3