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