2 Main file for DrvDiag shell Driver1 function.
4 Copyright (c) 2010, 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 TEST_MODE_STANDARD
= EfiDriverDiagnosticTypeStandard
,
23 TEST_MODE_EXTENDED
= EfiDriverDiagnosticTypeExtended
,
24 TEST_MODE_MANUFACTURING
= EfiDriverDiagnosticTypeManufacturing
,
32 IN CONST DRV_DIAG_TEST_MODE Mode
,
34 IN CONST BOOLEAN AllChilds
,
35 IN CONST EFI_HANDLE DriverHandle
,
36 IN CONST EFI_HANDLE ControllerHandle
,
37 IN CONST EFI_HANDLE ChildHandle
40 EFI_DRIVER_DIAGNOSTICS_PROTOCOL
*DriverDiagnostics
;
41 EFI_DRIVER_DIAGNOSTICS2_PROTOCOL
*DriverDiagnostics2
;
42 EFI_HANDLE
*DriverHandleList
;
43 EFI_HANDLE
*ControllerHandleList
;
44 EFI_HANDLE
*ChildHandleList
;
46 UINTN DriverHandleListCount
;
47 UINTN ControllerHandleListCount
;
48 UINTN ChildHandleListCount
;
49 UINTN DriverHandleListLoop
;
50 UINTN ControllerHandleListLoop
;
51 UINTN ChildHandleListLoop
;
60 if ((ChildHandle
!= NULL
&& AllChilds
) || (Mode
>= TEST_MODE_MAX
)){
61 return (EFI_INVALID_PARAMETER
);
64 if (Lang
== NULL
|| AsciiStrLen(Lang
) < 3) {
65 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"-l <value>");
66 return (EFI_INVALID_PARAMETER
);
69 DriverDiagnostics
= NULL
;
70 DriverDiagnostics2
= NULL
;
72 Status2
= EFI_SUCCESS
;
73 DriverHandleList
= NULL
;
74 ControllerHandleList
= NULL
;
75 ChildHandleList
= NULL
;
78 DriverHandleListCount
= 0;
79 ControllerHandleListCount
= 0;
80 ChildHandleListCount
= 0;
82 if (DriverHandle
!= NULL
) {
83 DriverHandleList
= AllocateZeroPool(2*sizeof(EFI_HANDLE
));
84 ASSERT(DriverHandleList
!=NULL
);
85 DriverHandleList
[0] = DriverHandle
;
86 DriverHandleListCount
= 1;
88 DriverHandleList
= GetHandleListByProtocolList(DiagGuidList
);
89 if (DriverHandleList
== NULL
) {
90 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_DRVCFG_NONE
), gShellDriver1HiiHandle
);
91 return (EFI_NOT_FOUND
);
93 for (Walker
= DriverHandleList
; Walker
!= NULL
&& *Walker
!= NULL
; DriverHandleListCount
++, Walker
++);
96 if (ControllerHandle
!= NULL
) {
97 ControllerHandleList
= AllocateZeroPool(2*sizeof(EFI_HANDLE
));
98 ASSERT(ControllerHandleList
!=NULL
);
99 ControllerHandleList
[0] = ControllerHandle
;
100 ControllerHandleListCount
= 1;
102 ControllerHandleList
= NULL
;
105 if (ChildHandle
!= NULL
) {
106 ChildHandleList
= AllocateZeroPool(2*sizeof(EFI_HANDLE
));
107 ASSERT(ChildHandleList
!=NULL
);
108 ChildHandleList
[0] = ChildHandle
;
109 ChildHandleListCount
= 1;
110 } else if (AllChilds
) {
111 ChildHandleList
= NULL
;
113 // This gets handled in the loop below.
116 ChildHandleList
= NULL
;
119 for (DriverHandleListLoop
= 0
120 ; DriverHandleListLoop
< DriverHandleListCount
121 ; DriverHandleListLoop
++
123 if (ControllerHandle
== NULL
) {
124 PARSE_HANDLE_DATABASE_DEVICES(DriverHandleList
[DriverHandleListLoop
], &ControllerHandleListCount
, &ControllerHandleList
);
126 for (ControllerHandleListLoop
= 0
127 ; ControllerHandleListLoop
< ControllerHandleListCount
128 ; ControllerHandleListLoop
++
131 ASSERT(ChildHandleList
== NULL
);
132 PARSE_HANDLE_DATABASE_MANAGED_CHILDREN(
133 DriverHandleList
[DriverHandleListLoop
],
134 ControllerHandleList
[ControllerHandleListLoop
],
135 &ChildHandleListCount
,
138 for (ChildHandleListLoop
= 0
139 ; (ChildHandleListLoop
< ChildHandleListCount
|| ChildHandleList
== NULL
)
140 ; ChildHandleListLoop
++
142 if (Mode
!= TEST_MODE_LIST
) {
143 if (Lang
[2] == '-') {
145 // Get the protocol pointer and call the function
147 Status
= gBS
->OpenProtocol(
148 DriverHandleList
[DriverHandleListLoop
],
149 &gEfiDriverDiagnostics2ProtocolGuid
,
150 (VOID
**)&DriverDiagnostics2
,
153 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
154 if (!EFI_ERROR(Status
)) {
155 Status
= DriverDiagnostics2
->RunDiagnostics(
157 ControllerHandleList
[ControllerHandleListLoop
],
158 ChildHandleList
== NULL
?NULL
:ChildHandleList
[ChildHandleListLoop
],
159 (EFI_DRIVER_DIAGNOSTIC_TYPE
)Mode
,
166 Status
= gBS
->OpenProtocol(
167 DriverHandleList
[DriverHandleListLoop
],
168 &gEfiDriverDiagnosticsProtocolGuid
,
169 (VOID
**)&DriverDiagnostics
,
172 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
173 if (!EFI_ERROR(Status
)) {
174 Status
= DriverDiagnostics
->RunDiagnostics(
176 ControllerHandleList
[ControllerHandleListLoop
],
177 ChildHandleList
== NULL
?NULL
:ChildHandleList
[ChildHandleListLoop
],
178 (EFI_DRIVER_DIAGNOSTIC_TYPE
)Mode
,
185 if (EFI_ERROR(Status
)) {
188 HandleIndex1
= ConvertHandleToHandleIndex(DriverHandleList
[DriverHandleListLoop
]);
189 HandleIndex2
= ConvertHandleToHandleIndex(ControllerHandleList
[ControllerHandleListLoop
]);
194 STRING_TOKEN (STR_3P_RESULT
),
195 gShellDriver1HiiHandle
,
199 ChildHandleList
== NULL
?0:ConvertHandleToHandleIndex(ChildHandleList
[ChildHandleListLoop
]),
201 if (OutBuffer
!=NULL
) {
205 if (ErrorType
!=NULL
) {
210 HandleIndex1
= ConvertHandleToHandleIndex(DriverHandleList
[DriverHandleListLoop
]);
211 HandleIndex2
= ConvertHandleToHandleIndex(ControllerHandleList
[ControllerHandleListLoop
]);
213 // Print out the information that this set can be tested
219 STRING_TOKEN (STR_DRV_DIAG_ITEM_LINE
),
220 gShellDriver1HiiHandle
,
223 ChildHandleList
== NULL
?0:ConvertHandleToHandleIndex(ChildHandleList
[ChildHandleListLoop
])
228 // If we are doing a single pass with NULL child jump out after a single loop
230 if (ChildHandleList
== NULL
) {
235 SHELL_FREE_NON_NULL(ChildHandleList
);
236 ChildHandleList
= NULL
;
237 ChildHandleListCount
= 0;
240 if (ControllerHandle
== NULL
) {
241 SHELL_FREE_NON_NULL(ControllerHandleList
);
242 ControllerHandleList
= NULL
;
243 ControllerHandleListCount
= 0;
247 if (DriverHandleList
!= NULL
) {
248 FreePool(DriverHandleList
);
250 if (ControllerHandleList
!= NULL
) {
251 FreePool(ControllerHandleList
);
253 if (ChildHandleList
!= NULL
) {
254 FreePool(ChildHandleList
);
260 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
271 ShellCommandRunDrvDiag (
272 IN EFI_HANDLE ImageHandle
,
273 IN EFI_SYSTEM_TABLE
*SystemTable
278 CHAR16
*ProblemParam
;
279 SHELL_STATUS ShellStatus
;
280 DRV_DIAG_TEST_MODE Mode
;
282 CONST CHAR16
*DriverHandleStr
;
283 CONST CHAR16
*ControllerHandleStr
;
284 CONST CHAR16
*ChildHandleStr
;
290 ShellStatus
= SHELL_SUCCESS
;
291 Mode
= TEST_MODE_MAX
;
295 // initialize the shell lib (we must be in non-auto-init...)
297 Status
= ShellInitialize();
298 ASSERT_EFI_ERROR(Status
);
300 Status
= CommandInit();
301 ASSERT_EFI_ERROR(Status
);
304 // parse the command line
306 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
307 if (EFI_ERROR(Status
)) {
308 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
309 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, ProblemParam
);
310 FreePool(ProblemParam
);
311 ShellStatus
= SHELL_INVALID_PARAMETER
;
317 // if more than 3 'value' parameters (plus the name one) or we have any 2 mode flags
319 if ((ShellCommandLineGetCount(Package
) > 4)
320 ||(ShellCommandLineGetFlag(Package
, L
"-s") && ShellCommandLineGetFlag(Package
, L
"-e"))
321 ||(ShellCommandLineGetFlag(Package
, L
"-s") && ShellCommandLineGetFlag(Package
, L
"-m"))
322 ||(ShellCommandLineGetFlag(Package
, L
"-e") && ShellCommandLineGetFlag(Package
, L
"-m"))
325 // error for too many parameters
327 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
);
328 ShellStatus
= SHELL_INVALID_PARAMETER
;
329 } else if ((ShellCommandLineGetFlag(Package
, L
"-s"))
330 || (ShellCommandLineGetFlag(Package
, L
"-e"))
331 || (ShellCommandLineGetFlag(Package
, L
"-m"))
334 // Run the apropriate test
336 if (ShellCommandLineGetFlag(Package
, L
"-s")) {
337 Mode
= TEST_MODE_STANDARD
;
338 } else if (ShellCommandLineGetFlag(Package
, L
"-e")) {
339 Mode
= TEST_MODE_EXTENDED
;
340 } else if (ShellCommandLineGetFlag(Package
, L
"-m")) {
341 Mode
= TEST_MODE_MANUFACTURING
;
347 // Do a listing of what's available to test
349 Mode
= TEST_MODE_LIST
;
352 Lang
= ShellCommandLineGetValue(Package
, L
"-l");
354 Language
= AllocateZeroPool(StrSize(Lang
));
355 AsciiSPrint(Language
, StrSize(Lang
), "%S", Lang
);
356 } else if (!ShellCommandLineGetFlag(Package
, L
"-l")){
357 Language
= AllocateZeroPool(10);
358 AsciiSPrint(Language
, 10, "en-us");
360 ASSERT(Language
== NULL
);
361 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_NO_VALUE
), gShellDriver1HiiHandle
, L
"-l");
362 ShellCommandLineFreeVarList (Package
);
363 return (SHELL_INVALID_PARAMETER
);
366 DriverHandleStr
= ShellCommandLineGetRawValue(Package
, 1);
367 ControllerHandleStr
= ShellCommandLineGetRawValue(Package
, 2);
368 ChildHandleStr
= ShellCommandLineGetRawValue(Package
, 3);
370 if (DriverHandleStr
== NULL
) {
373 Handle1
= ConvertHandleIndexToHandle(StrHexToUintn(DriverHandleStr
));
375 if (ControllerHandleStr
== NULL
) {
378 Handle2
= ConvertHandleIndexToHandle(StrHexToUintn(ControllerHandleStr
));
380 if (ChildHandleStr
== NULL
) {
383 Handle3
= ConvertHandleIndexToHandle(StrHexToUintn(ChildHandleStr
));
386 Status
= DoDiagnostics (
389 ShellCommandLineGetFlag(Package
, L
"-c"),
395 SHELL_FREE_NON_NULL(Language
);
396 ShellCommandLineFreeVarList (Package
);
399 if (ShellStatus
== SHELL_SUCCESS
) {
400 if (Status
== EFI_SECURITY_VIOLATION
) {
401 ShellStatus
= SHELL_SECURITY_VIOLATION
;
402 } else if (Status
== EFI_INVALID_PARAMETER
) {
403 ShellStatus
= SHELL_INVALID_PARAMETER
;
404 } else if (Status
== EFI_NOT_FOUND
) {
405 ShellStatus
= SHELL_NOT_FOUND
;
406 } else if (EFI_ERROR(Status
)) {
407 ShellStatus
= SHELL_NOT_FOUND
;
411 return (ShellStatus
);