From nobody Fri Dec 27 18:17:17 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1501709108086433.9891914558227; Wed, 2 Aug 2017 14:25:08 -0700 (PDT) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 29BFF209589C9; Wed, 2 Aug 2017 14:22:52 -0700 (PDT) Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id E063021AEB0B0 for ; Wed, 2 Aug 2017 14:22:50 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 462F5C04B317; Wed, 2 Aug 2017 21:25:01 +0000 (UTC) Received: from lacos-laptop-7.usersys.redhat.com (ovpn-116-47.phx2.redhat.com [10.3.116.47]) by smtp.corp.redhat.com (Postfix) with ESMTP id E7E1917B57; Wed, 2 Aug 2017 21:24:59 +0000 (UTC) X-Original-To: edk2-devel@lists.01.org DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 462F5C04B317 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=lersek@redhat.com From: Laszlo Ersek To: edk2-devel-01 Date: Wed, 2 Aug 2017 23:24:43 +0200 Message-Id: <20170802212453.19221-3-lersek@redhat.com> In-Reply-To: <20170802212453.19221-1-lersek@redhat.com> References: <20170802212453.19221-1-lersek@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 02 Aug 2017 21:25:01 +0000 (UTC) Subject: [edk2] [PATCH 02/12] OvmfPkg/IoMmuDxe: rename DeviceAddress to PlainTextAddress in MAP_INFO X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jordan Justen , Tom Lendacky , Ard Biesheuvel MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" 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 Cc: Brijesh Singh Cc: Jordan Justen Cc: Tom Lendacky Suggested-by: Ard Biesheuvel Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek --- 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; =20 #define NO_MAPPING (VOID *) (UINTN) -1 =20 /** Provides the controller-specific addresses required to access system mem= ory from a DMA bus master. On SEV guest, the DMA operations must be performe= d on shared buffer hence we allocate a bounce buffer to map the HostAddress t= o a DeviceAddress. The Encryption attribute is removed from the DeviceAddress buffer. =20 @param This The protocol instance pointer. @param Operation Indicates if the bus master is going to re= ad 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 ou= tput the number of bytes that were mapped. @param DeviceAddress The resulting map address for the bus mast= er PCI controller to use to access the hosts HostAddress. @param Mapping A resulting value to pass to Unmap(). =20 @retval EFI_SUCCESS The range was mapped for the returned NumberOfBytes. @retval EFI_UNSUPPORTED The HostAddress cannot be mapped as a comm= on 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 requ= ested address. =20 **/ @@ -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; =20 if (HostAddress =3D=3D NULL || NumberOfBytes =3D=3D NULL || DeviceAddres= s =3D=3D NULL || Mapping =3D=3D NULL) { return EFI_INVALID_PARAMETER; } =20 // // Make sure that Operation is valid // if ((UINT32) Operation >=3D EdkiiIoMmuOperationMaximum) { return EFI_INVALID_PARAMETER; } PhysicalAddress =3D (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress; =20 DmaMemoryTop =3D (UINTN)-1; AllocateType =3D AllocateAnyPages; =20 if (((Operation !=3D EdkiiIoMmuOperationBusMasterRead64 && Operation !=3D EdkiiIoMmuOperationBusMasterWrite64 && Operation !=3D 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 =3D SIZE_4GB - 1; AllocateType =3D AllocateMaxAddress; =20 if (Operation =3D=3D EdkiiIoMmuOperationBusMasterCommonBuffer || Operation =3D=3D EdkiiIoMmuOperationBusMasterCommonBuffer64) { // // Common Buffer operations can not be remapped. If the common bu= ffer // if above 4GB, then it is not possible to generate a mapping, so // return an error. // return EFI_UNSUPPORTED; } } =20 // // CommandBuffer was allocated by us (AllocateBuffer) and is already in // unencryted buffer so no need to create bounce buffer // if (Operation =3D=3D EdkiiIoMmuOperationBusMasterCommonBuffer || Operation =3D=3D EdkiiIoMmuOperationBusMasterCommonBuffer64) { *Mapping =3D NO_MAPPING; *DeviceAddress =3D PhysicalAddress; =20 return EFI_SUCCESS; } =20 // // Allocate a MAP_INFO structure to remember the mapping when Unmap() is // called later. // MapInfo =3D AllocatePool (sizeof (MAP_INFO)); if (MapInfo =3D=3D NULL) { *NumberOfBytes =3D 0; return EFI_OUT_OF_RESOURCES; } =20 // // Initialize the MAP_INFO structure // MapInfo->Operation =3D Operation; MapInfo->NumberOfBytes =3D *NumberOfBytes; MapInfo->NumberOfPages =3D EFI_SIZE_TO_PAGES (MapInfo->NumberOfBytes= ); MapInfo->HostAddress =3D PhysicalAddress; - MapInfo->DeviceAddress =3D DmaMemoryTop; + MapInfo->PlainTextAddress =3D DmaMemoryTop; =20 // // Allocate a buffer to map the transfer to. // Status =3D gBS->AllocatePages ( AllocateType, EfiBootServicesData, MapInfo->NumberOfPages, - &MapInfo->DeviceAddress + &MapInfo->PlainTextAddress ); if (EFI_ERROR (Status)) { FreePool (MapInfo); *NumberOfBytes =3D 0; return Status; } =20 // // Clear the memory encryption mask from the device buffer // Status =3D MemEncryptSevClearPageEncMask ( 0, - MapInfo->DeviceAddress, + MapInfo->PlainTextAddress, MapInfo->NumberOfPages, TRUE ); ASSERT_EFI_ERROR(Status); =20 // // 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 =3D=3D EdkiiIoMmuOperationBusMasterRead || Operation =3D=3D EdkiiIoMmuOperationBusMasterRead64) { CopyMem ( - (VOID *) (UINTN) MapInfo->DeviceAddress, + (VOID *) (UINTN) MapInfo->PlainTextAddress, (VOID *) (UINTN) MapInfo->HostAddress, MapInfo->NumberOfBytes ); } =20 // // The DeviceAddress is the address of the maped buffer below 4GB // - *DeviceAddress =3D MapInfo->DeviceAddress; + *DeviceAddress =3D MapInfo->PlainTextAddress; =20 // // Return a pointer to the MAP_INFO structure in Mapping // *Mapping =3D MapInfo; =20 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 )); =20 return EFI_SUCCESS; } =20 /** Completes the Map() operation and releases any corresponding resources. =20 @param This The protocol instance pointer. @param Mapping The mapping value returned from Map(). =20 @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 s= ystem memory. **/ @@ -227,87 +227,87 @@ EFIAPI IoMmuUnmap ( IN EDKII_IOMMU_PROTOCOL *This, IN VOID *Mapping ) { MAP_INFO *MapInfo; EFI_STATUS Status; =20 if (Mapping =3D=3D NULL) { return EFI_INVALID_PARAMETER; } =20 // // See if the Map() operation associated with this Unmap() required a ma= pping // buffer. If a mapping buffer was not required, then this function simp= ly // buffer. If a mapping buffer was not required, then this function simp= ly // if (Mapping =3D=3D NO_MAPPING) { return EFI_SUCCESS; } =20 MapInfo =3D (MAP_INFO *)Mapping; =20 // // 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 =3D=3D EdkiiIoMmuOperationBusMasterWrite || MapInfo->Operation =3D=3D EdkiiIoMmuOperationBusMasterWrite64) { CopyMem ( (VOID *) (UINTN) MapInfo->HostAddress, - (VOID *) (UINTN) MapInfo->DeviceAddress, + (VOID *) (UINTN) MapInfo->PlainTextAddress, MapInfo->NumberOfBytes ); } =20 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 =3D MemEncryptSevSetPageEncMask ( 0, - MapInfo->DeviceAddress, + MapInfo->PlainTextAddress, MapInfo->NumberOfPages, TRUE ); ASSERT_EFI_ERROR(Status); =20 // // 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; } =20 /** Allocates pages that are suitable for an OperationBusMasterCommonBuffer = or OperationBusMasterCommonBuffer64 mapping. =20 @param This The protocol instance pointer. @param Type This parameter is not used and must be ign= ored. @param MemoryType The type of memory to allocate, EfiBootServicesData or EfiRuntimeServicesD= ata. @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 t= he allocated range. =20 @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. =20 **/ --=20 2.13.1.3.g8be5a757fa67 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel