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