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