]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/DrvCfg.c
Add check code to avoid access violation.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / DrvCfg.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for DrvCfg shell Driver1 function.\r
3\r
361a8267 4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
4ba49616 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#include <Protocol/HiiConfigAccess.h>\r
17#include <Protocol/HiiDatabase.h>\r
18\r
4880c2c9 19STATIC CONST EFI_GUID *CfgGuidList[] = {&gEfiDriverConfigurationProtocolGuid, &gEfiDriverConfiguration2ProtocolGuid, NULL};\r
20\r
4ba49616 21/**\r
4880c2c9 22 Find the EFI_HII_HANDLE by device path.\r
4ba49616 23\r
4880c2c9 24 @param[in] DevPath1 The Device Path to match.\r
25 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.\r
26 @param[in] HiiDb The Hii database protocol\r
4ba49616 27\r
4880c2c9 28 @retval EFI_SUCCESS The operation was successful.\r
29 @retval EFI_NOT_FOUND There was no EFI_HII_HANDLE found for that deviec path.\r
4ba49616 30**/\r
31EFI_STATUS\r
32EFIAPI\r
4880c2c9 33FindHiiHandleViaDevPath(\r
34 IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath1,\r
35 OUT EFI_HII_HANDLE *HiiHandle,\r
36 IN EFI_HII_DATABASE_PROTOCOL *HiiDb\r
4ba49616 37 )\r
38{\r
4880c2c9 39 EFI_HII_HANDLE *HandleBuffer;\r
40 UINTN HandleBufferSize;\r
41 VOID *MainBuffer;\r
42 UINTN MainBufferSize;\r
43 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
44 EFI_HII_PACKAGE_HEADER *PackageHeader;\r
45 UINTN LoopVariable;\r
46 EFI_DEVICE_PATH_PROTOCOL *DevPath2;\r
47 EFI_STATUS Status;\r
4ba49616 48\r
4880c2c9 49 ASSERT(DevPath1 != NULL);\r
50 ASSERT(HiiHandle != NULL);\r
51 ASSERT(*HiiHandle == NULL);\r
52 ASSERT(HiiDb != NULL);\r
4ba49616 53\r
4880c2c9 54 HandleBufferSize = 0;\r
55 HandleBuffer = NULL;\r
56 Status = HiiDb->ListPackageLists(HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);\r
4ba49616 57 if (Status == EFI_BUFFER_TOO_SMALL) {\r
4880c2c9 58 HandleBuffer = AllocateZeroPool(HandleBufferSize);\r
cd8462ea 59 ASSERT (HandleBuffer != NULL);\r
4880c2c9 60 Status = HiiDb->ListPackageLists(HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);\r
4ba49616 61 }\r
62 if (EFI_ERROR(Status)) {\r
4880c2c9 63 SHELL_FREE_NON_NULL(HandleBuffer);\r
4ba49616 64 return (Status);\r
65 }\r
66\r
72c8a89a
ED
67 if (HandleBuffer == NULL) {\r
68 return EFI_NOT_FOUND;\r
69 }\r
70\r
4880c2c9 71 for (LoopVariable = 0 ; LoopVariable < (HandleBufferSize/sizeof(HandleBuffer[0])) && *HiiHandle == NULL ; LoopVariable++) {\r
72 MainBufferSize = 0;\r
73 MainBuffer = NULL;\r
74 Status = HiiDb->ExportPackageLists(HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);\r
75 if (Status == EFI_BUFFER_TOO_SMALL) {\r
76 MainBuffer = AllocateZeroPool(MainBufferSize);\r
cd8462ea 77 ASSERT (MainBuffer != NULL);\r
4880c2c9 78 Status = HiiDb->ExportPackageLists(HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);\r
79 }\r
80 //\r
81 // Enumerate through the block of returned memory.\r
82 // This should actually be a small block, but we need to be sure.\r
83 //\r
84 for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)MainBuffer\r
85 ; PackageListHeader != NULL && ((CHAR8*)PackageListHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && *HiiHandle == NULL\r
86 ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)(((CHAR8*)(PackageListHeader)) + PackageListHeader->PackageLength )) {\r
87 for (PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageListHeader))+sizeof(EFI_HII_PACKAGE_LIST_HEADER))\r
88 ; PackageHeader != NULL && ((CHAR8*)PackageHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END && *HiiHandle == NULL\r
89 ; PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageHeader))+PackageHeader->Length)) {\r
90 if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) {\r
91 DevPath2 = (EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER));\r
92 if (DevicePathCompare(&DevPath1, &DevPath2) == 0) {\r
93 *HiiHandle = HandleBuffer[LoopVariable];\r
94 break;\r
95 }\r
96 }\r
97 }\r
4ba49616 98 }\r
4880c2c9 99 SHELL_FREE_NON_NULL(MainBuffer);\r
4ba49616 100 }\r
4880c2c9 101 SHELL_FREE_NON_NULL(HandleBuffer);\r
4ba49616 102\r
4880c2c9 103 if (*HiiHandle == NULL) {\r
104 return (EFI_NOT_FOUND);\r
105 }\r
106 return (EFI_SUCCESS);\r
107}\r
4ba49616 108\r
4880c2c9 109/**\r
110 Convert a EFI_HANDLE to a EFI_HII_HANDLE.\r
4ba49616 111\r
4880c2c9 112 @param[in] Handle The EFI_HANDLE to convert.\r
113 @param[out] HiiHandle The EFI_HII_HANDLE after the converstion.\r
114 @param[in] HiiDb The Hii database protocol\r
4ba49616 115\r
4880c2c9 116 @retval EFI_SUCCESS The operation was successful.\r
117**/\r
118EFI_STATUS\r
119EFIAPI\r
120ConvertHandleToHiiHandle(\r
121 IN CONST EFI_HANDLE Handle,\r
122 OUT EFI_HII_HANDLE *HiiHandle,\r
123 IN EFI_HII_DATABASE_PROTOCOL *HiiDb\r
124 )\r
125{\r
126 EFI_STATUS Status;\r
127 EFI_DEVICE_PATH_PROTOCOL *DevPath1;\r
4ba49616 128\r
4880c2c9 129 if (HiiHandle == NULL || HiiDb == NULL) {\r
130 return (EFI_INVALID_PARAMETER);\r
131 }\r
132 *HiiHandle = NULL;\r
133\r
134 if (Handle == NULL) {\r
135 return (EFI_SUCCESS);\r
136 }\r
137\r
138 DevPath1 = NULL;\r
139 Status = gBS->OpenProtocol(Handle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath1, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
140 if (EFI_ERROR(Status) || DevPath1 == NULL) {\r
141 return (EFI_NOT_FOUND);\r
142 }\r
143\r
144 return (FindHiiHandleViaDevPath(DevPath1, HiiHandle, HiiDb));\r
4ba49616 145}\r
146\r
147/**\r
4880c2c9 148 Function to print out all HII configuration information to a file.\r
4ba49616 149\r
4880c2c9 150 @param[in] Handle The handle to get info on. NULL to do all handles.\r
151 @param[in] FileName The filename to rwite the info to.\r
4ba49616 152**/\r
153SHELL_STATUS\r
154EFIAPI\r
4880c2c9 155ConfigToFile(\r
156 IN CONST EFI_HANDLE Handle,\r
157 IN CONST CHAR16 *FileName\r
4ba49616 158 )\r
159{\r
4880c2c9 160 EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
161 EFI_STATUS Status;\r
162 VOID *MainBuffer;\r
163 UINTN MainBufferSize;\r
164 EFI_HII_HANDLE HiiHandle;\r
165 SHELL_FILE_HANDLE FileHandle;\r
4ba49616 166\r
4880c2c9 167 HiiDatabase = NULL;\r
168 MainBufferSize = 0;\r
169 MainBuffer = NULL;\r
170 FileHandle = NULL;\r
4ba49616 171\r
4880c2c9 172 Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0);\r
4ba49616 173 if (EFI_ERROR(Status)) {\r
4880c2c9 174 ShellPrintHiiEx(\r
175 -1,\r
176 -1,\r
177 NULL,\r
178 STRING_TOKEN(STR_GEN_FILE_OPEN), \r
179 gShellDriver1HiiHandle, \r
180 FileName, \r
181 Status);\r
182 return (SHELL_DEVICE_ERROR);\r
4ba49616 183 }\r
184\r
4ba49616 185 //\r
4880c2c9 186 // Locate HII Database protocol\r
4ba49616 187 //\r
4880c2c9 188 Status = gBS->LocateProtocol (\r
189 &gEfiHiiDatabaseProtocolGuid,\r
190 NULL,\r
191 (VOID **) &HiiDatabase\r
192 );\r
193\r
194 if (EFI_ERROR(Status) || HiiDatabase == NULL) {\r
195 ShellPrintHiiEx(\r
196 -1, \r
197 -1, \r
198 NULL,\r
199 STRING_TOKEN(STR_GEN_PROTOCOL_NF), \r
200 gShellDriver1HiiHandle, \r
201 L"EfiHiiDatabaseProtocol", \r
202 &gEfiHiiDatabaseProtocolGuid);\r
203 ShellCloseFile(&FileHandle);\r
204 return (SHELL_NOT_FOUND);\r
4ba49616 205 }\r
4ba49616 206\r
4880c2c9 207 Status = ConvertHandleToHiiHandle(Handle, &HiiHandle, HiiDatabase);\r
208 if (EFI_ERROR(Status)) {\r
209 ShellPrintHiiEx(\r
210 -1, \r
211 -1, \r
212 NULL, \r
213 STRING_TOKEN(STR_GEN_HANDLE_NOT), \r
214 gShellDriver1HiiHandle, \r
215 ConvertHandleToHandleIndex(Handle), \r
216 L"Device");\r
217 ShellCloseFile(&FileHandle);\r
218 return (SHELL_DEVICE_ERROR); \r
4ba49616 219 }\r
220\r
4880c2c9 221 Status = HiiDatabase->ExportPackageLists(HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer);\r
222 if (Status == EFI_BUFFER_TOO_SMALL) {\r
223 MainBuffer = AllocateZeroPool(MainBufferSize);\r
224 Status = HiiDatabase->ExportPackageLists(HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer);\r
4ba49616 225 }\r
226\r
4880c2c9 227 Status = ShellWriteFile(FileHandle, &MainBufferSize, MainBuffer);\r
228\r
229 ShellCloseFile(&FileHandle);\r
230 SHELL_FREE_NON_NULL(MainBuffer);\r
231\r
232 if (EFI_ERROR(Status)) {\r
233 ShellPrintHiiEx(\r
234 -1, \r
235 -1,\r
236 NULL,\r
237 STRING_TOKEN(STR_FILE_WRITE_FAIL), \r
238 gShellDriver1HiiHandle, \r
239 FileName, \r
240 Status);\r
241 return (SHELL_DEVICE_ERROR); \r
242 }\r
243 ShellPrintHiiEx(\r
244 -1, \r
245 -1,\r
246 NULL,\r
247 STRING_TOKEN(STR_DRVCFG_COMP), \r
248 gShellDriver1HiiHandle);\r
249\r
250 return (SHELL_SUCCESS);\r
4ba49616 251}\r
252\r
253/**\r
4880c2c9 254 Function to read in HII configuration information from a file.\r
4ba49616 255\r
4880c2c9 256 @param[in] Handle The handle to get info for.\r
257 @param[in] FileName The filename to read the info from.\r
4ba49616 258**/\r
259SHELL_STATUS\r
260EFIAPI\r
4880c2c9 261ConfigFromFile(\r
262 IN EFI_HANDLE Handle,\r
263 IN CONST CHAR16 *FileName\r
4ba49616 264 )\r
265{\r
4880c2c9 266 EFI_HII_DATABASE_PROTOCOL *HiiDatabase;\r
267 EFI_STATUS Status;\r
268 VOID *MainBuffer;\r
269 UINT64 Temp;\r
270 UINTN MainBufferSize;\r
271 EFI_HII_HANDLE HiiHandle;\r
272 SHELL_FILE_HANDLE FileHandle;\r
273 CHAR16 *TempDevPathString;\r
274 EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
275 EFI_HII_PACKAGE_HEADER *PackageHeader;\r
276 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
277 UINTN HandleIndex;\r
278\r
279 HiiDatabase = NULL;\r
280 MainBufferSize = 0;\r
281 MainBuffer = NULL;\r
282 FileHandle = NULL;\r
283\r
284 Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ, 0);\r
285 if (EFI_ERROR(Status)) {\r
286 ShellPrintHiiEx(\r
287 -1,\r
288 -1,\r
289 NULL,\r
290 STRING_TOKEN(STR_GEN_FILE_OPEN), \r
291 gShellDriver1HiiHandle, \r
292 FileName, \r
293 Status);\r
294 return (SHELL_DEVICE_ERROR);\r
295 }\r
296\r
297 //\r
298 // Locate HII Database protocol\r
299 //\r
300 Status = gBS->LocateProtocol (\r
301 &gEfiHiiDatabaseProtocolGuid,\r
302 NULL,\r
303 (VOID **) &HiiDatabase\r
304 );\r
4ba49616 305\r
4880c2c9 306 if (EFI_ERROR(Status) || HiiDatabase == NULL) {\r
307 ShellPrintHiiEx(\r
308 -1, \r
309 -1, \r
310 NULL,\r
311 STRING_TOKEN(STR_GEN_PROTOCOL_NF), \r
312 gShellDriver1HiiHandle, \r
313 L"EfiHiiDatabaseProtocol", \r
314 &gEfiHiiDatabaseProtocolGuid);\r
315 ShellCloseFile(&FileHandle);\r
316 return (SHELL_NOT_FOUND);\r
317 }\r
4ba49616 318\r
4880c2c9 319 Status = ShellGetFileSize(FileHandle, &Temp);\r
320 MainBufferSize = (UINTN)Temp;\r
321 if (EFI_ERROR(Status)) {\r
4ba49616 322 ShellPrintHiiEx(\r
323 -1, \r
324 -1, \r
325 NULL, \r
4880c2c9 326 STRING_TOKEN(STR_FILE_READ_FAIL), \r
4ba49616 327 gShellDriver1HiiHandle, \r
4880c2c9 328 FileName,\r
329 Status);\r
330 ShellCloseFile(&FileHandle);\r
331 return (SHELL_DEVICE_ERROR); \r
332 }\r
333 MainBuffer = AllocateZeroPool((UINTN)MainBufferSize); \r
334 if (EFI_ERROR(Status)) {\r
335 ShellPrintHiiEx(\r
336 -1, \r
337 -1, \r
338 NULL, \r
339 STRING_TOKEN(STR_GEN_OUT_MEM), \r
340 gShellDriver1HiiHandle);\r
341 ShellCloseFile(&FileHandle);\r
342 return (SHELL_DEVICE_ERROR); \r
4ba49616 343 }\r
4880c2c9 344 Status = ShellReadFile(FileHandle, &MainBufferSize, MainBuffer);\r
345 if (EFI_ERROR(Status)) {\r
346 ShellPrintHiiEx(\r
347 -1, \r
348 -1, \r
349 NULL, \r
350 STRING_TOKEN(STR_FILE_READ_FAIL), \r
351 gShellDriver1HiiHandle, \r
352 FileName,\r
353 Status);\r
354 ShellCloseFile(&FileHandle);\r
355 SHELL_FREE_NON_NULL(MainBuffer);\r
356 return (SHELL_DEVICE_ERROR); \r
357 }\r
358\r
359 ShellCloseFile(&FileHandle);\r
360\r
361 if (Handle != NULL) {\r
362 //\r
363 // User override in place. Just do it.\r
364 //\r
365 HiiHandle = NULL;\r
366 Status = ConvertHandleToHiiHandle(Handle, &HiiHandle, HiiDatabase);\r
367 if (EFI_ERROR(Status)) {\r
4ba49616 368 ShellPrintHiiEx(\r
369 -1, \r
370 -1, \r
371 NULL, \r
4880c2c9 372 STRING_TOKEN(STR_GEN_HANDLE_NOT), \r
4ba49616 373 gShellDriver1HiiHandle, \r
4880c2c9 374 ConvertHandleToHandleIndex(Handle), \r
375 L"Device");\r
376 ShellCloseFile(&FileHandle);\r
377 return (SHELL_DEVICE_ERROR); \r
378 }\r
379 Status = HiiDatabase->UpdatePackageList(HiiDatabase, HiiHandle, MainBuffer);\r
380 if (EFI_ERROR(Status)) {\r
381 ShellPrintHiiEx(\r
382 -1, \r
383 -1, \r
384 NULL, \r
385 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR), \r
386 gShellDriver1HiiHandle, \r
387 L"HiiDatabase->UpdatePackageList", \r
388 Status);\r
389 return (SHELL_DEVICE_ERROR); \r
390 }\r
391 } else {\r
392 //\r
393 // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.\r
394 //\r
395\r
396 for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)MainBuffer\r
397 ; PackageListHeader != NULL && ((CHAR8*)PackageListHeader) < (((CHAR8*)MainBuffer)+MainBufferSize)\r
398 ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)(((CHAR8*)(PackageListHeader)) + PackageListHeader->PackageLength )) {\r
399 for (PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageListHeader))+sizeof(EFI_HII_PACKAGE_LIST_HEADER))\r
400 ; PackageHeader != NULL && ((CHAR8*)PackageHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END\r
401 ; PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageHeader))+PackageHeader->Length)) {\r
402 if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) {\r
403 HiiHandle = NULL;\r
404 Status = FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)), &HiiHandle, HiiDatabase);\r
405 if (EFI_ERROR(Status)) {\r
406 //\r
407 // print out an error.\r
408 //\r
409 TempDevPathString = gDevPathToText->ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)), TRUE, TRUE);\r
410 ShellPrintHiiEx(\r
411 -1, \r
412 -1, \r
413 NULL, \r
414 STRING_TOKEN(STR_DRVCFG_IN_FILE_NF), \r
415 gShellDriver1HiiHandle, \r
416 TempDevPathString);\r
417 SHELL_FREE_NON_NULL(TempDevPathString);\r
418 } else {\r
419 Status = HiiDatabase->UpdatePackageList(HiiDatabase, HiiHandle, PackageListHeader);\r
420 if (EFI_ERROR(Status)) {\r
421 ShellPrintHiiEx(\r
422 -1, \r
423 -1, \r
424 NULL, \r
425 STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR), \r
426 gShellDriver1HiiHandle, \r
427 L"HiiDatabase->UpdatePackageList", \r
428 Status);\r
429 return (SHELL_DEVICE_ERROR);\r
430 } else {\r
431 DevPath = (EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER));\r
432 gBS->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle);\r
433 HandleIndex = ConvertHandleToHandleIndex(Handle);\r
434 ShellPrintHiiEx(\r
435 -1, \r
436 -1, \r
437 NULL, \r
438 STRING_TOKEN(STR_DRVCFG_DONE_HII), \r
439 gShellDriver1HiiHandle, \r
440 HandleIndex);\r
441 }\r
442 } \r
443 }\r
444 }\r
4ba49616 445 }\r
446 }\r
4880c2c9 447\r
448 SHELL_FREE_NON_NULL(MainBuffer);\r
449\r
450\r
451 ShellPrintHiiEx(\r
452 -1, \r
453 -1,\r
454 NULL,\r
455 STRING_TOKEN(STR_DRVCFG_COMP), \r
456 gShellDriver1HiiHandle);\r
4ba49616 457 return (SHELL_SUCCESS);\r
458}\r
459\r
4880c2c9 460EFI_STATUS\r
461EFIAPI\r
462ShellCmdDriverConfigurationProcessActionRequired (\r
463 EFI_HANDLE DriverImageHandle,\r
464 EFI_HANDLE ControllerHandle,\r
465 EFI_HANDLE ChildHandle,\r
466 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired\r
467 )\r
468{\r
469 EFI_HANDLE ConnectControllerContextOverride[2];\r
470\r
471 switch (ActionRequired) {\r
472 case EfiDriverConfigurationActionNone:\r
473 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle);\r
474 break;\r
475\r
476 case EfiDriverConfigurationActionStopController:\r
477 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_STOP), gShellDriver1HiiHandle);\r
478 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"stop controller");\r
479 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue, NULL, NULL);\r
480\r
481 gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle);\r
482 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"stopped");\r
483 break;\r
484\r
485 case EfiDriverConfigurationActionRestartController:\r
486 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"controller");\r
487 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart controller");\r
488 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue, NULL, NULL);\r
489\r
490 gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle);\r
491 ConnectControllerContextOverride[0] = DriverImageHandle;\r
492 ConnectControllerContextOverride[1] = NULL;\r
493 gBS->ConnectController (ControllerHandle, ConnectControllerContextOverride, NULL, TRUE);\r
494 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"restarted");\r
495 break;\r
496\r
497 case EfiDriverConfigurationActionRestartPlatform:\r
498 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"platform");\r
499 ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart platform");\r
500 ShellPromptForResponse(ShellPromptResponseTypeEnterContinue, NULL, NULL);\r
501\r
502 gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);\r
503 break;\r
504\r
505 default:\r
506 return (EFI_INVALID_PARAMETER);\r
507 break;\r
508 }\r
509\r
510 return EFI_SUCCESS;\r
511}\r
512\r
513SHELL_STATUS\r
514EFIAPI\r
515PreHiiDrvCfg (\r
516 IN CONST CHAR8 *Language,\r
517 IN BOOLEAN ForceDefaults,\r
518 IN UINT32 DefaultType,\r
519 IN BOOLEAN AllChildren,\r
520 IN BOOLEAN ValidateOptions,\r
521 IN BOOLEAN SetOptions,\r
522 IN EFI_HANDLE DriverImageHandle,\r
523 IN EFI_HANDLE DeviceHandle,\r
524 IN EFI_HANDLE ChildHandle\r
525 )\r
526{\r
527 EFI_STATUS Status;\r
528 SHELL_STATUS ShellStatus;\r
529 UINTN OuterLoopCounter;\r
530 CHAR8 *BestLanguage;\r
531 UINTN DriverImageHandleCount;\r
532 EFI_HANDLE *DriverImageHandleBuffer;\r
533 UINTN HandleCount;\r
534 EFI_HANDLE *HandleBuffer;\r
535 UINTN *HandleType;\r
536 UINTN LoopCounter;\r
537 UINTN ChildIndex;\r
538 UINTN ChildHandleCount;\r
539 EFI_HANDLE *ChildHandleBuffer;\r
540 UINTN *ChildHandleType;\r
541 EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired;\r
542 EFI_DRIVER_CONFIGURATION_PROTOCOL *DriverConfiguration;\r
543 BOOLEAN Iso639Language;\r
544 UINTN HandleIndex1;\r
545 UINTN HandleIndex2;\r
546 UINTN HandleIndex3;\r
547\r
548 ShellStatus = SHELL_SUCCESS;\r
549\r
550 if (ChildHandle == NULL && AllChildren) {\r
551 SetOptions = FALSE;\r
552 }\r
553\r
554 if (ForceDefaults) {\r
555 ShellPrintHiiEx(\r
556 -1,\r
557 -1,\r
558 NULL,\r
559 STRING_TOKEN (STR_DRVCFG_FORCE_D), \r
560 gShellDriver1HiiHandle, \r
561 DefaultType);\r
562 } else if (ValidateOptions) {\r
563 ShellPrintHiiEx(\r
564 -1,\r
565 -1,\r
566 NULL,\r
567 STRING_TOKEN (STR_DRVCFG_VALIDATE), \r
568 gShellDriver1HiiHandle);\r
569 } else if (SetOptions) {\r
570 ShellPrintHiiEx(\r
571 -1,\r
572 -1,\r
573 NULL,\r
574 STRING_TOKEN (STR_DRVCFG_SET), \r
575 gShellDriver1HiiHandle);\r
576 }\r
577\r
578 if (DriverImageHandle == 0) {\r
579 DriverImageHandleBuffer = GetHandleListByProtocolList(CfgGuidList);\r
580 if (DriverImageHandleBuffer == NULL) {\r
581 ShellStatus = SHELL_NOT_FOUND;\r
582 goto Done;\r
583 }\r
584 for (\r
585 HandleBuffer = DriverImageHandleBuffer, DriverImageHandleCount = 0 \r
586 ; HandleBuffer != NULL && *HandleBuffer != NULL \r
587 ; HandleBuffer++,DriverImageHandleCount++);\r
588 } else {\r
589 DriverImageHandleCount = 1;\r
590 //\r
591 // Allocate buffer to hold the image handle so as to\r
592 // keep consistent with the above clause\r
593 //\r
594 DriverImageHandleBuffer = AllocatePool (sizeof (EFI_HANDLE));\r
595 ASSERT (DriverImageHandleBuffer);\r
596 DriverImageHandleBuffer[0] = DriverImageHandle;\r
597 }\r
598\r
599 for (OuterLoopCounter = 0; OuterLoopCounter < DriverImageHandleCount; OuterLoopCounter++) {\r
600 Iso639Language = FALSE;\r
601 Status = gBS->OpenProtocol (\r
602 DriverImageHandleBuffer[OuterLoopCounter],\r
603 &gEfiDriverConfiguration2ProtocolGuid,\r
604 (VOID **) &DriverConfiguration,\r
605 NULL,\r
606 NULL,\r
607 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
608 );\r
609 if (EFI_ERROR (Status)) {\r
610 Iso639Language = TRUE;\r
611 Status = gBS->OpenProtocol (\r
612 DriverImageHandleBuffer[OuterLoopCounter],\r
613 &gEfiDriverConfigurationProtocolGuid,\r
614 (VOID **) &DriverConfiguration,\r
615 NULL,\r
616 NULL,\r
617 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
618 );\r
619 }\r
620 if (EFI_ERROR (Status)) {\r
621// ShellPrintHiiEx(\r
622// -1,\r
623// -1,\r
624// NULL,\r
625// STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),\r
626// gShellDriver1HiiHandle,\r
627// ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])\r
628// );\r
629 ShellStatus = SHELL_UNSUPPORTED;\r
630 continue;\r
631 }\r
632 \r
633 BestLanguage = GetBestLanguage (\r
634 DriverConfiguration->SupportedLanguages,\r
635 Iso639Language,\r
636 Language!=NULL?Language:"",\r
637 DriverConfiguration->SupportedLanguages,\r
638 NULL\r
639 );\r
640 if (BestLanguage == NULL) {\r
641 ShellPrintHiiEx(\r
642 -1,\r
643 -1,\r
644 NULL,\r
645 STRING_TOKEN (STR_GEN_PROBLEM_VAL),\r
646 gShellDriver1HiiHandle,\r
647 L"-l"\r
648 );\r
649 ShellStatus = SHELL_INVALID_PARAMETER;\r
650 continue;\r
651 }\r
652\r
653 Status = ParseHandleDatabaseByRelationshipWithType (\r
654 DriverImageHandleBuffer[OuterLoopCounter],\r
655 NULL,\r
656 &HandleCount,\r
657 &HandleBuffer,\r
658 &HandleType\r
659 );\r
660 if (EFI_ERROR (Status)) {\r
661 continue;\r
662 }\r
663\r
664 if (SetOptions && DeviceHandle == NULL) {\r
665\r
666 gST->ConOut->ClearScreen (gST->ConOut);\r
667 Status = DriverConfiguration->SetOptions (\r
668 DriverConfiguration,\r
669 NULL,\r
670 NULL,\r
671 BestLanguage,\r
672 &ActionRequired\r
673 );\r
674 gST->ConOut->ClearScreen (gST->ConOut);\r
675\r
676 ShellPrintHiiEx(\r
677 -1,\r
678 -1,\r
679 NULL,\r
680 STRING_TOKEN (STR_DRVCFG_ALL_LANG),\r
681 gShellDriver1HiiHandle,\r
682 ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]),\r
683 DriverConfiguration->SupportedLanguages\r
684 );\r
685 if (!EFI_ERROR (Status)) {\r
686 ShellPrintHiiEx(\r
687 -1,\r
688 -1,\r
689 NULL,\r
690 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), \r
691 gShellDriver1HiiHandle);\r
692 for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {\r
693 if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) == HR_CONTROLLER_HANDLE) {\r
694 ShellCmdDriverConfigurationProcessActionRequired (\r
695 DriverImageHandleBuffer[OuterLoopCounter],\r
696 HandleBuffer[LoopCounter],\r
697 NULL,\r
698 ActionRequired\r
699 );\r
700 }\r
701 }\r
702 } else {\r
703 ShellPrintHiiEx(\r
704 -1,\r
705 -1,\r
706 NULL,\r
707 STRING_TOKEN (STR_DRVCFG_NOT_SET), \r
708 gShellDriver1HiiHandle, \r
709 Status);\r
710 }\r
711 continue;\r
712 }\r
713\r
714 for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {\r
715 if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) != HR_CONTROLLER_HANDLE) {\r
716 continue;\r
717 }\r
718 if (DeviceHandle != NULL && DeviceHandle != HandleBuffer[LoopCounter]) {\r
719 continue;\r
720 }\r
721 if (ChildHandle == NULL) {\r
722 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
723 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
724 ShellPrintHiiEx(\r
725 -1,\r
726 -1,\r
727 NULL,\r
728 STRING_TOKEN (STR_DRVCFG_CTRL_LANG),\r
729 gShellDriver1HiiHandle,\r
730 HandleIndex1,\r
731 HandleIndex2,\r
732 DriverConfiguration->SupportedLanguages\r
733 );\r
734\r
735 if (ForceDefaults) {\r
736 Status = DriverConfiguration->ForceDefaults (\r
737 DriverConfiguration,\r
738 HandleBuffer[LoopCounter],\r
739 NULL,\r
740 DefaultType,\r
741 &ActionRequired\r
742 );\r
743\r
744 if (!EFI_ERROR (Status)) {\r
745 ShellPrintHiiEx(\r
746 -1,\r
747 -1,\r
748 NULL,\r
749 STRING_TOKEN (STR_DRVCFG_DEF_FORCED), \r
750 gShellDriver1HiiHandle);\r
751 ShellCmdDriverConfigurationProcessActionRequired (\r
752 DriverImageHandleBuffer[OuterLoopCounter],\r
753 HandleBuffer[LoopCounter],\r
754 NULL,\r
755 ActionRequired\r
756 );\r
757 } else {\r
758 ShellPrintHiiEx(\r
759 -1,\r
760 -1,\r
761 NULL,\r
762 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), \r
763 gShellDriver1HiiHandle, \r
764 Status);\r
765 ShellStatus = SHELL_DEVICE_ERROR;\r
766 }\r
767 } else if (ValidateOptions) {\r
768 Status = DriverConfiguration->OptionsValid (\r
769 DriverConfiguration,\r
770 HandleBuffer[LoopCounter],\r
771 NULL\r
772 );\r
773\r
774 if (!EFI_ERROR (Status)) {\r
775 ShellPrintHiiEx(\r
776 -1,\r
777 -1,\r
778 NULL,\r
779 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), \r
780 gShellDriver1HiiHandle);\r
781 } else {\r
782 ShellPrintHiiEx(\r
783 -1,\r
784 -1,\r
785 NULL,\r
786 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), \r
787 gShellDriver1HiiHandle, \r
788 Status);\r
789 ShellStatus = SHELL_DEVICE_ERROR;\r
790 }\r
791 } else if (SetOptions) {\r
792 gST->ConOut->ClearScreen (gST->ConOut);\r
793 Status = DriverConfiguration->SetOptions (\r
794 DriverConfiguration,\r
795 HandleBuffer[LoopCounter],\r
796 NULL,\r
797 BestLanguage,\r
798 &ActionRequired\r
799 );\r
800 gST->ConOut->ClearScreen (gST->ConOut);\r
801 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
802 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
803 ShellPrintHiiEx(\r
804 -1,\r
805 -1,\r
806 NULL,\r
807 STRING_TOKEN (STR_DRVCFG_CTRL_LANG),\r
808 gShellDriver1HiiHandle,\r
809 HandleIndex1,\r
810 HandleIndex2,\r
811 DriverConfiguration->SupportedLanguages\r
812 );\r
813 if (!EFI_ERROR (Status)) {\r
814 ShellPrintHiiEx(\r
815 -1,\r
816 -1,\r
817 NULL,\r
818 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), \r
819 gShellDriver1HiiHandle);\r
820\r
821 ShellCmdDriverConfigurationProcessActionRequired (\r
822 DriverImageHandleBuffer[OuterLoopCounter],\r
823 HandleBuffer[LoopCounter],\r
824 NULL,\r
825 ActionRequired\r
826 );\r
827\r
828 } else {\r
829 ShellPrintHiiEx(\r
830 -1,\r
831 -1,\r
832 NULL,\r
833 STRING_TOKEN (STR_DRVCFG_NOT_SET), \r
834 gShellDriver1HiiHandle, \r
835 Status);\r
836 ShellStatus = SHELL_DEVICE_ERROR;\r
837 }\r
838 } else {\r
839 Print (L"\n");\r
840 }\r
841 }\r
842\r
843 if (ChildHandle == NULL && !AllChildren) {\r
844 continue;\r
845 }\r
846\r
847 Status = ParseHandleDatabaseByRelationshipWithType (\r
848 DriverImageHandleBuffer[OuterLoopCounter],\r
849 HandleBuffer[LoopCounter],\r
850 &ChildHandleCount,\r
851 &ChildHandleBuffer,\r
852 &ChildHandleType\r
853 );\r
854 if (EFI_ERROR (Status)) {\r
855 continue;\r
856 }\r
857\r
858 for (ChildIndex = 0; ChildIndex < ChildHandleCount; ChildIndex++) {\r
859\r
860 if ((ChildHandleType[ChildIndex] & HR_CHILD_HANDLE) != HR_CHILD_HANDLE) {\r
861 continue;\r
862 }\r
863\r
864 if (ChildHandle != NULL && ChildHandle != ChildHandleBuffer[ChildIndex]) {\r
865 continue;\r
866 }\r
867\r
868 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
869 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
870 HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);\r
871 ShellPrintHiiEx(\r
872 -1,\r
873 -1,\r
874 NULL,\r
875 STRING_TOKEN (STR_DRVCFG_CHILD_LANG),\r
876 gShellDriver1HiiHandle,\r
877 HandleIndex1,\r
878 HandleIndex2,\r
879 HandleIndex3,\r
880 DriverConfiguration->SupportedLanguages);\r
881\r
882 if (ForceDefaults) {\r
883 Status = DriverConfiguration->ForceDefaults (\r
884 DriverConfiguration,\r
885 HandleBuffer[LoopCounter],\r
886 ChildHandleBuffer[ChildIndex],\r
887 DefaultType,\r
888 &ActionRequired\r
889 );\r
890\r
891 if (!EFI_ERROR (Status)) {\r
892 ShellPrintHiiEx(\r
893 -1,\r
894 -1,\r
895 NULL,\r
896 STRING_TOKEN (STR_DRVCFG_DEF_FORCED), \r
897 gShellDriver1HiiHandle);\r
898\r
899 ShellCmdDriverConfigurationProcessActionRequired (\r
900 DriverImageHandleBuffer[OuterLoopCounter],\r
901 HandleBuffer[LoopCounter],\r
902 ChildHandleBuffer[ChildIndex],\r
903 ActionRequired\r
904 );\r
905\r
906 } else {\r
907 ShellPrintHiiEx(\r
908 -1,\r
909 -1,\r
910 NULL,\r
911 STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), \r
912 gShellDriver1HiiHandle, \r
913 Status);\r
914 ShellStatus = SHELL_DEVICE_ERROR;\r
915 }\r
916 } else if (ValidateOptions) {\r
917 Status = DriverConfiguration->OptionsValid (\r
918 DriverConfiguration,\r
919 HandleBuffer[LoopCounter],\r
920 ChildHandleBuffer[ChildIndex]\r
921 );\r
922\r
923 if (!EFI_ERROR (Status)) {\r
924 ShellPrintHiiEx(\r
925 -1,\r
926 -1,\r
927 NULL,\r
928 STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), \r
929 gShellDriver1HiiHandle);\r
930 } else {\r
931 ShellPrintHiiEx(\r
932 -1,\r
933 -1,\r
934 NULL,\r
935 STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), \r
936 gShellDriver1HiiHandle, \r
937 Status);\r
938 ShellStatus = SHELL_DEVICE_ERROR;\r
939 }\r
940 } else if (SetOptions) {\r
941 gST->ConOut->ClearScreen (gST->ConOut);\r
942 Status = DriverConfiguration->SetOptions (\r
943 DriverConfiguration,\r
944 HandleBuffer[LoopCounter],\r
945 ChildHandleBuffer[ChildIndex],\r
946 BestLanguage,\r
947 &ActionRequired\r
948 );\r
949 gST->ConOut->ClearScreen (gST->ConOut);\r
950 HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);\r
951 HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);\r
952 HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);\r
953 ShellPrintHiiEx(\r
954 -1,\r
955 -1,\r
956 NULL,\r
957 STRING_TOKEN (STR_DRVCFG_CHILD_LANG),\r
958 gShellDriver1HiiHandle,\r
959 HandleIndex1,\r
960 HandleIndex2,\r
961 HandleIndex3,\r
962 DriverConfiguration->SupportedLanguages\r
963 );\r
964 if (!EFI_ERROR (Status)) {\r
965 ShellPrintHiiEx(\r
966 -1,\r
967 -1,\r
968 NULL,\r
969 STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), \r
970 gShellDriver1HiiHandle);\r
971\r
972 ShellCmdDriverConfigurationProcessActionRequired (\r
973 DriverImageHandleBuffer[OuterLoopCounter],\r
974 HandleBuffer[LoopCounter],\r
975 ChildHandleBuffer[ChildIndex],\r
976 ActionRequired\r
977 );\r
978\r
979 } else {\r
980 ShellPrintHiiEx(\r
981 -1,\r
982 -1,\r
983 NULL,\r
984 STRING_TOKEN (STR_DRVCFG_NOT_SET), \r
985 gShellDriver1HiiHandle, \r
986 Status);\r
987 ShellStatus = SHELL_DEVICE_ERROR;\r
988 }\r
989 } else {\r
990 Print (L"\n");\r
991 }\r
992 }\r
993\r
994 FreePool (ChildHandleBuffer);\r
995 FreePool (ChildHandleType);\r
996 }\r
997\r
998 FreePool (BestLanguage);\r
999 FreePool (HandleBuffer);\r
1000 FreePool (HandleType);\r
1001 }\r
1002\r
1003 if (DriverImageHandle != NULL && DriverImageHandleCount != 0) {\r
1004 FreePool (DriverImageHandleBuffer);\r
1005 }\r
1006\r
1007Done:\r
1008 return ShellStatus;\r
1009}\r
1010\r
4ba49616 1011/**\r
1012 Function to print out configuration information on all configurable handles.\r
1013\r
1014 @param[in] ChildrenToo TRUE to tewst for children.\r
4880c2c9 1015 @param[in] Language ASCII string for language code.\r
1016 @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only.\r
4ba49616 1017\r
1018 @retval SHELL_SUCCESS The operation was successful.\r
1019**/\r
1020SHELL_STATUS\r
1021EFIAPI\r
1022PrintConfigInfoOnAll(\r
4880c2c9 1023 IN CONST BOOLEAN ChildrenToo,\r
1024 IN CONST CHAR8 *Language,\r
1025 IN CONST BOOLEAN UseHii\r
4ba49616 1026 )\r
1027{\r
4ba49616 1028 EFI_HANDLE *HandleList;\r
1029 EFI_HANDLE *CurrentHandle;\r
4ba49616 1030 BOOLEAN Found;\r
4880c2c9 1031 UINTN Index2;\r
1032\r
4ba49616 1033\r
1034 Found = FALSE;\r
4ba49616 1035 HandleList = NULL;\r
1036 CurrentHandle = NULL;\r
4ba49616 1037\r
4880c2c9 1038 if (UseHii) {\r
1039 //\r
1040 // HII method\r
1041 //\r
1042 HandleList = GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid);\r
1043 for (CurrentHandle = HandleList ; CurrentHandle != NULL && *CurrentHandle != NULL; CurrentHandle++){\r
1044 Found = TRUE;\r
1045 Index2 = *CurrentHandle == NULL ? 0 : ConvertHandleToHandleIndex(*CurrentHandle);\r
1046 ShellPrintHiiEx(\r
1047 -1, \r
1048 -1, \r
1049 NULL, \r
1050 STRING_TOKEN (STR_DRVCFG_LINE_HII), \r
1051 gShellDriver1HiiHandle, \r
1052 Index2\r
1053 );\r
4ba49616 1054 }\r
4880c2c9 1055 SHELL_FREE_NON_NULL(HandleList);\r
4ba49616 1056 }\r
4ba49616 1057\r
4880c2c9 1058 if (PreHiiDrvCfg (\r
1059 Language,\r
1060 FALSE,\r
1061 0,\r
1062 ChildrenToo,\r
1063 FALSE,\r
1064 FALSE,\r
1065 0,\r
1066 0,\r
1067 0) == SHELL_SUCCESS) {\r
1068 Found = TRUE;\r
4ba49616 1069 }\r
4880c2c9 1070\r
4ba49616 1071 if (!Found) {\r
1072 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle);\r
1073 return (SHELL_SUCCESS);\r
1074 }\r
4880c2c9 1075\r
1076 return (SHELL_SUCCESS);\r
4ba49616 1077}\r
1078\r
4880c2c9 1079STATIC CONST SHELL_PARAM_ITEM ParamListHii[] = {\r
4ba49616 1080 {L"-s", TypeFlag},\r
4ba49616 1081 {L"-l", TypeValue},\r
1082 {L"-f", TypeValue},\r
1083 {L"-o", TypeValue},\r
1084 {L"-i", TypeValue},\r
1085 {NULL, TypeMax}\r
1086 };\r
4880c2c9 1087STATIC CONST SHELL_PARAM_ITEM ParamListPreHii[] = {\r
1088 {L"-c", TypeFlag},\r
1089 {L"-s", TypeFlag},\r
1090 {L"-v", TypeFlag},\r
1091 {L"-l", TypeValue},\r
1092 {L"-f", TypeValue},\r
1093 {NULL, TypeMax}\r
1094 };\r
4ba49616 1095\r
361a8267 1096/**\r
1097 Function for 'drvcfg' command.\r
1098\r
1099 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1100 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1101**/\r
4ba49616 1102SHELL_STATUS\r
1103EFIAPI\r
1104ShellCommandRunDrvCfg (\r
1105 IN EFI_HANDLE ImageHandle,\r
1106 IN EFI_SYSTEM_TABLE *SystemTable\r
1107 )\r
1108{\r
1109 EFI_STATUS Status;\r
1110 LIST_ENTRY *Package;\r
1111 CHAR16 *ProblemParam;\r
1112 SHELL_STATUS ShellStatus;\r
1113 CHAR8 *Language;\r
1114 CONST CHAR16 *Lang;\r
4880c2c9 1115 CONST CHAR16 *HandleIndex1;\r
1116 CONST CHAR16 *HandleIndex2;\r
1117 CONST CHAR16 *HandleIndex3;\r
1118 CONST CHAR16 *ForceTypeString;\r
1119 BOOLEAN Force;\r
1120 BOOLEAN Set;\r
1121 BOOLEAN Validate;\r
1122 BOOLEAN InFromFile;\r
1123 BOOLEAN OutToFile;\r
1124 BOOLEAN AllChildren;\r
1125 BOOLEAN UseHii;\r
1126 UINT32 ForceType;\r
1127 UINT64 Intermediate;\r
1128 EFI_HANDLE Handle1;\r
1129 EFI_HANDLE Handle2;\r
1130 EFI_HANDLE Handle3;\r
1131 CONST CHAR16 *FileName;\r
4ba49616 1132\r
1133 ShellStatus = SHELL_SUCCESS;\r
1134 Status = EFI_SUCCESS;\r
1135 Language = NULL;\r
4880c2c9 1136 UseHii = TRUE;\r
4ba49616 1137\r
1138 //\r
1139 // initialize the shell lib (we must be in non-auto-init...)\r
1140 //\r
1141 Status = ShellInitialize();\r
1142 ASSERT_EFI_ERROR(Status);\r
1143\r
1144 Status = CommandInit();\r
1145 ASSERT_EFI_ERROR(Status);\r
1146\r
1147 //\r
1148 // parse the command line\r
1149 //\r
4880c2c9 1150 Status = ShellCommandLineParse (ParamListHii, &Package, &ProblemParam, TRUE);\r
1151 if (EFI_ERROR(Status) || ShellCommandLineGetCount(Package) > 2) {\r
1152 UseHii = FALSE;\r
1153 if (Package != NULL) {\r
1154 ShellCommandLineFreeVarList (Package);\r
4ba49616 1155 }\r
4880c2c9 1156 SHELL_FREE_NON_NULL(ProblemParam);\r
1157 Status = ShellCommandLineParse (ParamListPreHii, &Package, &ProblemParam, TRUE);\r
1158 if (EFI_ERROR(Status)) {\r
1159 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
1160 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
1161 FreePool(ProblemParam);\r
1162 ShellStatus = SHELL_INVALID_PARAMETER;\r
1163 goto Done;\r
1164 } else {\r
1165 ASSERT(FALSE);\r
1166 }\r
1167 }\r
1168 } \r
1169 if (ShellStatus == SHELL_SUCCESS) {\r
4ba49616 1170 Lang = ShellCommandLineGetValue(Package, L"-l");\r
1171 if (Lang != NULL) {\r
1172 Language = AllocateZeroPool(StrSize(Lang));\r
1173 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
4880c2c9 1174 } else if (ShellCommandLineGetFlag(Package, L"-l")){\r
4ba49616 1175 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
4880c2c9 1176 ShellStatus = SHELL_INVALID_PARAMETER;\r
1177 goto Done;\r
1178 }\r
1179 Set = ShellCommandLineGetFlag (Package, L"-s");\r
1180 Validate = ShellCommandLineGetFlag (Package, L"-v");\r
1181 InFromFile = ShellCommandLineGetFlag (Package, L"-i");\r
1182 OutToFile = ShellCommandLineGetFlag (Package, L"-o");\r
1183 AllChildren = ShellCommandLineGetFlag (Package, L"-c");\r
1184 Force = ShellCommandLineGetFlag (Package, L"-f");\r
1185 ForceTypeString = ShellCommandLineGetValue(Package, L"-f");\r
1186\r
1187 if (OutToFile) {\r
1188 FileName = ShellCommandLineGetValue(Package, L"-o");\r
1189 } else if (InFromFile) {\r
1190 FileName = ShellCommandLineGetValue(Package, L"-i");\r
1191 } else {\r
1192 FileName = NULL;\r
1193 }\r
1194\r
1195 if (InFromFile && EFI_ERROR(ShellFileExists(FileName))) {\r
1196 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, FileName);\r
1197 ShellStatus = SHELL_INVALID_PARAMETER;\r
1198 goto Done; \r
1199 }\r
1200 if (OutToFile && !EFI_ERROR(ShellFileExists(FileName))) {\r
1201 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, FileName);\r
1202 ShellStatus = SHELL_INVALID_PARAMETER;\r
1203 goto Done; \r
1204 }\r
1205 if (Force && ForceTypeString == NULL) {\r
1206 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-f");\r
1207 ShellStatus = SHELL_INVALID_PARAMETER;\r
1208 goto Done;\r
1209 } \r
1210 if (Force) {\r
1211 Status = ShellConvertStringToUint64(ForceTypeString, &Intermediate, FALSE, FALSE);\r
1212 if (EFI_ERROR(Status)) {\r
1213 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"-f");\r
1214 ShellStatus = SHELL_INVALID_PARAMETER;\r
1215 goto Done;\r
1216 }\r
1217 ForceType = (UINT32)Intermediate;\r
1218 } else {\r
1219 ForceType = 0;\r
1220 }\r
1221 HandleIndex1 = ShellCommandLineGetRawValue(Package, 1);\r
1222 Handle1 = NULL;\r
1223 if (HandleIndex1 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1, &Intermediate, TRUE, FALSE))) {\r
1224 Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
1225 if (Handle1 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
1226 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex1);\r
1227 ShellStatus = SHELL_INVALID_PARAMETER;\r
1228 goto Done;\r
1229 }\r
1230 }\r
1231 HandleIndex2 = ShellCommandLineGetRawValue(Package, 2);\r
1232 Handle2 = NULL;\r
1233 if (HandleIndex2 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2, &Intermediate, TRUE, FALSE))) {\r
1234 Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
1235 if (Handle2 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
1236 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex2);\r
1237 ShellStatus = SHELL_INVALID_PARAMETER;\r
1238 goto Done;\r
1239 }\r
1240 }\r
1241 HandleIndex3 = ShellCommandLineGetRawValue(Package, 3);\r
1242 Handle3 = NULL;\r
1243 if (HandleIndex3 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3, &Intermediate, TRUE, FALSE))) {\r
1244 Handle3 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
1245 if (Handle3 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {\r
1246 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex3);\r
1247 ShellStatus = SHELL_INVALID_PARAMETER;\r
1248 goto Done;\r
1249 }\r
1250 }\r
1251\r
1252 if ((InFromFile || OutToFile) && (FileName == NULL)) {\r
1253 if (FileName == NULL) {\r
1254 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, InFromFile?L"-i":L"-o");\r
1255 } else {\r
1256 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle);\r
1257 }\r
1258 ShellStatus = SHELL_INVALID_PARAMETER;\r
1259 goto Done;\r
1260 }\r
1261 if (!UseHii && (InFromFile || OutToFile)) {\r
1262 if (InFromFile) {\r
1263 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-i");\r
1264 ShellStatus = SHELL_INVALID_PARAMETER;\r
1265 goto Done;\r
1266 } \r
1267 if (OutToFile) {\r
1268 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-o");\r
1269 ShellStatus = SHELL_INVALID_PARAMETER;\r
1270 goto Done;\r
1271 }\r
1272 }\r
1273 if (Validate && Force) {\r
1274 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-f");\r
1275 ShellStatus = SHELL_INVALID_PARAMETER;\r
1276 goto Done;\r
1277 } \r
1278 if (Validate && Set) {\r
1279 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-s");\r
1280 ShellStatus = SHELL_INVALID_PARAMETER;\r
1281 goto Done;\r
1282 } \r
1283 if (Set && Force) {\r
1284 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-s", L"-f");\r
1285 ShellStatus = SHELL_INVALID_PARAMETER;\r
1286 goto Done;\r
1287 }\r
1288 if (OutToFile && InFromFile) {\r
1289 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-i", L"-o");\r
1290 ShellStatus = SHELL_INVALID_PARAMETER;\r
1291 goto Done;\r
4ba49616 1292 }\r
1293\r
1294 //\r
4880c2c9 1295 // We do HII first.\r
4ba49616 1296 //\r
4880c2c9 1297 if (UseHii) {\r
1298 if (Handle1 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
4ba49616 1299 //\r
4880c2c9 1300 // no HII on this handle.\r
4ba49616 1301 //\r
4880c2c9 1302 ShellStatus = SHELL_UNSUPPORTED;\r
1303 } else if (Validate) {\r
1304 } else if (Force) {\r
1305 } else if (Set) {\r
1306 } else if (InFromFile) {\r
1307 ShellStatus = ConfigFromFile(Handle1, FileName);\r
1308 if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) {\r
1309 goto Done;\r
1310 }\r
1311 } else if (OutToFile) {\r
1312 ShellStatus = ConfigToFile(Handle1, FileName);\r
1313 if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) {\r
1314 goto Done;\r
1315 }\r
1316 } else if (HandleIndex1 == NULL) {\r
1317 //\r
1318 // display all that are configurable\r
1319 //\r
1320 ShellStatus = PrintConfigInfoOnAll(AllChildren, Language, UseHii);\r
1321 goto Done;\r
1322 } else {\r
1323 if (!EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
1324 ShellPrintHiiEx(\r
1325 -1, \r
1326 -1, \r
1327 NULL, \r
1328 STRING_TOKEN (STR_DRVCFG_LINE_HII), \r
1329 gShellDriver1HiiHandle, \r
1330 ConvertHandleToHandleIndex(Handle1)\r
1331 );\r
1332 goto Done;\r
4ba49616 1333 }\r
1334 }\r
4880c2c9 1335 }\r
1336\r
1337 //\r
1338 // We allways need to do this one since it does both by default.\r
1339 //\r
1340 if (!InFromFile && !OutToFile) {\r
1341 ShellStatus = PreHiiDrvCfg (\r
1342 Language,\r
1343 Force,\r
1344 ForceType,\r
1345 AllChildren,\r
1346 Validate,\r
1347 Set,\r
1348 Handle1,\r
1349 Handle2,\r
1350 Handle3);\r
1351 }\r
1352\r
1353 if (ShellStatus == SHELL_UNSUPPORTED) {\r
1354 ShellPrintHiiEx(\r
1355 -1,\r
1356 -1,\r
1357 NULL,\r
1358 STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),\r
1359 gShellDriver1HiiHandle, \r
1360 ConvertHandleToHandleIndex(Handle1)\r
1361 );\r
4ba49616 1362 }\r
1363 }\r
4880c2c9 1364\r
1365Done:\r
4ba49616 1366 ShellCommandLineFreeVarList (Package);\r
1367 SHELL_FREE_NON_NULL(Language);\r
1368 return (ShellStatus);\r
1369}\r