]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Include/Guid/MemoryProfile.h
a2f03256c317715e144bc2f414cc3083f728810b
[mirror_edk2.git] / MdeModulePkg / Include / Guid / MemoryProfile.h
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