]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDebug1CommandsLib/SerMode.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / SerMode.c
index 52612283a2bb4c1df26d14bb86ea54651e8744c8..99cc4489429517108cac1e8b521be0fe90b372ae 100644 (file)
@@ -1,14 +1,9 @@
 /** @file\r
   Main file for SerMode shell Debug1 function.\r
 \r
-  Copyright (c) 2005 - 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
+  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
+  Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include <Library/ShellLib.h>\r
 #include <Protocol/SerialIo.h>\r
 \r
+/**\r
+  Display information about a serial device by it's handle.\r
+\r
+  If HandleValid is FALSE, do all devices.\r
+\r
+  @param[in] HandleIdx      The handle index for the device.\r
+  @param[in] HandleValid    TRUE if HandleIdx is valid.\r
+\r
+  @retval SHELL_INVALID_PARAMETER   A parameter was invalid.\r
+  @retval SHELL_SUCCESS             The operation was successful.\r
+**/\r
 SHELL_STATUS\r
-EFIAPI\r
-iDisplaySettings (\r
-  IN UINTN                   HandleIdx,\r
-  IN BOOLEAN                 HandleValid\r
+DisplaySettings (\r
+  IN UINTN    HandleIdx,\r
+  IN BOOLEAN  HandleValid\r
   )\r
 {\r
   EFI_SERIAL_IO_PROTOCOL  *SerialIo;\r
@@ -32,88 +37,89 @@ iDisplaySettings (
   CHAR16                  Parity;\r
   SHELL_STATUS            ShellStatus;\r
 \r
-  Handles   = NULL;\r
-  StopBits  = NULL;\r
+  Handles  = NULL;\r
+  StopBits = NULL;\r
 \r
   ShellStatus = SHELL_SUCCESS;\r
 \r
-  Status    = gBS->LocateHandleBuffer (ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles);\r
+  Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles);\r
   if (EFI_ERROR (Status)) {\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle);\r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");\r
     return SHELL_INVALID_PARAMETER;\r
   }\r
 \r
   for (Index = 0; Index < NoHandles; Index++) {\r
     if (HandleValid) {\r
-      if (ConvertHandleIndexToHandle(HandleIdx) != Handles[Index]) {\r
+      if (ConvertHandleIndexToHandle (HandleIdx) != Handles[Index]) {\r
         continue;\r
       }\r
     }\r
 \r
-    Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID**)&SerialIo);\r
+    Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID **)&SerialIo);\r
     if (!EFI_ERROR (Status)) {\r
       switch (SerialIo->Mode->Parity) {\r
-      case DefaultParity:\r
+        case DefaultParity:\r
 \r
-        Parity = 'D';\r
-        break;\r
+          Parity = 'D';\r
+          break;\r
 \r
-      case NoParity:\r
+        case NoParity:\r
 \r
-        Parity = 'N';\r
-        break;\r
+          Parity = 'N';\r
+          break;\r
 \r
-      case EvenParity:\r
+        case EvenParity:\r
 \r
-        Parity = 'E';\r
-        break;\r
+          Parity = 'E';\r
+          break;\r
 \r
-      case OddParity:\r
+        case OddParity:\r
 \r
-        Parity = 'O';\r
-        break;\r
+          Parity = 'O';\r
+          break;\r
 \r
-      case MarkParity:\r
+        case MarkParity:\r
 \r
-        Parity = 'M';\r
-        break;\r
+          Parity = 'M';\r
+          break;\r
 \r
-      case SpaceParity:\r
+        case SpaceParity:\r
 \r
-        Parity = 'S';\r
-        break;\r
+          Parity = 'S';\r
+          break;\r
 \r
-      default:\r
+        default:\r
 \r
-        Parity = 'U';\r
+          Parity = 'U';\r
       }\r
 \r
       switch (SerialIo->Mode->StopBits) {\r
-      case DefaultStopBits:\r
+        case DefaultStopBits:\r
 \r
-        StopBits = L"Default";\r
-        break;\r
+          StopBits = L"Default";\r
+          break;\r
 \r
-      case OneStopBit:\r
+        case OneStopBit:\r
 \r
-        StopBits = L"1";\r
-        break;\r
+          StopBits = L"1";\r
+          break;\r
 \r
-      case TwoStopBits:\r
+        case TwoStopBits:\r
 \r
-        StopBits = L"2";\r
-        break;\r
+          StopBits = L"2";\r
+          break;\r
 \r
-      case OneFiveStopBits:\r
+        case OneFiveStopBits:\r
 \r
-        StopBits = L"1.5";\r
-        break;\r
+          StopBits = L"1.5";\r
+          break;\r
 \r
-      default:\r
+        default:\r
 \r
-        StopBits = L"Unknown";\r
+          StopBits = L"Unknown";\r
       }\r
-      ShellPrintHiiEx(\r
+\r
+      ShellPrintHiiEx (\r
         -1,\r
         -1,\r
         NULL,\r
@@ -125,9 +131,9 @@ iDisplaySettings (
         Parity,\r
         SerialIo->Mode->DataBits,\r
         StopBits\r
-       );\r
+        );\r
     } else {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle);\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");\r
       ShellStatus = SHELL_NOT_FOUND;\r
       break;\r
     }\r
@@ -138,8 +144,8 @@ iDisplaySettings (
   }\r
 \r
   if (Index == NoHandles) {\r
-    if ((NoHandles != 0 && HandleValid) || 0 == NoHandles) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NOT_FOUND), gShellDebug1HiiHandle);\r
+    if (((NoHandles != 0) && HandleValid) || (0 == NoHandles)) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NOT_FOUND), gShellDebug1HiiHandle, L"sermode");\r
       ShellStatus = SHELL_NOT_FOUND;\r
     }\r
   }\r
@@ -147,6 +153,12 @@ iDisplaySettings (
   return ShellStatus;\r
 }\r
 \r
+/**\r
+  Function for 'sermode' command.\r
+\r
+  @param[in] ImageHandle  Handle to the Image (NULL if Internal).\r
+  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).\r
+**/\r
 SHELL_STATUS\r
 EFIAPI\r
 ShellCommandRunSerMode (\r
@@ -169,6 +181,7 @@ ShellCommandRunSerMode (
   LIST_ENTRY              *Package;\r
   CHAR16                  *ProblemParam;\r
   CONST CHAR16            *Temp;\r
+  UINT64                  Intermediate;\r
 \r
   ShellStatus = SHELL_SUCCESS;\r
   HandleIdx   = 0;\r
@@ -179,123 +192,130 @@ ShellCommandRunSerMode (
   Package     = NULL;\r
 \r
   Status = ShellCommandLineParse (EmptyParamList, &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), gShellDebug1HiiHandle, 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), gShellDebug1HiiHandle, L"sermode", ProblemParam);\r
+      FreePool (ProblemParam);\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
-      ASSERT(FALSE);\r
+      ASSERT (FALSE);\r
     }\r
   } else {\r
-    if (ShellCommandLineGetCount(Package) < 5 && ShellCommandLineGetCount(Package) > 1) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);\r
+    if ((ShellCommandLineGetCount (Package) < 6) && (ShellCommandLineGetCount (Package) > 2)) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"sermode");\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
-    } else if (ShellCommandLineGetCount(Package) > 5) {\r
-      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);\r
+    } else if (ShellCommandLineGetCount (Package) > 6) {\r
+      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"sermode");\r
       ShellStatus = SHELL_INVALID_PARAMETER;\r
     } else {\r
-      Temp = ShellCommandLineGetRawValue(Package, 1);\r
+      Temp = ShellCommandLineGetRawValue (Package, 1);\r
       if (Temp != NULL) {\r
-        HandleIdx = StrHexToUintn(Temp);\r
-        Temp = ShellCommandLineGetRawValue(Package, 2);\r
+        Status    = ShellConvertStringToUint64 (Temp, &Intermediate, TRUE, FALSE);\r
+        HandleIdx = (UINTN)Intermediate;\r
+        Temp      = ShellCommandLineGetRawValue (Package, 2);\r
         if (Temp == NULL) {\r
-          ShellStatus = iDisplaySettings (HandleIdx, TRUE);\r
+          ShellStatus = DisplaySettings (HandleIdx, TRUE);\r
           goto Done;\r
         }\r
       } else {\r
-        ShellStatus = iDisplaySettings (0, FALSE);\r
+        ShellStatus = DisplaySettings (0, FALSE);\r
         goto Done;\r
       }\r
-      Temp = ShellCommandLineGetRawValue(Package, 2);\r
+\r
+      Temp = ShellCommandLineGetRawValue (Package, 2);\r
       if (Temp != NULL) {\r
-        BaudRate = StrHexToUintn(Temp);\r
+        BaudRate = ShellStrToUintn (Temp);\r
       } else {\r
-        ASSERT(FALSE);\r
+        ASSERT (FALSE);\r
         BaudRate = 0;\r
       }\r
-      Temp = ShellCommandLineGetRawValue(Package, 3);\r
-      if (Temp == NULL || StrLen(Temp)>1) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp);\r
+\r
+      Temp = ShellCommandLineGetRawValue (Package, 3);\r
+      if ((Temp == NULL) || (StrLen (Temp) > 1)) {\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
       } else {\r
-        switch(Temp[0]){\r
-        case 'd':\r
-        case 'D':\r
-          Parity = DefaultParity;\r
-          break;\r
-        case 'n':\r
-        case 'N':\r
-          Parity = NoParity;\r
-          break;\r
-        case 'e':\r
-        case 'E':\r
-          Parity = EvenParity;\r
-          break;\r
-        case 'o':\r
-        case 'O':\r
-          Parity = OddParity;\r
-          break;\r
-        case 'm':\r
-        case 'M':\r
-          Parity = MarkParity;\r
-          break;\r
-        case 's':\r
-        case 'S':\r
-          Parity = SpaceParity;\r
-          break;\r
-        default:\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp);\r
-          ShellStatus = SHELL_INVALID_PARAMETER;\r
-          goto Done;\r
+        switch (Temp[0]) {\r
+          case 'd':\r
+          case 'D':\r
+            Parity = DefaultParity;\r
+            break;\r
+          case 'n':\r
+          case 'N':\r
+            Parity = NoParity;\r
+            break;\r
+          case 'e':\r
+          case 'E':\r
+            Parity = EvenParity;\r
+            break;\r
+          case 'o':\r
+          case 'O':\r
+            Parity = OddParity;\r
+            break;\r
+          case 'm':\r
+          case 'M':\r
+            Parity = MarkParity;\r
+            break;\r
+          case 's':\r
+          case 'S':\r
+            Parity = SpaceParity;\r
+            break;\r
+          default:\r
+            ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
+            ShellStatus = SHELL_INVALID_PARAMETER;\r
+            goto Done;\r
         }\r
       }\r
-      Temp = ShellCommandLineGetRawValue(Package, 4);\r
+\r
+      Temp = ShellCommandLineGetRawValue (Package, 4);\r
       if (Temp != NULL) {\r
-        DataBits = StrHexToUintn(Temp);\r
+        DataBits = ShellStrToUintn (Temp);\r
       } else {\r
         //\r
         // make sure this is some number not in the list below.\r
         //\r
         DataBits = 0;\r
       }\r
+\r
       switch (DataBits) {\r
-      case 4:\r
-      case 7:\r
-      case 8:\r
-        break;\r
-      default:\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp);\r
-        ShellStatus = SHELL_INVALID_PARAMETER;\r
-        goto Done;\r
+        case 4:\r
+        case 7:\r
+        case 8:\r
+          break;\r
+        default:\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+          goto Done;\r
       }\r
-      Temp = ShellCommandLineGetRawValue(Package, 5);\r
-      Value = StrHexToUintn(Temp);\r
+\r
+      Temp  = ShellCommandLineGetRawValue (Package, 5);\r
+      Value = ShellStrToUintn (Temp);\r
       switch (Value) {\r
-      case 0:\r
-        StopBits = DefaultStopBits;\r
-        break;\r
+        case 0:\r
+          StopBits = DefaultStopBits;\r
+          break;\r
 \r
-      case 1:\r
-        StopBits = OneStopBit;\r
-        break;\r
+        case 1:\r
+          StopBits = OneStopBit;\r
+          break;\r
 \r
-      case 2:\r
-        StopBits = TwoStopBits;\r
-        break;\r
+        case 2:\r
+          StopBits = TwoStopBits;\r
+          break;\r
 \r
-      case 15:\r
-        StopBits = OneFiveStopBits;\r
-        break;\r
+        case 15:\r
+          StopBits = OneFiveStopBits;\r
+          break;\r
 \r
-      default:\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp);\r
-        ShellStatus = SHELL_INVALID_PARAMETER;\r
-        goto Done;\r
+        default:\r
+          ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
+          ShellStatus = SHELL_INVALID_PARAMETER;\r
+          goto Done;\r
       }\r
-      Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles);\r
+\r
+      Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles);\r
       if (EFI_ERROR (Status)) {\r
-        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle);\r
+        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");\r
         ShellStatus = SHELL_INVALID_PARAMETER;\r
         goto Done;\r
       }\r
@@ -305,31 +325,40 @@ ShellCommandRunSerMode (
           continue;\r
         }\r
 \r
-        Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID**)&SerialIo);\r
+        Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID **)&SerialIo);\r
         if (!EFI_ERROR (Status)) {\r
           Status = SerialIo->SetAttributes (\r
-                              SerialIo,\r
-                              (UINT64) BaudRate,\r
-                              SerialIo->Mode->ReceiveFifoDepth,\r
-                              SerialIo->Mode->Timeout,\r
-                              Parity,\r
-                              (UINT8) DataBits,\r
-                              StopBits\r
-                             );\r
+                               SerialIo,\r
+                               (UINT64)BaudRate,\r
+                               SerialIo->Mode->ReceiveFifoDepth,\r
+                               SerialIo->Mode->Timeout,\r
+                               Parity,\r
+                               (UINT8)DataBits,\r
+                               StopBits\r
+                               );\r
           if (EFI_ERROR (Status)) {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_FAIL), gShellDebug1HiiHandle, ConvertHandleToHandleIndex(Handles[Index]), Status);\r
-            ShellStatus = SHELL_ACCESS_DENIED;\r
+            if (Status == EFI_INVALID_PARAMETER) {\r
+              ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_UNSUPPORTED), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index]));\r
+              ShellStatus = SHELL_UNSUPPORTED;\r
+            } else if (Status == EFI_DEVICE_ERROR) {\r
+              ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_DEV_ERROR), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index]));\r
+              ShellStatus = SHELL_ACCESS_DENIED;\r
+            } else {\r
+              ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_FAIL), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index]));\r
+              ShellStatus = SHELL_ACCESS_DENIED;\r
+            }\r
           } else {\r
-            ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_HANDLE), gShellDebug1HiiHandle, ConvertHandleToHandleIndex(Handles[Index]));\r
+            ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_HANDLE), gShellDebug1HiiHandle, ConvertHandleToHandleIndex (Handles[Index]));\r
           }\r
+\r
           break;\r
         }\r
       }\r
     }\r
   }\r
 \r
-  if (Index == NoHandles) {\r
-    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_BAD_HANDLE), gShellDebug1HiiHandle, HandleIdx);\r
+  if ((ShellStatus == SHELL_SUCCESS) && (Index == NoHandles)) {\r
+    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_BAD_HANDLE), gShellDebug1HiiHandle, L"sermode", HandleIdx);\r
     ShellStatus = SHELL_INVALID_PARAMETER;\r
   }\r
 \r
@@ -337,8 +366,10 @@ Done:
   if (Package != NULL) {\r
     ShellCommandLineFreeVarList (Package);\r
   }\r
+\r
   if (Handles != NULL) {\r
     FreePool (Handles);\r
   }\r
+\r
   return ShellStatus;\r
 }\r