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