]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Include/Guid/MemoryProfile.h
MdeModulePkg SmiHandlerProfile: Use fixed data type in data structure
[mirror_edk2.git] / MdeModulePkg / Include / Guid / MemoryProfile.h
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