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