]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/WinNtSerialIoDxe/WinNtSerialIo.c
Add necessary parameter checking for WinNtSerialIoDxe module, according to UEFI 2...
[mirror_edk2.git] / Nt32Pkg / WinNtSerialIoDxe / WinNtSerialIo.c
index 44bbf5765cd8f6aa5182a81bfb3c9848456b535e..c0692eaa529e63bc7b5bcdfd2ce271ea7023f189 100644 (file)
@@ -56,6 +56,11 @@ EFI_DRIVER_BINDING_PROTOCOL gWinNtSerialIoDriverBinding = {
   NULL\r
 };\r
 \r
+//\r
+// List of supported baud rate\r
+//\r
+UINT64 mBaudRateCurrentSupport[] = {50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 7200, 9600, 19200, 38400, 57600, 115200, SERIAL_PORT_MAX_BAUD_RATE + 1};\r
+\r
 /**\r
   The user Entry Point for module WinNtSerialIo. The user code starts with this function.\r
 \r
@@ -739,6 +744,7 @@ Returns:
 // TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_STATUS                    Status;\r
+  UINTN                         Index;  \r
   WIN_NT_SERIAL_IO_PRIVATE_DATA *Private;\r
   COMMTIMEOUTS                  PortTimeOuts;\r
   DWORD                         ConvertedTime;\r
@@ -746,8 +752,6 @@ Returns:
   EFI_DEVICE_PATH_PROTOCOL      *NewDevicePath;\r
   EFI_TPL                       Tpl;\r
 \r
-  Tpl     = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
   Private = WIN_NT_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   //\r
@@ -777,6 +781,56 @@ Returns:
   if (StopBits == DefaultStopBits) {\r
     StopBits = (EFI_STOP_BITS_TYPE) FixedPcdGet8 (PcdUartDefaultStopBits);\r
   }\r
+\r
+  //\r
+  // Make sure all parameters are valid\r
+  //\r
+  if ((BaudRate > SERIAL_PORT_MAX_BAUD_RATE) || (BaudRate < SERIAL_PORT_MIN_BAUD_RATE)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  //The lower baud rate supported by the serial device will be selected without exceeding the unsupported BaudRate parameter\r
+  // \r
+  \r
+  for (Index = 1; Index < (sizeof (mBaudRateCurrentSupport) / sizeof (mBaudRateCurrentSupport[0])); Index++) {\r
+    if (BaudRate < mBaudRateCurrentSupport[Index]) {\r
+      BaudRate = mBaudRateCurrentSupport[Index-1];\r
+      break;\r
+      }\r
+  }\r
+       \r
+  if ((ReceiveFifoDepth < 1) || (ReceiveFifoDepth > SERIAL_PORT_MAX_RECEIVE_FIFO_DEPTH)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((Timeout < SERIAL_PORT_MIN_TIMEOUT) || (Timeout > SERIAL_PORT_MAX_TIMEOUT)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((Parity < NoParity) || (Parity > SpaceParity)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((StopBits < OneStopBit) || (StopBits > TwoStopBits)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Now we only support DataBits=7,8.\r
+  //\r
+  if ((DataBits < 7) || (DataBits > 8)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  //\r
+  // Now we only support DataBits=7,8.\r
+  // for DataBits = 6,7,8, StopBits can not set OneFiveStopBits.\r
+  //\r
+  if (StopBits == OneFiveStopBits) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }  \r
+  \r
   //\r
   // See if the new attributes already match the current attributes\r
   //\r
@@ -786,10 +840,11 @@ Returns:
       Private->UartDevicePath.StopBits       == StopBits         &&\r
       Private->SerialIoMode.ReceiveFifoDepth == ReceiveFifoDepth &&\r
       Private->SerialIoMode.Timeout          == Timeout             ) {\r
-    gBS->RestoreTPL(Tpl);\r
     return EFI_SUCCESS;\r
   }\r
 \r
+  Tpl     = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
   //\r
   //  Get current values from NT\r
   //\r
@@ -943,6 +998,15 @@ Returns:
   DCB                           Dcb;\r
   EFI_TPL                       Tpl;\r
 \r
+  //\r
+  // first determine the parameter is invalid\r
+  //\r
+  if (Control & (~(EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY |\r
+                   EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \r
+                   EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE))) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   Tpl     = gBS->RaiseTPL (TPL_NOTIFY);\r
 \r
   Private = WIN_NT_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r