mirror of https://github.com/acidanthera/audk.git
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:
parent
7cfe445d7f
commit
66c548be50
|
@ -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;
|
||||
}
|
||||
|
||||
Access = &LocalAccess;
|
||||
//
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue