Home | History | Annotate | Download | only in Guid
      1 /** @file
      2   Memory profile data structure.
      3 
      4   Copyright (c) 2014 - 2015, 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 //
     19 // For BIOS MemoryType (0 ~ EfiMaxMemoryType - 1), it is recorded in UsageByType[MemoryType]. (Each valid entry has one entry)
     20 // For OS MemoryType (0x80000000 ~ 0xFFFFFFFF), it is recorded in UsageByType[EfiMaxMemoryType]. (All types are combined into one entry)
     21 // For OEM MemoryType (0x70000000 ~ 0x7FFFFFFF), it is recorded in UsageByType[EfiMaxMemoryType + 1]. (All types are combined into one entry)
     22 //
     23 
     24 typedef struct {
     25   UINT32                       Signature;
     26   UINT16                       Length;
     27   UINT16                       Revision;
     28 } MEMORY_PROFILE_COMMON_HEADER;
     29 
     30 #define MEMORY_PROFILE_CONTEXT_SIGNATURE SIGNATURE_32 ('M','P','C','T')
     31 #define MEMORY_PROFILE_CONTEXT_REVISION 0x0002
     32 
     33 typedef struct {
     34   MEMORY_PROFILE_COMMON_HEADER  Header;
     35   UINT64                        CurrentTotalUsage;
     36   UINT64                        PeakTotalUsage;
     37   UINT64                        CurrentTotalUsageByType[EfiMaxMemoryType + 2];
     38   UINT64                        PeakTotalUsageByType[EfiMaxMemoryType + 2];
     39   UINT64                        TotalImageSize;
     40   UINT32                        ImageCount;
     41   UINT32                        SequenceCount;
     42 } MEMORY_PROFILE_CONTEXT;
     43 
     44 #define MEMORY_PROFILE_DRIVER_INFO_SIGNATURE SIGNATURE_32 ('M','P','D','I')
     45 #define MEMORY_PROFILE_DRIVER_INFO_REVISION 0x0002
     46 
     47 typedef struct {
     48   MEMORY_PROFILE_COMMON_HEADER  Header;
     49   EFI_GUID                      FileName;
     50   PHYSICAL_ADDRESS              ImageBase;
     51   UINT64                        ImageSize;
     52   PHYSICAL_ADDRESS              EntryPoint;
     53   UINT16                        ImageSubsystem;
     54   EFI_FV_FILETYPE               FileType;
     55   UINT8                         Reserved[1];
     56   UINT32                        AllocRecordCount;
     57   UINT64                        CurrentUsage;
     58   UINT64                        PeakUsage;
     59   UINT64                        CurrentUsageByType[EfiMaxMemoryType + 2];
     60   UINT64                        PeakUsageByType[EfiMaxMemoryType + 2];
     61 } MEMORY_PROFILE_DRIVER_INFO;
     62 
     63 typedef enum {
     64   MemoryProfileActionAllocatePages = 1,
     65   MemoryProfileActionFreePages = 2,
     66   MemoryProfileActionAllocatePool = 3,
     67   MemoryProfileActionFreePool = 4,
     68 } MEMORY_PROFILE_ACTION;
     69 
     70 #define MEMORY_PROFILE_ALLOC_INFO_SIGNATURE SIGNATURE_32 ('M','P','A','I')
     71 #define MEMORY_PROFILE_ALLOC_INFO_REVISION 0x0001
     72 
     73 typedef struct {
     74   MEMORY_PROFILE_COMMON_HEADER  Header;
     75   PHYSICAL_ADDRESS              CallerAddress;
     76   UINT32                        SequenceId;
     77   UINT8                         Reserved[4];
     78   MEMORY_PROFILE_ACTION         Action;
     79   EFI_MEMORY_TYPE               MemoryType;
     80   PHYSICAL_ADDRESS              Buffer;
     81   UINT64                        Size;
     82 } MEMORY_PROFILE_ALLOC_INFO;
     83 
     84 #define MEMORY_PROFILE_DESCRIPTOR_SIGNATURE SIGNATURE_32 ('M','P','D','R')
     85 #define MEMORY_PROFILE_DESCRIPTOR_REVISION 0x0001
     86 
     87 typedef struct {
     88   MEMORY_PROFILE_COMMON_HEADER  Header;
     89   PHYSICAL_ADDRESS              Address;
     90   UINT64                        Size;
     91 } MEMORY_PROFILE_DESCRIPTOR;
     92 
     93 #define MEMORY_PROFILE_FREE_MEMORY_SIGNATURE SIGNATURE_32 ('M','P','R','M')
     94 #define MEMORY_PROFILE_FREE_MEMORY_REVISION 0x0001
     95 
     96 typedef struct {
     97   MEMORY_PROFILE_COMMON_HEADER  Header;
     98   UINT64                        TotalFreeMemoryPages;
     99   UINT32                        FreeMemoryEntryCount;
    100   UINT8                         Reserved[4];
    101   //MEMORY_PROFILE_DESCRIPTOR     MemoryDescriptor[FreeMemoryEntryCount];
    102 } MEMORY_PROFILE_FREE_MEMORY;
    103 
    104 #define MEMORY_PROFILE_MEMORY_RANGE_SIGNATURE SIGNATURE_32 ('M','P','M','R')
    105 #define MEMORY_PROFILE_MEMORY_RANGE_REVISION 0x0001
    106 
    107 typedef struct {
    108   MEMORY_PROFILE_COMMON_HEADER  Header;
    109   UINT32                        MemoryRangeCount;
    110   UINT8                         Reserved[4];
    111   //MEMORY_PROFILE_DESCRIPTOR     MemoryDescriptor[MemoryRangeCount];
    112 } MEMORY_PROFILE_MEMORY_RANGE;
    113 
    114 //
    115 // UEFI memory profile layout:
    116 // +--------------------------------+
    117 // | CONTEXT                        |
    118 // +--------------------------------+
    119 // | DRIVER_INFO(1)                 |
    120 // +--------------------------------+
    121 // | ALLOC_INFO(1, 1)               |
    122 // +--------------------------------+
    123 // | ALLOC_INFO(1, m1)              |
    124 // +--------------------------------+
    125 // | DRIVER_INFO(n)                 |
    126 // +--------------------------------+
    127 // | ALLOC_INFO(n, 1)               |
    128 // +--------------------------------+
    129 // | ALLOC_INFO(n, mn)              |
    130 // +--------------------------------+
    131 //
    132 
    133 typedef struct _EDKII_MEMORY_PROFILE_PROTOCOL EDKII_MEMORY_PROFILE_PROTOCOL;
    134 
    135 /**
    136   Get memory profile data.
    137 
    138   @param[in]      This              The EDKII_MEMORY_PROFILE_PROTOCOL instance.
    139   @param[in, out] ProfileSize       On entry, points to the size in bytes of the ProfileBuffer.
    140                                     On return, points to the size of the data returned in ProfileBuffer.
    141   @param[out]     ProfileBuffer     Profile buffer.
    142 
    143   @return EFI_SUCCESS               Get the memory profile data successfully.
    144   @return EFI_BUFFER_TO_SMALL       The ProfileSize is too small for the resulting data.
    145                                     ProfileSize is updated with the size required.
    146 
    147 **/
    148 typedef
    149 EFI_STATUS
    150 (EFIAPI *EDKII_MEMORY_PROFILE_GET_DATA)(
    151   IN     EDKII_MEMORY_PROFILE_PROTOCOL  *This,
    152   IN OUT UINT64                         *ProfileSize,
    153      OUT VOID                           *ProfileBuffer
    154   );
    155 
    156 /**
    157   Register image to memory profile.
    158 
    159   @param[in] This               The EDKII_MEMORY_PROFILE_PROTOCOL instance.
    160   @param[in] FilePath           File path of the image.
    161   @param[in] ImageBase          Image base address.
    162   @param[in] ImageSize          Image size.
    163   @param[in] FileType           File type of the image.
    164 
    165   @return EFI_SUCCESS           Register success.
    166   @return EFI_OUT_OF_RESOURCE   No enough resource for this register.
    167 
    168 **/
    169 typedef
    170 EFI_STATUS
    171 (EFIAPI *EDKII_MEMORY_PROFILE_REGISTER_IMAGE)(
    172   IN EDKII_MEMORY_PROFILE_PROTOCOL      *This,
    173   IN EFI_DEVICE_PATH_PROTOCOL           *FilePath,
    174   IN PHYSICAL_ADDRESS                   ImageBase,
    175   IN UINT64                             ImageSize,
    176   IN EFI_FV_FILETYPE                    FileType
    177   );
    178 
    179 /**
    180   Unregister image from memory profile.
    181 
    182   @param[in] This               The EDKII_MEMORY_PROFILE_PROTOCOL instance.
    183   @param[in] FilePath           File path of the image.
    184   @param[in] ImageBase          Image base address.
    185   @param[in] ImageSize          Image size.
    186 
    187   @return EFI_SUCCESS           Unregister success.
    188   @return EFI_NOT_FOUND         The image is not found.
    189 
    190 **/
    191 typedef
    192 EFI_STATUS
    193 (EFIAPI *EDKII_MEMORY_PROFILE_UNREGISTER_IMAGE)(
    194   IN EDKII_MEMORY_PROFILE_PROTOCOL      *This,
    195   IN EFI_DEVICE_PATH_PROTOCOL           *FilePath,
    196   IN PHYSICAL_ADDRESS                   ImageBase,
    197   IN UINT64                             ImageSize
    198   );
    199 
    200 struct _EDKII_MEMORY_PROFILE_PROTOCOL {
    201   EDKII_MEMORY_PROFILE_GET_DATA         GetData;
    202   EDKII_MEMORY_PROFILE_REGISTER_IMAGE   RegisterImage;
    203   EDKII_MEMORY_PROFILE_UNREGISTER_IMAGE UnregisterImage;
    204 };
    205 
    206 //
    207 // SMRAM profile layout:
    208 // +--------------------------------+
    209 // | CONTEXT                        |
    210 // +--------------------------------+
    211 // | DRIVER_INFO(1)                 |
    212 // +--------------------------------+
    213 // | ALLOC_INFO(1, 1)               |
    214 // +--------------------------------+
    215 // | ALLOC_INFO(1, m1)              |
    216 // +--------------------------------+
    217 // | DRIVER_INFO(n)                 |
    218 // +--------------------------------+
    219 // | ALLOC_INFO(n, 1)               |
    220 // +--------------------------------+
    221 // | ALLOC_INFO(n, mn)              |
    222 // +--------------------------------+
    223 // | FREE_MEMORY                    |
    224 // +--------------------------------+
    225 // | FREE MEMORY DESCRIPTOR(1)      |
    226 // +--------------------------------+
    227 // | FREE MEMORY DESCRIPTOR(p)      |
    228 // +--------------------------------+
    229 // | MEMORY_RANGE                   |
    230 // +--------------------------------+
    231 // | MEMORY RANGE DESCRIPTOR(1)     |
    232 // +--------------------------------+
    233 // | MEMORY RANGE DESCRIPTOR(q)     |
    234 // +--------------------------------+
    235 //
    236 
    237 //
    238 // SMRAM profile command
    239 //
    240 #define SMRAM_PROFILE_COMMAND_GET_PROFILE_INFO         0x1
    241 #define SMRAM_PROFILE_COMMAND_GET_PROFILE_DATA         0x2
    242 //
    243 // Below 2 commands are now used by ECP only and only valid before SmmReadyToLock
    244 //
    245 #define SMRAM_PROFILE_COMMAND_REGISTER_IMAGE           0x3
    246 #define SMRAM_PROFILE_COMMAND_UNREGISTER_IMAGE         0x4
    247 
    248 typedef struct {
    249   UINT32                            Command;
    250   UINT32                            DataLength;
    251   UINT64                            ReturnStatus;
    252 } SMRAM_PROFILE_PARAMETER_HEADER;
    253 
    254 typedef struct {
    255   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    256   UINT64                            ProfileSize;
    257 } SMRAM_PROFILE_PARAMETER_GET_PROFILE_INFO;
    258 
    259 typedef struct {
    260   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    261   UINT64                            ProfileSize;
    262   PHYSICAL_ADDRESS                  ProfileBuffer;
    263 } SMRAM_PROFILE_PARAMETER_GET_PROFILE_DATA;
    264 
    265 typedef struct {
    266   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    267   EFI_GUID                          FileName;
    268   PHYSICAL_ADDRESS                  ImageBuffer;
    269   UINT64                            NumberOfPage;
    270 } SMRAM_PROFILE_PARAMETER_REGISTER_IMAGE;
    271 
    272 typedef struct {
    273   SMRAM_PROFILE_PARAMETER_HEADER    Header;
    274   EFI_GUID                          FileName;
    275   PHYSICAL_ADDRESS                  ImageBuffer;
    276   UINT64                            NumberOfPage;
    277 } SMRAM_PROFILE_PARAMETER_UNREGISTER_IMAGE;
    278 
    279 
    280 #define EDKII_MEMORY_PROFILE_GUID { \
    281   0x821c9a09, 0x541a, 0x40f6, 0x9f, 0x43, 0xa, 0xd1, 0x93, 0xa1, 0x2c, 0xfe \
    282 }
    283 
    284 extern EFI_GUID gEdkiiMemoryProfileGuid;
    285 
    286 #endif
    287 
    288