]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c
MdeModulePkg: Update Dxe to handle unaccepted memory type
[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
ba0014b9 6 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
5d73d92f 8\r
9**/\r
10\r
73768087
CP
11//\r
12// Need full names for Standard-Format Output\r
13//\r
47d20b54
MK
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
5d73d92f 29\r
73768087
CP
30//\r
31// Need short names for some memory types\r
32//\r
47d20b54
MK
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
73768087 42\r
5d73d92f 43#include "UefiShellDebug1CommandsLib.h"\r
44\r
8bb61740 45typedef struct {\r
47d20b54
MK
46 UINT32 Type;\r
47 UINT64 NumberOfPages;\r
48 LIST_ENTRY Link;\r
8bb61740
RN
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
47d20b54
MK
60 LIST_ENTRY *List,\r
61 UINT32 Type,\r
62 UINT64 NumberOfPages\r
8bb61740
RN
63 )\r
64{\r
47d20b54
MK
65 MEMORY_LENGTH_ENTRY *Entry;\r
66 MEMORY_LENGTH_ENTRY *NewEntry;\r
67 LIST_ENTRY *Link;\r
8bb61740
RN
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
47d20b54
MK
92\r
93 NewEntry->Type = Type;\r
8bb61740
RN
94 NewEntry->NumberOfPages = 0;\r
95 InsertTailList (Link, &NewEntry->Link);\r
96 }\r
97\r
98 NewEntry->NumberOfPages += NumberOfPages;\r
99}\r
100\r
3737ac2b 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
5d73d92f 107SHELL_STATUS\r
108EFIAPI\r
109ShellCommandRunMemMap (\r
110 IN EFI_HANDLE ImageHandle,\r
111 IN EFI_SYSTEM_TABLE *SystemTable\r
112 )\r
113{\r
47d20b54
MK
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
5d73d92f 160\r
3737ac2b 161 AcpiReclaimPages = 0;\r
162 AcpiNvsPages = 0;\r
163 MmioSpacePages = 0;\r
5d73d92f 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
c12383d5
JC
173 MmioPortPages = 0;\r
174 UnusableMemoryPages = 0;\r
175 PalCodePages = 0;\r
38707d76 176 PersistentPages = 0;\r
5d73d92f 177 Size = 0;\r
ac25ebdc 178 Descriptors = NULL;\r
5d73d92f 179 ShellStatus = SHELL_SUCCESS;\r
180 Status = EFI_SUCCESS;\r
8bb61740 181 InitializeListHead (&MemoryList);\r
5d73d92f 182\r
183 //\r
184 // initialize the shell lib (we must be in non-auto-init...)\r
185 //\r
47d20b54
MK
186 Status = ShellInitialize ();\r
187 ASSERT_EFI_ERROR (Status);\r
5d73d92f 188\r
47d20b54
MK
189 Status = CommandInit ();\r
190 ASSERT_EFI_ERROR (Status);\r
5d73d92f 191\r
192 //\r
193 // parse the command line\r
194 //\r
195 Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
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
5d73d92f 200 ShellStatus = SHELL_INVALID_PARAMETER;\r
201 } else {\r
47d20b54 202 ASSERT (FALSE);\r
5d73d92f 203 }\r
204 } else {\r
47d20b54
MK
205 if (ShellCommandLineGetCount (Package) > 1) {\r
206 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"memmap");\r
5d73d92f 207 ShellStatus = SHELL_INVALID_PARAMETER;\r
208 } else {\r
47d20b54
MK
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
5d73d92f 214 }\r
47d20b54
MK
215\r
216 if (EFI_ERROR (Status)) {\r
217 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_GET_FAILED), gShellDebug1HiiHandle, L"memmap");\r
5d73d92f 218 ShellStatus = SHELL_ACCESS_DENIED;\r
219 } else {\r
47d20b54 220 ASSERT (Version == EFI_MEMORY_DESCRIPTOR_VERSION);\r
73768087 221\r
47d20b54 222 Sfo = ShellCommandLineGetFlag (Package, L"-sfo");\r
73768087
CP
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
ac25ebdc 229 for ( Walker = Descriptors\r
47d20b54
MK
230 ; (Walker < (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Descriptors + Size)) && (Walker != NULL)\r
231 ; Walker = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Walker + ItemSize)\r
232 )\r
233 {\r
ac25ebdc 234 switch (Walker->Type) {\r
47d20b54
MK
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
ac25ebdc 237 ReservedPages += Walker->NumberOfPages;\r
5d73d92f 238 break;\r
239 case EfiLoaderCode:\r
47d20b54 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
ac25ebdc 241 LoadCodePages += Walker->NumberOfPages;\r
47d20b54 242 TotalPages += Walker->NumberOfPages;\r
5d73d92f 243 break;\r
244 case EfiLoaderData:\r
47d20b54 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
ac25ebdc 246 LoadDataPages += Walker->NumberOfPages;\r
47d20b54 247 TotalPages += Walker->NumberOfPages;\r
5d73d92f 248 break;\r
249 case EfiBootServicesCode:\r
47d20b54 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
ac25ebdc 251 BSCodePages += Walker->NumberOfPages;\r
47d20b54 252 TotalPages += Walker->NumberOfPages;\r
5d73d92f 253 break;\r
254 case EfiBootServicesData:\r
47d20b54 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
ac25ebdc 256 BSDataPages += Walker->NumberOfPages;\r
47d20b54 257 TotalPages += Walker->NumberOfPages;\r
5d73d92f 258 break;\r
259 case EfiRuntimeServicesCode:\r
47d20b54 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
ac25ebdc 261 RTCodePages += Walker->NumberOfPages;\r
47d20b54 262 TotalPages += Walker->NumberOfPages;\r
5d73d92f 263 break;\r
264 case EfiRuntimeServicesData:\r
47d20b54 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
ac25ebdc 266 RTDataPages += Walker->NumberOfPages;\r
47d20b54 267 TotalPages += Walker->NumberOfPages;\r
5d73d92f 268 break;\r
269 case EfiConventionalMemory:\r
47d20b54 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
ac25ebdc
RN
271 AvailPages += Walker->NumberOfPages;\r
272 TotalPages += Walker->NumberOfPages;\r
6c4542ed
LG
273 break;\r
274 case EfiPersistentMemory:\r
47d20b54 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
ac25ebdc
RN
276 PersistentPages += Walker->NumberOfPages;\r
277 TotalPages += Walker->NumberOfPages;\r
5d73d92f 278 break;\r
279 case EfiUnusableMemory:\r
47d20b54 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
ac25ebdc 281 UnusableMemoryPages += Walker->NumberOfPages;\r
5d73d92f 282 break;\r
283 case EfiACPIReclaimMemory:\r
47d20b54
MK
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
ac25ebdc 286 AcpiReclaimPages += Walker->NumberOfPages;\r
5d73d92f 287 break;\r
288 case EfiACPIMemoryNVS:\r
47d20b54
MK
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
5d73d92f 292 break;\r
293 case EfiMemoryMappedIO:\r
47d20b54
MK
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
5d73d92f 296 break;\r
297 case EfiMemoryMappedIOPortSpace:\r
47d20b54 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
ac25ebdc 299 MmioPortPages += Walker->NumberOfPages;\r
5d73d92f 300 break;\r
301 case EfiPalCode:\r
47d20b54
MK
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
ac25ebdc 304 PalCodePages += Walker->NumberOfPages;\r
5d73d92f 305 break;\r
306 default:\r
8bb61740
RN
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
47d20b54 314\r
8bb61740
RN
315 TotalPages += Walker->NumberOfPages;\r
316 AddMemoryLength (&MemoryList, Walker->Type, Walker->NumberOfPages);\r
317 break;\r
5d73d92f 318 }\r
319 }\r
47d20b54 320\r
5d73d92f 321 //\r
322 // print the summary\r
323 //\r
47d20b54
MK
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
5d73d92f 340 if (!Sfo) {\r
47d20b54
MK
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
8bb61740
RN
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
47d20b54
MK
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
8bb61740
RN
391 );\r
392 }\r
393\r
47d20b54
MK
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
5d73d92f 403 } else {\r
47d20b54
MK
404 ShellPrintHiiEx (\r
405 -1,\r
406 -1,\r
407 NULL,\r
408 STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO),\r
409 gShellDebug1HiiHandle,\r
5d73d92f 410 TotalPagesSize,\r
73768087 411 ReservedPagesSize,\r
5d73d92f 412 BSCodePagesSize,\r
413 BSDataPagesSize,\r
414 RTCodePagesSize,\r
415 RTDataPagesSize,\r
416 LoadCodePagesSize,\r
417 LoadDataPagesSize,\r
c12383d5
JC
418 AvailPagesSize,\r
419 MmioSpacePagesSize,\r
420 MmioPortPagesSize,\r
421 UnusableMemoryPagesSize,\r
422 AcpiReclaimPagesSize,\r
423 AcpiNvsPagesSize,\r
38707d76
TS
424 PalCodePagesSize,\r
425 PersistentPagesSize\r
47d20b54 426 );\r
5d73d92f 427 }\r
428 }\r
429 }\r
47d20b54 430\r
5d73d92f 431 ShellCommandLineFreeVarList (Package);\r
432 }\r
433\r
ac25ebdc 434 if (Descriptors != NULL) {\r
47d20b54 435 FreePool (Descriptors);\r
5d73d92f 436 }\r
437\r
8bb61740
RN
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
5d73d92f 445 return (ShellStatus);\r
446}\r