MdeModulePkg/Pci: Fixed Asserts in SCT PCIIO Protocol Test.
authorGaurav Jain <gaurav.jain@nxp.com>
Tue, 25 Feb 2020 12:00:41 +0000 (20:00 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 5 Mar 2020 02:14:37 +0000 (02:14 +0000)
ASSERT in PollMem_Conf, CopyMem_Conf, SetBarAttributes_Conf
Conformance Test.
SCT Test expect return as Invalid Parameter or Unsupported.
Added Checks for Function Parameters.
return Invalid or Unsupported if Check fails.

Added Checks in PciIoPollIo(), PciIoIoRead()
PciIoIoWrite()

Signed-off-by: Gaurav Jain <gaurav.jain@nxp.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceIo.c
MdeModulePkg/Bus/Pci/NonDiscoverablePciDeviceDxe/NonDiscoverablePciDeviceIo.h

index 2d55c96..c3e8300 100644 (file)
@@ -93,6 +93,31 @@ PciIoPollMem (
   OUT UINT64                      *Result\r
   )\r
 {\r
+  NON_DISCOVERABLE_PCI_DEVICE         *Dev;\r
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR   *Desc;\r
+  UINTN                               Count;\r
+  EFI_STATUS                          Status;\r
+\r
+  if ((UINT32)Width > EfiPciIoWidthUint64) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (Result == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Dev = NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(This);\r
+  Count = 1;\r
+\r
+  Status = GetBarResource (Dev, BarIndex, &Desc);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (Offset + (Count << (Width & 0x3)) > Desc->AddrLen) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (FALSE);\r
   return EFI_UNSUPPORTED;\r
 }\r
@@ -126,6 +151,31 @@ PciIoPollIo (
   OUT UINT64                      *Result\r
   )\r
 {\r
+  NON_DISCOVERABLE_PCI_DEVICE         *Dev;\r
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR   *Desc;\r
+  UINTN                               Count;\r
+  EFI_STATUS                          Status;\r
+\r
+  if ((UINT32)Width > EfiPciIoWidthUint64) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (Result == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Dev = NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(This);\r
+  Count = 1;\r
+\r
+  Status = GetBarResource (Dev, BarIndex, &Desc);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (Offset + (Count << (Width & 0x3)) > Desc->AddrLen) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (FALSE);\r
   return EFI_UNSUPPORTED;\r
 }\r
@@ -396,6 +446,29 @@ PciIoIoRead (
   IN OUT VOID                         *Buffer\r
   )\r
 {\r
+  NON_DISCOVERABLE_PCI_DEVICE         *Dev;\r
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR   *Desc;\r
+  EFI_STATUS                          Status;\r
+\r
+  if ((UINT32)Width >= EfiPciIoWidthMaximum) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (Buffer == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Dev = NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(This);\r
+\r
+  Status = GetBarResource (Dev, BarIndex, &Desc);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (Offset + (Count << (Width & 0x3)) > Desc->AddrLen) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (FALSE);\r
   return EFI_UNSUPPORTED;\r
 }\r
@@ -425,6 +498,29 @@ PciIoIoWrite (
   IN OUT VOID                         *Buffer\r
   )\r
 {\r
+  NON_DISCOVERABLE_PCI_DEVICE         *Dev;\r
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR   *Desc;\r
+  EFI_STATUS                          Status;\r
+\r
+  if ((UINT32)Width >= EfiPciIoWidthMaximum) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (Buffer == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Dev = NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(This);\r
+\r
+  Status = GetBarResource (Dev, BarIndex, &Desc);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (Offset + (Count << (Width & 0x3)) > Desc->AddrLen) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (FALSE);\r
   return EFI_UNSUPPORTED;\r
 }\r
@@ -556,6 +652,35 @@ PciIoCopyMem (
   IN     UINTN                        Count\r
   )\r
 {\r
+  NON_DISCOVERABLE_PCI_DEVICE         *Dev;\r
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR   *DestDesc;\r
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR   *SrcDesc;\r
+  EFI_STATUS                          Status;\r
+\r
+  if ((UINT32)Width > EfiPciIoWidthUint64) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Dev = NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(This);\r
+\r
+  Status = GetBarResource (Dev, DestBarIndex, &DestDesc);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (DestOffset + (Count << (Width & 0x3)) > DestDesc->AddrLen) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Status = GetBarResource (Dev, SrcBarIndex, &SrcDesc);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (SrcOffset + (Count << (Width & 0x3)) > SrcDesc->AddrLen) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (FALSE);\r
   return EFI_UNSUPPORTED;\r
 }\r
@@ -1265,9 +1390,6 @@ PciIoAttributes (
   NON_DISCOVERABLE_PCI_DEVICE   *Dev;\r
   BOOLEAN                       Enable;\r
 \r
-  #define DEV_SUPPORTED_ATTRIBUTES \\r
-    (EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE)\r
-\r
   Dev = NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(This);\r
 \r
   if ((Attributes & (~(DEV_SUPPORTED_ATTRIBUTES))) != 0) {\r
@@ -1414,6 +1536,33 @@ PciIoSetBarAttributes (
   IN OUT UINT64                       *Length\r
   )\r
 {\r
+  NON_DISCOVERABLE_PCI_DEVICE         *Dev;\r
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR   *Desc;\r
+  EFI_PCI_IO_PROTOCOL_WIDTH           Width;\r
+  UINTN                               Count;\r
+  EFI_STATUS                          Status;\r
+\r
+  if ((Attributes & (~DEV_SUPPORTED_ATTRIBUTES)) != 0) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (Offset == NULL || Length == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Dev = NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(This);\r
+  Width = EfiPciIoWidthUint8;\r
+  Count = (UINT32) *Length;\r
+\r
+  Status = GetBarResource(Dev, BarIndex, &Desc);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if (*Offset + (Count << (Width & 0x3)) > Desc->AddrLen) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   ASSERT (FALSE);\r
   return EFI_UNSUPPORTED;\r
 }\r
index 6511fbb..15541c2 100644 (file)
@@ -30,6 +30,9 @@
         CR (PciIoPointer, NON_DISCOVERABLE_PCI_DEVICE, PciIo, \\r
             NON_DISCOVERABLE_PCI_DEVICE_SIG)\r
 \r
+#define DEV_SUPPORTED_ATTRIBUTES \\r
+    (EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE)\r
+\r
 #define PCI_ID_VENDOR_UNKNOWN         0xffff\r
 #define PCI_ID_DEVICE_DONTCARE        0x0000\r
 \r