]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
Update return value.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Dh.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Dh 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 SHELL_PARAM_ITEM ParamList[] = {\r
18 {L"-p", TypeValue},\r
19 {L"-d", TypeFlag},\r
20 {L"-v", TypeFlag},\r
21 {L"-verbose", TypeFlag},\r
22 {L"-sfo", TypeFlag},\r
23 {L"-l", TypeValue},\r
24 {NULL, TypeMax}\r
25 };\r
26\r
27STATIC CONST EFI_GUID *UefiDriverModelProtocolsGuidArray[] = {\r
28 &gEfiDriverBindingProtocolGuid,\r
29 &gEfiPlatformDriverOverrideProtocolGuid,\r
30 &gEfiBusSpecificDriverOverrideProtocolGuid,\r
31 &gEfiDriverDiagnosticsProtocolGuid,\r
32 &gEfiDriverDiagnostics2ProtocolGuid,\r
33 &gEfiComponentNameProtocolGuid,\r
34 &gEfiComponentName2ProtocolGuid,\r
35 &gEfiPlatformToDriverConfigurationProtocolGuid,\r
36 &gEfiDriverSupportedEfiVersionProtocolGuid,\r
37 &gEfiDriverFamilyOverrideProtocolGuid,\r
38 &gEfiDriverHealthProtocolGuid,\r
39 &gEfiLoadedImageProtocolGuid,\r
40 NULL\r
41};\r
42\r
43BOOLEAN\r
44EFIAPI\r
45IsDriverProt (\r
46 IN CONST EFI_GUID *Guid\r
47 )\r
48{\r
49 CONST EFI_GUID **GuidWalker;\r
50 BOOLEAN GuidFound;\r
51 GuidFound = FALSE;\r
52 for (GuidWalker = UefiDriverModelProtocolsGuidArray\r
53 ; GuidWalker != NULL && *GuidWalker != NULL\r
54 ; GuidWalker++\r
55 ){\r
56 if (CompareGuid(*GuidWalker, Guid)) {\r
57 GuidFound = TRUE;\r
58 break;\r
59 }\r
60 }\r
61 return (GuidFound);\r
62}\r
63\r
64CHAR16*\r
65EFIAPI\r
66GetProtocolInfoString(\r
67 IN CONST EFI_HANDLE TheHandle,\r
68 IN CONST CHAR8 *Language,\r
69 IN CONST CHAR16 *Seperator,\r
70 IN CONST BOOLEAN DriverInfo,\r
71 IN CONST BOOLEAN Verbose,\r
72 IN CONST BOOLEAN ExtraInfo\r
73 )\r
74{\r
75 EFI_GUID **ProtocolGuidArray;\r
76 UINTN ArrayCount;\r
77 UINTN ProtocolIndex;\r
78 EFI_STATUS Status;\r
79 CHAR16 *RetVal;\r
80 UINTN Size;\r
81 CHAR16 *Temp;\r
82\r
83 ProtocolGuidArray = NULL;\r
84\r
85 Status = gBS->ProtocolsPerHandle (\r
86 TheHandle,\r
87 &ProtocolGuidArray,\r
88 &ArrayCount\r
89 );\r
90 if (!EFI_ERROR (Status)) {\r
91 RetVal = NULL;\r
92 Size = 0;\r
93 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
94 Temp = GetStringNameFromGuid(ProtocolGuidArray[ProtocolIndex], Language);\r
95 if (Temp != NULL) {\r
96 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
97 if (Size != 0) {\r
98 StrnCatGrow(&RetVal, &Size, Seperator, 0);\r
99 }\r
100 StrnCatGrow(&RetVal, &Size, L"%H", 0);\r
101 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
102 StrnCatGrow(&RetVal, &Size, L"%N", 0);\r
103 FreePool(Temp);\r
104 }\r
105 if (ExtraInfo) {\r
106 Temp = GetProtocolInformationDump(TheHandle, ProtocolGuidArray[ProtocolIndex], Verbose);\r
107 if (Temp != NULL) {\r
108 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
109 if (!Verbose) {\r
110 StrnCatGrow(&RetVal, &Size, L"(", 0);\r
111 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
112 StrnCatGrow(&RetVal, &Size, L")", 0);\r
113 } else {\r
114 StrnCatGrow(&RetVal, &Size, Seperator, 0);\r
115 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
116 }\r
117 FreePool(Temp);\r
118 }\r
119 }\r
120 }\r
121 } else {\r
122 return (NULL);\r
123 }\r
124\r
125 if (ProtocolGuidArray != NULL) {\r
126 FreePool(ProtocolGuidArray);\r
127 }\r
128 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
129 StrnCatGrow(&RetVal, &Size, Seperator, 0);\r
130 return (RetVal);\r
131}\r
132\r
133SHELL_STATUS\r
134EFIAPI\r
135DoDhByHandle(\r
136 IN CONST EFI_HANDLE TheHandle,\r
137 IN CONST BOOLEAN Verbose,\r
138 IN CONST BOOLEAN Sfo,\r
139 IN CONST CHAR8 *Language,\r
140 IN CONST BOOLEAN DriverInfo,\r
141 IN CONST BOOLEAN Multiple\r
142 )\r
143{\r
144 CHAR16 *ProtocolInfoString;\r
145 SHELL_STATUS ShellStatus;\r
146 EFI_STATUS Status;\r
147\r
148 Status = EFI_SUCCESS;\r
149 ShellStatus = SHELL_SUCCESS;\r
150 ProtocolInfoString = NULL;\r
151\r
152 if (!Sfo) {\r
153 if (Multiple) {\r
154 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L" ", DriverInfo, Verbose, TRUE);\r
155 ShellPrintHiiEx(\r
156 -1,\r
157 -1,\r
158 NULL,\r
159 STRING_TOKEN (STR_DH_OUTPUT),\r
160 gShellDriver1HiiHandle,\r
161 ConvertHandleToHandleIndex(TheHandle),\r
162 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
163 } else {\r
164 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L"\r\n", DriverInfo, Verbose, TRUE);\r
165 ShellPrintHiiEx(\r
166 -1,\r
167 -1,\r
168 NULL,\r
169 STRING_TOKEN (STR_DH_OUTPUT_SINGLE),\r
170 gShellDriver1HiiHandle,\r
171 ConvertHandleToHandleIndex(TheHandle),\r
172 TheHandle,\r
173 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
174 }\r
175 } else {\r
176//#string STR_DH_OUTPUT_SFO #language en-US "%s, %s, %s, %H%02x%N, %s, %s\r\n"\r
177 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L";", DriverInfo, FALSE, FALSE);\r
178 ShellPrintHiiEx(\r
179 -1,\r
180 -1,\r
181 NULL,\r
182 STRING_TOKEN (STR_DH_OUTPUT_SFO),\r
183 gShellDriver1HiiHandle,\r
184 Multiple ?L"HandlesInfo":L"HandleInfo",\r
185 L"DriverName",\r
186 L"ControllerName",\r
187 ConvertHandleToHandleIndex(TheHandle),\r
188 L"DevPath",\r
189 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
190\r
191\r
192 }\r
193\r
194\r
195 if (ProtocolInfoString != NULL) {\r
196 FreePool(ProtocolInfoString);\r
197 }\r
198 return (ShellStatus);\r
199}\r
200\r
201SHELL_STATUS\r
202EFIAPI\r
203DoDhForHandleList(\r
204 IN CONST EFI_HANDLE *HandleList,\r
205 IN CONST BOOLEAN Sfo,\r
206 IN CONST CHAR8 *Language,\r
207 IN CONST BOOLEAN DriverInfo\r
208 )\r
209{\r
210 CONST EFI_HANDLE *HandleWalker;\r
211 SHELL_STATUS ShellStatus;\r
212\r
213 ShellStatus = SHELL_SUCCESS;\r
214\r
215 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL && ShellStatus == SHELL_SUCCESS; HandleWalker++) {\r
216 ShellStatus = DoDhByHandle(\r
217 *HandleWalker,\r
218 FALSE,\r
219 Sfo,\r
220 Language,\r
221 DriverInfo,\r
222 TRUE\r
223 );\r
224 }\r
225 return (ShellStatus);\r
226}\r
227\r
228SHELL_STATUS\r
229EFIAPI\r
230DoDhForAll(\r
231 IN CONST BOOLEAN Sfo,\r
232 IN CONST CHAR8 *Language,\r
233 IN CONST BOOLEAN DriverInfo\r
234 )\r
235{\r
236 EFI_HANDLE *HandleList;\r
237 SHELL_STATUS ShellStatus;\r
238\r
239 HandleList = GetHandleListByProtocol(NULL);\r
240\r
241 ShellStatus = DoDhForHandleList(\r
242 HandleList,\r
243 Sfo,\r
244 Language,\r
245 DriverInfo);\r
246\r
247 FreePool(HandleList);\r
248\r
249 return (ShellStatus);\r
250}\r
251\r
252SHELL_STATUS\r
253EFIAPI\r
254DoDhByProtocol(\r
255 IN CONST CHAR16 *ProtocolName,\r
256 IN CONST BOOLEAN Sfo,\r
257 IN CONST CHAR8 *Language,\r
258 IN CONST BOOLEAN DriverInfo\r
259 )\r
260{\r
261 EFI_GUID *Guid;\r
262 EFI_STATUS Status;\r
263 EFI_HANDLE *HandleList;\r
264 SHELL_STATUS ShellStatus;\r
265\r
266 ASSERT(ProtocolName != NULL);\r
267\r
268 Status = GetGuidFromStringName(ProtocolName, Language, &Guid);\r
269 if (EFI_ERROR(Status)) {\r
270 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, ProtocolName);\r
271 return (SHELL_INVALID_PARAMETER);\r
272 }\r
273\r
274 HandleList = GetHandleListByProtocol(Guid);\r
275\r
276 ShellStatus = DoDhForHandleList(\r
277 HandleList,\r
278 Sfo,\r
279 Language,\r
280 DriverInfo);\r
281\r
282 SHELL_FREE_NON_NULL(HandleList);\r
283\r
284 return (ShellStatus);\r
285}\r
286\r
287SHELL_STATUS\r
288EFIAPI\r
289ShellCommandRunDh (\r
290 IN EFI_HANDLE ImageHandle,\r
291 IN EFI_SYSTEM_TABLE *SystemTable\r
292 )\r
293{\r
294 EFI_STATUS Status;\r
295 LIST_ENTRY *Package;\r
296 CHAR16 *ProblemParam;\r
297 SHELL_STATUS ShellStatus;\r
298 CHAR8 *Language;\r
299 CONST CHAR16 *Lang;\r
300 CONST CHAR16 *Temp2;\r
301 BOOLEAN SfoMode;\r
302 BOOLEAN FlagD;\r
303 BOOLEAN Verbose;\r
304\r
305 ShellStatus = SHELL_SUCCESS;\r
306 Status = EFI_SUCCESS;\r
307 Language = NULL;\r
308\r
309 //\r
310 // initialize the shell lib (we must be in non-auto-init...)\r
311 //\r
312 Status = ShellInitialize();\r
313 ASSERT_EFI_ERROR(Status);\r
314\r
315 Status = CommandInit();\r
316 ASSERT_EFI_ERROR(Status);\r
317\r
318 //\r
319 // parse the command line\r
320 //\r
321 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
322 if (EFI_ERROR(Status)) {\r
323 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
324 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
325 FreePool(ProblemParam);\r
326 ShellStatus = SHELL_INVALID_PARAMETER;\r
327 } else {\r
328 ASSERT(FALSE);\r
329 }\r
330 } else {\r
331 if (ShellCommandLineGetCount(Package) > 2) {\r
332 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
333 ShellCommandLineFreeVarList (Package);\r
334 return (SHELL_INVALID_PARAMETER);\r
335 }\r
336\r
337 Lang = ShellCommandLineGetValue(Package, L"-l");\r
338 if (Lang != NULL) {\r
339 Language = AllocateZeroPool(StrSize(Lang));\r
340 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
341 } else if (!ShellCommandLineGetFlag(Package, L"-l")){\r
342 Language = AllocateZeroPool(10);\r
343 AsciiSPrint(Language, 10, "en-us");\r
344 } else {\r
345 ASSERT(Language == NULL);\r
346 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
347 ShellCommandLineFreeVarList (Package);\r
348 return (SHELL_INVALID_PARAMETER);\r
349 }\r
350\r
351 SfoMode = ShellCommandLineGetFlag(Package, L"-sfo");\r
352 FlagD = ShellCommandLineGetFlag(Package, L"-d");\r
353 if (ShellCommandLineGetFlag(Package, L"-v") || ShellCommandLineGetFlag(Package, L"-verbose")) {\r
354 Verbose = TRUE;\r
355 } else {\r
356 Verbose = FALSE;\r
357 }\r
358\r
359 if (ShellCommandLineGetFlag(Package, L"-p")) {\r
360 if (ShellCommandLineGetCount(Package) > 1) {\r
361 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
362 ShellStatus = SHELL_INVALID_PARAMETER;\r
363 } else if (ShellCommandLineGetValue(Package, L"-p") == NULL) {\r
364 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-p");\r
365 ShellStatus = SHELL_INVALID_PARAMETER;\r
366 } else {\r
367 //\r
368 // print by protocol\r
369 //\r
370 ShellStatus = DoDhByProtocol(\r
371 ShellCommandLineGetValue(Package, L"-p"),\r
372 SfoMode,\r
373 Lang==NULL?NULL:Language,\r
374 FlagD\r
375 );\r
376 }\r
377 } else {\r
378 Temp2 = ShellCommandLineGetRawValue(Package, 1);\r
379 if (Temp2 == NULL) {\r
380 //\r
381 // Print everything\r
382 //\r
383 ShellStatus = DoDhForAll(\r
384 SfoMode,\r
385 Lang==NULL?NULL:Language,\r
386 FlagD\r
387 );\r
388 } else {\r
389 if (!ShellIsHexOrDecimalNumber(Temp2, TRUE, FALSE) || ConvertHandleIndexToHandle(StrHexToUintn(Temp2)) == NULL) {\r
390 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Temp2);\r
391 ShellStatus = SHELL_INVALID_PARAMETER;\r
392 } else {\r
393 //\r
394 // print 1 handle\r
395 //\r
396 ShellStatus = DoDhByHandle(\r
397 ConvertHandleIndexToHandle(StrHexToUintn(Temp2)),\r
398 Verbose,\r
399 SfoMode,\r
400 Lang==NULL?NULL:Language,\r
401 FlagD,\r
402 FALSE\r
403 );\r
404 }\r
405 }\r
406 }\r
407\r
408\r
409 ShellCommandLineFreeVarList (Package);\r
410 SHELL_FREE_NON_NULL(Language);\r
411 }\r
412\r
413 return (ShellStatus);\r
414}\r