#ifndef _MEMORY_PROFILE_H_\r
#define _MEMORY_PROFILE_H_\r
\r
+#include <Pi/PiFirmwareFile.h>\r
+\r
//\r
// For BIOS MemoryType (0 ~ EfiMaxMemoryType - 1), it is recorded in UsageByType[MemoryType]. (Each valid entry has one entry)\r
// For OS MemoryType (0x80000000 ~ 0xFFFFFFFF), it is recorded in UsageByType[EfiMaxMemoryType]. (All types are combined into one entry)\r
} MEMORY_PROFILE_CONTEXT;\r
\r
#define MEMORY_PROFILE_DRIVER_INFO_SIGNATURE SIGNATURE_32 ('M','P','D','I')\r
-#define MEMORY_PROFILE_DRIVER_INFO_REVISION 0x0002\r
+#define MEMORY_PROFILE_DRIVER_INFO_REVISION 0x0003\r
\r
typedef struct {\r
MEMORY_PROFILE_COMMON_HEADER Header;\r
UINT64 PeakUsage;\r
UINT64 CurrentUsageByType[EfiMaxMemoryType + 2];\r
UINT64 PeakUsageByType[EfiMaxMemoryType + 2];\r
+ UINT16 PdbStringOffset;\r
+ UINT8 Reserved2[6];\r
+//CHAR8 PdbString[];\r
} MEMORY_PROFILE_DRIVER_INFO;\r
\r
typedef enum {\r
MemoryProfileActionFreePool = 4,\r
} MEMORY_PROFILE_ACTION;\r
\r
+//\r
+// Below is the detailed MEMORY_PROFILE_ACTION definition.\r
+//\r
+// 31 15 9 8 8 7 7 6 6 5-4 3 - 0\r
+// +----------------------------------------------+\r
+// |User | |Lib| |Re|Copy|Zero|Align|Type|Basic|\r
+// +----------------------------------------------+\r
+//\r
+\r
+//\r
+// Basic Action\r
+// 1 : AllocatePages\r
+// 2 : FreePages\r
+// 3 : AllocatePool\r
+// 4 : FreePool\r
+//\r
+#define MEMORY_PROFILE_ACTION_BASIC_MASK 0xF\r
+\r
+//\r
+// Extension\r
+//\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_MASK 0xFFF0\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_LIB_MASK 0x8000\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_REALLOC_MASK 0x0200\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_COPY_MASK 0x0100\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_ZERO_MASK 0x0080\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_ALIGN_MASK 0x0040\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_MASK 0x0030\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_BASIC 0x0000\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_RUNTIME 0x0010\r
+#define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_RESERVED 0x0020\r
+\r
+//\r
+// Extension (used by memory allocation lib)\r
+//\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_PAGES 0x8001\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_PAGES 0x8011\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_PAGES 0x8021\r
+#define MEMORY_PROFILE_ACTION_LIB_FREE_PAGES 0x8002\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_PAGES 0x8041\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_RUNTIME_PAGES 0x8051\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_RESERVED_PAGES 0x8061\r
+#define MEMORY_PROFILE_ACTION_LIB_FREE_ALIGNED_PAGES 0x8042\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_POOL 0x8003\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_POOL 0x8013\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_POOL 0x8023\r
+#define MEMORY_PROFILE_ACTION_LIB_FREE_POOL 0x8004\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ZERO_POOL 0x8083\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_ZERO_POOL 0x8093\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_ZERO_POOL 0x80a3\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_COPY_POOL 0x8103\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_COPY_POOL 0x8113\r
+#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_COPY_POOL 0x8123\r
+#define MEMORY_PROFILE_ACTION_LIB_REALLOCATE_POOL 0x8203\r
+#define MEMORY_PROFILE_ACTION_LIB_REALLOCATE_RUNTIME_POOL 0x8213\r
+#define MEMORY_PROFILE_ACTION_LIB_REALLOCATE_RESERVED_POOL 0x8223\r
+\r
+//\r
+// User defined: 0x80000000~0xFFFFFFFF\r
+//\r
+// NOTE: User defined action MUST OR the basic action,\r
+// so that core can know the action is allocate or free,\r
+// and the type is pages (can be freed partially)\r
+// or pool (cannot be freed partially).\r
+//\r
+#define MEMORY_PROFILE_ACTION_USER_DEFINED_MASK 0x80000000\r
+\r
#define MEMORY_PROFILE_ALLOC_INFO_SIGNATURE SIGNATURE_32 ('M','P','A','I')\r
-#define MEMORY_PROFILE_ALLOC_INFO_REVISION 0x0001\r
+#define MEMORY_PROFILE_ALLOC_INFO_REVISION 0x0002\r
\r
typedef struct {\r
MEMORY_PROFILE_COMMON_HEADER Header;\r
EFI_MEMORY_TYPE MemoryType;\r
PHYSICAL_ADDRESS Buffer;\r
UINT64 Size;\r
+ UINT16 ActionStringOffset;\r
+ UINT8 Reserved2[6];\r
+//CHAR8 ActionString[];\r
} MEMORY_PROFILE_ALLOC_INFO;\r
\r
#define MEMORY_PROFILE_DESCRIPTOR_SIGNATURE SIGNATURE_32 ('M','P','D','R')\r
@param[out] ProfileBuffer Profile buffer.\r
\r
@return EFI_SUCCESS Get the memory profile data successfully.\r
+ @return EFI_UNSUPPORTED Memory profile is unsupported.\r
@return EFI_BUFFER_TO_SMALL The ProfileSize is too small for the resulting data. \r
ProfileSize is updated with the size required.\r
\r
@param[in] ImageSize Image size.\r
@param[in] FileType File type of the image.\r
\r
- @return EFI_SUCCESS Register success.\r
- @return EFI_OUT_OF_RESOURCE No enough resource for this register.\r
+ @return EFI_SUCCESS Register successfully.\r
+ @return EFI_UNSUPPORTED Memory profile is unsupported,\r
+ or memory profile for the image is not required.\r
+ @return EFI_OUT_OF_RESOURCES No enough resource for this register.\r
\r
**/\r
typedef\r
@param[in] ImageBase Image base address.\r
@param[in] ImageSize Image size.\r
\r
- @return EFI_SUCCESS Unregister success.\r
+ @return EFI_SUCCESS Unregister successfully.\r
+ @return EFI_UNSUPPORTED Memory profile is unsupported,\r
+ or memory profile for the image is not required.\r
@return EFI_NOT_FOUND The image is not found.\r
\r
**/\r
IN UINT64 ImageSize\r
);\r
\r
+#define MEMORY_PROFILE_RECORDING_ENABLE TRUE\r
+#define MEMORY_PROFILE_RECORDING_DISABLE FALSE\r
+\r
+/**\r
+ Get memory profile recording state.\r
+\r
+ @param[in] This The EDKII_MEMORY_PROFILE_PROTOCOL instance.\r
+ @param[out] RecordingState Recording state.\r
+\r
+ @return EFI_SUCCESS Memory profile recording state is returned.\r
+ @return EFI_UNSUPPORTED Memory profile is unsupported.\r
+ @return EFI_INVALID_PARAMETER RecordingState is NULL.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EDKII_MEMORY_PROFILE_GET_RECORDING_STATE) (\r
+ IN EDKII_MEMORY_PROFILE_PROTOCOL *This,\r
+ OUT BOOLEAN *RecordingState\r
+ );\r
+\r
+/**\r
+ Set memory profile recording state.\r
+\r
+ @param[in] This The EDKII_MEMORY_PROFILE_PROTOCOL instance.\r
+ @param[in] RecordingState Recording state.\r
+\r
+ @return EFI_SUCCESS Set memory profile recording state successfully.\r
+ @return EFI_UNSUPPORTED Memory profile is unsupported.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EDKII_MEMORY_PROFILE_SET_RECORDING_STATE) (\r
+ IN EDKII_MEMORY_PROFILE_PROTOCOL *This,\r
+ IN BOOLEAN RecordingState\r
+ );\r
+\r
+/**\r
+ Record memory profile of multilevel caller.\r
+\r
+ @param[in] This The EDKII_MEMORY_PROFILE_PROTOCOL instance.\r
+ @param[in] CallerAddress Address of caller.\r
+ @param[in] Action Memory profile action.\r
+ @param[in] MemoryType Memory type.\r
+ EfiMaxMemoryType means the MemoryType is unknown.\r
+ @param[in] Buffer Buffer address.\r
+ @param[in] Size Buffer size.\r
+ @param[in] ActionString String for memory profile action.\r
+ Only needed for user defined allocate action.\r
+\r
+ @return EFI_SUCCESS Memory profile is updated.\r
+ @return EFI_UNSUPPORTED Memory profile is unsupported,\r
+ or memory profile for the image is not required,\r
+ or memory profile for the memory type is not required.\r
+ @return EFI_ACCESS_DENIED It is during memory profile data getting.\r
+ @return EFI_ABORTED Memory profile recording is not enabled.\r
+ @return EFI_OUT_OF_RESOURCES No enough resource to update memory profile for allocate action.\r
+ @return EFI_NOT_FOUND No matched allocate info found for free action.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EDKII_MEMORY_PROFILE_RECORD) (\r
+ IN EDKII_MEMORY_PROFILE_PROTOCOL *This,\r
+ IN PHYSICAL_ADDRESS CallerAddress,\r
+ IN MEMORY_PROFILE_ACTION Action,\r
+ IN EFI_MEMORY_TYPE MemoryType,\r
+ IN VOID *Buffer,\r
+ IN UINTN Size,\r
+ IN CHAR8 *ActionString OPTIONAL\r
+ );\r
+\r
struct _EDKII_MEMORY_PROFILE_PROTOCOL {\r
- EDKII_MEMORY_PROFILE_GET_DATA GetData;\r
- EDKII_MEMORY_PROFILE_REGISTER_IMAGE RegisterImage;\r
- EDKII_MEMORY_PROFILE_UNREGISTER_IMAGE UnregisterImage;\r
+ EDKII_MEMORY_PROFILE_GET_DATA GetData;\r
+ EDKII_MEMORY_PROFILE_REGISTER_IMAGE RegisterImage;\r
+ EDKII_MEMORY_PROFILE_UNREGISTER_IMAGE UnregisterImage;\r
+ EDKII_MEMORY_PROFILE_GET_RECORDING_STATE GetRecordingState;\r
+ EDKII_MEMORY_PROFILE_SET_RECORDING_STATE SetRecordingState;\r
+ EDKII_MEMORY_PROFILE_RECORD Record;\r
};\r
\r
//\r
#define SMRAM_PROFILE_COMMAND_UNREGISTER_IMAGE 0x4\r
\r
#define SMRAM_PROFILE_COMMAND_GET_PROFILE_DATA_BY_OFFSET 0x5\r
+#define SMRAM_PROFILE_COMMAND_GET_RECORDING_STATE 0x6\r
+#define SMRAM_PROFILE_COMMAND_SET_RECORDING_STATE 0x7\r
\r
typedef struct {\r
UINT32 Command;\r
UINT64 ProfileOffset;\r
} SMRAM_PROFILE_PARAMETER_GET_PROFILE_DATA_BY_OFFSET;\r
\r
+typedef struct {\r
+ SMRAM_PROFILE_PARAMETER_HEADER Header;\r
+ BOOLEAN RecordingState;\r
+} SMRAM_PROFILE_PARAMETER_RECORDING_STATE;\r
+\r
typedef struct {\r
SMRAM_PROFILE_PARAMETER_HEADER Header;\r
EFI_GUID FileName;\r
\r
\r
#define EDKII_MEMORY_PROFILE_GUID { \\r
- 0x821c9a09, 0x541a, 0x40f6, 0x9f, 0x43, 0xa, 0xd1, 0x93, 0xa1, 0x2c, 0xfe \\r
+ 0x821c9a09, 0x541a, 0x40f6, { 0x9f, 0x43, 0xa, 0xd1, 0x93, 0xa1, 0x2c, 0xfe } \\r
}\r
\r
extern EFI_GUID gEdkiiMemoryProfileGuid;\r
\r
+typedef EDKII_MEMORY_PROFILE_PROTOCOL EDKII_SMM_MEMORY_PROFILE_PROTOCOL;\r
+\r
+#define EDKII_SMM_MEMORY_PROFILE_GUID { \\r
+ 0xe22bbcca, 0x516a, 0x46a8, { 0x80, 0xe2, 0x67, 0x45, 0xe8, 0x36, 0x93, 0xbd } \\r
+}\r
+\r
+extern EFI_GUID gEdkiiSmmMemoryProfileGuid;\r
+\r
#endif\r
\r