]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg NvmExpressDxe: Add buffer alignment check in PassThru API
authorHao Wu <hao.a.wu@intel.com>
Mon, 22 Aug 2016 05:55:52 +0000 (13:55 +0800)
committerHao Wu <hao.a.wu@intel.com>
Tue, 6 Sep 2016 07:31:29 +0000 (15:31 +0800)
According to the UEFI spec, the 'TransferBuffer' and 'MetadataBuffer' used
in a data transfer should be aligned on the boundary specified by the
IoAlign field in the EFI_NVM_EXPRESS_PASS_THRU_MODE structure.

This commit adds this check to follow the spec.

Cc: Feng Tian <feng.tian@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Hao Wu <hao.a.wu@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressPassthru.c

index ec7507e4c29a100cfc109f461fa8aae2b471bd54..6b292608588a7d7727d69a16c2d36b60fb1217ea 100644 (file)
@@ -357,27 +357,28 @@ NvmExpressPassThru (
   IN     EFI_EVENT                                   Event OPTIONAL\r
   )\r
 {\r
-  NVME_CONTROLLER_PRIVATE_DATA  *Private;\r
-  EFI_STATUS                    Status;\r
-  EFI_PCI_IO_PROTOCOL           *PciIo;\r
-  NVME_SQ                       *Sq;\r
-  NVME_CQ                       *Cq;\r
-  UINT16                        QueueId;\r
-  UINT32                        Bytes;\r
-  UINT16                        Offset;\r
-  EFI_EVENT                     TimerEvent;\r
-  EFI_PCI_IO_PROTOCOL_OPERATION Flag;\r
-  EFI_PHYSICAL_ADDRESS          PhyAddr;\r
-  VOID                          *MapData;\r
-  VOID                          *MapMeta;\r
-  VOID                          *MapPrpList;\r
-  UINTN                         MapLength;\r
-  UINT64                        *Prp;\r
-  VOID                          *PrpListHost;\r
-  UINTN                         PrpListNo;\r
-  UINT32                        Data;\r
-  NVME_PASS_THRU_ASYNC_REQ      *AsyncRequest;\r
-  EFI_TPL                       OldTpl;\r
+  NVME_CONTROLLER_PRIVATE_DATA   *Private;\r
+  EFI_STATUS                     Status;\r
+  EFI_PCI_IO_PROTOCOL            *PciIo;\r
+  NVME_SQ                        *Sq;\r
+  NVME_CQ                        *Cq;\r
+  UINT16                         QueueId;\r
+  UINT32                         Bytes;\r
+  UINT16                         Offset;\r
+  EFI_EVENT                      TimerEvent;\r
+  EFI_PCI_IO_PROTOCOL_OPERATION  Flag;\r
+  EFI_PHYSICAL_ADDRESS           PhyAddr;\r
+  VOID                           *MapData;\r
+  VOID                           *MapMeta;\r
+  VOID                           *MapPrpList;\r
+  UINTN                          MapLength;\r
+  UINT64                         *Prp;\r
+  VOID                           *PrpListHost;\r
+  UINTN                          PrpListNo;\r
+  UINT32                         IoAlign;\r
+  UINT32                         Data;\r
+  NVME_PASS_THRU_ASYNC_REQ       *AsyncRequest;\r
+  EFI_TPL                        OldTpl;\r
 \r
   //\r
   // check the data fields in Packet parameter.\r
@@ -394,6 +395,18 @@ NvmExpressPassThru (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  //\r
+  // Buffer alignment check for TransferBuffer & MetadataBuffer.\r
+  //\r
+  IoAlign = This->Mode->IoAlign;\r
+  if (IoAlign > 0 && (((UINTN) Packet->TransferBuffer & (IoAlign - 1)) != 0)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (IoAlign > 0 && (((UINTN) Packet->MetadataBuffer & (IoAlign - 1)) != 0)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
   Private     = NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU (This);\r
   PciIo       = Private->PciIo;\r
   MapData     = NULL;\r