Acidanthera UEFI Development Kit based on EDK II edk2-stable202311
Go to file
Laszlo Ersek 58e681406f OvmfPkg/IoMmuDxe: implement in-place decryption/encryption for Map/Unmap
At the moment, we have the following distribution of actions between the
IOMMU protocol member functions:

- AllocateBuffer() allocates pages and clears the memory encryption mask.

- FreeBuffer() re-sets the memory encryption mask, and deallocates pages.

- Map() does nothing at all when BusMasterCommonBuffer[64] is requested
  (and AllocateBuffer() was called previously). Otherwise, Map() allocates
  pages, and clears the memory encryption mask.

- Unmap() does nothing when cleaning up a BusMasterCommonBuffer[64]
  operation. Otherwise, Unmap() clears the encryption mask, and frees the
  pages.

This is wrong: the AllocateBuffer() protocol member is not expected to
produce a buffer that is immediately usable, and client code is required
to call Map() unconditionally, even if BusMasterCommonBuffer[64] is the
desired operation. Implement the right distribution of actions as follows:

- AllocateBuffer() allocates pages and does not touch the encryption mask.

- FreeBuffer() deallocates pages and does not touch the encryption mask.

- Map() does not allocate pages when BusMasterCommonBuffer[64] is
  requested, and it allocates pages (bounce buffer) otherwise.  Regardless
  of the BusMaster operation, Map() (and Map() only) clears the memory
  encryption mask.

- Unmap() restores the encryption mask unconditionally. If the operation
  was BusMasterCommonBuffer[64], then Unmap() does not release the pages.
  Otherwise, the pages (bounce buffer) are released.

This approach also ensures that Unmap() can be called from
ExitBootServices() event handlers, for cleaning up
BusMasterCommonBuffer[64] operations. (More specifically, for restoring
the SEV encryption mask on any in-flight buffers, after resetting any
referring devices.) ExitBootServices() event handlers must not change the
UEFI memory map, thus any memory allocation or freeing in Unmap() would
disqualify Unmap() from being called in such a context.

Map()-ing and Unmap()-ing memory for a BusMasterCommonBuffer[64] operation
effectively means in-place decryption and encryption in a SEV context. As
an additional hurdle, section "7.10.8 Encrypt-in-Place" of AMD publication
Nr.24593 implies that we need a separate temporary buffer for decryption
and encryption that will eventually land in-place. Allocating said
temporary buffer in the straightforward way would violate the above
allocation/freeing restrictions on Map()/Unmap(), therefore pre-allocate
this "stash buffer" too in AllocateBuffer(), and free it in FreeBuffer().

To completely rid Unmap() of dynamic memory impact, for
BusMasterCommonBuffer[64] operations, we're going to rework the lifecycle of
the MAP_INFO structures in a later patch.

(The MemEncryptSevSetPageEncMask() call in Unmap() could theoretically
allocate memory internally for page splitting, however this won't happen
in practice: in Unmap() we only restore the memory encryption mask, and
don't genuinely set it. Any page splitting will have occurred in Map()'s
MemEncryptSevClearPageEncMask() call first.)

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>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Brijesh Singh <brijesh.singh@amd.com>
Reviewed-by: Brijesh Singh <brijesh.singh@amd.com>
2017-08-05 01:31:53 +02:00
AppPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
ArmPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
ArmPlatformPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
ArmVirtPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
BaseTools BaseTools/VfrCompile: Remove the MAX_PATH limitation 2017-08-04 14:32:42 +08:00
BeagleBoardPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
Conf EDK II: Add .gitignore 2014-10-14 16:08:15 +00:00
CorebootModulePkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
CorebootPayloadPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
CryptoPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
DuetPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
EdkCompatibilityPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
EdkShellBinPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
EdkShellPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
EmbeddedPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
EmulatorPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
FatBinPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
FatPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
IntelFrameworkModulePkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
IntelFrameworkPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
IntelFsp2Pkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
IntelFsp2WrapperPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
IntelFspPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
IntelFspWrapperPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
IntelSiliconPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
MdeModulePkg MdeModulePkg/DisplayEngine: Fix incorrect display issue 2017-08-04 14:32:43 +08:00
MdePkg MdePkg: Add definition for SecHobData PPI 2017-08-04 08:56:05 +08:00
NetworkPkg NetworkPkg: iSCSI should allow to set 6 or 12 length of ISID keyword. 2017-08-04 13:30:30 +08:00
Nt32Pkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
Omap35xxPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
OptionRomPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
OvmfPkg OvmfPkg/IoMmuDxe: implement in-place decryption/encryption for Map/Unmap 2017-08-05 01:31:53 +02:00
PcAtChipsetPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
PerformancePkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
QuarkPlatformPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
QuarkSocPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
SecurityPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
ShellBinPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
ShellPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
SignedCapsulePkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
SourceLevelDebugPkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
StdLib edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
StdLibPrivateInternalFiles edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
UefiCpuPkg UefiCpuPkg: Enable Processor Trace feature. 2017-08-04 12:26:44 +08:00
UnixPkg UnixPkg: Remove UnixPkg files (It is replaced by EmulatorPkg) 2013-07-29 21:09:55 +00:00
Vlv2DeviceRefCodePkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
Vlv2TbltDevicePkg edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
.gitignore edk2: Add .DS_Store to .gitignore for macOS 2017-05-19 15:14:34 -07:00
BuildNotes2.txt BaseTools: Updated BuildNotes URLs 2016-03-25 09:46:44 +08:00
Contributions.txt edk2: Reformat TianoCore Contribution Agreement 1.1 2017-08-03 11:02:10 -07:00
Edk2Setup.bat Edk2Setup.bat: Fix build errors from VS tools PREFIX ENV missing 2016-11-05 09:10:58 +08:00
License.txt edk2: Move License.txt file to root 2017-08-03 11:02:17 -07:00
Maintainers.txt Maintainers.txt: Update maintainers for DuetPkg & Nt32Pkg 2017-06-01 09:01:49 +08:00
Readme.md edk2: Add Readme.md to root of edk2 repository 2017-08-03 11:02:25 -07:00
edksetup.bat BaseTools: suppress usage instructions with rebuild options 2017-07-04 10:16:13 +08:00
edksetup.sh edksetup.sh, BaseTools/BuildEnv: add --reconfig support 2016-10-24 13:53:16 +01:00

Readme.md

EDK II Project

A modern, feature-rich, cross-platform firmware development environment for the UEFI and PI specifications from www.uefi.org.

Contributions to the EDK II open source project are covered by the TianoCore Contribution Agreement 1.1

The majority of the content in the EDK II open source project uses a BSD 2-Clause License. The EDK II open source project contains the following components that are covered by additional licenses:

The EDK II Project is composed of packages. The maintainers for each package are listed in Maintainers.txt.

Resources