]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c
add comments to function declarations and definitions and updated to match coding...
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / DrvDiag.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for DrvDiag shell Driver1 function.\r
3\r
361a8267 4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
4ba49616 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 "UefiShellDriver1CommandsLib.h"\r
16\r
17STATIC CONST EFI_GUID *DiagGuidList[] = {&gEfiDriverDiagnosticsProtocolGuid, &gEfiDriverDiagnostics2ProtocolGuid, NULL};\r
18//\r
19// We need 1 more item on the list...\r
20//\r
21typedef enum {\r
361a8267 22 TestModeStandard = EfiDriverDiagnosticTypeStandard,\r
23 TestModeExtended = EfiDriverDiagnosticTypeExtended,\r
24 TestModeManufacturing = EfiDriverDiagnosticTypeManufacturing,\r
25 TestModeList,\r
26 TestModeMax\r
4ba49616 27} DRV_DIAG_TEST_MODE;\r
28\r
361a8267 29/**\r
30 Do the diagnostics call for some set of handles.\r
31\r
32 @param[in] Mode The type of diagnostic test to run.\r
33 @param[in] Lang The language code to use.\r
34 @param[in] AllChilds Should the test be on all children.\r
35 @param[in] DriverHandle The driver handle to test with.\r
36 @param[in] ControllerHandle The specific controller handle to test.\r
37 @param[in] ChildHandle The specific child handle to test.\r
38\r
39 @retval EFI_SUCCESS The operation was successful.\r
40 @retval EFI_INVALID_PARAMETER A parameter had an invalid value.\r
41 @retval EFI_NOT_FOUND No diagnostic handle could be found.\r
42**/\r
4ba49616 43EFI_STATUS\r
44EFIAPI\r
45DoDiagnostics (\r
46 IN CONST DRV_DIAG_TEST_MODE Mode,\r
47 IN CONST CHAR8 *Lang,\r
48 IN CONST BOOLEAN AllChilds,\r
49 IN CONST EFI_HANDLE DriverHandle,\r
50 IN CONST EFI_HANDLE ControllerHandle,\r
51 IN CONST EFI_HANDLE ChildHandle\r
52 )\r
53{\r
54 EFI_DRIVER_DIAGNOSTICS_PROTOCOL *DriverDiagnostics;\r
55 EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *DriverDiagnostics2;\r
56 EFI_HANDLE *DriverHandleList;\r
57 EFI_HANDLE *ControllerHandleList;\r
58 EFI_HANDLE *ChildHandleList;\r
59 EFI_HANDLE *Walker;\r
60 UINTN DriverHandleListCount;\r
61 UINTN ControllerHandleListCount;\r
62 UINTN ChildHandleListCount;\r
63 UINTN DriverHandleListLoop;\r
64 UINTN ControllerHandleListLoop;\r
65 UINTN ChildHandleListLoop;\r
66 EFI_STATUS Status;\r
67 EFI_STATUS Status2;\r
68 EFI_GUID *ErrorType;\r
69 UINTN OutBufferSize;\r
70 CHAR16 *OutBuffer;\r
71 UINTN HandleIndex1;\r
72 UINTN HandleIndex2;\r
361a8267 73 CHAR8 *Language;\r
74 CHAR8 *TempChar;\r
75 BOOLEAN Found;\r
4ba49616 76\r
361a8267 77 if ((ChildHandle != NULL && AllChilds) || (Mode >= TestModeMax)){\r
4ba49616 78 return (EFI_INVALID_PARAMETER);\r
79 }\r
80\r
81 DriverDiagnostics = NULL;\r
82 DriverDiagnostics2 = NULL;\r
83 Status = EFI_SUCCESS;\r
84 Status2 = EFI_SUCCESS;\r
85 DriverHandleList = NULL;\r
86 ControllerHandleList = NULL;\r
87 ChildHandleList = NULL;\r
361a8267 88 Language = NULL;\r
4ba49616 89 OutBuffer = NULL;\r
90 ErrorType = NULL;\r
91 DriverHandleListCount = 0;\r
92 ControllerHandleListCount = 0;\r
93 ChildHandleListCount = 0;\r
94\r
95 if (DriverHandle != NULL) {\r
96 DriverHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE));\r
97 ASSERT(DriverHandleList!=NULL);\r
98 DriverHandleList[0] = DriverHandle;\r
99 DriverHandleListCount = 1;\r
100 } else {\r
101 DriverHandleList = GetHandleListByProtocolList(DiagGuidList);\r
102 if (DriverHandleList == NULL) {\r
361a8267 103 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"gEfiDriverDiagnosticsProtocolGuid", &gEfiDriverDiagnosticsProtocolGuid);\r
104 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"gEfiDriverDiagnostics2ProtocolGuid", &gEfiDriverDiagnostics2ProtocolGuid);\r
4ba49616 105 return (EFI_NOT_FOUND);\r
106 } \r
107 for (Walker = DriverHandleList ; Walker != NULL && *Walker != NULL ; DriverHandleListCount++, Walker++);\r
108 }\r
109\r
110 if (ControllerHandle != NULL) {\r
111 ControllerHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE));\r
112 ASSERT(ControllerHandleList!=NULL);\r
113 ControllerHandleList[0] = ControllerHandle;\r
114 ControllerHandleListCount = 1;\r
115 } else {\r
116 ControllerHandleList = NULL;\r
117 }\r
118\r
119 if (ChildHandle != NULL) {\r
120 ChildHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE));\r
121 ASSERT(ChildHandleList!=NULL);\r
122 ChildHandleList[0] = ChildHandle;\r
123 ChildHandleListCount = 1;\r
124 } else if (AllChilds) {\r
125 ChildHandleList = NULL;\r
126 //\r
127 // This gets handled in the loop below.\r
128 //\r
129 } else {\r
130 ChildHandleList = NULL;\r
131 }\r
132\r
361a8267 133 if (Mode == TestModeList) {\r
134 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVDIAG_HEADER), gShellDriver1HiiHandle);\r
135 }\r
4ba49616 136 for (DriverHandleListLoop = 0\r
137 ; DriverHandleListLoop < DriverHandleListCount\r
138 ; DriverHandleListLoop++\r
139 ){\r
361a8267 140 if (Mode == TestModeList) {\r
141 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVDIAG_DRIVER_HEADER), gShellDriver1HiiHandle, ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop]));\r
142 }\r
4ba49616 143 if (ControllerHandle == NULL) {\r
144 PARSE_HANDLE_DATABASE_DEVICES(DriverHandleList[DriverHandleListLoop], &ControllerHandleListCount, &ControllerHandleList);\r
361a8267 145 } \r
146 if (ControllerHandleListCount == 0) {\r
147 if (Mode == TestModeList) {\r
148 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVDIAG_DRIVER_NO_HANDLES), gShellDriver1HiiHandle);\r
149 }\r
150 } else {\r
151 if (Mode == TestModeList) {\r
152 ShellPrintEx(-1, -1, L"\r\n");\r
4ba49616 153 }\r
361a8267 154 for (ControllerHandleListLoop = 0\r
155 ; ControllerHandleListLoop < ControllerHandleListCount\r
156 ; ControllerHandleListLoop++\r
4ba49616 157 ){\r
361a8267 158 if (AllChilds) {\r
159 ASSERT(ChildHandleList == NULL);\r
160 PARSE_HANDLE_DATABASE_MANAGED_CHILDREN(\r
161 DriverHandleList[DriverHandleListLoop], \r
162 ControllerHandleList[ControllerHandleListLoop],\r
163 &ChildHandleListCount,\r
164 &ChildHandleList);\r
165 }\r
166 for (ChildHandleListLoop = 0\r
167 ; (ChildHandleListLoop < ChildHandleListCount || ChildHandleList == NULL)\r
168 ; ChildHandleListLoop++\r
169 ){\r
170 Found = FALSE;\r
171 if (Mode != TestModeList) {\r
172 if (Lang == NULL || Lang[2] == '-') {\r
173 //\r
174 // Get the protocol pointer and call the function\r
175 //\r
176 Status = gBS->OpenProtocol(\r
177 DriverHandleList[DriverHandleListLoop],\r
178 &gEfiDriverDiagnostics2ProtocolGuid,\r
179 (VOID**)&DriverDiagnostics2,\r
180 gImageHandle,\r
181 NULL,\r
182 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
183 if (!EFI_ERROR(Status)) {\r
184 if (Lang == NULL) {\r
185 Language = AllocateZeroPool(AsciiStrSize(DriverDiagnostics2->SupportedLanguages));\r
186 if (Language == NULL) {\r
187 return (EFI_OUT_OF_RESOURCES);\r
188 }\r
189 AsciiStrCpy(Language, DriverDiagnostics2->SupportedLanguages);\r
190 TempChar = AsciiStrStr(Language, ";");\r
191 if (TempChar != NULL){\r
192 *TempChar = CHAR_NULL;\r
193 }\r
194 } else {\r
195 Language = AllocateZeroPool(AsciiStrSize(Lang));\r
196 if (Language == NULL) {\r
197 return (EFI_OUT_OF_RESOURCES);\r
198 }\r
199 AsciiStrCpy(Language, Lang);\r
200 }\r
201 Found = TRUE;\r
202 Status = DriverDiagnostics2->RunDiagnostics(\r
203 DriverDiagnostics2,\r
204 ControllerHandleList[ControllerHandleListLoop],\r
205 ChildHandleList == NULL?NULL:ChildHandleList[ChildHandleListLoop],\r
206 (EFI_DRIVER_DIAGNOSTIC_TYPE)Mode,\r
207 Language,\r
208 &ErrorType,\r
209 &OutBufferSize,\r
210 &OutBuffer);\r
211 FreePool(Language);\r
212 }\r
213 } \r
a1d4bfcc 214 if (!Found && (Lang == NULL||(Lang!=NULL&&(Lang[2]!='-')))){\r
361a8267 215 Status = gBS->OpenProtocol(\r
216 DriverHandleList[DriverHandleListLoop],\r
217 &gEfiDriverDiagnosticsProtocolGuid,\r
218 (VOID**)&DriverDiagnostics,\r
219 gImageHandle,\r
220 NULL,\r
221 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
222 if (!EFI_ERROR(Status)) {\r
223 if (Lang == NULL) {\r
224 Language = AllocateZeroPool(AsciiStrSize(DriverDiagnostics2->SupportedLanguages));\r
225 if (Language == NULL) {\r
226 return (EFI_OUT_OF_RESOURCES);\r
227 }\r
228 AsciiStrCpy(Language, DriverDiagnostics2->SupportedLanguages);\r
229 TempChar = AsciiStrStr(Language, ";");\r
230 if (TempChar != NULL){\r
231 *TempChar = CHAR_NULL;\r
232 }\r
233 } else {\r
234 Language = AllocateZeroPool(AsciiStrSize(Lang));\r
235 if (Language == NULL) {\r
236 return (EFI_OUT_OF_RESOURCES);\r
237 }\r
238 AsciiStrCpy(Language, Lang);\r
239 }\r
240 Status = DriverDiagnostics->RunDiagnostics(\r
241 DriverDiagnostics,\r
242 ControllerHandleList[ControllerHandleListLoop],\r
243 ChildHandleList == NULL?NULL:ChildHandleList[ChildHandleListLoop],\r
244 (EFI_DRIVER_DIAGNOSTIC_TYPE)Mode,\r
245 Language,\r
246 &ErrorType,\r
247 &OutBufferSize,\r
248 &OutBuffer);\r
249 FreePool(Language);\r
250 }\r
251 }\r
252 if (EFI_ERROR(Status)) {\r
253 Status2 = Status;\r
254 }\r
255 HandleIndex1 = ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop]);\r
256 HandleIndex2 = ConvertHandleToHandleIndex(ControllerHandleList[ControllerHandleListLoop]);\r
257 ShellPrintHiiEx(\r
258 -1,\r
259 -1,\r
4ba49616 260 NULL,\r
361a8267 261 STRING_TOKEN (STR_3P_RESULT),\r
262 gShellDriver1HiiHandle,\r
263 L"DrvDiag",\r
264 HandleIndex1,\r
265 HandleIndex2,\r
266 ChildHandleList == NULL?0:ConvertHandleToHandleIndex(ChildHandleList[ChildHandleListLoop]),\r
267 Status);\r
268 if (OutBuffer!=NULL) {\r
269 FreePool(OutBuffer);\r
270 OutBuffer = NULL;\r
271 }\r
272 if (ErrorType!=NULL) {\r
273 FreePool(ErrorType);\r
274 ErrorType = NULL;\r
4ba49616 275 }\r
276 } else {\r
361a8267 277 HandleIndex1 = ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop]);\r
278 HandleIndex2 = ConvertHandleToHandleIndex(ControllerHandleList[ControllerHandleListLoop]);\r
279 //\r
280 // Print out the information that this set can be tested\r
281 //\r
282 ShellPrintHiiEx(\r
283 -1,\r
284 -1,\r
4ba49616 285 NULL,\r
361a8267 286 STRING_TOKEN (STR_DRV_DIAG_ITEM_LINE),\r
287 gShellDriver1HiiHandle,\r
288 HandleIndex1,\r
289 HandleIndex2,\r
290 ChildHandleList == NULL?0:ConvertHandleToHandleIndex(ChildHandleList[ChildHandleListLoop])\r
291 );\r
4ba49616 292 }\r
361a8267 293\r
4ba49616 294 //\r
361a8267 295 // If we are doing a single pass with NULL child jump out after a single loop\r
4ba49616 296 //\r
361a8267 297 if (ChildHandleList == NULL) {\r
298 break;\r
299 }\r
4ba49616 300 }\r
361a8267 301 if (AllChilds) {\r
302 SHELL_FREE_NON_NULL(ChildHandleList);\r
303 ChildHandleList = NULL;\r
304 ChildHandleListCount = 0;\r
4ba49616 305 }\r
306 }\r
361a8267 307 if (ControllerHandle == NULL) {\r
308 SHELL_FREE_NON_NULL(ControllerHandleList);\r
309 ControllerHandleList = NULL;\r
310 ControllerHandleListCount = 0;\r
311 }\r
4ba49616 312 }\r
4ba49616 313 }\r
314\r
315 if (DriverHandleList != NULL) {\r
316 FreePool(DriverHandleList);\r
317 }\r
318 if (ControllerHandleList != NULL) {\r
319 FreePool(ControllerHandleList);\r
320 }\r
321 if (ChildHandleList != NULL) {\r
322 FreePool(ChildHandleList);\r
323 }\r
324 return (Status2);\r
325}\r
326\r
327\r
328STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
329 {L"-c", TypeFlag},\r
330 {L"-s", TypeFlag},\r
331 {L"-e", TypeFlag},\r
332 {L"-m", TypeFlag},\r
333 {L"-l", TypeValue},\r
334 {NULL, TypeMax}\r
335 };\r
336\r
361a8267 337/**\r
338 Function for 'drvdiag' command.\r
339\r
340 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
341 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
342**/\r
4ba49616 343SHELL_STATUS\r
344EFIAPI\r
345ShellCommandRunDrvDiag (\r
346 IN EFI_HANDLE ImageHandle,\r
347 IN EFI_SYSTEM_TABLE *SystemTable\r
348 )\r
349{\r
350 EFI_STATUS Status;\r
351 LIST_ENTRY *Package;\r
352 CHAR16 *ProblemParam;\r
353 SHELL_STATUS ShellStatus;\r
354 DRV_DIAG_TEST_MODE Mode;\r
355 CHAR8 *Language;\r
356 CONST CHAR16 *DriverHandleStr;\r
357 CONST CHAR16 *ControllerHandleStr;\r
358 CONST CHAR16 *ChildHandleStr;\r
359 CONST CHAR16 *Lang;\r
360 EFI_HANDLE Handle1;\r
361 EFI_HANDLE Handle2;\r
362 EFI_HANDLE Handle3;\r
361a8267 363 UINT64 Intermediate;\r
4ba49616 364\r
365 ShellStatus = SHELL_SUCCESS;\r
361a8267 366 Mode = TestModeMax;\r
4ba49616 367 Language = NULL;\r
368\r
369 //\r
370 // initialize the shell lib (we must be in non-auto-init...)\r
371 //\r
372 Status = ShellInitialize();\r
373 ASSERT_EFI_ERROR(Status);\r
374\r
375 Status = CommandInit();\r
376 ASSERT_EFI_ERROR(Status);\r
377\r
378 //\r
379 // parse the command line\r
380 //\r
381 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
382 if (EFI_ERROR(Status)) {\r
383 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
384 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
385 FreePool(ProblemParam);\r
386 ShellStatus = SHELL_INVALID_PARAMETER;\r
387 } else {\r
388 ASSERT(FALSE);\r
389 }\r
390 } else {\r
391 //\r
392 // if more than 3 'value' parameters (plus the name one) or we have any 2 mode flags\r
393 //\r
394 if ((ShellCommandLineGetCount(Package) > 4)\r
395 ||(ShellCommandLineGetFlag(Package, L"-s") && ShellCommandLineGetFlag(Package, L"-e"))\r
396 ||(ShellCommandLineGetFlag(Package, L"-s") && ShellCommandLineGetFlag(Package, L"-m"))\r
397 ||(ShellCommandLineGetFlag(Package, L"-e") && ShellCommandLineGetFlag(Package, L"-m"))\r
398 ){\r
399 //\r
400 // error for too many parameters\r
401 //\r
402 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
403 ShellStatus = SHELL_INVALID_PARAMETER;\r
404 } else if ((ShellCommandLineGetFlag(Package, L"-s"))\r
405 || (ShellCommandLineGetFlag(Package, L"-e"))\r
406 || (ShellCommandLineGetFlag(Package, L"-m"))\r
407 ){\r
408 //\r
409 // Run the apropriate test\r
410 //\r
411 if (ShellCommandLineGetFlag(Package, L"-s")) {\r
361a8267 412 Mode = TestModeStandard;\r
4ba49616 413 } else if (ShellCommandLineGetFlag(Package, L"-e")) {\r
361a8267 414 Mode = TestModeExtended;\r
4ba49616 415 } else if (ShellCommandLineGetFlag(Package, L"-m")) {\r
361a8267 416 Mode = TestModeManufacturing;\r
4ba49616 417 } else {\r
418 ASSERT(FALSE);\r
419 }\r
420 } else {\r
421 //\r
422 // Do a listing of what's available to test\r
423 //\r
361a8267 424 Mode = TestModeList;\r
4ba49616 425 }\r
426\r
427 Lang = ShellCommandLineGetValue(Package, L"-l");\r
361a8267 428 if (ShellCommandLineGetFlag(Package, L"-l") && Lang == NULL) {\r
4ba49616 429 ASSERT(Language == NULL);\r
430 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
431 ShellCommandLineFreeVarList (Package);\r
432 return (SHELL_INVALID_PARAMETER);\r
361a8267 433 } else if (Lang != NULL) {\r
434 Language = AllocateZeroPool(StrSize(Lang));\r
435 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
4ba49616 436 }\r
437\r
438 DriverHandleStr = ShellCommandLineGetRawValue(Package, 1);\r
439 ControllerHandleStr = ShellCommandLineGetRawValue(Package, 2);\r
440 ChildHandleStr = ShellCommandLineGetRawValue(Package, 3);\r
441\r
442 if (DriverHandleStr == NULL) {\r
443 Handle1 = NULL;\r
444 } else {\r
361a8267 445 ShellConvertStringToUint64(DriverHandleStr, &Intermediate, TRUE, FALSE);\r
446 Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
4ba49616 447 }\r
448 if (ControllerHandleStr == NULL) {\r
449 Handle2 = NULL;\r
450 } else {\r
361a8267 451 ShellConvertStringToUint64(ControllerHandleStr, &Intermediate, TRUE, FALSE);\r
452 Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
4ba49616 453 }\r
454 if (ChildHandleStr == NULL) {\r
455 Handle3 = NULL;\r
456 } else {\r
361a8267 457 ShellConvertStringToUint64(ChildHandleStr, &Intermediate, TRUE, FALSE);\r
458 Handle3 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
4ba49616 459 }\r
460\r
461 Status = DoDiagnostics (\r
462 Mode,\r
463 Language,\r
464 ShellCommandLineGetFlag(Package, L"-c"),\r
465 Handle1, \r
466 Handle2, \r
467 Handle3\r
468 );\r
469\r
470 SHELL_FREE_NON_NULL(Language);\r
471 ShellCommandLineFreeVarList (Package);\r
472\r
473 }\r
474 if (ShellStatus == SHELL_SUCCESS) {\r
475 if (Status == EFI_SECURITY_VIOLATION) {\r
476 ShellStatus = SHELL_SECURITY_VIOLATION;\r
477 } else if (Status == EFI_INVALID_PARAMETER) {\r
478 ShellStatus = SHELL_INVALID_PARAMETER;\r
479 } else if (Status == EFI_NOT_FOUND) {\r
480 ShellStatus = SHELL_NOT_FOUND;\r
481 } else if (EFI_ERROR(Status)) {\r
482 ShellStatus = SHELL_NOT_FOUND;\r
483 }\r
484 }\r
485\r
486 return (ShellStatus);\r
487}\r