2 Main file for DrvDiag shell Driver1 function.
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
5 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include "UefiShellDriver1CommandsLib.h"
12 STATIC CONST EFI_GUID
*DiagGuidList
[] = {&gEfiDriverDiagnosticsProtocolGuid
, &gEfiDriverDiagnostics2ProtocolGuid
, NULL
};
14 // We need 1 more item on the list...
17 TestModeStandard
= EfiDriverDiagnosticTypeStandard
,
18 TestModeExtended
= EfiDriverDiagnosticTypeExtended
,
19 TestModeManufacturing
= EfiDriverDiagnosticTypeManufacturing
,
25 Do the diagnostics call for some set of handles.
27 @param[in] Mode The type of diagnostic test to run.
28 @param[in] Lang The language code to use.
29 @param[in] AllChilds Should the test be on all children.
30 @param[in] DriverHandle The driver handle to test with.
31 @param[in] ControllerHandle The specific controller handle to test.
32 @param[in] ChildHandle The specific child handle to test.
34 @retval EFI_SUCCESS The operation was successful.
35 @retval EFI_INVALID_PARAMETER A parameter had an invalid value.
36 @retval EFI_NOT_FOUND No diagnostic handle could be found.
40 IN CONST DRV_DIAG_TEST_MODE Mode
,
42 IN CONST BOOLEAN AllChilds
,
43 IN CONST EFI_HANDLE DriverHandle
,
44 IN CONST EFI_HANDLE ControllerHandle
,
45 IN CONST EFI_HANDLE ChildHandle
48 EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*DriverDiagnostics
;
49 EFI_DRIVER_DIAGNOSTICS2_PROTOCOL
*DriverDiagnostics2
;
50 EFI_HANDLE
*DriverHandleList
;
51 EFI_HANDLE
*ControllerHandleList
;
52 EFI_HANDLE
*ChildHandleList
;
54 UINTN DriverHandleListCount
;
55 UINTN ControllerHandleListCount
;
56 UINTN ChildHandleListCount
;
57 UINTN DriverHandleListLoop
;
58 UINTN ControllerHandleListLoop
;
59 UINTN ChildHandleListLoop
;
70 if ((ChildHandle
!= NULL
&& AllChilds
) || (Mode
>= TestModeMax
)){
71 return (EFI_INVALID_PARAMETER
);
74 DriverDiagnostics
= NULL
;
75 DriverDiagnostics2
= NULL
;
77 Status2
= EFI_SUCCESS
;
78 DriverHandleList
= NULL
;
79 ControllerHandleList
= NULL
;
80 ChildHandleList
= NULL
;
84 DriverHandleListCount
= 0;
85 ControllerHandleListCount
= 0;
86 ChildHandleListCount
= 0;
88 if (DriverHandle
!= NULL
) {
89 DriverHandleList
= AllocateZeroPool(2*sizeof(EFI_HANDLE
));
90 if (DriverHandleList
== NULL
) {
91 return EFI_OUT_OF_RESOURCES
;
93 DriverHandleList
[0] = DriverHandle
;
94 DriverHandleListCount
= 1;
96 DriverHandleList
= GetHandleListByProtocolList(DiagGuidList
);
97 if (DriverHandleList
== NULL
) {
98 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROTOCOL_NF
), gShellDriver1HiiHandle
, L
"drvdiag", L
"gEfiDriverDiagnosticsProtocolGuid", &gEfiDriverDiagnosticsProtocolGuid
);
99 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROTOCOL_NF
), gShellDriver1HiiHandle
, L
"drvdiag", L
"gEfiDriverDiagnostics2ProtocolGuid", &gEfiDriverDiagnostics2ProtocolGuid
);
100 return (EFI_NOT_FOUND
);
102 for (Walker
= DriverHandleList
; Walker
!= NULL
&& *Walker
!= NULL
; DriverHandleListCount
++, Walker
++);
105 if (ControllerHandle
!= NULL
) {
106 ControllerHandleList
= AllocateZeroPool(2*sizeof(EFI_HANDLE
));
107 if (ControllerHandleList
== NULL
) {
108 SHELL_FREE_NON_NULL (DriverHandleList
);
109 return EFI_OUT_OF_RESOURCES
;
111 ControllerHandleList
[0] = ControllerHandle
;
112 ControllerHandleListCount
= 1;
114 ControllerHandleList
= NULL
;
117 if (ChildHandle
!= NULL
) {
118 ChildHandleList
= AllocateZeroPool(2*sizeof(EFI_HANDLE
));
119 if (ChildHandleList
== NULL
) {
120 SHELL_FREE_NON_NULL (ControllerHandleList
);
121 SHELL_FREE_NON_NULL (DriverHandleList
);
122 return EFI_OUT_OF_RESOURCES
;
124 ChildHandleList
[0] = ChildHandle
;
125 ChildHandleListCount
= 1;
126 } else if (AllChilds
) {
127 ChildHandleList
= NULL
;
129 // This gets handled in the loop below.
132 ChildHandleList
= NULL
;
135 if (Mode
== TestModeList
) {
136 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVDIAG_HEADER
), gShellDriver1HiiHandle
);
138 for (DriverHandleListLoop
= 0
139 ; DriverHandleListLoop
< DriverHandleListCount
140 ; DriverHandleListLoop
++
142 if (Mode
== TestModeList
) {
143 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVDIAG_DRIVER_HEADER
), gShellDriver1HiiHandle
, ConvertHandleToHandleIndex(DriverHandleList
[DriverHandleListLoop
]));
145 if (ControllerHandle
== NULL
) {
146 PARSE_HANDLE_DATABASE_DEVICES(DriverHandleList
[DriverHandleListLoop
], &ControllerHandleListCount
, &ControllerHandleList
);
148 if (ControllerHandleListCount
== 0) {
149 if (Mode
== TestModeList
) {
150 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVDIAG_DRIVER_NO_HANDLES
), gShellDriver1HiiHandle
);
153 if (Mode
== TestModeList
) {
154 ShellPrintEx(-1, -1, L
"\r\n");
156 for (ControllerHandleListLoop
= 0
157 ; ControllerHandleListLoop
< ControllerHandleListCount
158 ; ControllerHandleListLoop
++
161 ASSERT(ChildHandleList
== NULL
);
162 PARSE_HANDLE_DATABASE_MANAGED_CHILDREN(
163 DriverHandleList
[DriverHandleListLoop
],
164 ControllerHandleList
[ControllerHandleListLoop
],
165 &ChildHandleListCount
,
168 for (ChildHandleListLoop
= 0
169 ; (ChildHandleListLoop
< ChildHandleListCount
|| ChildHandleList
== NULL
)
170 ; ChildHandleListLoop
++
173 if (Mode
!= TestModeList
) {
174 if (Lang
== NULL
|| Lang
[2] == '-') {
176 // Get the protocol pointer and call the function
178 Status
= gBS
->OpenProtocol(
179 DriverHandleList
[DriverHandleListLoop
],
180 &gEfiDriverDiagnostics2ProtocolGuid
,
181 (VOID
**)&DriverDiagnostics2
,
184 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
185 if (!EFI_ERROR(Status
) && (DriverDiagnostics2
!= NULL
)) {
186 Language
= GetBestLanguageForDriver(DriverDiagnostics2
->SupportedLanguages
, Lang
, FALSE
);
188 Status
= DriverDiagnostics2
->RunDiagnostics(
190 ControllerHandleList
[ControllerHandleListLoop
],
191 ChildHandleList
== NULL
?NULL
:ChildHandleList
[ChildHandleListLoop
],
192 (EFI_DRIVER_DIAGNOSTIC_TYPE
)Mode
,
200 if (!Found
&& (Lang
== NULL
||(Lang
!=NULL
&&(Lang
[2]!='-')))){
201 Status
= gBS
->OpenProtocol(
202 DriverHandleList
[DriverHandleListLoop
],
203 &gEfiDriverDiagnosticsProtocolGuid
,
204 (VOID
**)&DriverDiagnostics
,
207 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
208 if (!EFI_ERROR(Status
)) {
209 Language
= GetBestLanguageForDriver(DriverDiagnostics
->SupportedLanguages
, Lang
, FALSE
);
210 Status
= DriverDiagnostics
->RunDiagnostics(
212 ControllerHandleList
[ControllerHandleListLoop
],
213 ChildHandleList
== NULL
?NULL
:ChildHandleList
[ChildHandleListLoop
],
214 (EFI_DRIVER_DIAGNOSTIC_TYPE
)Mode
,
222 if (EFI_ERROR(Status
)) {
225 HandleIndex1
= ConvertHandleToHandleIndex(DriverHandleList
[DriverHandleListLoop
]);
226 HandleIndex2
= ConvertHandleToHandleIndex(ControllerHandleList
[ControllerHandleListLoop
]);
231 STRING_TOKEN (STR_3P_RESULT
),
232 gShellDriver1HiiHandle
,
236 ChildHandleList
== NULL
?0:ConvertHandleToHandleIndex(ChildHandleList
[ChildHandleListLoop
]),
238 if (OutBuffer
!=NULL
) {
242 if (ErrorType
!=NULL
) {
247 HandleIndex1
= ConvertHandleToHandleIndex(DriverHandleList
[DriverHandleListLoop
]);
248 HandleIndex2
= ConvertHandleToHandleIndex(ControllerHandleList
[ControllerHandleListLoop
]);
250 // Print out the information that this set can be tested
256 STRING_TOKEN (STR_DRV_DIAG_ITEM_LINE
),
257 gShellDriver1HiiHandle
,
260 ChildHandleList
== NULL
?0:ConvertHandleToHandleIndex(ChildHandleList
[ChildHandleListLoop
])
265 // If we are doing a single pass with NULL child jump out after a single loop
267 if (ChildHandleList
== NULL
) {
272 SHELL_FREE_NON_NULL(ChildHandleList
);
273 ChildHandleList
= NULL
;
274 ChildHandleListCount
= 0;
277 if (ControllerHandle
== NULL
) {
278 SHELL_FREE_NON_NULL(ControllerHandleList
);
279 ControllerHandleList
= NULL
;
280 ControllerHandleListCount
= 0;
285 if (DriverHandleList
!= NULL
) {
286 FreePool(DriverHandleList
);
288 if (ControllerHandleList
!= NULL
) {
289 FreePool(ControllerHandleList
);
291 if (ChildHandleList
!= NULL
) {
292 FreePool(ChildHandleList
);
298 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
308 Function for 'drvdiag' command.
310 @param[in] ImageHandle Handle to the Image (NULL if Internal).
311 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
315 ShellCommandRunDrvDiag (
316 IN EFI_HANDLE ImageHandle
,
317 IN EFI_SYSTEM_TABLE
*SystemTable
322 CHAR16
*ProblemParam
;
323 SHELL_STATUS ShellStatus
;
324 DRV_DIAG_TEST_MODE Mode
;
326 CONST CHAR16
*DriverHandleStr
;
327 CONST CHAR16
*ControllerHandleStr
;
328 CONST CHAR16
*ChildHandleStr
;
335 ShellStatus
= SHELL_SUCCESS
;
340 // initialize the shell lib (we must be in non-auto-init...)
342 Status
= ShellInitialize();
343 ASSERT_EFI_ERROR(Status
);
345 Status
= CommandInit();
346 ASSERT_EFI_ERROR(Status
);
349 // parse the command line
351 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
352 if (EFI_ERROR(Status
)) {
353 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
354 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"drvdiag", ProblemParam
);
355 FreePool(ProblemParam
);
356 ShellStatus
= SHELL_INVALID_PARAMETER
;
362 // if more than 3 'value' parameters (plus the name one) or we have any 2 mode flags
364 if ((ShellCommandLineGetCount(Package
) > 4)
365 ||(ShellCommandLineGetFlag(Package
, L
"-s") && ShellCommandLineGetFlag(Package
, L
"-e"))
366 ||(ShellCommandLineGetFlag(Package
, L
"-s") && ShellCommandLineGetFlag(Package
, L
"-m"))
367 ||(ShellCommandLineGetFlag(Package
, L
"-e") && ShellCommandLineGetFlag(Package
, L
"-m"))
370 // error for too many parameters
372 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"drvdiag");
373 ShellStatus
= SHELL_INVALID_PARAMETER
;
374 } else if ((ShellCommandLineGetFlag(Package
, L
"-s"))
375 || (ShellCommandLineGetFlag(Package
, L
"-e"))
376 || (ShellCommandLineGetFlag(Package
, L
"-m"))
379 // Run the appropriate test
381 if (ShellCommandLineGetFlag(Package
, L
"-s")) {
382 Mode
= TestModeStandard
;
383 } else if (ShellCommandLineGetFlag(Package
, L
"-e")) {
384 Mode
= TestModeExtended
;
385 } else if (ShellCommandLineGetFlag(Package
, L
"-m")) {
386 Mode
= TestModeManufacturing
;
392 // Do a listing of what's available to test
397 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
398 if (ShellCommandLineGetFlag(Package
, L
"-l") && Lang
== NULL
) {
399 ASSERT(Language
== NULL
);
400 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"drvdiag", L
"-l");
401 ShellCommandLineFreeVarList (Package
);
402 return (SHELL_INVALID_PARAMETER
);
403 } else if (Lang
!= NULL
) {
404 Language
= AllocateZeroPool(StrSize(Lang
));
405 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
408 DriverHandleStr
= ShellCommandLineGetRawValue(Package
, 1);
409 ControllerHandleStr
= ShellCommandLineGetRawValue(Package
, 2);
410 ChildHandleStr
= ShellCommandLineGetRawValue(Package
, 3);
412 if (DriverHandleStr
== NULL
) {
415 ShellConvertStringToUint64(DriverHandleStr
, &Intermediate
, TRUE
, FALSE
);
416 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
418 if (ControllerHandleStr
== NULL
) {
421 ShellConvertStringToUint64(ControllerHandleStr
, &Intermediate
, TRUE
, FALSE
);
422 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
424 if (ChildHandleStr
== NULL
) {
427 ShellConvertStringToUint64(ChildHandleStr
, &Intermediate
, TRUE
, FALSE
);
428 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
431 Status
= DoDiagnostics (
434 ShellCommandLineGetFlag(Package
, L
"-c"),
440 SHELL_FREE_NON_NULL(Language
);
441 ShellCommandLineFreeVarList (Package
);
444 if (ShellStatus
== SHELL_SUCCESS
) {
445 if (Status
== EFI_SECURITY_VIOLATION
) {
446 ShellStatus
= SHELL_SECURITY_VIOLATION
;
447 } else if (Status
== EFI_INVALID_PARAMETER
) {
448 ShellStatus
= SHELL_INVALID_PARAMETER
;
449 } else if (Status
== EFI_NOT_FOUND
) {
450 ShellStatus
= SHELL_NOT_FOUND
;
451 } else if (EFI_ERROR(Status
)) {
452 ShellStatus
= SHELL_NOT_FOUND
;
456 return (ShellStatus
);