public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Laszlo Ersek <lersek@redhat.com>
To: edk2-devel-01 <edk2-devel@lists.01.org>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Brijesh Singh <brijesh.singh@amd.com>,
	Jordan Justen <jordan.l.justen@intel.com>,
	Tom Lendacky <thomas.lendacky@amd.com>
Subject: [PATCH 02/12] OvmfPkg/IoMmuDxe: rename DeviceAddress to PlainTextAddress in MAP_INFO
Date: Wed,  2 Aug 2017 23:24:43 +0200	[thread overview]
Message-ID: <20170802212453.19221-3-lersek@redhat.com> (raw)
In-Reply-To: <20170802212453.19221-1-lersek@redhat.com>

In this particular IOMMU driver, "DeviceAddress" is just as accessible to
the CPU as "HostAddress", the difference is that the area pointed-to by
the former is plain-text and accessible to the hypervisor. Rename
"DeviceAddress" to "PlainTextAddress" in MAP_INFO.

Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Suggested-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
 OvmfPkg/IoMmuDxe/AmdSevIoMmu.c | 26 ++++++++++----------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/OvmfPkg/IoMmuDxe/AmdSevIoMmu.c b/OvmfPkg/IoMmuDxe/AmdSevIoMmu.c
index edef0f41eecc..fcb7bcfaecc2 100644
--- a/OvmfPkg/IoMmuDxe/AmdSevIoMmu.c
+++ b/OvmfPkg/IoMmuDxe/AmdSevIoMmu.c
@@ -23,40 +23,40 @@
 typedef struct {
   EDKII_IOMMU_OPERATION                     Operation;
   UINTN                                     NumberOfBytes;
   UINTN                                     NumberOfPages;
   EFI_PHYSICAL_ADDRESS                      HostAddress;
-  EFI_PHYSICAL_ADDRESS                      DeviceAddress;
+  EFI_PHYSICAL_ADDRESS                      PlainTextAddress;
 } MAP_INFO;
 
 #define NO_MAPPING             (VOID *) (UINTN) -1
 
 /**
   Provides the controller-specific addresses required to access system memory
   from a DMA bus master. On SEV guest, the DMA operations must be performed on
   shared buffer hence we allocate a bounce buffer to map the HostAddress to a
   DeviceAddress. The Encryption attribute is removed from the DeviceAddress
   buffer.
 
   @param  This                  The protocol instance pointer.
   @param  Operation             Indicates if the bus master is going to read or
                                 write to system memory.
   @param  HostAddress           The system memory address to map to the PCI
                                 controller.
   @param  NumberOfBytes         On input the number of bytes to map. On output
                                 the number of bytes that were mapped.
   @param  DeviceAddress         The resulting map address for the bus master
                                 PCI controller to use to access the hosts
                                 HostAddress.
   @param  Mapping               A resulting value to pass to Unmap().
 
   @retval EFI_SUCCESS           The range was mapped for the returned
                                 NumberOfBytes.
   @retval EFI_UNSUPPORTED       The HostAddress cannot be mapped as a common
                                 buffer.
   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
   @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a
                                 lack of resources.
   @retval EFI_DEVICE_ERROR      The system hardware could not map the requested
                                 address.
 
 **/
@@ -65,160 +65,160 @@ EFIAPI
 IoMmuMap (
   IN     EDKII_IOMMU_PROTOCOL                       *This,
   IN     EDKII_IOMMU_OPERATION                      Operation,
   IN     VOID                                       *HostAddress,
   IN OUT UINTN                                      *NumberOfBytes,
   OUT    EFI_PHYSICAL_ADDRESS                       *DeviceAddress,
   OUT    VOID                                       **Mapping
   )
 {
   EFI_STATUS                                        Status;
   EFI_PHYSICAL_ADDRESS                              PhysicalAddress;
   MAP_INFO                                          *MapInfo;
   EFI_PHYSICAL_ADDRESS                              DmaMemoryTop;
   EFI_ALLOCATE_TYPE                                 AllocateType;
 
   if (HostAddress == NULL || NumberOfBytes == NULL || DeviceAddress == NULL ||
       Mapping == NULL) {
     return EFI_INVALID_PARAMETER;
   }
 
   //
   // Make sure that Operation is valid
   //
   if ((UINT32) Operation >= EdkiiIoMmuOperationMaximum) {
     return EFI_INVALID_PARAMETER;
   }
   PhysicalAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;
 
   DmaMemoryTop = (UINTN)-1;
   AllocateType = AllocateAnyPages;
 
   if (((Operation != EdkiiIoMmuOperationBusMasterRead64 &&
         Operation != EdkiiIoMmuOperationBusMasterWrite64 &&
         Operation != EdkiiIoMmuOperationBusMasterCommonBuffer64)) &&
       ((PhysicalAddress + *NumberOfBytes) > SIZE_4GB)) {
     //
     // If the root bridge or the device cannot handle performing DMA above
     // 4GB but any part of the DMA transfer being mapped is above 4GB, then
     // map the DMA transfer to a buffer below 4GB.
     //
     DmaMemoryTop = SIZE_4GB - 1;
     AllocateType = AllocateMaxAddress;
 
     if (Operation == EdkiiIoMmuOperationBusMasterCommonBuffer ||
         Operation == EdkiiIoMmuOperationBusMasterCommonBuffer64) {
         //
         // Common Buffer operations can not be remapped.  If the common buffer
         // if above 4GB, then it is not possible to generate a mapping, so
         // return an error.
         //
         return EFI_UNSUPPORTED;
     }
   }
 
   //
   // CommandBuffer was allocated by us (AllocateBuffer) and is already in
   // unencryted buffer so no need to create bounce buffer
   //
   if (Operation == EdkiiIoMmuOperationBusMasterCommonBuffer ||
       Operation == EdkiiIoMmuOperationBusMasterCommonBuffer64) {
     *Mapping = NO_MAPPING;
     *DeviceAddress = PhysicalAddress;
 
     return EFI_SUCCESS;
   }
 
   //
   // Allocate a MAP_INFO structure to remember the mapping when Unmap() is
   // called later.
   //
   MapInfo = AllocatePool (sizeof (MAP_INFO));
   if (MapInfo == NULL) {
     *NumberOfBytes = 0;
     return EFI_OUT_OF_RESOURCES;
   }
 
   //
   // Initialize the MAP_INFO structure
   //
   MapInfo->Operation         = Operation;
   MapInfo->NumberOfBytes     = *NumberOfBytes;
   MapInfo->NumberOfPages     = EFI_SIZE_TO_PAGES (MapInfo->NumberOfBytes);
   MapInfo->HostAddress       = PhysicalAddress;
-  MapInfo->DeviceAddress     = DmaMemoryTop;
+  MapInfo->PlainTextAddress  = DmaMemoryTop;
 
   //
   // Allocate a buffer to map the transfer to.
   //
   Status = gBS->AllocatePages (
                   AllocateType,
                   EfiBootServicesData,
                   MapInfo->NumberOfPages,
-                  &MapInfo->DeviceAddress
+                  &MapInfo->PlainTextAddress
                   );
   if (EFI_ERROR (Status)) {
     FreePool (MapInfo);
     *NumberOfBytes = 0;
     return Status;
   }
 
   //
   // Clear the memory encryption mask from the device buffer
   //
   Status = MemEncryptSevClearPageEncMask (
              0,
-             MapInfo->DeviceAddress,
+             MapInfo->PlainTextAddress,
              MapInfo->NumberOfPages,
              TRUE
              );
   ASSERT_EFI_ERROR(Status);
 
   //
   // If this is a read operation from the Bus Master's point of view,
   // then copy the contents of the real buffer into the mapped buffer
   // so the Bus Master can read the contents of the real buffer.
   //
   if (Operation == EdkiiIoMmuOperationBusMasterRead ||
       Operation == EdkiiIoMmuOperationBusMasterRead64) {
     CopyMem (
-      (VOID *) (UINTN) MapInfo->DeviceAddress,
+      (VOID *) (UINTN) MapInfo->PlainTextAddress,
       (VOID *) (UINTN) MapInfo->HostAddress,
       MapInfo->NumberOfBytes
       );
   }
 
   //
   // The DeviceAddress is the address of the maped buffer below 4GB
   //
-  *DeviceAddress = MapInfo->DeviceAddress;
+  *DeviceAddress = MapInfo->PlainTextAddress;
 
   //
   // Return a pointer to the MAP_INFO structure in Mapping
   //
   *Mapping       = MapInfo;
 
   DEBUG ((
     DEBUG_VERBOSE,
-    "%a Device 0x%Lx Host 0x%Lx Pages 0x%Lx Bytes 0x%Lx\n",
+    "%a PlainText 0x%Lx Host 0x%Lx Pages 0x%Lx Bytes 0x%Lx\n",
     __FUNCTION__,
-    MapInfo->DeviceAddress,
+    MapInfo->PlainTextAddress,
     MapInfo->HostAddress,
     MapInfo->NumberOfPages,
     MapInfo->NumberOfBytes
     ));
 
   return EFI_SUCCESS;
 }
 
 /**
   Completes the Map() operation and releases any corresponding resources.
 
   @param  This                  The protocol instance pointer.
   @param  Mapping               The mapping value returned from Map().
 
   @retval EFI_SUCCESS           The range was unmapped.
   @retval EFI_INVALID_PARAMETER Mapping is not a value that was returned by
                                 Map().
   @retval EFI_DEVICE_ERROR      The data was not committed to the target system
                                 memory.
 **/
@@ -227,87 +227,87 @@ EFIAPI
 IoMmuUnmap (
   IN  EDKII_IOMMU_PROTOCOL                     *This,
   IN  VOID                                     *Mapping
   )
 {
   MAP_INFO                 *MapInfo;
   EFI_STATUS               Status;
 
   if (Mapping == NULL) {
     return EFI_INVALID_PARAMETER;
   }
 
   //
   // See if the Map() operation associated with this Unmap() required a mapping
   // buffer. If a mapping buffer was not required, then this function simply
   // buffer. If a mapping buffer was not required, then this function simply
   //
   if (Mapping == NO_MAPPING) {
     return EFI_SUCCESS;
   }
 
   MapInfo = (MAP_INFO *)Mapping;
 
   //
   // If this is a write operation from the Bus Master's point of view,
   // then copy the contents of the mapped buffer into the real buffer
   // so the processor can read the contents of the real buffer.
   //
   if (MapInfo->Operation == EdkiiIoMmuOperationBusMasterWrite ||
       MapInfo->Operation == EdkiiIoMmuOperationBusMasterWrite64) {
     CopyMem (
       (VOID *) (UINTN) MapInfo->HostAddress,
-      (VOID *) (UINTN) MapInfo->DeviceAddress,
+      (VOID *) (UINTN) MapInfo->PlainTextAddress,
       MapInfo->NumberOfBytes
       );
   }
 
   DEBUG ((
     DEBUG_VERBOSE,
-    "%a Device 0x%Lx Host 0x%Lx Pages 0x%Lx Bytes 0x%Lx\n",
+    "%a PlainText 0x%Lx Host 0x%Lx Pages 0x%Lx Bytes 0x%Lx\n",
     __FUNCTION__,
-    MapInfo->DeviceAddress,
+    MapInfo->PlainTextAddress,
     MapInfo->HostAddress,
     MapInfo->NumberOfPages,
     MapInfo->NumberOfBytes
     ));
   //
   // Restore the memory encryption mask
   //
   Status = MemEncryptSevSetPageEncMask (
              0,
-             MapInfo->DeviceAddress,
+             MapInfo->PlainTextAddress,
              MapInfo->NumberOfPages,
              TRUE
              );
   ASSERT_EFI_ERROR(Status);
 
   //
   // Free the mapped buffer and the MAP_INFO structure.
   //
-  gBS->FreePages (MapInfo->DeviceAddress, MapInfo->NumberOfPages);
+  gBS->FreePages (MapInfo->PlainTextAddress, MapInfo->NumberOfPages);
   FreePool (Mapping);
   return EFI_SUCCESS;
 }
 
 /**
   Allocates pages that are suitable for an OperationBusMasterCommonBuffer or
   OperationBusMasterCommonBuffer64 mapping.
 
   @param  This                  The protocol instance pointer.
   @param  Type                  This parameter is not used and must be ignored.
   @param  MemoryType            The type of memory to allocate,
                                 EfiBootServicesData or EfiRuntimeServicesData.
   @param  Pages                 The number of pages to allocate.
   @param  HostAddress           A pointer to store the base system memory
                                 address of the allocated range.
   @param  Attributes            The requested bit mask of attributes for the
                                 allocated range.
 
   @retval EFI_SUCCESS           The requested memory pages were allocated.
   @retval EFI_UNSUPPORTED       Attributes is unsupported. The only legal
                                 attribute bits are MEMORY_WRITE_COMBINE and
                                 MEMORY_CACHED.
   @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
   @retval EFI_OUT_OF_RESOURCES  The memory pages could not be allocated.
 
 **/
-- 
2.13.1.3.g8be5a757fa67




  parent reply	other threads:[~2017-08-02 21:22 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-02 21:24 [PATCH 00/12] OvmfPkg/IoMmuDxe: cleanups and fixes Laszlo Ersek
2017-08-02 21:24 ` [PATCH 01/12] OvmfPkg/IoMmuDxe: rewrap source code to 79 characters Laszlo Ersek
2017-08-02 21:24 ` Laszlo Ersek [this message]
2017-08-02 21:24 ` [PATCH 03/12] OvmfPkg/IoMmuDxe: rename HostAddress to CryptedAddress in MAP_INFO Laszlo Ersek
2017-08-02 21:24 ` [PATCH 04/12] OvmfPkg/IoMmuDxe: convert UINTN arguments to UINT64 for the %Lx fmt spec Laszlo Ersek
2017-08-02 21:24 ` [PATCH 05/12] OvmfPkg/IoMmuDxe: don't initialize local variables Laszlo Ersek
2017-08-02 21:24 ` [PATCH 06/12] OvmfPkg/IoMmuDxe: propagate errors from AmdSevInstallIoMmuProtocol() Laszlo Ersek
2017-08-02 21:24 ` [PATCH 07/12] OvmfPkg/IoMmuDxe: clean up used library classes Laszlo Ersek
2017-08-02 21:24 ` [PATCH 08/12] OvmfPkg/IoMmuDxe: zero out pages before releasing them Laszlo Ersek
2017-08-02 21:24 ` [PATCH 09/12] OvmfPkg/IoMmuDxe: rework setup of "MapInfo->PlainTextAddress" in Map() Laszlo Ersek
2017-08-02 21:24 ` [PATCH 10/12] OvmfPkg/IoMmuDxe: implement in-place decryption/encryption for Map/Unmap Laszlo Ersek
2017-08-02 23:01   ` Brijesh Singh
2017-08-03  0:13     ` Laszlo Ersek
2017-08-03  1:09       ` Brijesh Singh
2017-08-03 14:35         ` Brijesh Singh
2017-08-03 14:40           ` Laszlo Ersek
2017-08-02 21:24 ` [PATCH 11/12] OvmfPkg/IoMmuDxe: abort harder on memory encryption mask failures Laszlo Ersek
2017-08-02 21:24 ` [PATCH 12/12] OvmfPkg/IoMmuDxe: Unmap(): recycle MAP_INFO after BusMasterCommonBuffer[64] Laszlo Ersek
2017-08-02 21:31 ` [PATCH 00/12] OvmfPkg/IoMmuDxe: cleanups and fixes Laszlo Ersek
2017-08-03 14:10 ` Brijesh Singh
2017-08-03 14:15   ` Laszlo Ersek
2017-08-05  1:25   ` Laszlo Ersek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170802212453.19221-3-lersek@redhat.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox