1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466
|
/** @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
|