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