\r
#include "QemuFlash.h"\r
\r
+STATIC EFI_PHYSICAL_ADDRESS mSevEsFlashPhysBase;\r
+\r
VOID\r
QemuFlashConvertPointers (\r
VOID\r
)\r
{\r
+ if (MemEncryptSevEsIsEnabled ()) {\r
+ mSevEsFlashPhysBase = (UINTN) mFlashBase;\r
+ }\r
+\r
EfiConvertPointer (0x0, (VOID **) &mFlashBase);\r
}\r
\r
if (MemEncryptSevEsIsEnabled ()) {\r
MSR_SEV_ES_GHCB_REGISTER Msr;\r
GHCB *Ghcb;\r
+ EFI_PHYSICAL_ADDRESS PhysAddr;\r
BOOLEAN InterruptState;\r
\r
Msr.GhcbPhysicalAddress = AsmReadMsr64 (MSR_SEV_ES_GHCB);\r
Ghcb = Msr.Ghcb;\r
\r
+ //\r
+ // The MMIO write needs to be to the physical address of the flash pointer.\r
+ // Since this service is available as part of the EFI runtime services,\r
+ // account for a non-identity mapped VA after SetVirtualAddressMap().\r
+ //\r
+ if (mSevEsFlashPhysBase == 0) {\r
+ PhysAddr = (UINTN) Ptr;\r
+ } else {\r
+ PhysAddr = mSevEsFlashPhysBase + (Ptr - mFlashBase);\r
+ }\r
+\r
//\r
// Writing to flash is emulated by the hypervisor through the use of write\r
// protection. This won't work for an SEV-ES guest because the write won't\r
Ghcb->SharedBuffer[0] = Value;\r
Ghcb->SaveArea.SwScratch = (UINT64) (UINTN) Ghcb->SharedBuffer;\r
VmgSetOffsetValid (Ghcb, GhcbSwScratch);\r
- VmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, (UINT64) (UINTN) Ptr, 1);\r
+ VmgExit (Ghcb, SVM_EXIT_MMIO_WRITE, PhysAddr, 1);\r
VmgDone (Ghcb, InterruptState);\r
} else {\r
*Ptr = Value;\r