2 Main file for Mode shell Debug1 function.
4 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
5 (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>
6 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
7 SPDX-License-Identifier: BSD-2-Clause-Patent
12 // Need full names for Standard-Format Output
14 STATIC CONST CHAR16 NameEfiReservedMemoryType
[] = L
"Reserved";
15 STATIC CONST CHAR16 NameEfiLoaderCode
[] = L
"LoaderCode";
16 STATIC CONST CHAR16 NameEfiLoaderData
[] = L
"LoaderData";
17 STATIC CONST CHAR16 NameEfiBootServicesCode
[] = L
"BootServiceCode";
18 STATIC CONST CHAR16 NameEfiBootServicesData
[] = L
"BootServiceData";
19 STATIC CONST CHAR16 NameEfiRuntimeServicesCode
[] = L
"RuntimeCode";
20 STATIC CONST CHAR16 NameEfiRuntimeServicesData
[] = L
"RuntimeData";
21 STATIC CONST CHAR16 NameEfiConventionalMemory
[] = L
"Available";
22 STATIC CONST CHAR16 NameEfiPersistentMemory
[] = L
"Persistent";
23 STATIC CONST CHAR16 NameEfiUnusableMemory
[] = L
"UnusableMemory";
24 STATIC CONST CHAR16 NameEfiACPIReclaimMemory
[] = L
"ACPIReclaimMemory";
25 STATIC CONST CHAR16 NameEfiACPIMemoryNVS
[] = L
"ACPIMemoryNVS";
26 STATIC CONST CHAR16 NameEfiMemoryMappedIO
[] = L
"MemoryMappedIO";
27 STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpace
[] = L
"MemoryMappedIOPortSpace";
28 STATIC CONST CHAR16 NameEfiPalCode
[] = L
"PalCode";
31 // Need short names for some memory types
33 STATIC CONST CHAR16 NameEfiBootServicesCodeShort
[] = L
"BS_Code";
34 STATIC CONST CHAR16 NameEfiBootServicesDataShort
[] = L
"BS_Data";
35 STATIC CONST CHAR16 NameEfiRuntimeServicesCodeShort
[] = L
"RT_Code";
36 STATIC CONST CHAR16 NameEfiRuntimeServicesDataShort
[] = L
"RT_Data";
37 STATIC CONST CHAR16 NameEfiUnusableMemoryShort
[] = L
"Unusable";
38 STATIC CONST CHAR16 NameEfiACPIReclaimMemoryShort
[] = L
"ACPI_Recl";
39 STATIC CONST CHAR16 NameEfiACPIMemoryNVSShort
[] = L
"ACPI_NVS";
40 STATIC CONST CHAR16 NameEfiMemoryMappedIOShort
[] = L
"MMIO";
41 STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpaceShort
[] = L
"MMIO_Port";
43 #include "UefiShellDebug1CommandsLib.h"
49 } MEMORY_LENGTH_ENTRY
;
52 Add the length of the specified type to List.
54 @param List A list to hold all pairs of <Type, NumberOfPages>.
55 @param Type Memory type.
56 @param NumberOfPages Number of pages.
65 MEMORY_LENGTH_ENTRY
*Entry
;
66 MEMORY_LENGTH_ENTRY
*NewEntry
;
70 for (Link
= GetFirstNode (List
); !IsNull (List
, Link
); Link
= GetNextNode (List
, Link
)) {
71 Entry
= BASE_CR (Link
, MEMORY_LENGTH_ENTRY
, Link
);
72 if (Entry
->Type
>= Type
) {
77 if ((Entry
!= NULL
) && (Entry
->Type
== Type
)) {
79 // The Entry is the one we look for.
84 // The search operation breaks due to:
85 // 1. Type of every entry < Type --> Insert to tail
86 // 2. Type of an entry > Type --> Insert to previous of this entry
88 NewEntry
= AllocatePool (sizeof (*NewEntry
));
89 if (NewEntry
== NULL
) {
92 NewEntry
->Type
= Type
;
93 NewEntry
->NumberOfPages
= 0;
94 InsertTailList (Link
, &NewEntry
->Link
);
97 NewEntry
->NumberOfPages
+= NumberOfPages
;
101 Function for 'memmap' command.
103 @param[in] ImageHandle Handle to the Image (NULL if Internal).
104 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
108 ShellCommandRunMemMap (
109 IN EFI_HANDLE ImageHandle
,
110 IN EFI_SYSTEM_TABLE
*SystemTable
115 CHAR16
*ProblemParam
;
116 SHELL_STATUS ShellStatus
;
118 EFI_MEMORY_DESCRIPTOR
*Descriptors
;
122 EFI_MEMORY_DESCRIPTOR
*Walker
;
123 UINT64 ReservedPages
;
124 UINT64 LoadCodePages
;
125 UINT64 LoadDataPages
;
132 UINT64 ReservedPagesSize
;
133 UINT64 LoadCodePagesSize
;
134 UINT64 LoadDataPagesSize
;
135 UINT64 BSCodePagesSize
;
136 UINT64 BSDataPagesSize
;
137 UINT64 RTDataPagesSize
;
138 UINT64 RTCodePagesSize
;
139 UINT64 AvailPagesSize
;
140 UINT64 TotalPagesSize
;
141 UINT64 AcpiReclaimPages
;
143 UINT64 MmioSpacePages
;
144 UINT64 AcpiReclaimPagesSize
;
145 UINT64 AcpiNvsPagesSize
;
146 UINT64 MmioSpacePagesSize
;
147 UINT64 MmioPortPages
;
148 UINT64 MmioPortPagesSize
;
149 UINT64 UnusableMemoryPages
;
150 UINT64 UnusableMemoryPagesSize
;
152 UINT64 PalCodePagesSize
;
153 UINT64 PersistentPages
;
154 UINT64 PersistentPagesSize
;
156 LIST_ENTRY MemoryList
;
157 MEMORY_LENGTH_ENTRY
*Entry
;
160 AcpiReclaimPages
= 0;
173 UnusableMemoryPages
= 0;
178 ShellStatus
= SHELL_SUCCESS
;
179 Status
= EFI_SUCCESS
;
180 InitializeListHead (&MemoryList
);
183 // initialize the shell lib (we must be in non-auto-init...)
185 Status
= ShellInitialize();
186 ASSERT_EFI_ERROR(Status
);
188 Status
= CommandInit();
189 ASSERT_EFI_ERROR(Status
);
192 // parse the command line
194 Status
= ShellCommandLineParse (SfoParamList
, &Package
, &ProblemParam
, TRUE
);
195 if (EFI_ERROR(Status
)) {
196 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
197 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDebug1HiiHandle
, L
"memmap", ProblemParam
);
198 FreePool(ProblemParam
);
199 ShellStatus
= SHELL_INVALID_PARAMETER
;
204 if (ShellCommandLineGetCount(Package
) > 1) {
205 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDebug1HiiHandle
, L
"memmap");
206 ShellStatus
= SHELL_INVALID_PARAMETER
;
208 Status
= gBS
->GetMemoryMap(&Size
, Descriptors
, &MapKey
, &ItemSize
, &Version
);
209 if (Status
== EFI_BUFFER_TOO_SMALL
){
211 Descriptors
= AllocateZeroPool(Size
);
212 Status
= gBS
->GetMemoryMap(&Size
, Descriptors
, &MapKey
, &ItemSize
, &Version
);
214 if (EFI_ERROR(Status
)) {
215 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_MEMMAP_GET_FAILED
), gShellDebug1HiiHandle
, L
"memmap");
216 ShellStatus
= SHELL_ACCESS_DENIED
;
218 ASSERT(Version
== EFI_MEMORY_DESCRIPTOR_VERSION
);
220 Sfo
= ShellCommandLineGetFlag(Package
, L
"-sfo");
222 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_MEMMAP_LIST_HEAD
), gShellDebug1HiiHandle
);
224 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_GEN_SFO_HEADER
), gShellDebug1HiiHandle
, L
"memmap");
227 for ( Walker
= Descriptors
228 ; (Walker
< (EFI_MEMORY_DESCRIPTOR
*) ((UINT8
*)Descriptors
+ Size
)) && (Walker
!= NULL
)
229 ; Walker
= (EFI_MEMORY_DESCRIPTOR
*) ((UINT8
*)Walker
+ ItemSize
)
231 switch (Walker
->Type
) {
232 case EfiReservedMemoryType
:
233 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
);
234 ReservedPages
+= Walker
->NumberOfPages
;
237 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
);
238 LoadCodePages
+= Walker
->NumberOfPages
;
239 TotalPages
+= Walker
->NumberOfPages
;
242 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
);
243 LoadDataPages
+= Walker
->NumberOfPages
;
244 TotalPages
+= Walker
->NumberOfPages
;
246 case EfiBootServicesCode
:
247 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
);
248 BSCodePages
+= Walker
->NumberOfPages
;
249 TotalPages
+= Walker
->NumberOfPages
;
251 case EfiBootServicesData
:
252 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
);
253 BSDataPages
+= Walker
->NumberOfPages
;
254 TotalPages
+= Walker
->NumberOfPages
;
256 case EfiRuntimeServicesCode
:
257 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
);
258 RTCodePages
+= Walker
->NumberOfPages
;
259 TotalPages
+= Walker
->NumberOfPages
;
261 case EfiRuntimeServicesData
:
262 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
);
263 RTDataPages
+= Walker
->NumberOfPages
;
264 TotalPages
+= Walker
->NumberOfPages
;
266 case EfiConventionalMemory
:
267 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
);
268 AvailPages
+= Walker
->NumberOfPages
;
269 TotalPages
+= Walker
->NumberOfPages
;
271 case EfiPersistentMemory
:
272 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
);
273 PersistentPages
+= Walker
->NumberOfPages
;
274 TotalPages
+= Walker
->NumberOfPages
;
276 case EfiUnusableMemory
:
277 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
);
278 UnusableMemoryPages
+= Walker
->NumberOfPages
;
280 case EfiACPIReclaimMemory
:
281 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
);
282 TotalPages
+= Walker
->NumberOfPages
;
283 AcpiReclaimPages
+= Walker
->NumberOfPages
;
285 case EfiACPIMemoryNVS
:
286 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
);
287 TotalPages
+= Walker
->NumberOfPages
;
288 AcpiNvsPages
+= Walker
->NumberOfPages
;
290 case EfiMemoryMappedIO
:
291 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
);
292 MmioSpacePages
+= Walker
->NumberOfPages
;
294 case EfiMemoryMappedIOPortSpace
:
295 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
);
296 MmioPortPages
+= Walker
->NumberOfPages
;
299 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
);
300 TotalPages
+= Walker
->NumberOfPages
;
301 PalCodePages
+= Walker
->NumberOfPages
;
305 // Shell Spec defines the SFO format.
306 // Do not print the OEM/OS memory usage in the SFO format, to avoid conflict with Shell Spec.
309 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
);
311 TotalPages
+= Walker
->NumberOfPages
;
312 AddMemoryLength (&MemoryList
, Walker
->Type
, Walker
->NumberOfPages
);
319 ReservedPagesSize
= MultU64x64(SIZE_4KB
,ReservedPages
);
320 LoadCodePagesSize
= MultU64x64(SIZE_4KB
,LoadCodePages
);
321 LoadDataPagesSize
= MultU64x64(SIZE_4KB
,LoadDataPages
);
322 BSCodePagesSize
= MultU64x64(SIZE_4KB
,BSCodePages
);
323 BSDataPagesSize
= MultU64x64(SIZE_4KB
,BSDataPages
);
324 RTDataPagesSize
= MultU64x64(SIZE_4KB
,RTDataPages
);
325 RTCodePagesSize
= MultU64x64(SIZE_4KB
,RTCodePages
);
326 AvailPagesSize
= MultU64x64(SIZE_4KB
,AvailPages
);
327 TotalPagesSize
= MultU64x64(SIZE_4KB
,TotalPages
);
328 AcpiReclaimPagesSize
= MultU64x64(SIZE_4KB
,AcpiReclaimPages
);
329 AcpiNvsPagesSize
= MultU64x64(SIZE_4KB
,AcpiNvsPages
);
330 MmioSpacePagesSize
= MultU64x64(SIZE_4KB
,MmioSpacePages
);
331 MmioPortPagesSize
= MultU64x64(SIZE_4KB
,MmioPortPages
);
332 PalCodePagesSize
= MultU64x64(SIZE_4KB
,PalCodePages
);
333 PersistentPagesSize
= MultU64x64(SIZE_4KB
,PersistentPages
);
334 UnusableMemoryPagesSize
= MultU64x64(SIZE_4KB
,UnusableMemoryPages
);
336 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_MEMMAP_LIST_SUMM
), gShellDebug1HiiHandle
,
337 ReservedPages
, ReservedPagesSize
,
338 LoadCodePages
, LoadCodePagesSize
,
339 LoadDataPages
, LoadDataPagesSize
,
340 BSCodePages
, BSCodePagesSize
,
341 BSDataPages
, BSDataPagesSize
,
342 RTCodePages
, RTCodePagesSize
,
343 RTDataPages
, RTDataPagesSize
,
344 AcpiReclaimPages
, AcpiReclaimPagesSize
,
345 AcpiNvsPages
, AcpiNvsPagesSize
,
346 MmioSpacePages
, MmioSpacePagesSize
,
347 MmioPortPages
, MmioPortPagesSize
,
348 PalCodePages
, PalCodePagesSize
,
349 AvailPages
, AvailPagesSize
,
350 PersistentPages
, PersistentPagesSize
354 // Print out the total memory usage for OEM/OS types in the order of type.
356 for (Link
= GetFirstNode (&MemoryList
); !IsNull (&MemoryList
, Link
); Link
= GetNextNode (&MemoryList
, Link
)) {
357 Entry
= BASE_CR (Link
, MEMORY_LENGTH_ENTRY
, Link
);
358 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_MEMMAP_LIST_SUMM_OTHER
), gShellDebug1HiiHandle
,
359 Entry
->Type
, Entry
->NumberOfPages
, MultU64x64 (SIZE_4KB
, Entry
->NumberOfPages
)
363 ShellPrintHiiEx (-1, -1, NULL
, STRING_TOKEN (STR_MEMMAP_LIST_SUMM2
), gShellDebug1HiiHandle
,
364 DivU64x32(MultU64x64(SIZE_4KB
,TotalPages
), SIZE_1MB
), TotalPagesSize
367 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO
), gShellDebug1HiiHandle
,
379 UnusableMemoryPagesSize
,
380 AcpiReclaimPagesSize
,
388 ShellCommandLineFreeVarList (Package
);
391 if (Descriptors
!= NULL
) {
392 FreePool(Descriptors
);
396 // Free the memory list.
398 for (Link
= GetFirstNode (&MemoryList
); !IsNull (&MemoryList
, Link
); ) {
399 Link
= RemoveEntryList (Link
);
402 return (ShellStatus
);