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