2 Main file for DrvDiag shell Driver1 function.
4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellDriver1CommandsLib.h"
17 STATIC CONST EFI_GUID
*DiagGuidList
[] = {&gEfiDriverDiagnosticsProtocolGuid
, &gEfiDriverDiagnostics2ProtocolGuid
, NULL
};
19 // We need 1 more item on the list...
22 TestModeStandard
= EfiDriverDiagnosticTypeStandard
,
23 TestModeExtended
= EfiDriverDiagnosticTypeExtended
,
24 TestModeManufacturing
= EfiDriverDiagnosticTypeManufacturing
,
30 Do the diagnostics call for some set of handles.
32 @param[in] Mode The type of diagnostic test to run.
33 @param[in] Lang The language code to use.
34 @param[in] AllChilds Should the test be on all children.
35 @param[in] DriverHandle The driver handle to test with.
36 @param[in] ControllerHandle The specific controller handle to test.
37 @param[in] ChildHandle The specific child handle to test.
39 @retval EFI_SUCCESS The operation was successful.
40 @retval EFI_INVALID_PARAMETER A parameter had an invalid value.
41 @retval EFI_NOT_FOUND No diagnostic handle could be found.
46 IN CONST DRV_DIAG_TEST_MODE Mode
,
48 IN CONST BOOLEAN AllChilds
,
49 IN CONST EFI_HANDLE DriverHandle
,
50 IN CONST EFI_HANDLE ControllerHandle
,
51 IN CONST EFI_HANDLE ChildHandle
54 EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*DriverDiagnostics
;
55 EFI_DRIVER_DIAGNOSTICS2_PROTOCOL
*DriverDiagnostics2
;
56 EFI_HANDLE
*DriverHandleList
;
57 EFI_HANDLE
*ControllerHandleList
;
58 EFI_HANDLE
*ChildHandleList
;
60 UINTN DriverHandleListCount
;
61 UINTN ControllerHandleListCount
;
62 UINTN ChildHandleListCount
;
63 UINTN DriverHandleListLoop
;
64 UINTN ControllerHandleListLoop
;
65 UINTN ChildHandleListLoop
;
77 if ((ChildHandle
!= NULL
&& AllChilds
) || (Mode
>= TestModeMax
)){
78 return (EFI_INVALID_PARAMETER
);
81 DriverDiagnostics
= NULL
;
82 DriverDiagnostics2
= NULL
;
84 Status2
= EFI_SUCCESS
;
85 DriverHandleList
= NULL
;
86 ControllerHandleList
= NULL
;
87 ChildHandleList
= NULL
;
91 DriverHandleListCount
= 0;
92 ControllerHandleListCount
= 0;
93 ChildHandleListCount
= 0;
95 if (DriverHandle
!= NULL
) {
96 DriverHandleList
= AllocateZeroPool(2*sizeof(EFI_HANDLE
));
97 ASSERT(DriverHandleList
!=NULL
);
98 DriverHandleList
[0] = DriverHandle
;
99 DriverHandleListCount
= 1;
101 DriverHandleList
= GetHandleListByProtocolList(DiagGuidList
);
102 if (DriverHandleList
== NULL
) {
103 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROTOCOL_NF
), gShellDriver1HiiHandle
, L
"gEfiDriverDiagnosticsProtocolGuid", &gEfiDriverDiagnosticsProtocolGuid
);
104 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROTOCOL_NF
), gShellDriver1HiiHandle
, L
"gEfiDriverDiagnostics2ProtocolGuid", &gEfiDriverDiagnostics2ProtocolGuid
);
105 return (EFI_NOT_FOUND
);
107 for (Walker
= DriverHandleList
; Walker
!= NULL
&& *Walker
!= NULL
; DriverHandleListCount
++, Walker
++);
110 if (ControllerHandle
!= NULL
) {
111 ControllerHandleList
= AllocateZeroPool(2*sizeof(EFI_HANDLE
));
112 ASSERT(ControllerHandleList
!=NULL
);
113 ControllerHandleList
[0] = ControllerHandle
;
114 ControllerHandleListCount
= 1;
116 ControllerHandleList
= NULL
;
119 if (ChildHandle
!= NULL
) {
120 ChildHandleList
= AllocateZeroPool(2*sizeof(EFI_HANDLE
));
121 ASSERT(ChildHandleList
!=NULL
);
122 ChildHandleList
[0] = ChildHandle
;
123 ChildHandleListCount
= 1;
124 } else if (AllChilds
) {
125 ChildHandleList
= NULL
;
127 // This gets handled in the loop below.
130 ChildHandleList
= NULL
;
133 if (Mode
== TestModeList
) {
134 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVDIAG_HEADER
), gShellDriver1HiiHandle
);
136 for (DriverHandleListLoop
= 0
137 ; DriverHandleListLoop
< DriverHandleListCount
138 ; DriverHandleListLoop
++
140 if (Mode
== TestModeList
) {
141 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVDIAG_DRIVER_HEADER
), gShellDriver1HiiHandle
, ConvertHandleToHandleIndex(DriverHandleList
[DriverHandleListLoop
]));
143 if (ControllerHandle
== NULL
) {
144 PARSE_HANDLE_DATABASE_DEVICES(DriverHandleList
[DriverHandleListLoop
], &ControllerHandleListCount
, &ControllerHandleList
);
146 if (ControllerHandleListCount
== 0) {
147 if (Mode
== TestModeList
) {
148 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVDIAG_DRIVER_NO_HANDLES
), gShellDriver1HiiHandle
);
151 if (Mode
== TestModeList
) {
152 ShellPrintEx(-1, -1, L
"\r\n");
154 for (ControllerHandleListLoop
= 0
155 ; ControllerHandleListLoop
< ControllerHandleListCount
156 ; ControllerHandleListLoop
++
159 ASSERT(ChildHandleList
== NULL
);
160 PARSE_HANDLE_DATABASE_MANAGED_CHILDREN(
161 DriverHandleList
[DriverHandleListLoop
],
162 ControllerHandleList
[ControllerHandleListLoop
],
163 &ChildHandleListCount
,
166 for (ChildHandleListLoop
= 0
167 ; (ChildHandleListLoop
< ChildHandleListCount
|| ChildHandleList
== NULL
)
168 ; ChildHandleListLoop
++
171 if (Mode
!= TestModeList
) {
172 if (Lang
== NULL
|| Lang
[2] == '-') {
174 // Get the protocol pointer and call the function
176 Status
= gBS
->OpenProtocol(
177 DriverHandleList
[DriverHandleListLoop
],
178 &gEfiDriverDiagnostics2ProtocolGuid
,
179 (VOID
**)&DriverDiagnostics2
,
182 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
183 if (!EFI_ERROR(Status
)) {
185 Language
= AllocateZeroPool(AsciiStrSize(DriverDiagnostics2
->SupportedLanguages
));
186 if (Language
== NULL
) {
187 return (EFI_OUT_OF_RESOURCES
);
189 AsciiStrCpy(Language
, DriverDiagnostics2
->SupportedLanguages
);
190 TempChar
= AsciiStrStr(Language
, ";");
191 if (TempChar
!= NULL
){
192 *TempChar
= CHAR_NULL
;
195 Language
= AllocateZeroPool(AsciiStrSize(Lang
));
196 if (Language
== NULL
) {
197 return (EFI_OUT_OF_RESOURCES
);
199 AsciiStrCpy(Language
, Lang
);
202 Status
= DriverDiagnostics2
->RunDiagnostics(
204 ControllerHandleList
[ControllerHandleListLoop
],
205 ChildHandleList
== NULL
?NULL
:ChildHandleList
[ChildHandleListLoop
],
206 (EFI_DRIVER_DIAGNOSTIC_TYPE
)Mode
,
214 if (!Found
&& (Lang
== NULL
||(Lang
!=NULL
&&(Lang
[2]!='-')))){
215 Status
= gBS
->OpenProtocol(
216 DriverHandleList
[DriverHandleListLoop
],
217 &gEfiDriverDiagnosticsProtocolGuid
,
218 (VOID
**)&DriverDiagnostics
,
221 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
222 if (!EFI_ERROR(Status
)) {
224 Language
= AllocateZeroPool(AsciiStrSize(DriverDiagnostics2
->SupportedLanguages
));
225 if (Language
== NULL
) {
226 return (EFI_OUT_OF_RESOURCES
);
228 AsciiStrCpy(Language
, DriverDiagnostics2
->SupportedLanguages
);
229 TempChar
= AsciiStrStr(Language
, ";");
230 if (TempChar
!= NULL
){
231 *TempChar
= CHAR_NULL
;
234 Language
= AllocateZeroPool(AsciiStrSize(Lang
));
235 if (Language
== NULL
) {
236 return (EFI_OUT_OF_RESOURCES
);
238 AsciiStrCpy(Language
, Lang
);
240 Status
= DriverDiagnostics
->RunDiagnostics(
242 ControllerHandleList
[ControllerHandleListLoop
],
243 ChildHandleList
== NULL
?NULL
:ChildHandleList
[ChildHandleListLoop
],
244 (EFI_DRIVER_DIAGNOSTIC_TYPE
)Mode
,
252 if (EFI_ERROR(Status
)) {
255 HandleIndex1
= ConvertHandleToHandleIndex(DriverHandleList
[DriverHandleListLoop
]);
256 HandleIndex2
= ConvertHandleToHandleIndex(ControllerHandleList
[ControllerHandleListLoop
]);
261 STRING_TOKEN (STR_3P_RESULT
),
262 gShellDriver1HiiHandle
,
266 ChildHandleList
== NULL
?0:ConvertHandleToHandleIndex(ChildHandleList
[ChildHandleListLoop
]),
268 if (OutBuffer
!=NULL
) {
272 if (ErrorType
!=NULL
) {
277 HandleIndex1
= ConvertHandleToHandleIndex(DriverHandleList
[DriverHandleListLoop
]);
278 HandleIndex2
= ConvertHandleToHandleIndex(ControllerHandleList
[ControllerHandleListLoop
]);
280 // Print out the information that this set can be tested
286 STRING_TOKEN (STR_DRV_DIAG_ITEM_LINE
),
287 gShellDriver1HiiHandle
,
290 ChildHandleList
== NULL
?0:ConvertHandleToHandleIndex(ChildHandleList
[ChildHandleListLoop
])
295 // If we are doing a single pass with NULL child jump out after a single loop
297 if (ChildHandleList
== NULL
) {
302 SHELL_FREE_NON_NULL(ChildHandleList
);
303 ChildHandleList
= NULL
;
304 ChildHandleListCount
= 0;
307 if (ControllerHandle
== NULL
) {
308 SHELL_FREE_NON_NULL(ControllerHandleList
);
309 ControllerHandleList
= NULL
;
310 ControllerHandleListCount
= 0;
315 if (DriverHandleList
!= NULL
) {
316 FreePool(DriverHandleList
);
318 if (ControllerHandleList
!= NULL
) {
319 FreePool(ControllerHandleList
);
321 if (ChildHandleList
!= NULL
) {
322 FreePool(ChildHandleList
);
328 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
338 Function for 'drvdiag' command.
340 @param[in] ImageHandle Handle to the Image (NULL if Internal).
341 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
345 ShellCommandRunDrvDiag (
346 IN EFI_HANDLE ImageHandle
,
347 IN EFI_SYSTEM_TABLE
*SystemTable
352 CHAR16
*ProblemParam
;
353 SHELL_STATUS ShellStatus
;
354 DRV_DIAG_TEST_MODE Mode
;
356 CONST CHAR16
*DriverHandleStr
;
357 CONST CHAR16
*ControllerHandleStr
;
358 CONST CHAR16
*ChildHandleStr
;
365 ShellStatus
= SHELL_SUCCESS
;
370 // initialize the shell lib (we must be in non-auto-init...)
372 Status
= ShellInitialize();
373 ASSERT_EFI_ERROR(Status
);
375 Status
= CommandInit();
376 ASSERT_EFI_ERROR(Status
);
379 // parse the command line
381 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
382 if (EFI_ERROR(Status
)) {
383 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
384 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
385 FreePool(ProblemParam
);
386 ShellStatus
= SHELL_INVALID_PARAMETER
;
392 // if more than 3 'value' parameters (plus the name one) or we have any 2 mode flags
394 if ((ShellCommandLineGetCount(Package
) > 4)
395 ||(ShellCommandLineGetFlag(Package
, L
"-s") && ShellCommandLineGetFlag(Package
, L
"-e"))
396 ||(ShellCommandLineGetFlag(Package
, L
"-s") && ShellCommandLineGetFlag(Package
, L
"-m"))
397 ||(ShellCommandLineGetFlag(Package
, L
"-e") && ShellCommandLineGetFlag(Package
, L
"-m"))
400 // error for too many parameters
402 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
403 ShellStatus
= SHELL_INVALID_PARAMETER
;
404 } else if ((ShellCommandLineGetFlag(Package
, L
"-s"))
405 || (ShellCommandLineGetFlag(Package
, L
"-e"))
406 || (ShellCommandLineGetFlag(Package
, L
"-m"))
409 // Run the apropriate test
411 if (ShellCommandLineGetFlag(Package
, L
"-s")) {
412 Mode
= TestModeStandard
;
413 } else if (ShellCommandLineGetFlag(Package
, L
"-e")) {
414 Mode
= TestModeExtended
;
415 } else if (ShellCommandLineGetFlag(Package
, L
"-m")) {
416 Mode
= TestModeManufacturing
;
422 // Do a listing of what's available to test
427 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
428 if (ShellCommandLineGetFlag(Package
, L
"-l") && Lang
== NULL
) {
429 ASSERT(Language
== NULL
);
430 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
431 ShellCommandLineFreeVarList (Package
);
432 return (SHELL_INVALID_PARAMETER
);
433 } else if (Lang
!= NULL
) {
434 Language
= AllocateZeroPool(StrSize(Lang
));
435 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
438 DriverHandleStr
= ShellCommandLineGetRawValue(Package
, 1);
439 ControllerHandleStr
= ShellCommandLineGetRawValue(Package
, 2);
440 ChildHandleStr
= ShellCommandLineGetRawValue(Package
, 3);
442 if (DriverHandleStr
== NULL
) {
445 ShellConvertStringToUint64(DriverHandleStr
, &Intermediate
, TRUE
, FALSE
);
446 Handle1
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
448 if (ControllerHandleStr
== NULL
) {
451 ShellConvertStringToUint64(ControllerHandleStr
, &Intermediate
, TRUE
, FALSE
);
452 Handle2
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
454 if (ChildHandleStr
== NULL
) {
457 ShellConvertStringToUint64(ChildHandleStr
, &Intermediate
, TRUE
, FALSE
);
458 Handle3
= ConvertHandleIndexToHandle((UINTN
)Intermediate
);
461 Status
= DoDiagnostics (
464 ShellCommandLineGetFlag(Package
, L
"-c"),
470 SHELL_FREE_NON_NULL(Language
);
471 ShellCommandLineFreeVarList (Package
);
474 if (ShellStatus
== SHELL_SUCCESS
) {
475 if (Status
== EFI_SECURITY_VIOLATION
) {
476 ShellStatus
= SHELL_SECURITY_VIOLATION
;
477 } else if (Status
== EFI_INVALID_PARAMETER
) {
478 ShellStatus
= SHELL_INVALID_PARAMETER
;
479 } else if (Status
== EFI_NOT_FOUND
) {
480 ShellStatus
= SHELL_NOT_FOUND
;
481 } else if (EFI_ERROR(Status
)) {
482 ShellStatus
= SHELL_NOT_FOUND
;
486 return (ShellStatus
);