+++ /dev/null
-/** @file\r
- Main file for connect shell Driver1 function.\r
-\r
- Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "UefiShellDriver1CommandsLib.h"\r
-#include <Guid/GlobalVariable.h>\r
-#include <Guid/ConsoleInDevice.h>\r
-#include <Guid/ConsoleOutDevice.h>\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-ConnectControllers (\r
- IN CONST EFI_HANDLE ControllerHandle,\r
- IN CONST EFI_HANDLE DriverHandle,\r
- IN CONST BOOLEAN Recursive,\r
- IN CONST BOOLEAN Output\r
- ){\r
- EFI_STATUS Status;\r
- EFI_HANDLE *ControllerHandleList;\r
- EFI_HANDLE *DriverHandleList;\r
- EFI_HANDLE *HandleWalker;\r
-\r
- ControllerHandleList = NULL;\r
- Status = EFI_NOT_FOUND;\r
-\r
- //\r
- // If we have a single handle to connect make that a 'list'\r
- //\r
- if (DriverHandle == NULL) {\r
- DriverHandleList = NULL;\r
- } else {\r
- DriverHandleList = AllocatePool(2*sizeof(EFI_HANDLE));\r
- DriverHandleList[0] = DriverHandle;\r
- DriverHandleList[1] = NULL;\r
- }\r
-\r
- //\r
- // do we connect all controllers (with a loop) or a single one...\r
- // This is where we call the gBS->ConnectController function.\r
- //\r
- if (ControllerHandle == NULL) {\r
- ControllerHandleList = GetHandleListByPotocol(&gEfiDevicePathProtocolGuid);\r
- for (HandleWalker = ControllerHandleList\r
- ; HandleWalker != NULL && *HandleWalker != NULL\r
- ; HandleWalker++\r
- ){\r
- Status = gBS->ConnectController(*HandleWalker, DriverHandleList, NULL, Recursive);\r
- if (Output) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_CON_RESULT), gShellDriver1HiiHandle, *HandleWalker, Status);\r
- }\r
- }\r
- } else {\r
- Status = gBS->ConnectController(ControllerHandle, DriverHandleList, NULL, Recursive);\r
- ASSERT(Output == FALSE);\r
- }\r
-\r
- //\r
- // Free any memory we allocated.\r
- //\r
- if (ControllerHandleList != NULL) {\r
- FreePool(ControllerHandleList);\r
- }\r
- if (DriverHandleList != NULL) {\r
- FreePool(DriverHandleList);\r
- }\r
- return (Status);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-ConnectFromDevPaths (\r
- IN CONST CHAR16 *Key\r
- ){\r
- EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
- EFI_DEVICE_PATH_PROTOCOL *DevPathWalker;\r
- UINTN Length;\r
- EFI_HANDLE Handle;\r
- EFI_STATUS Status;\r
-\r
- DevPath = NULL;\r
- Length = 0;\r
-\r
- //\r
- // Get the DevicePath buffer from the variable...\r
- //\r
- Status = gRT->GetVariable((CHAR16*)Key, (EFI_GUID*)&gEfiGlobalVariableGuid, NULL, &Length, DevPath);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- DevPath = AllocatePool(Length);\r
- Status = gRT->GetVariable((CHAR16*)Key, (EFI_GUID*)&gEfiGlobalVariableGuid, NULL, &Length, DevPath);\r
- }\r
-\r
- //\r
- // walk the list of devices and connect them\r
- //\r
- for (DevPathWalker = DevPath\r
- ; DevPathWalker < (DevPath + Length) && !EFI_ERROR(Status) && DevPath != NULL\r
- ; DevPathWalker += GetDevicePathSize(DevPathWalker)\r
- ){\r
- //\r
- // get the correct handle from a given device path\r
- //\r
- if (StrCmp(Key, L"ConInDev") == 0) {\r
- Status = gBS->LocateDevicePath((EFI_GUID*)&gEfiConsoleInDeviceGuid, &DevPathWalker, &Handle);\r
- } else if (StrCmp(Key, L"ConOutDev") == 0) {\r
- Status = gBS->LocateDevicePath((EFI_GUID*)&gEfiConsoleOutDeviceGuid, &DevPathWalker, &Handle);\r
- } else {\r
- Handle = NULL;\r
- Status = EFI_INVALID_PARAMETER;\r
- ASSERT(FALSE);\r
- }\r
- if (!EFI_ERROR(Status)) {\r
- Status = ConnectControllers(Handle, NULL, FALSE, FALSE);\r
- }\r
- }\r
-\r
- if (DevPath != NULL) {\r
- FreePool(DevPath);\r
- }\r
- return (Status);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-ConvertAndConnectControllers (\r
- IN CONST CHAR16 *StringHandle1,\r
- IN CONST CHAR16 *StringHandle2 OPTIONAL,\r
- IN CONST BOOLEAN Recursive,\r
- IN CONST BOOLEAN Output\r
- ){\r
- EFI_HANDLE Handle1;\r
- EFI_HANDLE Handle2;\r
-\r
- //\r
- // Convert the command line parameters to HANDLES. They must be in HEX according to spec.\r
- //\r
- if (StringHandle1 != NULL) {\r
- Handle1 = (EFI_HANDLE)StrHexToUintn(StringHandle1);\r
- } else {\r
- Handle1 = NULL;\r
- }\r
- if (StringHandle2 != NULL) {\r
- Handle2 = (EFI_HANDLE)StrHexToUintn(StringHandle2);\r
- } else {\r
- Handle2 = NULL;\r
- }\r
-\r
- //\r
- // if only one is NULL verify it's the proper one...\r
- //\r
- if ( (Handle1 == NULL && Handle2 != NULL)\r
- || (Handle1 != NULL && Handle2 == NULL)\r
- ){\r
- //\r
- // Figure out which one should be NULL and move the handle to the right place.\r
- // If Handle1 is NULL then test Handle2 and vise versa.\r
- // The one that DOES has driver binding must be Handle2\r
- //\r
- if (Handle1 == NULL) {\r
- if (EFI_ERROR(gBS->OpenProtocol(Handle2, &gEfiDriverBindingProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
- // swap\r
- Handle1 = Handle2;\r
- Handle2 = NULL;\r
- } else {\r
- // We're all good...\r
- }\r
- } else {\r
- if (EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiDriverBindingProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
- // We're all good...\r
- } else {\r
- // swap\r
- Handle2 = Handle1;\r
- Handle1 = NULL;\r
- }\r
- }\r
- }\r
-\r
- return (ConnectControllers(Handle1, Handle2, Recursive, Output));\r
-}\r
-\r
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
- {L"-c", TypeFlag},\r
- {L"-r", TypeFlag},\r
- {NULL, TypeMax}\r
- };\r
-\r
-SHELL_STATUS\r
-EFIAPI\r
-ShellCommandRunConnect (\r
- VOID *RESERVED\r
- ) {\r
- EFI_STATUS Status;\r
- LIST_ENTRY *Package;\r
- CHAR16 *ProblemParam;\r
- SHELL_STATUS ShellStatus;\r
-\r
- ShellStatus = SHELL_SUCCESS;\r
-\r
- //\r
- // initialize the shell lib (we must be in non-auto-init...)\r
- //\r
- Status = ShellInitialize();\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- Status = CommandInit();\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- //\r
- // parse the command line\r
- //\r
- Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
- if EFI_ERROR(Status) {\r
- if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
- FreePool(ProblemParam);\r
- ShellStatus = SHELL_INVALID_PARAMETER;\r
- } else {\r
- ASSERT(FALSE);\r
- }\r
- } else {\r
- //\r
- // if more than 2 'value' parameters (plus the name one) or either -r or -c with any value parameters we have too many parameters\r
- //\r
- if ((ShellCommandLineGetCount() > 3)\r
- ||((ShellCommandLineGetFlag(Package, L"-r") != FALSE || ShellCommandLineGetFlag(Package, L"-c") != FALSE) && ShellCommandLineGetCount()!=0)\r
- ){\r
- //\r
- // error for too many parameters\r
- //\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
- ShellStatus = SHELL_INVALID_PARAMETER;\r
- } else if (ShellCommandLineGetFlag(Package, L"-c") != FALSE) {\r
- //\r
- // do the conin and conout from EFI variables\r
- // if the first fails dont 'loose' the error\r
- //\r
- Status = ConnectFromDevPaths(L"ConInDev");\r
- if (EFI_ERROR(Status)) {\r
- ConnectFromDevPaths(L"ConOutDev");\r
- } else {\r
- Status = ConnectFromDevPaths(L"ConOutDev");\r
- }\r
- ShellStatus = Status & (~MAX_BIT);\r
- } else {\r
- //\r
- // 0, 1, or 2 specific handles and possibly recursive\r
- //\r
- if (ShellCommandLineGetRawValue(Package, 1) != NULL && CommandLibGetHandleValue(StrHexToUintn(ShellCommandLineGetRawValue(Package, 1))) == NULL){\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
- ShellStatus = SHELL_INVALID_PARAMETER;\r
- } else if (ShellCommandLineGetRawValue(Package, 2) != NULL && CommandLibGetHandleValue(StrHexToUintn(ShellCommandLineGetRawValue(Package, 2))) == NULL) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, ShellCommandLineGetRawValue(Package, 2));\r
- ShellStatus = SHELL_INVALID_PARAMETER;\r
- } else {\r
- Status = ConvertAndConnectControllers(ShellCommandLineGetRawValue(Package, 1), ShellCommandLineGetRawValue(Package, 2), ShellCommandLineGetFlag(Package, L"-r"), (BOOLEAN)(ShellCommandLineGetCount()!=0));\r
- ShellStatus = Status & (~MAX_BIT);\r
- }\r
- }\r
-\r
- ShellCommandLineFreeVarList (Package);\r
- }\r
- return (ShellStatus);\r
-}\r
-\r