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
24typedef 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
33typedef 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
47typedef 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
63typedef 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
73typedef 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
87typedef 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
96typedef 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
107typedef 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
133typedef 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**/
148typedef
149EFI_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**/
169typedef
170EFI_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**/
191typedef
192EFI_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
200struct _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
248typedef struct {
249  UINT32                            Command;
250  UINT32                            DataLength;
251  UINT64                            ReturnStatus;
252} SMRAM_PROFILE_PARAMETER_HEADER;
253
254typedef struct {
255  SMRAM_PROFILE_PARAMETER_HEADER    Header;
256  UINT64                            ProfileSize;
257} SMRAM_PROFILE_PARAMETER_GET_PROFILE_INFO;
258
259typedef struct {
260  SMRAM_PROFILE_PARAMETER_HEADER    Header;
261  UINT64                            ProfileSize;
262  PHYSICAL_ADDRESS                  ProfileBuffer;
263} SMRAM_PROFILE_PARAMETER_GET_PROFILE_DATA;
264
265typedef 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
272typedef 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
284extern EFI_GUID gEdkiiMemoryProfileGuid;
285
286#endif
287
288