]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/BaseMemEncryptSevLib: introduce MemEncryptSevClearMmioPageEncMask()
authorBrijesh Singh <brijesh.singh@amd.com>
Wed, 19 May 2021 18:19:45 +0000 (13:19 -0500)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Sat, 29 May 2021 12:15:21 +0000 (12:15 +0000)
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3275

The MemEncryptSevClearMmioPageEncMask() helper can be used for clearing
the memory encryption mask for the Mmio region.

The MemEncryptSevClearMmioPageEncMask() is a simplified version of
MemEncryptSevClearPageEncMask() -- it does not flush the caches after
clearing the page encryption mask.

Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Min Xu <min.m.xu@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
Message-Id: <20210519181949.6574-10-brijesh.singh@amd.com>

OvmfPkg/Include/Library/MemEncryptSevLib.h
OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c
OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c
OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c
OvmfPkg/Library/BaseMemEncryptSevLib/X64/SecVirtualMemory.c
OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h

index 99f15a7d12719a35d0effaf6764e5e4a2f038f47..b91490d5d44d7e8f60d940694c992cc5449cf2df 100644 (file)
@@ -203,4 +203,29 @@ MemEncryptSevGetAddressRangeState (
   IN UINTN                    Length\r
   );\r
 \r
+/**\r
+  This function clears memory encryption bit for the MMIO region specified by\r
+  BaseAddress and NumPages.\r
+\r
+  @param[in]  Cr3BaseAddress          Cr3 Base Address (if zero then use\r
+                                      current CR3)\r
+  @param[in]  BaseAddress             The physical address that is the start\r
+                                      address of a MMIO region.\r
+  @param[in]  NumPages                The number of pages from start memory\r
+                                      region.\r
+\r
+  @retval RETURN_SUCCESS              The attributes were cleared for the\r
+                                      memory region.\r
+  @retval RETURN_INVALID_PARAMETER    Number of pages is zero.\r
+  @retval RETURN_UNSUPPORTED          Clearing the memory encryption attribute\r
+                                      is not supported\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+MemEncryptSevClearMmioPageEncMask (\r
+  IN PHYSICAL_ADDRESS         Cr3BaseAddress,\r
+  IN PHYSICAL_ADDRESS         BaseAddress,\r
+  IN UINTN                    NumPages\r
+  );\r
+\r
 #endif // _MEM_ENCRYPT_SEV_LIB_H_\r
index 12a5bf495bd73cf06edecf4c18136e7a33c39541..169d3118e44f8a1c82103a38b417c0f0920f9ea1 100644 (file)
@@ -111,3 +111,34 @@ MemEncryptSevGetAddressRangeState (
   //\r
   return MemEncryptSevAddressRangeEncrypted;\r
 }\r
+\r
+/**\r
+  This function clears memory encryption bit for the MMIO region specified by\r
+  BaseAddress and NumPages.\r
+\r
+  @param[in]  Cr3BaseAddress          Cr3 Base Address (if zero then use\r
+                                      current CR3)\r
+  @param[in]  BaseAddress             The physical address that is the start\r
+                                      address of a MMIO region.\r
+  @param[in]  NumPages                The number of pages from start memory\r
+                                      region.\r
+\r
+  @retval RETURN_SUCCESS              The attributes were cleared for the\r
+                                      memory region.\r
+  @retval RETURN_INVALID_PARAMETER    Number of pages is zero.\r
+  @retval RETURN_UNSUPPORTED          Clearing the memory encryption attribute\r
+                                      is not supported\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+MemEncryptSevClearMmioPageEncMask (\r
+  IN PHYSICAL_ADDRESS         Cr3BaseAddress,\r
+  IN PHYSICAL_ADDRESS         BaseAddress,\r
+  IN UINTN                    NumPages\r
+  )\r
+{\r
+  //\r
+  // Memory encryption bit is not accessible in 32-bit mode\r
+  //\r
+  return RETURN_UNSUPPORTED;\r
+}\r
index 4fea6a6be0ac3f2b116db26f550de78404d2622e..a2bf698bcde754ad978afdf673355bdb19fc1519 100644 (file)
@@ -118,3 +118,36 @@ MemEncryptSevGetAddressRangeState (
            Length\r
            );\r
 }\r
+\r
+/**\r
+  This function clears memory encryption bit for the mmio region specified by\r
+  BaseAddress and NumPages.\r
+\r
+  @param[in]  Cr3BaseAddress          Cr3 Base Address (if zero then use\r
+                                      current CR3)\r
+  @param[in]  BaseAddress             The physical address that is the start\r
+                                      address of a mmio region.\r
+  @param[in]  NumPages                The number of pages from start memory\r
+                                      region.\r
+\r
+  @retval RETURN_SUCCESS              The attributes were cleared for the\r
+                                      memory region.\r
+  @retval RETURN_INVALID_PARAMETER    Number of pages is zero.\r
+  @retval RETURN_UNSUPPORTED          Clearing the memory encryption attribute\r
+                                      is not supported\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+MemEncryptSevClearMmioPageEncMask (\r
+  IN PHYSICAL_ADDRESS         Cr3BaseAddress,\r
+  IN PHYSICAL_ADDRESS         BaseAddress,\r
+  IN UINTN                    NumPages\r
+  )\r
+{\r
+  return InternalMemEncryptSevClearMmioPageEncMask (\r
+           Cr3BaseAddress,\r
+           BaseAddress,\r
+           EFI_PAGES_TO_SIZE (NumPages)\r
+           );\r
+\r
+}\r
index d3455e812bd13240b047ffff62eb57c56380e024..a18d336a87894434ad799e1c4776bd4b39fc6510 100644 (file)
@@ -891,3 +891,36 @@ InternalMemEncryptSevSetMemoryEncrypted (
            Flush\r
            );\r
 }\r
+\r
+/**\r
+  This function clears memory encryption bit for the MMIO region specified by\r
+  PhysicalAddress and Length.\r
+\r
+  @param[in]  Cr3BaseAddress          Cr3 Base Address (if zero then use\r
+                                      current CR3)\r
+  @param[in]  PhysicalAddress         The physical address that is the start\r
+                                      address of a MMIO region.\r
+  @param[in]  Length                  The length of memory region\r
+\r
+  @retval RETURN_SUCCESS              The attributes were cleared for the\r
+                                      memory region.\r
+  @retval RETURN_INVALID_PARAMETER    Length is zero.\r
+  @retval RETURN_UNSUPPORTED          Clearing the memory encyrption attribute\r
+                                      is not supported\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+InternalMemEncryptSevClearMmioPageEncMask (\r
+  IN  PHYSICAL_ADDRESS        Cr3BaseAddress,\r
+  IN  PHYSICAL_ADDRESS        PhysicalAddress,\r
+  IN  UINTN                   Length\r
+  )\r
+{\r
+  return SetMemoryEncDec (\r
+           Cr3BaseAddress,\r
+           PhysicalAddress,\r
+           Length,\r
+           ClearCBit,\r
+           FALSE\r
+           );\r
+}\r
index bca5e3febb1b8e936ff8ecbcd1aee6303b71440a..e0d3a15e85038d7a0bf149f5f3fb3ca06a8fac63 100644 (file)
@@ -98,3 +98,33 @@ InternalMemEncryptSevSetMemoryEncrypted (
   //\r
   return RETURN_UNSUPPORTED;\r
 }\r
+\r
+/**\r
+  This function clears memory encryption bit for the MMIO region specified by\r
+  PhysicalAddress and Length.\r
+\r
+  @param[in]  Cr3BaseAddress          Cr3 Base Address (if zero then use\r
+                                      current CR3)\r
+  @param[in]  PhysicalAddress         The physical address that is the start\r
+                                      address of a MMIO region.\r
+  @param[in]  Length                  The length of memory region\r
+\r
+  @retval RETURN_SUCCESS              The attributes were cleared for the\r
+                                      memory region.\r
+  @retval RETURN_INVALID_PARAMETER    Length is zero.\r
+  @retval RETURN_UNSUPPORTED          Clearing the memory encyrption attribute\r
+                                      is not supported\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+InternalMemEncryptSevClearMmioPageEncMask (\r
+  IN  PHYSICAL_ADDRESS        Cr3BaseAddress,\r
+  IN  PHYSICAL_ADDRESS        PhysicalAddress,\r
+  IN  UINTN                   Length\r
+  )\r
+{\r
+  //\r
+  // This function is not available during SEC.\r
+  //\r
+  return RETURN_UNSUPPORTED;\r
+}\r
index fe2a0b2826cdd6c1703927b770be8c2d6cc5883f..8dc39e647b905cdb7b9aca3f0d474f22a824d625 100644 (file)
@@ -126,4 +126,27 @@ InternalMemEncryptSevGetAddressRangeState (
   IN UINTN                    Length\r
   );\r
 \r
+/**\r
+  This function clears memory encryption bit for the MMIO region specified by\r
+  PhysicalAddress and Length.\r
+\r
+  @param[in]  Cr3BaseAddress          Cr3 Base Address (if zero then use\r
+                                      current CR3)\r
+  @param[in]  PhysicalAddress         The physical address that is the start\r
+                                      address of a MMIO region.\r
+  @param[in]  Length                  The length of memory region\r
+\r
+  @retval RETURN_SUCCESS              The attributes were cleared for the\r
+                                      memory region.\r
+  @retval RETURN_INVALID_PARAMETER    Length is zero.\r
+  @retval RETURN_UNSUPPORTED          Clearing the memory encyrption attribute\r
+                                      is not supported\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+InternalMemEncryptSevClearMmioPageEncMask (\r
+  IN  PHYSICAL_ADDRESS        Cr3BaseAddress,\r
+  IN  PHYSICAL_ADDRESS        PhysicalAddress,\r
+  IN  UINTN                   Length\r
+  );\r
 #endif\r