Home | History | Annotate | Download | only in Guid
      1 /** @file
      2   Memory profile data structure.
      3 
      4   Copyright (c) 2014 - 2016, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials
      6   are licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef _MEMORY_PROFILE_H_
     16 #define _MEMORY_PROFILE_H_
     17 
     18 #include <Pi/PiFirmwareFile.h>
     19 
     20 //
     21 // For BIOS MemoryType (0 ~ EfiMaxMemoryType - 1), it is recorded in UsageByType[MemoryType]. (Each valid entry has one entry)
     22 // For OS MemoryType (0x80000000 ~ 0xFFFFFFFF), it is recorded in UsageByType[EfiMaxMemoryType]. (All types are combined into one entry)
     23 // For OEM MemoryType (0x70000000 ~ 0x7FFFFFFF), it is recorded in UsageByType[EfiMaxMemoryType + 1]. (All types are combined into one entry)
     24 //
     25 
     26 typedef struct {
     27   UINT32                       Signature;
     28   UINT16                       Length;
     29   UINT16                       Revision;
     30 } MEMORY_PROFILE_COMMON_HEADER;
     31 
     32 #define MEMORY_PROFILE_CONTEXT_SIGNATURE SIGNATURE_32 ('M','P','C','T')
     33 #define MEMORY_PROFILE_CONTEXT_REVISION 0x0002
     34 
     35 typedef struct {
     36   MEMORY_PROFILE_COMMON_HEADER  Header;
     37   UINT64                        CurrentTotalUsage;
     38   UINT64                        PeakTotalUsage;
     39   UINT64                        CurrentTotalUsageByType[EfiMaxMemoryType + 2];
     40   UINT64                        PeakTotalUsageByType[EfiMaxMemoryType + 2];
     41   UINT64                        TotalImageSize;
     42   UINT32                        ImageCount;
     43   UINT32                        SequenceCount;
     44 } MEMORY_PROFILE_CONTEXT;
     45 
     46 #define MEMORY_PROFILE_DRIVER_INFO_SIGNATURE SIGNATURE_32 ('M','P','D','I')
     47 #define MEMORY_PROFILE_DRIVER_INFO_REVISION 0x0003
     48 
     49 typedef struct {
     50   MEMORY_PROFILE_COMMON_HEADER  Header;
     51   EFI_GUID                      FileName;
     52   PHYSICAL_ADDRESS              ImageBase;
     53   UINT64                        ImageSize;
     54   PHYSICAL_ADDRESS              EntryPoint;
     55   UINT16                        ImageSubsystem;
     56   EFI_FV_FILETYPE               FileType;
     57   UINT8                         Reserved[1];
     58   UINT32                        AllocRecordCount;
     59   UINT64                        CurrentUsage;
     60   UINT64                        PeakUsage;
     61   UINT64                        CurrentUsageByType[EfiMaxMemoryType + 2];
     62   UINT64                        PeakUsageByType[EfiMaxMemoryType + 2];
     63   UINT16                        PdbStringOffset;
     64   UINT8                         Reserved2[6];
     65 //CHAR8                         PdbString[];
     66 } MEMORY_PROFILE_DRIVER_INFO;
     67 
     68 typedef enum {
     69   MemoryProfileActionAllocatePages = 1,
     70   MemoryProfileActionFreePages = 2,
     71   MemoryProfileActionAllocatePool = 3,
     72   MemoryProfileActionFreePool = 4,
     73 } MEMORY_PROFILE_ACTION;
     74 
     75 //
     76 // Below is the detailed MEMORY_PROFILE_ACTION definition.
     77 //
     78 //  31       15      9  8  8 7  7 6   6 5-4  3 - 0
     79 // +----------------------------------------------+
     80 // |User |  |Lib|   |Re|Copy|Zero|Align|Type|Basic|
     81 // +----------------------------------------------+
     82 //
     83 
     84 //
     85 // Basic Action
     86 //      1 : AllocatePages
     87 //      2 : FreePages
     88 //      3 : AllocatePool
     89 //      4 : FreePool
     90 //
     91 #define MEMORY_PROFILE_ACTION_BASIC_MASK 0xF
     92 
     93 //
     94 // Extension
     95 //
     96 #define MEMORY_PROFILE_ACTION_EXTENSION_MASK               0xFFF0
     97 #define MEMORY_PROFILE_ACTION_EXTENSION_LIB_MASK           0x8000
     98 #define MEMORY_PROFILE_ACTION_EXTENSION_REALLOC_MASK       0x0200
     99 #define MEMORY_PROFILE_ACTION_EXTENSION_COPY_MASK          0x0100
    100 #define MEMORY_PROFILE_ACTION_EXTENSION_ZERO_MASK          0x0080
    101 #define MEMORY_PROFILE_ACTION_EXTENSION_ALIGN_MASK         0x0040
    102 #define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_MASK      0x0030
    103 #define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_BASIC     0x0000
    104 #define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_RUNTIME   0x0010
    105 #define MEMORY_PROFILE_ACTION_EXTENSION_MEM_TYPE_RESERVED  0x0020
    106 
    107 //
    108 // Extension (used by memory allocation lib)
    109 //
    110 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_PAGES                    0x8001
    111 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_PAGES            0x8011
    112 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_PAGES           0x8021
    113 #define MEMORY_PROFILE_ACTION_LIB_FREE_PAGES                        0x8002
    114 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_PAGES            0x8041
    115 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_RUNTIME_PAGES    0x8051
    116 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ALIGNED_RESERVED_PAGES   0x8061
    117 #define MEMORY_PROFILE_ACTION_LIB_FREE_ALIGNED_PAGES                0x8042
    118 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_POOL                     0x8003
    119 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_POOL             0x8013
    120 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_POOL            0x8023
    121 #define MEMORY_PROFILE_ACTION_LIB_FREE_POOL                         0x8004
    122 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_ZERO_POOL                0x8083
    123 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_ZERO_POOL        0x8093
    124 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_ZERO_POOL       0x80a3
    125 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_COPY_POOL                0x8103
    126 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RUNTIME_COPY_POOL        0x8113
    127 #define MEMORY_PROFILE_ACTION_LIB_ALLOCATE_RESERVED_COPY_POOL       0x8123
    128 #define MEMORY_PROFILE_ACTION_LIB_REALLOCATE_POOL                   0x8203
    129 #define MEMORY_PROFILE_ACTION_LIB_REALLOCATE_RUNTIME_POOL           0x8213
    130 #define MEMORY_PROFILE_ACTION_LIB_REALLOCATE_RESERVED_POOL          0x8223
    131 
    132 //
    133 // User defined: 0x80000000~0xFFFFFFFF
    134 //
    135 // NOTE: User defined action MUST OR the basic action,
    136 //       so that core can know the action is allocate or free,
    137 //       and the type is pages (can be freed partially)
    138 //       or pool (cannot be freed partially).
    139 //
    140 #define MEMORY_PROFILE_ACTION_USER_DEFINED_MASK           0x80000000
    141 
    142 #define MEMORY_PROFILE_ALLOC_INFO_SIGNATURE SIGNATURE_32 ('M','P','A','I')
    143 #define MEMORY_PROFILE_ALLOC_INFO_REVISION 0x0002
    144 
    145 typedef struct {
    146   MEMORY_PROFILE_COMMON_HEADER  Header;
    147   PHYSICAL_ADDRESS              CallerAddress;
    148   UINT32                        SequenceId;
    149   UINT8                         Reserved[2];
    150   UINT16                        ActionStringOffset;
    151   MEMORY_PROFILE_ACTION         Action;
    152   EFI_MEMORY_TYPE               MemoryType;
    153   PHYSICAL_ADDRESS              Buffer;
    154   UINT64                        Size;
    155 //CHAR8                         ActionString[];
    156 } MEMORY_PROFILE_ALLOC_INFO;
    157 
    158 #define MEMORY_PROFILE_DESCRIPTOR_SIGNATURE SIGNATURE_32 ('M','P','D','R')
    159 #define MEMORY_PROFILE_DESCRIPTOR_REVISION 0x0001
    160 
    161 typedef struct {
    162   MEMORY_PROFILE_COMMON_HEADER  Header;
    163   PHYSICAL_ADDRESS              Address;
    164   UINT64                        Size;
    165 } MEMORY_PROFILE_DESCRIPTOR;
    166 
    167 #define MEMORY_PROFILE_FREE_MEMORY_SIGNATURE SIGNATURE_32 ('M','P','R','M')
    168 #define MEMORY_PROFILE_FREE_MEMORY_REVISION 0x0001
    169 
    170 typedef struct {
    171   MEMORY_PROFILE_COMMON_HEADER  Header;
    172   UINT64                        TotalFreeMemoryPages;
    173   UINT32                        FreeMemoryEntryCount;
    174   UINT8                         Reserved[4];
    175   //MEMORY_PROFILE_DESCRIPTOR     MemoryDescriptor[FreeMemoryEntryCount];
    176 } MEMORY_PROFILE_FREE_MEMORY;
    177 
    178 #define MEMORY_PROFILE_MEMORY_RANGE_SIGNATURE SIGNATURE_32 ('M','P','M','R')
    179 #define MEMORY_PROFILE_MEMORY_RANGE_REVISION 0x0001
    180 
    181 typedef struct {
    182   MEMORY_PROFILE_COMMON_HEADER  Header;
    183   UINT32                        MemoryRangeCount;
    184   UINT8                         Reserved[4];
    185   //MEMORY_PROFILE_DESCRIPTOR     MemoryDescriptor[MemoryRangeCount];
    186 } MEMORY_PROFILE_MEMORY_RANGE;
    187 
    188 //
    189 // UEFI memory profile layout:
    190 // +--------------------------------+
    191 // | CONTEXT                        |
    192 // +--------------------------------+
    193 // | DRIVER_INFO(1)                 |
    194 // +--------------------------------+
    195 // | ALLOC_INFO(1, 1)               |
    196 // +--------------------------------+
    197 // | ALLOC_INFO(1, m1)              |
    198 // +--------------------------------+
    199 // | DRIVER_INFO(n)                 |
    200 // +--------------------------------+
    201 // | ALLOC_INFO(n, 1)               |
    202 // +--------------------------------+
    203 // | ALLOC_INFO(n, mn)              |
    204 // +--------------------------------+
    205 //
    206 
    207 typedef struct _EDKII_MEMORY_PROFILE_PROTOCOL EDKII_MEMORY_PROFILE_PROTOCOL;
    208 
    209 /**
    210   Get memory profile data.
    211 
    212   @param[in]      This              The EDKII_MEMORY_PROFILE_PROTOCOL instance.
    213   @param[in, out] ProfileSize       On entry, points to the size in bytes of the ProfileBuffer.
    214                                     On return, points to the size of the data returned in ProfileBuffer.
    215   @param[out]     ProfileBuffer     Profile buffer.
    216 
    217   @return EFI_SUCCESS               Get the memory profile data successfully.
    218   @return EFI_UNSUPPORTED           Memory profile is unsupported.
    219   @return EFI_BUFFER_TO_SMALL       The ProfileSize is too small for the resulting data.
    220                                     ProfileSize is updated with the size required.
    221 
    222 **/
    223 typedef
    224 EFI_STATUS
    225 (EFIAPI *EDKII_MEMORY_PROFILE_GET_DATA)(
    226   IN     EDKII_MEMORY_PROFILE_PROTOCOL  *This,
    227   IN OUT UINT64                         *ProfileSize,
    228      OUT VOID                           *ProfileBuffer
    229   );
    230 
    231 /**
    232   Register image to memory profile.
    233 
    234   @param[in] This               The EDKII_MEMORY_PROFILE_PROTOCOL instance.
    235   @param[in] FilePath           File path of the image.
    236   @param[in] ImageBase          Image base address.
    237   @param[in] ImageSize          Image size.
    238   @param[in] FileType           File type of the image.
    239 
    240   @return EFI_SUCCESS           Register successfully.
    241   @return EFI_UNSUPPORTED       Memory profile is unsupported,
    242                                 or memory profile for the image is not required.
    243   @return EFI_OUT_OF_RESOURCES  No enough resource for this register.
    244 
    245 **/
    246 typedef
    247 EFI_STATUS
    248 (EFIAPI *EDKII_MEMORY_PROFILE_REGISTER_IMAGE)(
    249   IN EDKII_MEMORY_PROFILE_PROTOCOL      *This,
    250   IN EFI_DEVICE_PATH_PROTOCOL           *FilePath,
    251   IN PHYSICAL_ADDRESS                   ImageBase,
    252   IN UINT64                             ImageSize,
    253   IN EFI_FV_FILETYPE                    FileType
    254   );
    255 
    256 /**
    257   Unregister image from memory profile.
    258 
    259   @param[in] This               The EDKII_MEMORY_PROFILE_PROTOCOL instance.
    260   @param[in] FilePath           File path of the image.
    261   @param[in] ImageBase          Image base address.
    262   @param[in] ImageSize          Image size.
    263 
    264   @return EFI_SUCCESS           Unregister successfully.
    265   @return EFI_UNSUPPORTED       Memory profile is unsupported,
    266                                 or memory profile for the image is not required.
    267   @return EFI_NOT_FOUND         The image is not found.
    268 
    269 **/
    270 typedef
    271 EFI_STATUS
    272 (EFIAPI *EDKII_MEMORY_PROFILE_UNREGISTER_IMAGE)(
    273   IN EDKII_MEMORY_PROFILE_PROTOCOL      *This,
    274   IN EFI_DEVICE_PATH_PROTOCOL           *FilePath,
    275   IN PHYSICAL_ADDRESS                   ImageBase,
    276   IN UINT64                             ImageSize
    277   );
    278 
    279 #define MEMORY_PROFILE_RECORDING_ENABLE     TRUE
    280 #define MEMORY_PROFILE_RECORDING_DISABLE    FALSE
    281 
    282 /**
    283   Get memory profile recording state.
    284 
    285   @param[in]  This              The EDKII_MEMORY_PROFILE_PROTOCOL instance.
    286   @param[out] RecordingState    Recording state.
    287 
    288   @return EFI_SUCCESS           Memory profile recording state is returned.
    289   @return EFI_UNSUPPORTED       Memory profile is unsupported.
    290   @return EFI_INVALID_PARAMETER RecordingState is NULL.
    291 
    292 **/
    293 typedef
    294 EFI_STATUS
    295 (EFIAPI *EDKII_MEMORY_PROFILE_GET_RECORDING_STATE) (
    296   IN EDKII_MEMORY_PROFILE_PROTOCOL      *This,
    297   OUT BOOLEAN                           *RecordingState
    298   );
    299 
    300 /**
    301   Set memory profile recording state.
    302 
    303   @param[in] This               The EDKII_MEMORY_PROFILE_PROTOCOL instance.
    304   @param[in] RecordingState     Recording state.
    305 
    306   @return EFI_SUCCESS           Set memory profile recording state successfully.
    307   @return EFI_UNSUPPORTED       Memory profile is unsupported.
    308 
    309 **/
    310 typedef
    311 EFI_STATUS
    312 (EFIAPI *EDKII_MEMORY_PROFILE_SET_RECORDING_STATE) (
    313   IN EDKII_MEMORY_PROFILE_PROTOCOL      *This,
    314   IN BOOLEAN                            RecordingState
    315   );
    316 
    317 /**
    318   Record memory profile of multilevel caller.
    319 
    320   @param[in] This               The EDKII_MEMORY_PROFILE_PROTOCOL instance.
    321   @param[in] CallerAddress      Address of caller.
    322   @param[in] Action             Memory profile action.
    323   @param[in] MemoryType         Memory type.
    324                                 EfiMaxMemoryType means the MemoryType is unknown.
    325   @param[in] Buffer             Buffer address.
    326   @param[in] Size               Buffer size.
    327   @param[in] ActionString       String for memory profile action.
    328                                 Only needed for user defined allocate action.
    329 
    330   @return EFI_SUCCESS           Memory profile is updated.
    331   @return EFI_UNSUPPORTED       Memory profile is unsupported,
    332                                 or memory profile for the image is not required,
    333                                 or memory profile for the memory type is not required.
    334   @return EFI_ACCESS_DENIED     It is during memory profile data getting.
    335   @return EFI_ABORTED           Memory profile recording is not enabled.
    336   @return EFI_OUT_OF_RESOURCES  No enough resource to update memory profile for allocate action.
    337   @return EFI_NOT_FOUND         No matched allocate info found for free action.
    338 
    339 **/
    340 typedef
    341 EFI_STATUS
    342 (EFIAPI *EDKII_MEMORY_PROFILE_RECORD) (
    343   IN EDKII_MEMORY_PROFILE_PROTOCOL      *This,
    344   IN PHYSICAL_ADDRESS                   CallerAddress,
    345   IN MEMORY_PROFILE_ACTION              Action,
    346   IN EFI_MEMORY_TYPE                    MemoryType,
    347   IN VOID                               *Buffer,
    348   IN UINTN                              Size,
    349   IN CHAR8                              *ActionString OPTIONAL
    350   );
    351 
    352 struct _EDKII_MEMORY_PROFILE_PROTOCOL {
    353   EDKII_MEMORY_PROFILE_GET_DATA             GetData;
    354   EDKII_MEMORY_PROFILE_REGISTER_IMAGE       RegisterImage;
    355   EDKII_MEMORY_PROFILE_UNREGISTER_IMAGE     UnregisterImage;
    356   EDKII_MEMORY_PROFILE_GET_RECORDING_STATE  GetRecordingState;
    357   EDKII_MEMORY_PROFILE_SET_RECORDING_STATE  SetRecordingState;
    358   EDKII_MEMORY_PROFILE_RECORD               Record;
    359 };
    360 
    361 //
    362 // SMRAM profile layout:
    363 // +--------------------------------+
    364 // | CONTEXT                        |
    365 // +--------------------------------+
    366 // | DRIVER_INFO(1)                 |
    367 // +--------------------------------+
    368 // | ALLOC_INFO(1, 1)               |
    369 // +--------------------------------+
    370 // | ALLOC_INFO(1, m1)              |
    371 // +--------------------------------+
    372 // | DRIVER_INFO(n)                 |
    373 // +--------------------------------+
    374 // | ALLOC_INFO(n, 1)               |
    375 // +--------------------------------+
    376 // | ALLOC_INFO(n, mn)              |
    377 // +--------------------------------+
    378 // | FREE_MEMORY                    |
    379 // +--------------------------------+
    380 // | FREE MEMORY DESCRIPTOR(1)      |
    381 // +--------------------------------+
    382 // | FREE MEMORY DESCRIPTOR(p)      |
    383 // +--------------------------------+
    384 // | MEMORY_RANGE                   |
    385 // +--------------------------------+
    386 // | MEMORY RANGE DESCRIPTOR(1)     |
    387 // +--------------------------------+
    388 // | MEMORY RANGE DESCRIPTOR(q)     |
    389 // +--------------------------------+
    390 //
    391 
    392 //
    393 // SMRAM profile command
    394 //
    395 #define SMRAM_PROFILE_COMMAND_GET_PROFILE_INFO           0x1
    396 #define SMRAM_PROFILE_COMMAND_GET_PROFILE_DATA           0x2
    397 //
    398 // Below 2 commands are now used by ECP only and only valid before SmmReadyToLock
    399 //
    400 #define SMRAM_PROFILE_COMMAND_REGISTER_IMAGE             0x3
    401 #define SMRAM_PROFILE_COMMAND_UNREGISTER_IMAGE           0x4
    402 
    403 #define SMRAM_PROFILE_COMMAND_GET_PROFILE_DATA_BY_OFFSET 0x5
    404 #define SMRAM_PROFILE_COMMAND_GET_RECORDING_STATE        0x6
    405 #define SMRAM_PROFILE_COMMAND_SET_RECORDING_STATE        0x7
    406 
    407 typedef struct {
    408   UINT32                            Command;
    409   UINT32                            DataLength;
    410   UINT64                            ReturnStatus;
    411 } SMRAM_PROFILE_PARAMETER_HEADER;
    412 
    413 typedef struct {
    414   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    415   UINT64                            ProfileSize;
    416 } SMRAM_PROFILE_PARAMETER_GET_PROFILE_INFO;
    417 
    418 typedef struct {
    419   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    420   UINT64                            ProfileSize;
    421   PHYSICAL_ADDRESS                  ProfileBuffer;
    422 } SMRAM_PROFILE_PARAMETER_GET_PROFILE_DATA;
    423 
    424 typedef struct {
    425   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    426   //
    427   // On input, profile buffer size.
    428   // On output, actual profile data size copied.
    429   //
    430   UINT64                            ProfileSize;
    431   PHYSICAL_ADDRESS                  ProfileBuffer;
    432   //
    433   // On input, profile buffer offset to copy.
    434   // On output, next time profile buffer offset to copy.
    435   //
    436   UINT64                            ProfileOffset;
    437 } SMRAM_PROFILE_PARAMETER_GET_PROFILE_DATA_BY_OFFSET;
    438 
    439 typedef struct {
    440   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    441   BOOLEAN                           RecordingState;
    442 } SMRAM_PROFILE_PARAMETER_RECORDING_STATE;
    443 
    444 typedef struct {
    445   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    446   EFI_GUID                          FileName;
    447   PHYSICAL_ADDRESS                  ImageBuffer;
    448   UINT64                            NumberOfPage;
    449 } SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE;
    450 
    451 typedef struct {
    452   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    453   EFI_GUID                          FileName;
    454   PHYSICAL_ADDRESS                  ImageBuffer;
    455   UINT64                            NumberOfPage;
    456 } SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE;
    457 
    458 
    459 #define EDKII_MEMORY_PROFILE_GUID { \
    460   0x821c9a09, 0x541a, 0x40f6, { 0x9f, 0x43, 0xa, 0xd1, 0x93, 0xa1, 0x2c, 0xfe } \
    461 }
    462 
    463 extern EFI_GUID gEdkiiMemoryProfileGuid;
    464 
    465 typedef EDKII_MEMORY_PROFILE_PROTOCOL EDKII_SMM_MEMORY_PROFILE_PROTOCOL;
    466 
    467 #define EDKII_SMM_MEMORY_PROFILE_GUID { \
    468   0xe22bbcca, 0x516a, 0x46a8, { 0x80, 0xe2, 0x67, 0x45, 0xe8, 0x36, 0x93, 0xbd } \
    469 }
    470 
    471 extern EFI_GUID gEdkiiSmmMemoryProfileGuid;
    472 
    473 #endif
    474 
    475