]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c
MdeModulePkg: Update Dxe to handle unaccepted memory type
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / MemMap.c
... / ...
CommitLineData
1/** @file\r
2 Main file for Mode shell Debug1 function.\r
3\r
4 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
5 (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
6 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
8\r
9**/\r
10\r
11//\r
12// Need full names for Standard-Format Output\r
13//\r
14STATIC CONST CHAR16 NameEfiReservedMemoryType[] = L"Reserved";\r
15STATIC CONST CHAR16 NameEfiLoaderCode[] = L"LoaderCode";\r
16STATIC CONST CHAR16 NameEfiLoaderData[] = L"LoaderData";\r
17STATIC CONST CHAR16 NameEfiBootServicesCode[] = L"BootServiceCode";\r
18STATIC CONST CHAR16 NameEfiBootServicesData[] = L"BootServiceData";\r
19STATIC CONST CHAR16 NameEfiRuntimeServicesCode[] = L"RuntimeCode";\r
20STATIC CONST CHAR16 NameEfiRuntimeServicesData[] = L"RuntimeData";\r
21STATIC CONST CHAR16 NameEfiConventionalMemory[] = L"Available";\r
22STATIC CONST CHAR16 NameEfiPersistentMemory[] = L"Persistent";\r
23STATIC CONST CHAR16 NameEfiUnusableMemory[] = L"UnusableMemory";\r
24STATIC CONST CHAR16 NameEfiACPIReclaimMemory[] = L"ACPIReclaimMemory";\r
25STATIC CONST CHAR16 NameEfiACPIMemoryNVS[] = L"ACPIMemoryNVS";\r
26STATIC CONST CHAR16 NameEfiMemoryMappedIO[] = L"MemoryMappedIO";\r
27STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpace[] = L"MemoryMappedIOPortSpace";\r
28STATIC CONST CHAR16 NameEfiPalCode[] = L"PalCode";\r
29\r
30//\r
31// Need short names for some memory types\r
32//\r
33STATIC CONST CHAR16 NameEfiBootServicesCodeShort[] = L"BS_Code";\r
34STATIC CONST CHAR16 NameEfiBootServicesDataShort[] = L"BS_Data";\r
35STATIC CONST CHAR16 NameEfiRuntimeServicesCodeShort[] = L"RT_Code";\r
36STATIC CONST CHAR16 NameEfiRuntimeServicesDataShort[] = L"RT_Data";\r
37STATIC CONST CHAR16 NameEfiUnusableMemoryShort[] = L"Unusable";\r
38STATIC CONST CHAR16 NameEfiACPIReclaimMemoryShort[] = L"ACPI_Recl";\r
39STATIC CONST CHAR16 NameEfiACPIMemoryNVSShort[] = L"ACPI_NVS";\r
40STATIC CONST CHAR16 NameEfiMemoryMappedIOShort[] = L"MMIO";\r
41STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpaceShort[] = L"MMIO_Port";\r
42\r
43#include "UefiShellDebug1CommandsLib.h"\r
44\r
45typedef struct {\r
46 UINT32 Type;\r
47 UINT64 NumberOfPages;\r
48 LIST_ENTRY Link;\r
49} MEMORY_LENGTH_ENTRY;\r
50\r
51/**\r
52 Add the length of the specified type to List.\r
53\r
54 @param List A list to hold all pairs of <Type, NumberOfPages>.\r
55 @param Type Memory type.\r
56 @param NumberOfPages Number of pages.\r
57**/\r
58VOID\r
59AddMemoryLength (\r
60 LIST_ENTRY *List,\r
61 UINT32 Type,\r
62 UINT64 NumberOfPages\r
63 )\r
64{\r
65 MEMORY_LENGTH_ENTRY *Entry;\r
66 MEMORY_LENGTH_ENTRY *NewEntry;\r
67 LIST_ENTRY *Link;\r
68\r
69 Entry = NULL;\r
70 for (Link = GetFirstNode (List); !IsNull (List, Link); Link = GetNextNode (List, Link)) {\r
71 Entry = BASE_CR (Link, MEMORY_LENGTH_ENTRY, Link);\r
72 if (Entry->Type >= Type) {\r
73 break;\r
74 }\r
75 }\r
76\r
77 if ((Entry != NULL) && (Entry->Type == Type)) {\r
78 //\r
79 // The Entry is the one we look for.\r
80 //\r
81 NewEntry = Entry;\r
82 } else {\r
83 //\r
84 // The search operation breaks due to:\r
85 // 1. Type of every entry < Type --> Insert to tail\r
86 // 2. Type of an entry > Type --> Insert to previous of this entry\r
87 //\r
88 NewEntry = AllocatePool (sizeof (*NewEntry));\r
89 if (NewEntry == NULL) {\r
90 return;\r
91 }\r
92\r
93 NewEntry->Type = Type;\r
94 NewEntry->NumberOfPages = 0;\r
95 InsertTailList (Link, &NewEntry->Link);\r
96 }\r
97\r
98 NewEntry->NumberOfPages += NumberOfPages;\r
99}\r
100\r
101/**\r
102 Function for 'memmap' command.\r
103\r
104 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
105 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
106**/\r
107SHELL_STATUS\r
108EFIAPI\r
109ShellCommandRunMemMap (\r
110 IN EFI_HANDLE ImageHandle,\r
111 IN EFI_SYSTEM_TABLE *SystemTable\r
112 )\r
113{\r
114 EFI_STATUS Status;\r
115 LIST_ENTRY *Package;\r
116 CHAR16 *ProblemParam;\r
117 SHELL_STATUS ShellStatus;\r
118 UINTN Size;\r
119 EFI_MEMORY_DESCRIPTOR *Descriptors;\r
120 UINTN MapKey;\r
121 UINTN ItemSize;\r
122 UINT32 Version;\r
123 EFI_MEMORY_DESCRIPTOR *Walker;\r
124 UINT64 ReservedPages;\r
125 UINT64 LoadCodePages;\r
126 UINT64 LoadDataPages;\r
127 UINT64 BSCodePages;\r
128 UINT64 BSDataPages;\r
129 UINT64 RTDataPages;\r
130 UINT64 RTCodePages;\r
131 UINT64 AvailPages;\r
132 UINT64 TotalPages;\r
133 UINT64 ReservedPagesSize;\r
134 UINT64 LoadCodePagesSize;\r
135 UINT64 LoadDataPagesSize;\r
136 UINT64 BSCodePagesSize;\r
137 UINT64 BSDataPagesSize;\r
138 UINT64 RTDataPagesSize;\r
139 UINT64 RTCodePagesSize;\r
140 UINT64 AvailPagesSize;\r
141 UINT64 TotalPagesSize;\r
142 UINT64 AcpiReclaimPages;\r
143 UINT64 AcpiNvsPages;\r
144 UINT64 MmioSpacePages;\r
145 UINT64 AcpiReclaimPagesSize;\r
146 UINT64 AcpiNvsPagesSize;\r
147 UINT64 MmioSpacePagesSize;\r
148 UINT64 MmioPortPages;\r
149 UINT64 MmioPortPagesSize;\r
150 UINT64 UnusableMemoryPages;\r
151 UINT64 UnusableMemoryPagesSize;\r
152 UINT64 PalCodePages;\r
153 UINT64 PalCodePagesSize;\r
154 UINT64 PersistentPages;\r
155 UINT64 PersistentPagesSize;\r
156 BOOLEAN Sfo;\r
157 LIST_ENTRY MemoryList;\r
158 MEMORY_LENGTH_ENTRY *Entry;\r
159 LIST_ENTRY *Link;\r
160\r
161 AcpiReclaimPages = 0;\r
162 AcpiNvsPages = 0;\r
163 MmioSpacePages = 0;\r
164 TotalPages = 0;\r
165 ReservedPages = 0;\r
166 LoadCodePages = 0;\r
167 LoadDataPages = 0;\r
168 BSCodePages = 0;\r
169 BSDataPages = 0;\r
170 RTDataPages = 0;\r
171 RTCodePages = 0;\r
172 AvailPages = 0;\r
173 MmioPortPages = 0;\r
174 UnusableMemoryPages = 0;\r
175 PalCodePages = 0;\r
176 PersistentPages = 0;\r
177 Size = 0;\r
178 Descriptors = NULL;\r
179 ShellStatus = SHELL_SUCCESS;\r
180 Status = EFI_SUCCESS;\r
181 InitializeListHead (&MemoryList);\r
182\r
183 //\r
184 // initialize the shell lib (we must be in non-auto-init...)\r
185 //\r
186 Status = ShellInitialize ();\r
187 ASSERT_EFI_ERROR (Status);\r
188\r
189 Status = CommandInit ();\r
190 ASSERT_EFI_ERROR (Status);\r
191\r
192 //\r
193 // parse the command line\r
194 //\r
195 Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE);\r
196 if (EFI_ERROR (Status)) {\r
197 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
198 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"memmap", ProblemParam);\r
199 FreePool (ProblemParam);\r
200 ShellStatus = SHELL_INVALID_PARAMETER;\r
201 } else {\r
202 ASSERT (FALSE);\r
203 }\r
204 } else {\r
205 if (ShellCommandLineGetCount (Package) > 1) {\r
206 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"memmap");\r
207 ShellStatus = SHELL_INVALID_PARAMETER;\r
208 } else {\r
209 Status = gBS->GetMemoryMap (&Size, Descriptors, &MapKey, &ItemSize, &Version);\r
210 if (Status == EFI_BUFFER_TOO_SMALL) {\r
211 Size += SIZE_1KB;\r
212 Descriptors = AllocateZeroPool (Size);\r
213 Status = gBS->GetMemoryMap (&Size, Descriptors, &MapKey, &ItemSize, &Version);\r
214 }\r
215\r
216 if (EFI_ERROR (Status)) {\r
217 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_GET_FAILED), gShellDebug1HiiHandle, L"memmap");\r
218 ShellStatus = SHELL_ACCESS_DENIED;\r
219 } else {\r
220 ASSERT (Version == EFI_MEMORY_DESCRIPTOR_VERSION);\r
221\r
222 Sfo = ShellCommandLineGetFlag (Package, L"-sfo");\r
223 if (!Sfo) {\r
224 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_HEAD), gShellDebug1HiiHandle);\r
225 } else {\r
226 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellDebug1HiiHandle, L"memmap");\r
227 }\r
228\r
229 for ( Walker = Descriptors\r
230 ; (Walker < (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Descriptors + Size)) && (Walker != NULL)\r
231 ; Walker = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Walker + ItemSize)\r
232 )\r
233 {\r
234 switch (Walker->Type) {\r
235 case EfiReservedMemoryType:\r
236 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiReservedMemoryType, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
237 ReservedPages += Walker->NumberOfPages;\r
238 break;\r
239 case EfiLoaderCode:\r
240 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
241 LoadCodePages += Walker->NumberOfPages;\r
242 TotalPages += Walker->NumberOfPages;\r
243 break;\r
244 case EfiLoaderData:\r
245 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderData, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
246 LoadDataPages += Walker->NumberOfPages;\r
247 TotalPages += Walker->NumberOfPages;\r
248 break;\r
249 case EfiBootServicesCode:\r
250 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiBootServicesCodeShort : NameEfiBootServicesCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
251 BSCodePages += Walker->NumberOfPages;\r
252 TotalPages += Walker->NumberOfPages;\r
253 break;\r
254 case EfiBootServicesData:\r
255 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiBootServicesDataShort : NameEfiBootServicesData, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
256 BSDataPages += Walker->NumberOfPages;\r
257 TotalPages += Walker->NumberOfPages;\r
258 break;\r
259 case EfiRuntimeServicesCode:\r
260 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiRuntimeServicesCodeShort : NameEfiRuntimeServicesCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
261 RTCodePages += Walker->NumberOfPages;\r
262 TotalPages += Walker->NumberOfPages;\r
263 break;\r
264 case EfiRuntimeServicesData:\r
265 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiRuntimeServicesDataShort : NameEfiRuntimeServicesData, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
266 RTDataPages += Walker->NumberOfPages;\r
267 TotalPages += Walker->NumberOfPages;\r
268 break;\r
269 case EfiConventionalMemory:\r
270 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiConventionalMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
271 AvailPages += Walker->NumberOfPages;\r
272 TotalPages += Walker->NumberOfPages;\r
273 break;\r
274 case EfiPersistentMemory:\r
275 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiPersistentMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
276 PersistentPages += Walker->NumberOfPages;\r
277 TotalPages += Walker->NumberOfPages;\r
278 break;\r
279 case EfiUnusableMemory:\r
280 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiUnusableMemoryShort : NameEfiUnusableMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
281 UnusableMemoryPages += Walker->NumberOfPages;\r
282 break;\r
283 case EfiACPIReclaimMemory:\r
284 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiACPIReclaimMemoryShort : NameEfiACPIReclaimMemory, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
285 TotalPages += Walker->NumberOfPages;\r
286 AcpiReclaimPages += Walker->NumberOfPages;\r
287 break;\r
288 case EfiACPIMemoryNVS:\r
289 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiACPIMemoryNVSShort : NameEfiACPIMemoryNVS, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
290 TotalPages += Walker->NumberOfPages;\r
291 AcpiNvsPages += Walker->NumberOfPages;\r
292 break;\r
293 case EfiMemoryMappedIO:\r
294 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiMemoryMappedIOShort : NameEfiMemoryMappedIO, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
295 MmioSpacePages += Walker->NumberOfPages;\r
296 break;\r
297 case EfiMemoryMappedIOPortSpace:\r
298 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, !Sfo ? NameEfiMemoryMappedIOPortSpaceShort : NameEfiMemoryMappedIOPortSpace, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
299 MmioPortPages += Walker->NumberOfPages;\r
300 break;\r
301 case EfiPalCode:\r
302 ShellPrintHiiEx (-1, -1, NULL, (EFI_STRING_ID)(!Sfo ? STRING_TOKEN (STR_MEMMAP_LIST_ITEM) : STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiPalCode, Walker->PhysicalStart, Walker->PhysicalStart+MultU64x64 (SIZE_4KB, Walker->NumberOfPages)-1, Walker->NumberOfPages, Walker->Attribute);\r
303 TotalPages += Walker->NumberOfPages;\r
304 PalCodePages += Walker->NumberOfPages;\r
305 break;\r
306 default:\r
307 //\r
308 // Shell Spec defines the SFO format.\r
309 // Do not print the OEM/OS memory usage in the SFO format, to avoid conflict with Shell Spec.\r
310 //\r
311 if (!Sfo) {\r
312 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_ITEM_OTHER), gShellDebug1HiiHandle, Walker->Type, Walker->PhysicalStart, Walker->PhysicalStart + MultU64x64 (SIZE_4KB, Walker->NumberOfPages) - 1, Walker->NumberOfPages, Walker->Attribute);\r
313 }\r
314\r
315 TotalPages += Walker->NumberOfPages;\r
316 AddMemoryLength (&MemoryList, Walker->Type, Walker->NumberOfPages);\r
317 break;\r
318 }\r
319 }\r
320\r
321 //\r
322 // print the summary\r
323 //\r
324 ReservedPagesSize = MultU64x64 (SIZE_4KB, ReservedPages);\r
325 LoadCodePagesSize = MultU64x64 (SIZE_4KB, LoadCodePages);\r
326 LoadDataPagesSize = MultU64x64 (SIZE_4KB, LoadDataPages);\r
327 BSCodePagesSize = MultU64x64 (SIZE_4KB, BSCodePages);\r
328 BSDataPagesSize = MultU64x64 (SIZE_4KB, BSDataPages);\r
329 RTDataPagesSize = MultU64x64 (SIZE_4KB, RTDataPages);\r
330 RTCodePagesSize = MultU64x64 (SIZE_4KB, RTCodePages);\r
331 AvailPagesSize = MultU64x64 (SIZE_4KB, AvailPages);\r
332 TotalPagesSize = MultU64x64 (SIZE_4KB, TotalPages);\r
333 AcpiReclaimPagesSize = MultU64x64 (SIZE_4KB, AcpiReclaimPages);\r
334 AcpiNvsPagesSize = MultU64x64 (SIZE_4KB, AcpiNvsPages);\r
335 MmioSpacePagesSize = MultU64x64 (SIZE_4KB, MmioSpacePages);\r
336 MmioPortPagesSize = MultU64x64 (SIZE_4KB, MmioPortPages);\r
337 PalCodePagesSize = MultU64x64 (SIZE_4KB, PalCodePages);\r
338 PersistentPagesSize = MultU64x64 (SIZE_4KB, PersistentPages);\r
339 UnusableMemoryPagesSize = MultU64x64 (SIZE_4KB, UnusableMemoryPages);\r
340 if (!Sfo) {\r
341 ShellPrintHiiEx (\r
342 -1,\r
343 -1,\r
344 NULL,\r
345 STRING_TOKEN (STR_MEMMAP_LIST_SUMM),\r
346 gShellDebug1HiiHandle,\r
347 ReservedPages,\r
348 ReservedPagesSize,\r
349 LoadCodePages,\r
350 LoadCodePagesSize,\r
351 LoadDataPages,\r
352 LoadDataPagesSize,\r
353 BSCodePages,\r
354 BSCodePagesSize,\r
355 BSDataPages,\r
356 BSDataPagesSize,\r
357 RTCodePages,\r
358 RTCodePagesSize,\r
359 RTDataPages,\r
360 RTDataPagesSize,\r
361 AcpiReclaimPages,\r
362 AcpiReclaimPagesSize,\r
363 AcpiNvsPages,\r
364 AcpiNvsPagesSize,\r
365 MmioSpacePages,\r
366 MmioSpacePagesSize,\r
367 MmioPortPages,\r
368 MmioPortPagesSize,\r
369 PalCodePages,\r
370 PalCodePagesSize,\r
371 AvailPages,\r
372 AvailPagesSize,\r
373 PersistentPages,\r
374 PersistentPagesSize\r
375 );\r
376\r
377 //\r
378 // Print out the total memory usage for OEM/OS types in the order of type.\r
379 //\r
380 for (Link = GetFirstNode (&MemoryList); !IsNull (&MemoryList, Link); Link = GetNextNode (&MemoryList, Link)) {\r
381 Entry = BASE_CR (Link, MEMORY_LENGTH_ENTRY, Link);\r
382 ShellPrintHiiEx (\r
383 -1,\r
384 -1,\r
385 NULL,\r
386 STRING_TOKEN (STR_MEMMAP_LIST_SUMM_OTHER),\r
387 gShellDebug1HiiHandle,\r
388 Entry->Type,\r
389 Entry->NumberOfPages,\r
390 MultU64x64 (SIZE_4KB, Entry->NumberOfPages)\r
391 );\r
392 }\r
393\r
394 ShellPrintHiiEx (\r
395 -1,\r
396 -1,\r
397 NULL,\r
398 STRING_TOKEN (STR_MEMMAP_LIST_SUMM2),\r
399 gShellDebug1HiiHandle,\r
400 DivU64x32 (MultU64x64 (SIZE_4KB, TotalPages), SIZE_1MB),\r
401 TotalPagesSize\r
402 );\r
403 } else {\r
404 ShellPrintHiiEx (\r
405 -1,\r
406 -1,\r
407 NULL,\r
408 STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO),\r
409 gShellDebug1HiiHandle,\r
410 TotalPagesSize,\r
411 ReservedPagesSize,\r
412 BSCodePagesSize,\r
413 BSDataPagesSize,\r
414 RTCodePagesSize,\r
415 RTDataPagesSize,\r
416 LoadCodePagesSize,\r
417 LoadDataPagesSize,\r
418 AvailPagesSize,\r
419 MmioSpacePagesSize,\r
420 MmioPortPagesSize,\r
421 UnusableMemoryPagesSize,\r
422 AcpiReclaimPagesSize,\r
423 AcpiNvsPagesSize,\r
424 PalCodePagesSize,\r
425 PersistentPagesSize\r
426 );\r
427 }\r
428 }\r
429 }\r
430\r
431 ShellCommandLineFreeVarList (Package);\r
432 }\r
433\r
434 if (Descriptors != NULL) {\r
435 FreePool (Descriptors);\r
436 }\r
437\r
438 //\r
439 // Free the memory list.\r
440 //\r
441 for (Link = GetFirstNode (&MemoryList); !IsNull (&MemoryList, Link); ) {\r
442 Link = RemoveEntryList (Link);\r
443 }\r
444\r
445 return (ShellStatus);\r
446}\r