]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c
ShellPkg: Standardized HP Copyright Message String
[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
a71003f2 5 Copyright (c) 2010 - 2013, 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
45EFIAPI\r
46DoDiagnostics (\r
47 IN CONST DRV_DIAG_TEST_MODE Mode,\r
48 IN CONST CHAR8 *Lang,\r
49 IN CONST BOOLEAN AllChilds,\r
50 IN CONST EFI_HANDLE DriverHandle,\r
51 IN CONST EFI_HANDLE ControllerHandle,\r
52 IN CONST EFI_HANDLE ChildHandle\r
53 )\r
54{\r
55 EFI_DRIVER_DIAGNOSTICS_PROTOCOL *DriverDiagnostics;\r
56 EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *DriverDiagnostics2;\r
57 EFI_HANDLE *DriverHandleList;\r
58 EFI_HANDLE *ControllerHandleList;\r
59 EFI_HANDLE *ChildHandleList;\r
60 EFI_HANDLE *Walker;\r
61 UINTN DriverHandleListCount;\r
62 UINTN ControllerHandleListCount;\r
63 UINTN ChildHandleListCount;\r
64 UINTN DriverHandleListLoop;\r
65 UINTN ControllerHandleListLoop;\r
66 UINTN ChildHandleListLoop;\r
67 EFI_STATUS Status;\r
68 EFI_STATUS Status2;\r
69 EFI_GUID *ErrorType;\r
70 UINTN OutBufferSize;\r
71 CHAR16 *OutBuffer;\r
72 UINTN HandleIndex1;\r
73 UINTN HandleIndex2;\r
361a8267 74 CHAR8 *Language;\r
361a8267 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
bc280720
TS
103 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"drvdiag", L"gEfiDriverDiagnosticsProtocolGuid", &gEfiDriverDiagnosticsProtocolGuid); \r
104 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"drvdiag", 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
a71003f2
ED
183 if (!EFI_ERROR(Status) && (DriverDiagnostics2 != NULL)) {\r
184 Language = GetBestLanguageForDriver(DriverDiagnostics2->SupportedLanguages, Lang, FALSE);\r
361a8267 185 Found = TRUE;\r
186 Status = DriverDiagnostics2->RunDiagnostics(\r
187 DriverDiagnostics2,\r
188 ControllerHandleList[ControllerHandleListLoop],\r
189 ChildHandleList == NULL?NULL:ChildHandleList[ChildHandleListLoop],\r
190 (EFI_DRIVER_DIAGNOSTIC_TYPE)Mode,\r
191 Language,\r
192 &ErrorType,\r
193 &OutBufferSize,\r
194 &OutBuffer);\r
195 FreePool(Language);\r
196 }\r
197 } \r
a1d4bfcc 198 if (!Found && (Lang == NULL||(Lang!=NULL&&(Lang[2]!='-')))){\r
361a8267 199 Status = gBS->OpenProtocol(\r
200 DriverHandleList[DriverHandleListLoop],\r
201 &gEfiDriverDiagnosticsProtocolGuid,\r
202 (VOID**)&DriverDiagnostics,\r
203 gImageHandle,\r
204 NULL,\r
205 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
206 if (!EFI_ERROR(Status)) {\r
a71003f2 207 Language = GetBestLanguageForDriver(DriverDiagnostics->SupportedLanguages, Lang, FALSE);\r
361a8267 208 Status = DriverDiagnostics->RunDiagnostics(\r
209 DriverDiagnostics,\r
210 ControllerHandleList[ControllerHandleListLoop],\r
211 ChildHandleList == NULL?NULL:ChildHandleList[ChildHandleListLoop],\r
212 (EFI_DRIVER_DIAGNOSTIC_TYPE)Mode,\r
213 Language,\r
214 &ErrorType,\r
215 &OutBufferSize,\r
216 &OutBuffer);\r
217 FreePool(Language);\r
218 }\r
219 }\r
220 if (EFI_ERROR(Status)) {\r
221 Status2 = Status;\r
222 }\r
223 HandleIndex1 = ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop]);\r
224 HandleIndex2 = ConvertHandleToHandleIndex(ControllerHandleList[ControllerHandleListLoop]);\r
225 ShellPrintHiiEx(\r
226 -1,\r
227 -1,\r
4ba49616 228 NULL,\r
361a8267 229 STRING_TOKEN (STR_3P_RESULT),\r
230 gShellDriver1HiiHandle,\r
231 L"DrvDiag",\r
232 HandleIndex1,\r
233 HandleIndex2,\r
234 ChildHandleList == NULL?0:ConvertHandleToHandleIndex(ChildHandleList[ChildHandleListLoop]),\r
235 Status);\r
236 if (OutBuffer!=NULL) {\r
237 FreePool(OutBuffer);\r
238 OutBuffer = NULL;\r
239 }\r
240 if (ErrorType!=NULL) {\r
241 FreePool(ErrorType);\r
242 ErrorType = NULL;\r
4ba49616 243 }\r
244 } else {\r
361a8267 245 HandleIndex1 = ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop]);\r
246 HandleIndex2 = ConvertHandleToHandleIndex(ControllerHandleList[ControllerHandleListLoop]);\r
247 //\r
248 // Print out the information that this set can be tested\r
249 //\r
250 ShellPrintHiiEx(\r
251 -1,\r
252 -1,\r
4ba49616 253 NULL,\r
361a8267 254 STRING_TOKEN (STR_DRV_DIAG_ITEM_LINE),\r
255 gShellDriver1HiiHandle,\r
256 HandleIndex1,\r
257 HandleIndex2,\r
258 ChildHandleList == NULL?0:ConvertHandleToHandleIndex(ChildHandleList[ChildHandleListLoop])\r
259 );\r
4ba49616 260 }\r
361a8267 261\r
4ba49616 262 //\r
361a8267 263 // If we are doing a single pass with NULL child jump out after a single loop\r
4ba49616 264 //\r
361a8267 265 if (ChildHandleList == NULL) {\r
266 break;\r
267 }\r
4ba49616 268 }\r
361a8267 269 if (AllChilds) {\r
270 SHELL_FREE_NON_NULL(ChildHandleList);\r
271 ChildHandleList = NULL;\r
272 ChildHandleListCount = 0;\r
4ba49616 273 }\r
274 }\r
361a8267 275 if (ControllerHandle == NULL) {\r
276 SHELL_FREE_NON_NULL(ControllerHandleList);\r
277 ControllerHandleList = NULL;\r
278 ControllerHandleListCount = 0;\r
279 }\r
4ba49616 280 }\r
4ba49616 281 }\r
282\r
283 if (DriverHandleList != NULL) {\r
284 FreePool(DriverHandleList);\r
285 }\r
286 if (ControllerHandleList != NULL) {\r
287 FreePool(ControllerHandleList);\r
288 }\r
289 if (ChildHandleList != NULL) {\r
290 FreePool(ChildHandleList);\r
291 }\r
292 return (Status2);\r
293}\r
294\r
295\r
296STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
297 {L"-c", TypeFlag},\r
298 {L"-s", TypeFlag},\r
299 {L"-e", TypeFlag},\r
300 {L"-m", TypeFlag},\r
301 {L"-l", TypeValue},\r
302 {NULL, TypeMax}\r
303 };\r
304\r
361a8267 305/**\r
306 Function for 'drvdiag' command.\r
307\r
308 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
309 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
310**/\r
4ba49616 311SHELL_STATUS\r
312EFIAPI\r
313ShellCommandRunDrvDiag (\r
314 IN EFI_HANDLE ImageHandle,\r
315 IN EFI_SYSTEM_TABLE *SystemTable\r
316 )\r
317{\r
318 EFI_STATUS Status;\r
319 LIST_ENTRY *Package;\r
320 CHAR16 *ProblemParam;\r
321 SHELL_STATUS ShellStatus;\r
322 DRV_DIAG_TEST_MODE Mode;\r
323 CHAR8 *Language;\r
324 CONST CHAR16 *DriverHandleStr;\r
325 CONST CHAR16 *ControllerHandleStr;\r
326 CONST CHAR16 *ChildHandleStr;\r
327 CONST CHAR16 *Lang;\r
328 EFI_HANDLE Handle1;\r
329 EFI_HANDLE Handle2;\r
330 EFI_HANDLE Handle3;\r
361a8267 331 UINT64 Intermediate;\r
4ba49616 332\r
333 ShellStatus = SHELL_SUCCESS;\r
361a8267 334 Mode = TestModeMax;\r
4ba49616 335 Language = NULL;\r
336\r
337 //\r
338 // initialize the shell lib (we must be in non-auto-init...)\r
339 //\r
340 Status = ShellInitialize();\r
341 ASSERT_EFI_ERROR(Status);\r
342\r
343 Status = CommandInit();\r
344 ASSERT_EFI_ERROR(Status);\r
345\r
346 //\r
347 // parse the command line\r
348 //\r
349 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
350 if (EFI_ERROR(Status)) {\r
351 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
bc280720 352 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drvdiag", ProblemParam); \r
4ba49616 353 FreePool(ProblemParam);\r
354 ShellStatus = SHELL_INVALID_PARAMETER;\r
355 } else {\r
356 ASSERT(FALSE);\r
357 }\r
358 } else {\r
359 //\r
360 // if more than 3 'value' parameters (plus the name one) or we have any 2 mode flags\r
361 //\r
362 if ((ShellCommandLineGetCount(Package) > 4)\r
363 ||(ShellCommandLineGetFlag(Package, L"-s") && ShellCommandLineGetFlag(Package, L"-e"))\r
364 ||(ShellCommandLineGetFlag(Package, L"-s") && ShellCommandLineGetFlag(Package, L"-m"))\r
365 ||(ShellCommandLineGetFlag(Package, L"-e") && ShellCommandLineGetFlag(Package, L"-m"))\r
366 ){\r
367 //\r
368 // error for too many parameters\r
369 //\r
bc280720 370 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drvdiag"); \r
4ba49616 371 ShellStatus = SHELL_INVALID_PARAMETER;\r
372 } else if ((ShellCommandLineGetFlag(Package, L"-s"))\r
373 || (ShellCommandLineGetFlag(Package, L"-e"))\r
374 || (ShellCommandLineGetFlag(Package, L"-m"))\r
375 ){\r
376 //\r
377 // Run the apropriate test\r
378 //\r
379 if (ShellCommandLineGetFlag(Package, L"-s")) {\r
361a8267 380 Mode = TestModeStandard;\r
4ba49616 381 } else if (ShellCommandLineGetFlag(Package, L"-e")) {\r
361a8267 382 Mode = TestModeExtended;\r
4ba49616 383 } else if (ShellCommandLineGetFlag(Package, L"-m")) {\r
361a8267 384 Mode = TestModeManufacturing;\r
4ba49616 385 } else {\r
386 ASSERT(FALSE);\r
387 }\r
388 } else {\r
389 //\r
390 // Do a listing of what's available to test\r
391 //\r
361a8267 392 Mode = TestModeList;\r
4ba49616 393 }\r
394\r
395 Lang = ShellCommandLineGetValue(Package, L"-l");\r
361a8267 396 if (ShellCommandLineGetFlag(Package, L"-l") && Lang == NULL) {\r
4ba49616 397 ASSERT(Language == NULL);\r
bc280720 398 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvdiag", L"-l"); \r
4ba49616 399 ShellCommandLineFreeVarList (Package);\r
400 return (SHELL_INVALID_PARAMETER);\r
361a8267 401 } else if (Lang != NULL) {\r
402 Language = AllocateZeroPool(StrSize(Lang));\r
403 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
4ba49616 404 }\r
405\r
406 DriverHandleStr = ShellCommandLineGetRawValue(Package, 1);\r
407 ControllerHandleStr = ShellCommandLineGetRawValue(Package, 2);\r
408 ChildHandleStr = ShellCommandLineGetRawValue(Package, 3);\r
409\r
410 if (DriverHandleStr == NULL) {\r
411 Handle1 = NULL;\r
412 } else {\r
361a8267 413 ShellConvertStringToUint64(DriverHandleStr, &Intermediate, TRUE, FALSE);\r
414 Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
4ba49616 415 }\r
416 if (ControllerHandleStr == NULL) {\r
417 Handle2 = NULL;\r
418 } else {\r
361a8267 419 ShellConvertStringToUint64(ControllerHandleStr, &Intermediate, TRUE, FALSE);\r
420 Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
4ba49616 421 }\r
422 if (ChildHandleStr == NULL) {\r
423 Handle3 = NULL;\r
424 } else {\r
361a8267 425 ShellConvertStringToUint64(ChildHandleStr, &Intermediate, TRUE, FALSE);\r
426 Handle3 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
4ba49616 427 }\r
428\r
429 Status = DoDiagnostics (\r
430 Mode,\r
431 Language,\r
432 ShellCommandLineGetFlag(Package, L"-c"),\r
433 Handle1, \r
434 Handle2, \r
435 Handle3\r
436 );\r
437\r
438 SHELL_FREE_NON_NULL(Language);\r
439 ShellCommandLineFreeVarList (Package);\r
440\r
441 }\r
442 if (ShellStatus == SHELL_SUCCESS) {\r
443 if (Status == EFI_SECURITY_VIOLATION) {\r
444 ShellStatus = SHELL_SECURITY_VIOLATION;\r
445 } else if (Status == EFI_INVALID_PARAMETER) {\r
446 ShellStatus = SHELL_INVALID_PARAMETER;\r
447 } else if (Status == EFI_NOT_FOUND) {\r
448 ShellStatus = SHELL_NOT_FOUND;\r
449 } else if (EFI_ERROR(Status)) {\r
450 ShellStatus = SHELL_NOT_FOUND;\r
451 }\r
452 }\r
453\r
454 return (ShellStatus);\r
455}\r