mirror of https://github.com/acidanthera/audk.git
467 lines
18 KiB
C
467 lines
18 KiB
C
/** @file
|
|
Memory profile data structure.
|
|
|
|
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#ifndef _MEMORY_PROFILE_H_
|
|
#define _MEMORY_PROFILE_H_
|
|
|
|
#include <Pi/PiFirmwareFile.h>
|
|
|
|
//
|
|
// For BIOS MemoryType (0 ~ EfiMaxMemoryType - 1), 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)
|
|
// For OEM MemoryType (0x70000000 ~ 0x7FFFFFFF), it is recorded in UsageByType[EfiMaxMemoryType + 1]. (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 0x0002
|
|
|
|
typedef struct {
|
|
MEMORY_PROFILE_COMMON_HEADER Header;
|
|
UINT64 CurrentTotalUsage;
|
|
UINT64 PeakTotalUsage;
|
|
UINT64 CurrentTotalUsageByType[EfiMaxMemoryType + 2];
|
|
UINT64 PeakTotalUsageByType[EfiMaxMemoryType + 2];
|
|
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 0x0003
|
|
|
|
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 + 2];
|
|
UINT64 PeakUsageByType[EfiMaxMemoryType + 2];
|
|
UINT16 PdbStringOffset;
|
|
UINT8 Reserved2[6];
|
|
// CHAR8 PdbString[];
|
|
} MEMORY_PROFILE_DRIVER_INFO;
|
|
|
|
typedef enum {
|
|
MemoryProfileActionAllocatePages = 1,
|
|
MemoryProfileActionFreePages = 2,
|
|
MemoryProfileActionAllocatePool = 3,
|
|
MemoryProfileActionFreePool = 4,
|
|
} MEMORY_PROFILE_ACTION;
|
|
|
|
//
|
|
// Below is the detailed MEMORY_PROFILE_ACTION definition.
|
|
//
|
|
// 31 15 9 8 8 7 7 6 6 5-4 3 - 0
|
|
// +----------------------------------------------+
|
|
// |User | |Lib| |Re|Copy|Zero|Align|Type|Basic|
|
|
// +----------------------------------------------+
|
|
//
|
|
|
|
//
|
|
// Basic Action
|
|
// 1 : AllocatePages
|
|
// 2 : FreePages
|
|
// 3 : AllocatePool
|
|
// 4 : FreePool
|
|
//
|
|
#define MEMORY_PROFILE_ACTION_BASIC_MASK 0xF
|
|
|
|
//
|
|
// Extension
|
|
//
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_MASK 0xFFF0
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_LIB_MASK 0x8000
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_REALLOC_MASK 0x0200
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_COPY_MASK 0x0100
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_ZERO_MASK 0x0080
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_ALIGN_MASK 0x0040
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_MASK 0x0030
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_BASIC 0x0000
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_RUNTIME 0x0010
|
|
#define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_RESERVED 0x0020
|
|
|
|
//
|
|
// Extension (used by memory allocation lib)
|
|
//
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_PAGES 0x8001
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_PAGES 0x8011
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_PAGES 0x8021
|
|
#define MEMORY_PROFILE_ACTION_LIB_FREE_PAGES 0x8002
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_PAGES 0x8041
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_RUNTIME_PAGES 0x8051
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_RESERVED_PAGES 0x8061
|
|
#define MEMORY_PROFILE_ACTION_LIB_FREE_ALIGNED_PAGES 0x8042
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_POOL 0x8003
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_POOL 0x8013
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_POOL 0x8023
|
|
#define MEMORY_PROFILE_ACTION_LIB_FREE_POOL 0x8004
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ZERO_POOL 0x8083
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_ZERO_POOL 0x8093
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_ZERO_POOL 0x80a3
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_COPY_POOL 0x8103
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_COPY_POOL 0x8113
|
|
#define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_COPY_POOL 0x8123
|
|
#define MEMORY_PROFILE_ACTION_LIB_REALLOCATE_POOL 0x8203
|
|
#define MEMORY_PROFILE_ACTION_LIB_REALLOCATE_RUNTIME_POOL 0x8213
|
|
#define MEMORY_PROFILE_ACTION_LIB_REALLOCATE_RESERVED_POOL 0x8223
|
|
|
|
//
|
|
// User defined: 0x80000000~0xFFFFFFFF
|
|
//
|
|
// NOTE: User defined action MUST OR the basic action,
|
|
// so that core can know the action is allocate or free,
|
|
// and the type is pages (can be freed partially)
|
|
// or pool (cannot be freed partially).
|
|
//
|
|
#define MEMORY_PROFILE_ACTION_USER_DEFINED_MASK 0x80000000
|
|
|
|
#define MEMORY_PROFILE_ALLOC_INFO_SIGNATURE SIGNATURE_32 ('M','P','A','I')
|
|
#define MEMORY_PROFILE_ALLOC_INFO_REVISION 0x0002
|
|
|
|
typedef struct {
|
|
MEMORY_PROFILE_COMMON_HEADER Header;
|
|
PHYSICAL_ADDRESS CallerAddress;
|
|
UINT32 SequenceId;
|
|
UINT8 Reserved[2];
|
|
UINT16 ActionStringOffset;
|
|
MEMORY_PROFILE_ACTION Action;
|
|
EFI_MEMORY_TYPE MemoryType;
|
|
PHYSICAL_ADDRESS Buffer;
|
|
UINT64 Size;
|
|
// CHAR8 ActionString[];
|
|
} 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_UNSUPPORTED Memory profile is unsupported.
|
|
@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 successfully.
|
|
@return EFI_UNSUPPORTED Memory profile is unsupported,
|
|
or memory profile for the image is not required.
|
|
@return EFI_OUT_OF_RESOURCES 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 successfully.
|
|
@return EFI_UNSUPPORTED Memory profile is unsupported,
|
|
or memory profile for the image is not required.
|
|
@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
|
|
);
|
|
|
|
#define MEMORY_PROFILE_RECORDING_ENABLE TRUE
|
|
#define MEMORY_PROFILE_RECORDING_DISABLE FALSE
|
|
|
|
/**
|
|
Get memory profile recording state.
|
|
|
|
@param[in] This The EDKII_MEMORY_PROFILE_PROTOCOL instance.
|
|
@param[out] RecordingState Recording state.
|
|
|
|
@return EFI_SUCCESS Memory profile recording state is returned.
|
|
@return EFI_UNSUPPORTED Memory profile is unsupported.
|
|
@return EFI_INVALID_PARAMETER RecordingState is NULL.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *EDKII_MEMORY_PROFILE_GET_RECORDING_STATE)(
|
|
IN EDKII_MEMORY_PROFILE_PROTOCOL *This,
|
|
OUT BOOLEAN *RecordingState
|
|
);
|
|
|
|
/**
|
|
Set memory profile recording state.
|
|
|
|
@param[in] This The EDKII_MEMORY_PROFILE_PROTOCOL instance.
|
|
@param[in] RecordingState Recording state.
|
|
|
|
@return EFI_SUCCESS Set memory profile recording state successfully.
|
|
@return EFI_UNSUPPORTED Memory profile is unsupported.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *EDKII_MEMORY_PROFILE_SET_RECORDING_STATE)(
|
|
IN EDKII_MEMORY_PROFILE_PROTOCOL *This,
|
|
IN BOOLEAN RecordingState
|
|
);
|
|
|
|
/**
|
|
Record memory profile of multilevel caller.
|
|
|
|
@param[in] This The EDKII_MEMORY_PROFILE_PROTOCOL instance.
|
|
@param[in] CallerAddress Address of caller.
|
|
@param[in] Action Memory profile action.
|
|
@param[in] MemoryType Memory type.
|
|
EfiMaxMemoryType means the MemoryType is unknown.
|
|
@param[in] Buffer Buffer address.
|
|
@param[in] Size Buffer size.
|
|
@param[in] ActionString String for memory profile action.
|
|
Only needed for user defined allocate action.
|
|
|
|
@return EFI_SUCCESS Memory profile is updated.
|
|
@return EFI_UNSUPPORTED Memory profile is unsupported,
|
|
or memory profile for the image is not required,
|
|
or memory profile for the memory type is not required.
|
|
@return EFI_ACCESS_DENIED It is during memory profile data getting.
|
|
@return EFI_ABORTED Memory profile recording is not enabled.
|
|
@return EFI_OUT_OF_RESOURCES No enough resource to update memory profile for allocate action.
|
|
@return EFI_NOT_FOUND No matched allocate info found for free action.
|
|
|
|
**/
|
|
typedef
|
|
EFI_STATUS
|
|
(EFIAPI *EDKII_MEMORY_PROFILE_RECORD)(
|
|
IN EDKII_MEMORY_PROFILE_PROTOCOL *This,
|
|
IN PHYSICAL_ADDRESS CallerAddress,
|
|
IN MEMORY_PROFILE_ACTION Action,
|
|
IN EFI_MEMORY_TYPE MemoryType,
|
|
IN VOID *Buffer,
|
|
IN UINTN Size,
|
|
IN CHAR8 *ActionString OPTIONAL
|
|
);
|
|
|
|
struct _EDKII_MEMORY_PROFILE_PROTOCOL {
|
|
EDKII_MEMORY_PROFILE_GET_DATA GetData;
|
|
EDKII_MEMORY_PROFILE_REGISTER_IMAGE RegisterImage;
|
|
EDKII_MEMORY_PROFILE_UNREGISTER_IMAGE UnregisterImage;
|
|
EDKII_MEMORY_PROFILE_GET_RECORDING_STATE GetRecordingState;
|
|
EDKII_MEMORY_PROFILE_SET_RECORDING_STATE SetRecordingState;
|
|
EDKII_MEMORY_PROFILE_RECORD Record;
|
|
};
|
|
|
|
//
|
|
// 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 have been deprecated. They may not be re-used.
|
|
//
|
|
#define SMRAM_PROFILE_COMMAND_DEPRECATED1 0x3
|
|
#define SMRAM_PROFILE_COMMAND_DEPRECATED2 0x4
|
|
|
|
#define SMRAM_PROFILE_COMMAND_GET_PROFILE_DATA_BY_OFFSET 0x5
|
|
#define SMRAM_PROFILE_COMMAND_GET_RECORDING_STATE 0x6
|
|
#define SMRAM_PROFILE_COMMAND_SET_RECORDING_STATE 0x7
|
|
|
|
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;
|
|
//
|
|
// On input, profile buffer size.
|
|
// On output, actual profile data size copied.
|
|
//
|
|
UINT64 ProfileSize;
|
|
PHYSICAL_ADDRESS ProfileBuffer;
|
|
//
|
|
// On input, profile buffer offset to copy.
|
|
// On output, next time profile buffer offset to copy.
|
|
//
|
|
UINT64 ProfileOffset;
|
|
} SMRAM_PROFILE_PARAMETER_GET_PROFILE_DATA_BY_OFFSET;
|
|
|
|
typedef struct {
|
|
SMRAM_PROFILE_PARAMETER_HEADER Header;
|
|
BOOLEAN RecordingState;
|
|
} SMRAM_PROFILE_PARAMETER_RECORDING_STATE;
|
|
|
|
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;
|
|
|
|
typedef EDKII_MEMORY_PROFILE_PROTOCOL EDKII_SMM_MEMORY_PROFILE_PROTOCOL;
|
|
|
|
#define EDKII_SMM_MEMORY_PROFILE_GUID {\
|
|
0xe22bbcca, 0x516a, 0x46a8, { 0x80, 0xe2, 0x67, 0x45, 0xe8, 0x36, 0x93, 0xbd } \
|
|
}
|
|
|
|
extern EFI_GUID gEdkiiSmmMemoryProfileGuid;
|
|
|
|
#endif
|