]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c
ShellPkg/drivers: Fix GCC build failure
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Drivers.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Drivers shell Driver1 function.\r
3\r
c011b6c9 4 (C) Copyright 2012-2015 Hewlett-Packard Development Company, L.P.<BR>\r
416d48f7 5 Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
4ba49616 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellDriver1CommandsLib.h"\r
17\r
a29117bf
CP
18#define MAX_LEN_DRIVER_NAME 35\r
19\r
4ba49616 20STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
21 {L"-sfo", TypeFlag},\r
22 {L"-l", TypeValue},\r
23 {NULL, TypeMax}\r
24 };\r
25\r
361a8267 26/**\r
27 Get a device path (in text format) for a given handle.\r
28\r
29 @param[in] TheHandle The handle to get the device path for.\r
30\r
31 @retval NULL An error occured.\r
32 @return A pointer to the driver path as a string. The callee must \r
33 free this memory.\r
34**/\r
4ba49616 35CHAR16*\r
4ba49616 36GetDevicePathTextForHandle(\r
37 IN EFI_HANDLE TheHandle\r
38 )\r
39{\r
40 EFI_STATUS Status;\r
41 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
42 EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;\r
43 EFI_DEVICE_PATH_PROTOCOL *FinalPath;\r
44 CHAR16 *RetVal;\r
45\r
46 FinalPath = NULL;\r
47\r
48 Status = gBS->OpenProtocol (\r
49 TheHandle,\r
50 &gEfiLoadedImageProtocolGuid,\r
51 (VOID**)&LoadedImage,\r
52 gImageHandle,\r
53 NULL,\r
54 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
55 );\r
56 if (!EFI_ERROR (Status)) {\r
57 Status = gBS->OpenProtocol (\r
58 LoadedImage->DeviceHandle,\r
59 &gEfiDevicePathProtocolGuid,\r
60 (VOID**)&ImageDevicePath,\r
61 gImageHandle,\r
62 NULL,\r
63 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
64 );\r
65 if (!EFI_ERROR (Status)) {\r
66 FinalPath = AppendDevicePath (ImageDevicePath, LoadedImage->FilePath);\r
67 gBS->CloseProtocol(\r
68 LoadedImage->DeviceHandle,\r
69 &gEfiDevicePathProtocolGuid,\r
70 gImageHandle,\r
71 NULL);\r
72 }\r
73 gBS->CloseProtocol(\r
74 TheHandle,\r
75 &gEfiLoadedImageProtocolGuid,\r
76 gImageHandle,\r
77 NULL);\r
78 }\r
79\r
80 if (FinalPath == NULL) {\r
81 return (NULL);\r
82 }\r
83 RetVal = gEfiShellProtocol->GetFilePathFromDevicePath(FinalPath);\r
84 if (RetVal == NULL) {\r
863986b3 85 RetVal = ConvertDevicePathToText(FinalPath, TRUE, TRUE);\r
4ba49616 86 }\r
87 FreePool(FinalPath);\r
88 return (RetVal);\r
89}\r
90\r
361a8267 91/**\r
92 Determine if the given handle has Driver Configuration protocol.\r
93\r
94 @param[in] TheHandle The handle to the driver to test.\r
95\r
96 @retval TRUE The driver does have Driver Configuration.\r
97 @retval FALSE The driver does not have Driver Configuration.\r
98**/\r
4ba49616 99BOOLEAN\r
4ba49616 100ReturnDriverConfig(\r
101 IN CONST EFI_HANDLE TheHandle\r
102 )\r
103{\r
104 EFI_STATUS Status;\r
105 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverConfigurationProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
106 if (EFI_ERROR(Status)) {\r
107 return (FALSE);\r
108 }\r
109 return (TRUE);\r
110}\r
111\r
361a8267 112/**\r
113 Determine if the given handle has DriverDiagnostics protocol.\r
114\r
115 @param[in] TheHandle The handle to the driver to test.\r
116\r
117 @retval TRUE The driver does have Driver Diasgnostics.\r
118 @retval FALSE The driver does not have Driver Diagnostics.\r
119**/\r
4ba49616 120BOOLEAN\r
4ba49616 121ReturnDriverDiag(\r
122 IN CONST EFI_HANDLE TheHandle\r
123 )\r
124{\r
125 EFI_STATUS Status;\r
126 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
127 if (EFI_ERROR(Status)) {\r
128 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverDiagnosticsProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL);\r
129 if (EFI_ERROR(Status)) {\r
130 return (FALSE);\r
131 }\r
132 }\r
133 return (TRUE);\r
134}\r
135\r
361a8267 136/**\r
137 Finds and returns the version of the driver specified by TheHandle.\r
138\r
139 @param[in] TheHandle The driver handle to get the version of.\r
140\r
141 @return The version of the driver.\r
142 @retval 0xFFFFFFFF An error ocurred.\r
143**/\r
4ba49616 144UINT32\r
4ba49616 145ReturnDriverVersion(\r
146 IN CONST EFI_HANDLE TheHandle\r
147 )\r
148{\r
149 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
150 EFI_STATUS Status;\r
151 UINT32 RetVal;\r
152\r
153 RetVal = (UINT32)-1;\r
154\r
155 Status = gBS->OpenProtocol((EFI_HANDLE)TheHandle, &gEfiDriverBindingProtocolGuid, (VOID**)&DriverBinding, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
156 if (!EFI_ERROR(Status)) {\r
157 RetVal = DriverBinding->Version;\r
158 gBS->CloseProtocol(TheHandle, &gEfiDriverBindingProtocolGuid, gImageHandle, NULL);\r
159 }\r
160 return (RetVal);\r
161}\r
162\r
416d48f7
HL
163/**\r
164 Get image name from Image Handle.\r
165\r
166 @param[in] Handle Image Handle\r
167\r
168 @return A pointer to the image name as a string.\r
169**/\r
170CHAR16 *\r
171GetImageNameFromHandle (\r
172 IN CONST EFI_HANDLE Handle\r
173 )\r
174{\r
175 EFI_STATUS Status;\r
176 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
177 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
178 EFI_DEVICE_PATH_PROTOCOL *DevPathNode;\r
179 EFI_GUID *NameGuid;\r
180 CHAR16 *ImageName;\r
181 UINTN BufferSize;\r
182 UINT32 AuthenticationStatus;\r
183 EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv2;\r
184\r
185 LoadedImage = NULL;\r
186 DriverBinding = NULL;\r
187 ImageName = NULL;\r
188\r
189 Status = gBS->OpenProtocol (\r
190 Handle,\r
191 &gEfiDriverBindingProtocolGuid,\r
192 (VOID **) &DriverBinding,\r
193 NULL,\r
194 NULL,\r
195 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
196 );\r
197 if (EFI_ERROR (Status)) {\r
198 return NULL;\r
199 }\r
200 Status = gBS->OpenProtocol (\r
201 DriverBinding->ImageHandle,\r
202 &gEfiLoadedImageProtocolGuid,\r
203 (VOID**)&LoadedImage,\r
204 gImageHandle,\r
205 NULL,\r
206 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
207 );\r
208 if (!EFI_ERROR (Status)) {\r
209 DevPathNode = LoadedImage->FilePath;\r
210 if (DevPathNode == NULL) {\r
211 return NULL;\r
212 }\r
213 while (!IsDevicePathEnd (DevPathNode)) {\r
214 NameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)DevPathNode);\r
215 if (NameGuid != NULL) {\r
216 Status = gBS->HandleProtocol (\r
217 LoadedImage->DeviceHandle,\r
218 &gEfiFirmwareVolume2ProtocolGuid,\r
f8daac81 219 (VOID **)&Fv2\r
416d48f7
HL
220 );\r
221 if (!EFI_ERROR (Status)) {\r
222 Status = Fv2->ReadSection (\r
223 Fv2,\r
224 NameGuid,\r
225 EFI_SECTION_USER_INTERFACE,\r
226 0,\r
227 (VOID **)&ImageName,\r
228 &BufferSize,\r
229 &AuthenticationStatus\r
230 );\r
231 if (!EFI_ERROR (Status)) {\r
232 break;\r
233 }\r
234 ImageName = NULL;\r
235 }\r
236 }\r
237 //\r
238 // Next device path node\r
239 //\r
240 DevPathNode = NextDevicePathNode (DevPathNode);\r
241 }\r
242 if (ImageName == NULL) {\r
243 ImageName = ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE);\r
244 }\r
245 }\r
246 return ImageName;\r
247}\r
248\r
361a8267 249/**\r
250 Function for 'drivers' command.\r
251\r
252 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
253 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
254**/\r
4ba49616 255SHELL_STATUS\r
256EFIAPI\r
257ShellCommandRunDrivers (\r
258 IN EFI_HANDLE ImageHandle,\r
259 IN EFI_SYSTEM_TABLE *SystemTable\r
260 )\r
261{\r
262 EFI_STATUS Status;\r
263 LIST_ENTRY *Package;\r
264 CHAR16 *ProblemParam;\r
265 SHELL_STATUS ShellStatus;\r
266 CHAR8 *Language;\r
267 CONST CHAR16 *Lang;\r
268 EFI_HANDLE *HandleList;\r
269 EFI_HANDLE *HandleWalker;\r
270 UINTN ChildCount;\r
271 UINTN DeviceCount;\r
d506d8db
HL
272 CHAR16 ChildCountStr[3];\r
273 CHAR16 DeviceCountStr[3];\r
4ba49616 274 CHAR16 *Temp2;\r
a29117bf
CP
275 CONST CHAR16 *FullDriverName;\r
276 CHAR16 *TruncatedDriverName;\r
416d48f7 277 CHAR16 *ImageName;\r
4ba49616 278 CHAR16 *FormatString;\r
279 UINT32 DriverVersion;\r
280 BOOLEAN DriverConfig;\r
281 BOOLEAN DriverDiag;\r
a29117bf 282 BOOLEAN SfoFlag;\r
4ba49616 283\r
284 ShellStatus = SHELL_SUCCESS;\r
285 Status = EFI_SUCCESS;\r
286 Language = NULL;\r
287 FormatString = NULL;\r
a29117bf 288 SfoFlag = FALSE;\r
4ba49616 289\r
290 //\r
291 // initialize the shell lib (we must be in non-auto-init...)\r
292 //\r
293 Status = ShellInitialize();\r
294 ASSERT_EFI_ERROR(Status);\r
295\r
296 Status = CommandInit();\r
297 ASSERT_EFI_ERROR(Status);\r
298\r
299 //\r
300 // parse the command line\r
301 //\r
302 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
303 if (EFI_ERROR(Status)) {\r
304 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
bc280720 305 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drivers", ProblemParam); \r
4ba49616 306 FreePool(ProblemParam);\r
307 ShellStatus = SHELL_INVALID_PARAMETER;\r
308 } else {\r
309 ASSERT(FALSE);\r
310 }\r
311 } else {\r
312 if (ShellCommandLineGetCount(Package) > 1) {\r
bc280720 313 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drivers"); \r
4ba49616 314 ShellStatus = SHELL_INVALID_PARAMETER;\r
315 } else {\r
36384ceb
ED
316 if (ShellCommandLineGetFlag(Package, L"-l")){\r
317 Lang = ShellCommandLineGetValue(Package, L"-l");\r
318 if (Lang != NULL) {\r
319 Language = AllocateZeroPool(StrSize(Lang));\r
320 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
321 } else {\r
322 ASSERT(Language == NULL);\r
bc280720 323 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drivers", L"-l"); \r
36384ceb
ED
324 ShellCommandLineFreeVarList (Package);\r
325 return (SHELL_INVALID_PARAMETER);\r
326 }\r
4ba49616 327 }\r
328\r
a29117bf
CP
329 if (ShellCommandLineGetFlag (Package, L"-sfo")) {\r
330 SfoFlag = TRUE;\r
331 FormatString = HiiGetString (gShellDriver1HiiHandle, STRING_TOKEN (STR_DRIVERS_ITEM_LINE_SFO), Language);\r
332 //\r
333 // print the SFO header\r
334 //\r
335 ShellPrintHiiEx (\r
336 -1,\r
337 -1,\r
338 Language,\r
339 STRING_TOKEN (STR_GEN_SFO_HEADER),\r
340 gShellDriver1HiiHandle,\r
341 L"drivers");\r
4ba49616 342 } else {\r
a29117bf 343 FormatString = HiiGetString (gShellDriver1HiiHandle, STRING_TOKEN (STR_DRIVERS_ITEM_LINE), Language);\r
4ba49616 344 //\r
345 // print the header row\r
346 //\r
347 ShellPrintHiiEx(\r
348 -1,\r
349 -1,\r
350 Language,\r
a29117bf 351 STRING_TOKEN (STR_DRIVERS_HEADER_LINES),\r
4ba49616 352 gShellDriver1HiiHandle);\r
353 }\r
354\r
355 HandleList = GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid);\r
356 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL ; HandleWalker++){\r
a29117bf
CP
357 ChildCount = 0;\r
358 DeviceCount = 0;\r
359 Status = ParseHandleDatabaseForChildDevices (*HandleWalker, &ChildCount , NULL);\r
360 Status = PARSE_HANDLE_DATABASE_DEVICES (*HandleWalker, &DeviceCount, NULL);\r
361 Temp2 = GetDevicePathTextForHandle(*HandleWalker);\r
362 DriverVersion = ReturnDriverVersion(*HandleWalker);\r
363 DriverConfig = ReturnDriverConfig(*HandleWalker);\r
364 DriverDiag = ReturnDriverDiag (*HandleWalker);\r
365 FullDriverName = GetStringNameFromHandle(*HandleWalker, Language);\r
416d48f7 366 ImageName = GetImageNameFromHandle (*HandleWalker);\r
a29117bf 367\r
d506d8db
HL
368 UnicodeValueToStringS (ChildCountStr, sizeof (ChildCountStr), 0, ChildCount, 0);\r
369 UnicodeValueToStringS (DeviceCountStr, sizeof (DeviceCountStr), 0, DeviceCount, 0);\r
a29117bf
CP
370 TruncatedDriverName = NULL;\r
371 if (!SfoFlag && (FullDriverName != NULL)) {\r
372 TruncatedDriverName = AllocateZeroPool ((MAX_LEN_DRIVER_NAME + 1) * sizeof (CHAR16));\r
a8d6ea0d 373 StrnCpyS (TruncatedDriverName, MAX_LEN_DRIVER_NAME + 1, FullDriverName, MAX_LEN_DRIVER_NAME);\r
a29117bf 374 }\r
4ba49616 375\r
d506d8db
HL
376 if (!SfoFlag) {\r
377 ShellPrintEx (\r
378 -1,\r
379 -1,\r
380 FormatString,\r
381 ConvertHandleToHandleIndex (*HandleWalker),\r
382 DriverVersion,\r
383 ChildCount > 0 ? L'B' : (DeviceCount > 0 ? L'D' : L'?'),\r
384 DriverConfig ? L'X' : L'-',\r
385 DriverDiag ? L'X' : L'-',\r
386 DeviceCount > 0 ? DeviceCountStr : L"-",\r
387 ChildCount > 0 ? ChildCountStr : L"-",\r
388 TruncatedDriverName,\r
389 ImageName == NULL ? L"" : ImageName\r
390 );\r
391 } else {\r
392 ShellPrintEx (\r
393 -1,\r
394 -1,\r
395 FormatString,\r
396 ConvertHandleToHandleIndex (*HandleWalker),\r
397 DriverVersion,\r
398 ChildCount > 0 ? L'B' : (DeviceCount > 0 ? L'D' : L'?'),\r
399 DriverConfig ? L'Y' : L'N',\r
400 DriverDiag ? L'Y' : L'N',\r
401 DeviceCount,\r
402 ChildCount,\r
403 FullDriverName,\r
404 Temp2 == NULL ? L"" : Temp2\r
405 );\r
406 }\r
a29117bf
CP
407 if (TruncatedDriverName != NULL) {\r
408 FreePool (TruncatedDriverName);\r
409 }\r
4ba49616 410 if (Temp2 != NULL) {\r
411 FreePool(Temp2);\r
412 }\r
416d48f7
HL
413 if (ImageName != NULL) {\r
414 FreePool (ImageName);\r
415 }\r
416\r
54206ae7
TS
417 if (ShellGetExecutionBreakFlag ()) {\r
418 ShellStatus = SHELL_ABORTED;\r
419 break;\r
420 }\r
4ba49616 421 }\r
422 }\r
423 SHELL_FREE_NON_NULL(Language);\r
424 ShellCommandLineFreeVarList (Package);\r
425 SHELL_FREE_NON_NULL(FormatString);\r
426 }\r
427\r
428 return (ShellStatus);\r
429}\r