]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c
Add "Debug1" profile (all but Edit and HexEdit commands)
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / MemMap.c
1 /** @file
2 Main file for Mode shell Debug1 function.
3
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the acModeanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which acModeanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 STATIC CONST CHAR16 strNameEfiReservedMemoryType[] = L"Reserved";
16 STATIC CONST CHAR16 strNameEfiLoaderCode[] = L"LoadCode";
17 STATIC CONST CHAR16 strNameEfiLoaderData[] = L"LoadData";
18 STATIC CONST CHAR16 strNameEfiBootServicesCode[] = L"BSCode";
19 STATIC CONST CHAR16 strNameEfiBootServicesData[] = L"BSData";
20 STATIC CONST CHAR16 strNameEfiRuntimeServicesCode[] = L"RTCode";
21 STATIC CONST CHAR16 strNameEfiRuntimeServicesData[] = L"RTData";
22 STATIC CONST CHAR16 strNameEfiConventionalMemory[] = L"Conv";
23 STATIC CONST CHAR16 strNameEfiUnusableMemory[] = L"Unusable";
24 STATIC CONST CHAR16 strNameEfiACPIReclaimMemory[] = L"ACPIRec";
25 STATIC CONST CHAR16 strNameEfiACPIMemoryNVS[] = L"ACPI_NVS";
26 STATIC CONST CHAR16 strNameEfiMemoryMappedIO[] = L"MMIO";
27 STATIC CONST CHAR16 strNameEfiMemoryMappedIOPortSpace[] = L"MMIOPort";
28 STATIC CONST CHAR16 strNameEfiPalCode[] = L"PalCode";
29
30 #include "UefiShellDebug1CommandsLib.h"
31
32 SHELL_STATUS
33 EFIAPI
34 ShellCommandRunMemMap (
35 IN EFI_HANDLE ImageHandle,
36 IN EFI_SYSTEM_TABLE *SystemTable
37 )
38 {
39 EFI_STATUS Status;
40 LIST_ENTRY *Package;
41 CHAR16 *ProblemParam;
42 SHELL_STATUS ShellStatus;
43 UINTN Size;
44 EFI_MEMORY_DESCRIPTOR *Buffer;
45 UINTN MapKey;
46 UINTN ItemSize;
47 UINT32 Version;
48 UINT8 *Walker;
49 UINT64 ReservedPages;
50 UINT64 LoadCodePages;
51 UINT64 LoadDataPages;
52 UINT64 BSCodePages;
53 UINT64 BSDataPages;
54 UINT64 RTDataPages;
55 UINT64 RTCodePages;
56 UINT64 AvailPages;
57 UINT64 TotalPages;
58 UINT64 ReservedPagesSize;
59 UINT64 LoadCodePagesSize;
60 UINT64 LoadDataPagesSize;
61 UINT64 BSCodePagesSize;
62 UINT64 BSDataPagesSize;
63 UINT64 RTDataPagesSize;
64 UINT64 RTCodePagesSize;
65 UINT64 AvailPagesSize;
66 UINT64 TotalPagesSize;
67 BOOLEAN Sfo;
68
69 TotalPages = 0;
70 ReservedPages = 0;
71 LoadCodePages = 0;
72 LoadDataPages = 0;
73 BSCodePages = 0;
74 BSDataPages = 0;
75 RTDataPages = 0;
76 RTCodePages = 0;
77 AvailPages = 0;
78 Size = 0;
79 Buffer = NULL;
80 ShellStatus = SHELL_SUCCESS;
81 Status = EFI_SUCCESS;
82
83 //
84 // initialize the shell lib (we must be in non-auto-init...)
85 //
86 Status = ShellInitialize();
87 ASSERT_EFI_ERROR(Status);
88
89 Status = CommandInit();
90 ASSERT_EFI_ERROR(Status);
91
92 //
93 // parse the command line
94 //
95 Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE);
96 if (EFI_ERROR(Status)) {
97 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
98 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
99 FreePool(ProblemParam);
100 ShellStatus = SHELL_INVALID_PARAMETER;
101 } else {
102 ASSERT(FALSE);
103 }
104 } else {
105 if (ShellCommandLineGetCount(Package) > 1) {
106 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
107 ShellStatus = SHELL_INVALID_PARAMETER;
108 } else {
109 Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);
110 if (Status == EFI_BUFFER_TOO_SMALL){
111 Size += SIZE_1KB;
112 Buffer = AllocatePool(Size);
113 Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);
114 }
115 if (EFI_ERROR(Status)) {
116 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_GET_FAILED), gShellDebug1HiiHandle, Status);
117 ShellStatus = SHELL_ACCESS_DENIED;
118 } else {
119 ASSERT(Version == EFI_MEMORY_DESCRIPTOR_VERSION);
120 Sfo = ShellCommandLineGetFlag(Package, L"-sfo");
121 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_HEAD), gShellDebug1HiiHandle);
122 for (Walker = (UINT8*)Buffer; Walker < (((UINT8*)Buffer)+Size) && Walker != NULL; Walker += ItemSize){
123 switch (((EFI_MEMORY_DESCRIPTOR*)Walker)->Type) {
124 // replaced ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages) with 0000
125 case EfiReservedMemoryType:
126 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiReservedMemoryType, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
127 ReservedPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
128 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
129 break;
130 case EfiLoaderCode:
131 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiLoaderCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
132 LoadCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
133 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
134 break;
135 case EfiLoaderData:
136 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiLoaderData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
137 LoadDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
138 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
139 break;
140 case EfiBootServicesCode:
141 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiBootServicesCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
142 BSCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
143 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
144 break;
145 case EfiBootServicesData:
146 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiBootServicesData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
147 BSDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
148 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
149 break;
150 case EfiRuntimeServicesCode:
151 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiRuntimeServicesCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
152 RTCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
153 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
154 break;
155 case EfiRuntimeServicesData:
156 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiRuntimeServicesData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
157 RTDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
158 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
159 break;
160 case EfiConventionalMemory:
161 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiConventionalMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
162 AvailPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
163 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
164 break;
165 case EfiUnusableMemory:
166 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiUnusableMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
167 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
168 break;
169 case EfiACPIReclaimMemory:
170 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiACPIReclaimMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
171 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
172 break;
173 case EfiACPIMemoryNVS:
174 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiACPIMemoryNVS, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
175 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
176 break;
177 case EfiMemoryMappedIO:
178 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiMemoryMappedIO, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
179 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
180 break;
181 case EfiMemoryMappedIOPortSpace:
182 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiMemoryMappedIOPortSpace, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
183 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
184 break;
185 case EfiPalCode:
186 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, strNameEfiPalCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages), ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
187 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
188 break;
189 default:
190 ASSERT(FALSE);
191 }
192 }
193 //
194 // print the summary
195 //
196 ReservedPagesSize = MultU64x64(SIZE_4KB,ReservedPages);
197 LoadCodePagesSize = MultU64x64(SIZE_4KB,LoadCodePages);
198 LoadDataPagesSize = MultU64x64(SIZE_4KB,LoadDataPages);
199 BSCodePagesSize = MultU64x64(SIZE_4KB,BSCodePages);
200 BSDataPagesSize = MultU64x64(SIZE_4KB,BSDataPages);
201 RTDataPagesSize = MultU64x64(SIZE_4KB,RTDataPages);
202 RTCodePagesSize = MultU64x64(SIZE_4KB,RTCodePages);
203 AvailPagesSize = MultU64x64(SIZE_4KB,AvailPages);
204 TotalPagesSize = MultU64x64(SIZE_4KB,TotalPages);
205 if (!Sfo) {
206 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_SUMM), gShellDebug1HiiHandle,
207 ReservedPages, ReservedPagesSize,
208 LoadCodePages, LoadCodePagesSize,
209 LoadDataPages, LoadDataPagesSize,
210 BSCodePages, BSCodePagesSize,
211 BSDataPages, BSDataPagesSize,
212 RTDataPages, RTDataPagesSize,
213 AvailPages, AvailPagesSize,
214 DivU64x32(MultU64x64(SIZE_4KB,TotalPages), SIZE_1MB), TotalPagesSize
215 );
216 } else {
217 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO), gShellDebug1HiiHandle,
218 TotalPagesSize,
219 MultU64x64(SIZE_4KB,ReservedPages),
220 BSCodePagesSize,
221 BSDataPagesSize,
222 RTCodePagesSize,
223 RTDataPagesSize,
224 LoadCodePagesSize,
225 LoadDataPagesSize,
226 AvailPages, AvailPagesSize
227 );
228 }
229 }
230 }
231 ShellCommandLineFreeVarList (Package);
232 }
233
234 if (Buffer != NULL) {
235 FreePool(Buffer);
236 }
237
238 return (ShellStatus);
239 }
240