]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Disconnect.c
index 96233f9b53b3f84e7b479497226f2abf4b8d9949..009ae5282b2796470f159bb56f38d5b935fd3395 100644 (file)
@@ -1,23 +1,20 @@
 /** @file\r
   Main file for Disconnect shell Driver1 function.\r
 \r
-  Copyright (c) 2010 - 2011, 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
+  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "UefiShellDriver1CommandsLib.h"\r
 \r
-STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
-  {L"-r", TypeFlag},\r
-  {NULL, TypeMax}\r
-  };\r
+STATIC CONST SHELL_PARAM_ITEM  ParamList[] = {\r
+  { L"-r",  TypeFlag },\r
+  { L"-nc", TypeFlag },\r
+  { NULL,   TypeMax  }\r
+};\r
 \r
 /**\r
   Disconnect everything.\r
@@ -25,8 +22,7 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
   @retval EFI_SUCCESS     The operation was successful.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
-DisconnectAll(\r
+DisconnectAll (\r
   VOID\r
   )\r
 {\r
@@ -41,34 +37,37 @@ DisconnectAll(
   // The following example recusively disconnects all drivers from all\r
   // controllers in a platform.\r
   //\r
-  EFI_STATUS Status;\r
-//  EFI_BOOT_SERVICES *gBS;\r
-  UINTN HandleCount;\r
-  EFI_HANDLE *HandleBuffer;\r
-  UINTN HandleIndex;\r
+  EFI_STATUS  Status;\r
+  //  EFI_BOOT_SERVICES *gBS;\r
+  UINTN       HandleCount;\r
+  EFI_HANDLE  *HandleBuffer;\r
+  UINTN       HandleIndex;\r
+\r
   //\r
   // Retrieve the list of all handles from the handle database\r
   //\r
   Status = gBS->LocateHandleBuffer (\r
-    AllHandles,\r
-    NULL,\r
-    NULL,\r
-    &HandleCount,\r
-    &HandleBuffer\r
-   );\r
+                  AllHandles,\r
+                  NULL,\r
+                  NULL,\r
+                  &HandleCount,\r
+                  &HandleBuffer\r
+                  );\r
   if (!EFI_ERROR (Status)) {\r
     for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
       Status = gBS->DisconnectController (\r
-        HandleBuffer[HandleIndex],\r
-        NULL,\r
-        NULL\r
-       );\r
+                      HandleBuffer[HandleIndex],\r
+                      NULL,\r
+                      NULL\r
+                      );\r
     }\r
-    gBS->FreePool(HandleBuffer);\r
+\r
+    gBS->FreePool (HandleBuffer);\r
     //\r
     // end of stealing\r
     //\r
   }\r
+\r
   return (EFI_SUCCESS);\r
 }\r
 \r
@@ -85,108 +84,120 @@ ShellCommandRunDisconnect (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS          Status;\r
-  LIST_ENTRY          *Package;\r
-  CHAR16              *ProblemParam;\r
-  SHELL_STATUS        ShellStatus;\r
-  CONST CHAR16        *Param1;\r
-  CONST CHAR16        *Param2;\r
-  CONST CHAR16        *Param3;\r
-  EFI_HANDLE          Handle1;\r
-  EFI_HANDLE          Handle2;\r
-  EFI_HANDLE          Handle3;\r
-  UINT64              Intermediate1;\r
-  UINT64              Intermediate2;\r
-  UINT64              Intermediate3;\r
-\r
-  ShellStatus         = SHELL_SUCCESS;\r
+  EFI_STATUS    Status;\r
+  LIST_ENTRY    *Package;\r
+  CHAR16        *ProblemParam;\r
+  SHELL_STATUS  ShellStatus;\r
+  CONST CHAR16  *Param1;\r
+  CONST CHAR16  *Param2;\r
+  CONST CHAR16  *Param3;\r
+  EFI_HANDLE    Handle1;\r
+  EFI_HANDLE    Handle2;\r
+  EFI_HANDLE    Handle3;\r
+  UINT64        Intermediate1;\r
+  UINT64        Intermediate2;\r
+  UINT64        Intermediate3;\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
+  Status = ShellInitialize ();\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
-  Status = CommandInit();\r
-  ASSERT_EFI_ERROR(Status);\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
+  if (EFI_ERROR (Status)) {\r
+    if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"disconnect", ProblemParam);\r
+      FreePool (ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
-      ASSERT(FALSE);\r
+      ASSERT (FALSE);\r
     }\r
   } else {\r
-    if (ShellCommandLineGetFlag(Package, L"-r")){\r
-      if (ShellCommandLineGetCount(Package) > 1){\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
+    if (ShellCommandLineGetFlag (Package, L"-r")) {\r
+      if (ShellCommandLineGetCount (Package) > 1) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect");\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
-      } else if (ShellCommandLineGetCount(Package) < 1) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle);\r
+      } else if (ShellCommandLineGetCount (Package) < 1) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect");\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
       } else {\r
-        Status = DisconnectAll();\r
+        Status = DisconnectAll ();\r
+        //\r
+        // Reconnect all consoles if -nc is not provided\r
+        //\r
+        if (!ShellCommandLineGetFlag (Package, L"-nc")) {\r
+          ShellConnectFromDevPaths (L"ConInDev");\r
+          ShellConnectFromDevPaths (L"ConOutDev");\r
+          ShellConnectFromDevPaths (L"ErrOutDev");\r
+          ShellConnectFromDevPaths (L"ErrOut");\r
+          ShellConnectFromDevPaths (L"ConIn");\r
+          ShellConnectFromDevPaths (L"ConOut");\r
+        }\r
       }\r
+    } else if (ShellCommandLineGetFlag (Package, L"-nc")) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect");\r
+      ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
-      if (ShellCommandLineGetCount(Package) > 4){\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
+      if (ShellCommandLineGetCount (Package) > 4) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect");\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
-      } else if (ShellCommandLineGetCount(Package) < 2) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle);\r
+      } else if (ShellCommandLineGetCount (Package) < 2) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect");\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
       } else {\r
         //\r
         // must have between 1 and 3 handles passed in ...\r
         //\r
-        Param1  = ShellCommandLineGetRawValue(Package, 1);\r
-        Param2  = ShellCommandLineGetRawValue(Package, 2);\r
-        Param3  = ShellCommandLineGetRawValue(Package, 3);\r
-        ShellConvertStringToUint64(Param1, &Intermediate1, TRUE, FALSE);\r
-        Handle1 = Param1!=NULL?ConvertHandleIndexToHandle((UINTN)Intermediate1):NULL;\r
-        ShellConvertStringToUint64(Param2, &Intermediate2, TRUE, FALSE);\r
-        Handle2 = Param2!=NULL?ConvertHandleIndexToHandle((UINTN)Intermediate2):NULL;\r
-        ShellConvertStringToUint64(Param3, &Intermediate3, TRUE, FALSE);\r
-        Handle3 = Param3!=NULL?ConvertHandleIndexToHandle((UINTN)Intermediate3):NULL;\r
-\r
-        if (Param1 != NULL && Handle1 == NULL) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param1);\r
-          ShellStatus = SHELL_INVALID_PARAMETER;\r
-        } else if (Param2 != NULL && Handle2 == NULL) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param2);\r
+        Param1 = ShellCommandLineGetRawValue (Package, 1);\r
+        Param2 = ShellCommandLineGetRawValue (Package, 2);\r
+        Param3 = ShellCommandLineGetRawValue (Package, 3);\r
+        ShellConvertStringToUint64 (Param1, &Intermediate1, TRUE, FALSE);\r
+        Handle1 = Param1 != NULL ? ConvertHandleIndexToHandle ((UINTN)Intermediate1) : NULL;\r
+        ShellConvertStringToUint64 (Param2, &Intermediate2, TRUE, FALSE);\r
+        Handle2 = Param2 != NULL ? ConvertHandleIndexToHandle ((UINTN)Intermediate2) : NULL;\r
+        ShellConvertStringToUint64 (Param3, &Intermediate3, TRUE, FALSE);\r
+        Handle3 = Param3 != NULL ? ConvertHandleIndexToHandle ((UINTN)Intermediate3) : NULL;\r
+\r
+        if ((Param1 != NULL) && (Handle1 == NULL)) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param1);\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
-        } else if (Param3 != NULL && Handle3 == NULL) {\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param3);\r
+        } else if ((Param2 != NULL) && (Handle2 == NULL)) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param2);\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
-        } else if (EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiDevicePathProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
-          ASSERT(Param1 != NULL);\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, ShellStrToUintn(Param1), L"controller handle");\r
+        } else if ((Param3 != NULL) && (Handle3 == NULL)) {\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param3);\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
-        } else if (Handle2 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
-          ASSERT(Param2 != NULL);\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, ShellStrToUintn(Param2), L"driver handle");\r
+        } else if ((Handle2 != NULL) && EFI_ERROR (gBS->OpenProtocol (Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
+          ASSERT (Param2 != NULL);\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, L"disconnect", ShellStrToUintn (Param2), L"driver handle");\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else {\r
-          ASSERT(Param1 != NULL);\r
-          Status = gBS->DisconnectController(Handle1, Handle2, Handle3);\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_3P_RESULT), gShellDriver1HiiHandle, L"Disconnect", (UINTN)Intermediate1, (UINTN)Intermediate2, (UINTN)Intermediate3, Status);\r
+          ASSERT (Param1 != NULL);\r
+          Status = gBS->DisconnectController (Handle1, Handle2, Handle3);\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_3P_RESULT), gShellDriver1HiiHandle, L"Disconnect", (UINTN)Intermediate1, (UINTN)Intermediate2, (UINTN)Intermediate3, Status);\r
         }\r
       }\r
     }\r
   }\r
+\r
   if (ShellStatus == SHELL_SUCCESS) {\r
     if (Status == EFI_SECURITY_VIOLATION) {\r
       ShellStatus = SHELL_SECURITY_VIOLATION;\r
     } else if (Status == EFI_INVALID_PARAMETER) {\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
-    } else if (EFI_ERROR(Status)) {\r
+    } else if (EFI_ERROR (Status)) {\r
       ShellStatus = SHELL_NOT_FOUND;\r
     }\r
   }\r
+\r
   return (ShellStatus);\r
 }\r