Blame 0057-OvmfPkg-QemuFlashFvbServicesRuntimeDxe-Restore-C-bit.patch

Paolo Bonzini 83f3ca
From 75b7aa9528bdd05a7ecf4e64a6beb478d31b402c Mon Sep 17 00:00:00 2001
Paolo Bonzini 83f3ca
From: Brijesh Singh <brijesh.singh@amd.com>
Paolo Bonzini 83f3ca
Date: Fri, 6 Jul 2018 10:00:42 -0500
Paolo Bonzini 83f3ca
Subject: [PATCH] OvmfPkg/QemuFlashFvbServicesRuntimeDxe: Restore C-bit
Paolo Bonzini 83f3ca
 when SEV is active
Paolo Bonzini 83f3ca
Paolo Bonzini 83f3ca
AmdSevDxe maps the flash memory range with C=0, but
Paolo Bonzini 83f3ca
SetMemorySpaceAttributes() unconditionally resets the C-bit to '1'. Lets
Paolo Bonzini 83f3ca
restore the mapping back to C=0.
Paolo Bonzini 83f3ca
Paolo Bonzini 83f3ca
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Paolo Bonzini 83f3ca
Cc: Anthony Perard <anthony.perard@citrix.com>
Paolo Bonzini 83f3ca
Cc: Julien Grall <julien.grall@linaro.org>
Paolo Bonzini 83f3ca
Cc: Justen Jordan L <jordan.l.justen@intel.com>
Paolo Bonzini 83f3ca
Cc: Laszlo Ersek <lersek@redhat.com>
Paolo Bonzini 83f3ca
Contributed-under: TianoCore Contribution Agreement 1.1
Paolo Bonzini 83f3ca
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
Paolo Bonzini 83f3ca
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Paolo Bonzini 83f3ca
Regression-tested-by: Laszlo Ersek <lersek@redhat.com>
Paolo Bonzini 83f3ca
---
Paolo Bonzini 83f3ca
 .../FvbServicesRuntimeDxe.inf                   |  1 +
Paolo Bonzini 83f3ca
 .../FwBlockServiceDxe.c                         | 17 +++++++++++++++++
Paolo Bonzini 83f3ca
 2 files changed, 18 insertions(+)
Paolo Bonzini 83f3ca
Paolo Bonzini 83f3ca
diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
Paolo Bonzini 83f3ca
index d7b4ec06c4..86b244a009 100644
Paolo Bonzini 83f3ca
--- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
Paolo Bonzini 83f3ca
+++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
Paolo Bonzini 83f3ca
@@ -53,6 +53,7 @@ [LibraryClasses]
Paolo Bonzini 83f3ca
   DebugLib
Paolo Bonzini 83f3ca
   DevicePathLib
Paolo Bonzini 83f3ca
   DxeServicesTableLib
Paolo Bonzini 83f3ca
+  MemEncryptSevLib
Paolo Bonzini 83f3ca
   MemoryAllocationLib
Paolo Bonzini 83f3ca
   PcdLib
Paolo Bonzini 83f3ca
   UefiBootServicesTableLib
Paolo Bonzini 83f3ca
diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c
Paolo Bonzini 83f3ca
index 37deece363..1fbe1342a5 100644
Paolo Bonzini 83f3ca
--- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c
Paolo Bonzini 83f3ca
+++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockServiceDxe.c
Paolo Bonzini 83f3ca
@@ -18,6 +18,7 @@
Paolo Bonzini 83f3ca
 #include <Library/DebugLib.h>
Paolo Bonzini 83f3ca
 #include <Library/DevicePathLib.h>
Paolo Bonzini 83f3ca
 #include <Library/DxeServicesTableLib.h>
Paolo Bonzini 83f3ca
+#include <Library/MemEncryptSevLib.h>
Paolo Bonzini 83f3ca
 #include <Library/PcdLib.h>
Paolo Bonzini 83f3ca
 #include <Library/UefiBootServicesTableLib.h>
Paolo Bonzini 83f3ca
 #include <Library/UefiRuntimeLib.h>
Paolo Bonzini 83f3ca
@@ -203,5 +204,21 @@ MarkIoMemoryRangeForRuntimeAccess (
Paolo Bonzini 83f3ca
                   );
Paolo Bonzini 83f3ca
   ASSERT_EFI_ERROR (Status);
Paolo Bonzini 83f3ca
 
Paolo Bonzini 83f3ca
+  //
Paolo Bonzini 83f3ca
+  // When SEV is active, AmdSevDxe mapped the BaseAddress with C=0 but
Paolo Bonzini 83f3ca
+  // SetMemorySpaceAttributes() remaps the range with C=1. Let's restore
Paolo Bonzini 83f3ca
+  // the mapping so that both guest and hyervisor can access the flash
Paolo Bonzini 83f3ca
+  // memory range.
Paolo Bonzini 83f3ca
+  //
Paolo Bonzini 83f3ca
+  if (MemEncryptSevIsEnabled ()) {
Paolo Bonzini 83f3ca
+    Status = MemEncryptSevClearPageEncMask (
Paolo Bonzini 83f3ca
+               0,
Paolo Bonzini 83f3ca
+               BaseAddress,
Paolo Bonzini 83f3ca
+               EFI_SIZE_TO_PAGES (Length),
Paolo Bonzini 83f3ca
+               FALSE
Paolo Bonzini 83f3ca
+               );
Paolo Bonzini 83f3ca
+    ASSERT_EFI_ERROR (Status);
Paolo Bonzini 83f3ca
+  }
Paolo Bonzini 83f3ca
+
Paolo Bonzini 83f3ca
   return Status;
Paolo Bonzini 83f3ca
 }
Paolo Bonzini 83f3ca
-- 
Paolo Bonzini 83f3ca
2.17.1
Paolo Bonzini 83f3ca