]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/DrvDiag.c
Update return value.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / DrvDiag.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for DrvDiag shell Driver1 function.\r
3\r
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
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
22 TEST_MODE_STANDARD = EfiDriverDiagnosticTypeStandard,\r
23 TEST_MODE_EXTENDED = EfiDriverDiagnosticTypeExtended,\r
24 TEST_MODE_MANUFACTURING = EfiDriverDiagnosticTypeManufacturing,\r
25 TEST_MODE_LIST,\r
26 TEST_MODE_MAX\r
27} DRV_DIAG_TEST_MODE;\r
28\r
29EFI_STATUS\r
30EFIAPI\r
31DoDiagnostics (\r
32 IN CONST DRV_DIAG_TEST_MODE Mode,\r
33 IN CONST CHAR8 *Lang,\r
34 IN CONST BOOLEAN AllChilds,\r
35 IN CONST EFI_HANDLE DriverHandle,\r
36 IN CONST EFI_HANDLE ControllerHandle,\r
37 IN CONST EFI_HANDLE ChildHandle\r
38 )\r
39{\r
40 EFI_DRIVER_DIAGNOSTICS_PROTOCOL *DriverDiagnostics;\r
41 EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *DriverDiagnostics2;\r
42 EFI_HANDLE *DriverHandleList;\r
43 EFI_HANDLE *ControllerHandleList;\r
44 EFI_HANDLE *ChildHandleList;\r
45 EFI_HANDLE *Walker;\r
46 UINTN DriverHandleListCount;\r
47 UINTN ControllerHandleListCount;\r
48 UINTN ChildHandleListCount;\r
49 UINTN DriverHandleListLoop;\r
50 UINTN ControllerHandleListLoop;\r
51 UINTN ChildHandleListLoop;\r
52 EFI_STATUS Status;\r
53 EFI_STATUS Status2;\r
54 EFI_GUID *ErrorType;\r
55 UINTN OutBufferSize;\r
56 CHAR16 *OutBuffer;\r
57 UINTN HandleIndex1;\r
58 UINTN HandleIndex2;\r
59\r
60 if ((ChildHandle != NULL && AllChilds) || (Mode >= TEST_MODE_MAX)){\r
61 return (EFI_INVALID_PARAMETER);\r
62 }\r
63\r
64 if (Lang == NULL || AsciiStrLen(Lang) < 3) {\r
65 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-l <value>");\r
66 return (EFI_INVALID_PARAMETER);\r
67 }\r
68\r
69 DriverDiagnostics = NULL;\r
70 DriverDiagnostics2 = NULL;\r
71 Status = EFI_SUCCESS;\r
72 Status2 = EFI_SUCCESS;\r
73 DriverHandleList = NULL;\r
74 ControllerHandleList = NULL;\r
75 ChildHandleList = NULL;\r
76 OutBuffer = NULL;\r
77 ErrorType = NULL;\r
78 DriverHandleListCount = 0;\r
79 ControllerHandleListCount = 0;\r
80 ChildHandleListCount = 0;\r
81\r
82 if (DriverHandle != NULL) {\r
83 DriverHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE));\r
84 ASSERT(DriverHandleList!=NULL);\r
85 DriverHandleList[0] = DriverHandle;\r
86 DriverHandleListCount = 1;\r
87 } else {\r
88 DriverHandleList = GetHandleListByProtocolList(DiagGuidList);\r
89 if (DriverHandleList == NULL) {\r
90 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle);\r
91 return (EFI_NOT_FOUND);\r
92 } \r
93 for (Walker = DriverHandleList ; Walker != NULL && *Walker != NULL ; DriverHandleListCount++, Walker++);\r
94 }\r
95\r
96 if (ControllerHandle != NULL) {\r
97 ControllerHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE));\r
98 ASSERT(ControllerHandleList!=NULL);\r
99 ControllerHandleList[0] = ControllerHandle;\r
100 ControllerHandleListCount = 1;\r
101 } else {\r
102 ControllerHandleList = NULL;\r
103 }\r
104\r
105 if (ChildHandle != NULL) {\r
106 ChildHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE));\r
107 ASSERT(ChildHandleList!=NULL);\r
108 ChildHandleList[0] = ChildHandle;\r
109 ChildHandleListCount = 1;\r
110 } else if (AllChilds) {\r
111 ChildHandleList = NULL;\r
112 //\r
113 // This gets handled in the loop below.\r
114 //\r
115 } else {\r
116 ChildHandleList = NULL;\r
117 }\r
118\r
119 for (DriverHandleListLoop = 0\r
120 ; DriverHandleListLoop < DriverHandleListCount\r
121 ; DriverHandleListLoop++\r
122 ){\r
123 if (ControllerHandle == NULL) {\r
124 PARSE_HANDLE_DATABASE_DEVICES(DriverHandleList[DriverHandleListLoop], &ControllerHandleListCount, &ControllerHandleList);\r
125 }\r
126 for (ControllerHandleListLoop = 0\r
127 ; ControllerHandleListLoop < ControllerHandleListCount\r
128 ; ControllerHandleListLoop++\r
129 ){\r
130 if (AllChilds) {\r
131 ASSERT(ChildHandleList == NULL);\r
132 PARSE_HANDLE_DATABASE_MANAGED_CHILDREN(\r
133 DriverHandleList[DriverHandleListLoop], \r
134 ControllerHandleList[ControllerHandleListLoop],\r
135 &ChildHandleListCount,\r
136 &ChildHandleList);\r
137 }\r
138 for (ChildHandleListLoop = 0\r
139 ; (ChildHandleListLoop < ChildHandleListCount || ChildHandleList == NULL)\r
140 ; ChildHandleListLoop++\r
141 ){\r
142 if (Mode != TEST_MODE_LIST) {\r
143 if (Lang[2] == '-') {\r
144 //\r
145 // Get the protocol pointer and call the function\r
146 //\r
147 Status = gBS->OpenProtocol(\r
148 DriverHandleList[DriverHandleListLoop],\r
149 &gEfiDriverDiagnostics2ProtocolGuid,\r
150 (VOID**)&DriverDiagnostics2,\r
151 gImageHandle,\r
152 NULL,\r
153 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
154 if (!EFI_ERROR(Status)) {\r
155 Status = DriverDiagnostics2->RunDiagnostics(\r
156 DriverDiagnostics2,\r
157 ControllerHandleList[ControllerHandleListLoop],\r
158 ChildHandleList == NULL?NULL:ChildHandleList[ChildHandleListLoop],\r
159 (EFI_DRIVER_DIAGNOSTIC_TYPE)Mode,\r
160 (CHAR8*)Lang,\r
161 &ErrorType,\r
162 &OutBufferSize,\r
163 &OutBuffer);\r
164 }\r
165 } else {\r
166 Status = gBS->OpenProtocol(\r
167 DriverHandleList[DriverHandleListLoop],\r
168 &gEfiDriverDiagnosticsProtocolGuid,\r
169 (VOID**)&DriverDiagnostics,\r
170 gImageHandle,\r
171 NULL,\r
172 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
173 if (!EFI_ERROR(Status)) {\r
174 Status = DriverDiagnostics->RunDiagnostics(\r
175 DriverDiagnostics,\r
176 ControllerHandleList[ControllerHandleListLoop],\r
177 ChildHandleList == NULL?NULL:ChildHandleList[ChildHandleListLoop],\r
178 (EFI_DRIVER_DIAGNOSTIC_TYPE)Mode,\r
179 (CHAR8*)Lang,\r
180 &ErrorType,\r
181 &OutBufferSize,\r
182 &OutBuffer);\r
183 }\r
184 }\r
185 if (EFI_ERROR(Status)) {\r
186 Status2 = Status;\r
187 }\r
188 HandleIndex1 = ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop]);\r
189 HandleIndex2 = ConvertHandleToHandleIndex(ControllerHandleList[ControllerHandleListLoop]);\r
190 ShellPrintHiiEx(\r
191 -1,\r
192 -1,\r
193 NULL,\r
194 STRING_TOKEN (STR_3P_RESULT),\r
195 gShellDriver1HiiHandle,\r
196 L"DrvDiag",\r
197 HandleIndex1,\r
198 HandleIndex2,\r
199 ChildHandleList == NULL?0:ConvertHandleToHandleIndex(ChildHandleList[ChildHandleListLoop]),\r
200 Status);\r
201 if (OutBuffer!=NULL) {\r
202 FreePool(OutBuffer);\r
203 OutBuffer = NULL;\r
204 }\r
205 if (ErrorType!=NULL) {\r
206 FreePool(ErrorType);\r
207 ErrorType = NULL;\r
208 }\r
209 } else {\r
210 HandleIndex1 = ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop]);\r
211 HandleIndex2 = ConvertHandleToHandleIndex(ControllerHandleList[ControllerHandleListLoop]);\r
212 //\r
213 // Print out the information that this set can be tested\r
214 //\r
215 ShellPrintHiiEx(\r
216 -1,\r
217 -1,\r
218 NULL,\r
219 STRING_TOKEN (STR_DRV_DIAG_ITEM_LINE),\r
220 gShellDriver1HiiHandle,\r
221 HandleIndex1,\r
222 HandleIndex2,\r
223 ChildHandleList == NULL?0:ConvertHandleToHandleIndex(ChildHandleList[ChildHandleListLoop])\r
224 );\r
225 }\r
226\r
227 //\r
228 // If we are doing a single pass with NULL child jump out after a single loop\r
229 //\r
230 if (ChildHandleList == NULL) {\r
231 break;\r
232 }\r
233 }\r
234 if (AllChilds) {\r
235 SHELL_FREE_NON_NULL(ChildHandleList);\r
236 ChildHandleList = NULL;\r
237 ChildHandleListCount = 0;\r
238 }\r
239 }\r
240 if (ControllerHandle == NULL) {\r
241 SHELL_FREE_NON_NULL(ControllerHandleList);\r
242 ControllerHandleList = NULL;\r
243 ControllerHandleListCount = 0;\r
244 }\r
245 }\r
246\r
247 if (DriverHandleList != NULL) {\r
248 FreePool(DriverHandleList);\r
249 }\r
250 if (ControllerHandleList != NULL) {\r
251 FreePool(ControllerHandleList);\r
252 }\r
253 if (ChildHandleList != NULL) {\r
254 FreePool(ChildHandleList);\r
255 }\r
256 return (Status2);\r
257}\r
258\r
259\r
260STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
261 {L"-c", TypeFlag},\r
262 {L"-s", TypeFlag},\r
263 {L"-e", TypeFlag},\r
264 {L"-m", TypeFlag},\r
265 {L"-l", TypeValue},\r
266 {NULL, TypeMax}\r
267 };\r
268\r
269SHELL_STATUS\r
270EFIAPI\r
271ShellCommandRunDrvDiag (\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 DRV_DIAG_TEST_MODE Mode;\r
281 CHAR8 *Language;\r
282 CONST CHAR16 *DriverHandleStr;\r
283 CONST CHAR16 *ControllerHandleStr;\r
284 CONST CHAR16 *ChildHandleStr;\r
285 CONST CHAR16 *Lang;\r
286 EFI_HANDLE Handle1;\r
287 EFI_HANDLE Handle2;\r
288 EFI_HANDLE Handle3;\r
289\r
290 ShellStatus = SHELL_SUCCESS;\r
291 Mode = TEST_MODE_MAX;\r
292 Language = NULL;\r
293\r
294 //\r
295 // initialize the shell lib (we must be in non-auto-init...)\r
296 //\r
297 Status = ShellInitialize();\r
298 ASSERT_EFI_ERROR(Status);\r
299\r
300 Status = CommandInit();\r
301 ASSERT_EFI_ERROR(Status);\r
302\r
303 //\r
304 // parse the command line\r
305 //\r
306 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
307 if (EFI_ERROR(Status)) {\r
308 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
309 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
310 FreePool(ProblemParam);\r
311 ShellStatus = SHELL_INVALID_PARAMETER;\r
312 } else {\r
313 ASSERT(FALSE);\r
314 }\r
315 } else {\r
316 //\r
317 // if more than 3 'value' parameters (plus the name one) or we have any 2 mode flags\r
318 //\r
319 if ((ShellCommandLineGetCount(Package) > 4)\r
320 ||(ShellCommandLineGetFlag(Package, L"-s") && ShellCommandLineGetFlag(Package, L"-e"))\r
321 ||(ShellCommandLineGetFlag(Package, L"-s") && ShellCommandLineGetFlag(Package, L"-m"))\r
322 ||(ShellCommandLineGetFlag(Package, L"-e") && ShellCommandLineGetFlag(Package, L"-m"))\r
323 ){\r
324 //\r
325 // error for too many parameters\r
326 //\r
327 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
328 ShellStatus = SHELL_INVALID_PARAMETER;\r
329 } else if ((ShellCommandLineGetFlag(Package, L"-s"))\r
330 || (ShellCommandLineGetFlag(Package, L"-e"))\r
331 || (ShellCommandLineGetFlag(Package, L"-m"))\r
332 ){\r
333 //\r
334 // Run the apropriate test\r
335 //\r
336 if (ShellCommandLineGetFlag(Package, L"-s")) {\r
337 Mode = TEST_MODE_STANDARD;\r
338 } else if (ShellCommandLineGetFlag(Package, L"-e")) {\r
339 Mode = TEST_MODE_EXTENDED;\r
340 } else if (ShellCommandLineGetFlag(Package, L"-m")) {\r
341 Mode = TEST_MODE_MANUFACTURING;\r
342 } else {\r
343 ASSERT(FALSE);\r
344 }\r
345 } else {\r
346 //\r
347 // Do a listing of what's available to test\r
348 //\r
349 Mode = TEST_MODE_LIST;\r
350 }\r
351\r
352 Lang = ShellCommandLineGetValue(Package, L"-l");\r
353 if (Lang != NULL) {\r
354 Language = AllocateZeroPool(StrSize(Lang));\r
355 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
356 } else if (!ShellCommandLineGetFlag(Package, L"-l")){\r
357 Language = AllocateZeroPool(10);\r
358 AsciiSPrint(Language, 10, "en-us");\r
359 } else {\r
360 ASSERT(Language == NULL);\r
361 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
362 ShellCommandLineFreeVarList (Package);\r
363 return (SHELL_INVALID_PARAMETER);\r
364 }\r
365\r
366 DriverHandleStr = ShellCommandLineGetRawValue(Package, 1);\r
367 ControllerHandleStr = ShellCommandLineGetRawValue(Package, 2);\r
368 ChildHandleStr = ShellCommandLineGetRawValue(Package, 3);\r
369\r
370 if (DriverHandleStr == NULL) {\r
371 Handle1 = NULL;\r
372 } else {\r
373 Handle1 = ConvertHandleIndexToHandle(StrHexToUintn(DriverHandleStr ));\r
374 }\r
375 if (ControllerHandleStr == NULL) {\r
376 Handle2 = NULL;\r
377 } else {\r
378 Handle2 = ConvertHandleIndexToHandle(StrHexToUintn(ControllerHandleStr));\r
379 }\r
380 if (ChildHandleStr == NULL) {\r
381 Handle3 = NULL;\r
382 } else {\r
383 Handle3 = ConvertHandleIndexToHandle(StrHexToUintn(ChildHandleStr ));\r
384 }\r
385\r
386 Status = DoDiagnostics (\r
387 Mode,\r
388 Language,\r
389 ShellCommandLineGetFlag(Package, L"-c"),\r
390 Handle1, \r
391 Handle2, \r
392 Handle3\r
393 );\r
394\r
395 SHELL_FREE_NON_NULL(Language);\r
396 ShellCommandLineFreeVarList (Package);\r
397\r
398 }\r
399 if (ShellStatus == SHELL_SUCCESS) {\r
400 if (Status == EFI_SECURITY_VIOLATION) {\r
401 ShellStatus = SHELL_SECURITY_VIOLATION;\r
402 } else if (Status == EFI_INVALID_PARAMETER) {\r
403 ShellStatus = SHELL_INVALID_PARAMETER;\r
404 } else if (Status == EFI_NOT_FOUND) {\r
405 ShellStatus = SHELL_NOT_FOUND;\r
406 } else if (EFI_ERROR(Status)) {\r
407 ShellStatus = SHELL_NOT_FOUND;\r
408 }\r
409 }\r
410\r
411 return (ShellStatus);\r
412}\r