]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/DmpStore.c
655e72a8769ca48fee11aa402f5819895096cf09
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / DmpStore.c
1 /** @file
2 Main file for DmpStore shell Debug1 function.
3
4 Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies 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 #include "UefiShellDebug1CommandsLib.h"
16
17
18 #define INIT_NAME_BUFFER_SIZE 128
19 #define INIT_DATA_BUFFER_SIZE 1024
20 #define INIT_ATTS_BUFFER_SIZE 64
21
22 CONST CHAR16 *
23 EFIAPI
24 GetAttrType (
25 IN CONST UINT32 Atts,
26 IN OUT CHAR16 *RetString
27 )
28 {
29 StrCpy(RetString, L"");
30
31 if (Atts & EFI_VARIABLE_NON_VOLATILE) {
32 StrCat(RetString, L"+NV");
33 }
34 if (Atts & EFI_VARIABLE_RUNTIME_ACCESS) {
35 StrCat(RetString, L"+RS+BS");
36 } else if (Atts & EFI_VARIABLE_BOOTSERVICE_ACCESS) {
37 StrCat(RetString, L"+BS");
38 }
39 if (Atts & EFI_VARIABLE_HARDWARE_ERROR_RECORD) {
40 StrCat(RetString, L"+HR");
41 }
42 if (Atts & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) {
43 StrCat(RetString, L"+AW");
44 }
45 if (Atts & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) {
46 StrCat(RetString, L"+AT");
47 }
48
49 if (RetString[0] == L'+') {
50 return (RetString+1);
51 }
52 if (RetString[0] == CHAR_NULL) {
53 StrCpy(RetString, L"invalid");
54 return (RetString);
55 }
56 return (RetString);
57 }
58
59 /**
60 Function to display or delete variables.
61
62 @param[in] VariableName The variable name of the EFI variable (or NULL).
63 @param[in] Guid The GUID of the variable set (or NULL).
64 @param[in] Delete TRUE to delete, FALSE otherwise.
65
66 @retval SHELL_SUCCESS The operation was successful.
67 @retval SHELL_OUT_OF_RESOURCES A memorty allocation failed.
68 @retval SHELL_ABORTED The abort message was received.
69 @retval SHELL_DEVICE_ERROR UEFI Variable Services returned an error.
70 @retval SHELL_NOT_FOUND the Name/Guid pair could not be found.
71 **/
72 SHELL_STATUS
73 EFIAPI
74 ProcessVariables (
75 IN CONST CHAR16 *VariableName OPTIONAL,
76 IN CONST EFI_GUID *Guid OPTIONAL,
77 IN BOOLEAN Delete
78 )
79 {
80 EFI_STATUS Status;
81 CHAR16 *FoundVarName;
82 EFI_GUID FoundVarGuid;
83 UINT8 *DataBuffer;
84 UINTN DataSize;
85 UINT32 Atts;
86 SHELL_STATUS ShellStatus;
87 BOOLEAN Found;
88 UINTN NameBufferSize; // Allocated Name buffer size
89 UINTN NameSize;
90 CHAR16 *OldName;
91 UINTN OldNameBufferSize;
92 UINTN DataBufferSize; // Allocated data buffer size
93 CHAR16 RetString[INIT_ATTS_BUFFER_SIZE];
94
95 Found = FALSE;
96 ShellStatus = SHELL_SUCCESS;
97 Status = EFI_SUCCESS;
98
99 NameBufferSize = INIT_NAME_BUFFER_SIZE;
100 DataBufferSize = INIT_DATA_BUFFER_SIZE;
101 FoundVarName = AllocateZeroPool (NameBufferSize);
102 if (FoundVarName == NULL) {
103 return (SHELL_OUT_OF_RESOURCES);
104 }
105 DataBuffer = AllocatePool (DataBufferSize);
106 if (DataBuffer == NULL) {
107 FreePool (FoundVarName);
108 return (SHELL_OUT_OF_RESOURCES);
109 }
110
111 for (;;){
112 if (ShellGetExecutionBreakFlag()) {
113 ShellStatus = SHELL_ABORTED;
114 break;
115 }
116
117 NameSize = NameBufferSize;
118 Status = gRT->GetNextVariableName (&NameSize, FoundVarName, &FoundVarGuid);
119 if (Status == EFI_BUFFER_TOO_SMALL) {
120 OldName = FoundVarName;
121 OldNameBufferSize = NameBufferSize;
122 //
123 // Expand at least twice to avoid reallocate many times
124 //
125 NameBufferSize = NameSize > NameBufferSize * 2 ? NameSize : NameBufferSize * 2;
126 FoundVarName = AllocateZeroPool (NameBufferSize);
127 if (FoundVarName == NULL) {
128 Status = EFI_OUT_OF_RESOURCES;
129 FreePool (OldName);
130 break;
131 }
132 //
133 // Preserve the original content to get correct iteration for GetNextVariableName() call
134 //
135 CopyMem (FoundVarName, OldName, OldNameBufferSize);
136 FreePool (OldName);
137 NameSize = NameBufferSize;
138 Status = gRT->GetNextVariableName (&NameSize, FoundVarName, &FoundVarGuid);
139 }
140 if (Status == EFI_NOT_FOUND) {
141 break;
142 }
143 ASSERT_EFI_ERROR(Status);
144
145 //
146 // Check if it matches
147 //
148 if (VariableName != NULL) {
149 if (!gUnicodeCollation->MetaiMatch(gUnicodeCollation, FoundVarName, (CHAR16*)VariableName)) {
150 continue;
151 }
152 }
153 if (Guid != NULL) {
154 if (!CompareGuid(&FoundVarGuid, Guid)) {
155 continue;
156 }
157 }
158
159 DataSize = DataBufferSize;
160 Status = gRT->GetVariable (FoundVarName, &FoundVarGuid, &Atts, &DataSize, DataBuffer);
161 if (Status == EFI_BUFFER_TOO_SMALL) {
162 //
163 // Expand at least twice to avoid reallocate many times
164 //
165 FreePool (DataBuffer);
166 DataBufferSize = DataSize > DataBufferSize * 2 ? DataSize : DataBufferSize * 2;
167 DataBuffer = AllocatePool (DataBufferSize);
168 if (DataBuffer == NULL) {
169 Status = EFI_OUT_OF_RESOURCES;
170 break;
171 }
172 DataSize = DataBufferSize;
173 Status = gRT->GetVariable (FoundVarName, &FoundVarGuid, &Atts, &DataSize, DataBuffer);
174 }
175 ASSERT_EFI_ERROR(Status);
176
177 //
178 // do the print or delete
179 //
180 Found = TRUE;
181 if (!Delete) {
182 ShellPrintHiiEx(
183 -1,
184 -1,
185 NULL,
186 STRING_TOKEN(STR_DMPSTORE_HEADER_LINE),
187 gShellDebug1HiiHandle,
188 GetAttrType(Atts, RetString),
189 &FoundVarGuid,
190 FoundVarName,
191 DataSize);
192 DumpHex(2, 0, DataSize, DataBuffer);
193 } else {
194 ShellPrintHiiEx(
195 -1,
196 -1,
197 NULL,
198 STRING_TOKEN(STR_DMPSTORE_DELETE_LINE),
199 gShellDebug1HiiHandle,
200 &FoundVarGuid,
201 FoundVarName);
202 ShellPrintHiiEx(
203 -1,
204 -1,
205 NULL,
206 STRING_TOKEN(STR_DMPSTORE_DELETE_DONE),
207 gShellDebug1HiiHandle,
208 gRT->SetVariable(FoundVarName, &FoundVarGuid, Atts, 0, NULL));
209 FoundVarName[0] = CHAR_NULL;
210 }
211 }
212
213 if (FoundVarName != NULL) {
214 FreePool(FoundVarName);
215 }
216 if (DataBuffer != NULL) {
217 FreePool(DataBuffer);
218 }
219 if (!Found) {
220 if (Status == EFI_OUT_OF_RESOURCES) {
221 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle);
222 return SHELL_OUT_OF_RESOURCES;
223 }
224
225 if (VariableName != NULL && Guid == NULL) {
226 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_N), gShellDebug1HiiHandle, VariableName);
227 } else if (VariableName != NULL && Guid != NULL) {
228 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_GN), gShellDebug1HiiHandle, Guid, VariableName);
229 } else if (VariableName == NULL && Guid == NULL) {
230 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND), gShellDebug1HiiHandle);
231 } else if (VariableName == NULL && Guid != NULL) {
232 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_NO_VAR_FOUND_G), gShellDebug1HiiHandle, Guid);
233 }
234 return (SHELL_NOT_FOUND);
235 }
236 return (SHELL_SUCCESS);
237 }
238
239 STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
240 {L"-d", TypeFlag},
241 {L"-l", TypeFlag},
242 {L"-s", TypeFlag},
243 {L"-all", TypeFlag},
244 {L"-guid", TypeValue},
245 {NULL, TypeMax}
246 };
247
248 /**
249 Function for 'dmpstore' command.
250
251 @param[in] ImageHandle Handle to the Image (NULL if Internal).
252 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
253 **/
254 SHELL_STATUS
255 EFIAPI
256 ShellCommandRunDmpStore (
257 IN EFI_HANDLE ImageHandle,
258 IN EFI_SYSTEM_TABLE *SystemTable
259 )
260 {
261 EFI_STATUS Status;
262 LIST_ENTRY *Package;
263 CHAR16 *ProblemParam;
264 SHELL_STATUS ShellStatus;
265 CONST CHAR16 *Temp;
266 EFI_GUID *Guid;
267 EFI_GUID GuidData;
268 CONST CHAR16 *VariableName;
269
270 ShellStatus = SHELL_SUCCESS;
271 Package = NULL;
272
273 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
274 if (EFI_ERROR(Status)) {
275 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
276 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
277 FreePool(ProblemParam);
278 ShellStatus = SHELL_INVALID_PARAMETER;
279 } else {
280 ASSERT(FALSE);
281 }
282 } else {
283 if (ShellCommandLineGetCount(Package) > 2) {
284 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
285 ShellStatus = SHELL_INVALID_PARAMETER;
286 } else if (ShellCommandLineGetFlag(Package, L"-all") && ShellCommandLineGetFlag(Package, L"-guid")) {
287 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"-all", L"-guid");
288 ShellStatus = SHELL_INVALID_PARAMETER;
289 } else if ((ShellCommandLineGetFlag(Package, L"-s") || ShellCommandLineGetFlag(Package, L"-l")) && ShellCommandLineGetFlag(Package, L"-d")) {
290 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDebug1HiiHandle, L"-l or -s", L"-d");
291 ShellStatus = SHELL_INVALID_PARAMETER;
292 } else {
293 if (!ShellCommandLineGetFlag(Package, L"-all")) {
294 Temp = ShellCommandLineGetValue(Package, L"-guid");
295 if (Temp != NULL) {
296 Status = ConvertStringToGuid(Temp, &GuidData);
297 if (EFI_ERROR(Status)) {
298 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp);
299 ShellStatus = SHELL_INVALID_PARAMETER;
300 }
301 Guid = &GuidData;
302 } else {
303 Guid = &gEfiGlobalVariableGuid;
304 }
305 VariableName = ShellCommandLineGetRawValue(Package, 1);
306 } else {
307 VariableName = NULL;
308 Guid = NULL;
309 }
310 if (ShellStatus == SHELL_SUCCESS) {
311 if (ShellCommandLineGetFlag(Package, L"-s") || ShellCommandLineGetFlag(Package, L"-l")) {
312 ///@todo fix this after lib ready...
313 ShellPrintEx(-1, -1, L"Not implemeneted yet.\r\n");
314 ShellStatus = SHELL_UNSUPPORTED;
315 } else {
316 ShellStatus = ProcessVariables (VariableName, Guid, ShellCommandLineGetFlag(Package, L"-d"));
317 }
318 }
319 }
320 }
321
322 if (Package != NULL) {
323 ShellCommandLineFreeVarList (Package);
324 }
325 return ShellStatus;
326 }
327