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