]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuFlashFvbServicesRuntimeDxe/QemuFlashDxe.c
OvmfPkg/QemuFlashFvbServicesRuntimeDxe: Use physical address with SEV-ES
[mirror_edk2.git] / OvmfPkg / QemuFlashFvbServicesRuntimeDxe / QemuFlashDxe.c
index 1b0742967f719985d60a9e29ff4cb6a8f25f3c12..63daa0b55b4955fb47bfb8a27d3b9f10326bcfa9 100644 (file)
 \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
@@ -52,11 +58,23 @@ QemuFlashPtrWrite (
   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
@@ -68,7 +86,7 @@ QemuFlashPtrWrite (
     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