OvmfPkg/QemuFwCfgLib: Add SEV support

When SEV is enabled, use a bounce buffer to perform the DMA operation.

Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
This commit is contained in:
Brijesh Singh 2017-07-06 09:29:19 -04:00 committed by Jordan Justen
parent 7cfe445d7f
commit 66c548be50
1 changed files with 52 additions and 2 deletions

View File

@ -72,6 +72,8 @@ InternalQemuFwCfgDmaBytes (
volatile FW_CFG_DMA_ACCESS *Access;
UINT32 AccessHigh, AccessLow;
UINT32 Status;
UINT32 NumPages;
VOID *DmaBuffer, *BounceBuffer;
ASSERT (Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ ||
Control == FW_CFG_DMA_CTL_SKIP);
@ -80,11 +82,44 @@ InternalQemuFwCfgDmaBytes (
return;
}
//
// When SEV is enabled then allocate DMA bounce buffer
//
if (InternalQemuFwCfgSevIsEnabled ()) {
UINTN TotalSize;
TotalSize = sizeof (*Access);
//
// Skip operation does not need buffer
//
if (Control != FW_CFG_DMA_CTL_SKIP) {
TotalSize += Size;
}
//
// Allocate SEV DMA buffer
//
NumPages = (UINT32)EFI_SIZE_TO_PAGES (TotalSize);
InternalQemuFwCfgSevDmaAllocateBuffer (&BounceBuffer, NumPages);
Access = BounceBuffer;
DmaBuffer = (UINT8*)BounceBuffer + sizeof (*Access);
//
// Decrypt data from encrypted guest buffer into DMA buffer
//
if (Control == FW_CFG_DMA_CTL_WRITE) {
CopyMem (DmaBuffer, Buffer, Size);
}
} else {
Access = &LocalAccess;
DmaBuffer = Buffer;
BounceBuffer = NULL;
}
Access->Control = SwapBytes32 (Control);
Access->Length = SwapBytes32 (Size);
Access->Address = SwapBytes64 ((UINTN)Buffer);
Access->Address = SwapBytes64 ((UINTN)DmaBuffer);
//
// Delimit the transfer from (a) modifications to Access, (b) in case of a
@ -117,6 +152,21 @@ InternalQemuFwCfgDmaBytes (
// After a read, the caller will want to use Buffer.
//
MemoryFence ();
//
// If Bounce buffer was allocated then copy the data into guest buffer and
// free the bounce buffer
//
if (BounceBuffer != NULL) {
//
// Encrypt the data from DMA buffer into guest buffer
//
if (Control == FW_CFG_DMA_CTL_READ) {
CopyMem (Buffer, DmaBuffer, Size);
}
InternalQemuFwCfgSevDmaFreeBuffer (BounceBuffer, NumPages);
}
}