!286 [openEuler-24.03-LTS]Hygon: Support live migration for Hygon CSV/CSV2/CSV3 guest
From: @hanliyang Reviewed-by: @caojinhuahw Signed-off-by: @caojinhuahw
This commit is contained in:
commit
e84a091d67
330
0068-OvmfPkg-BaseMemEncryptLib-Detect-SEV-live-migration-.patch
Normal file
330
0068-OvmfPkg-BaseMemEncryptLib-Detect-SEV-live-migration-.patch
Normal file
@ -0,0 +1,330 @@
|
|||||||
|
From ae4bf41d9c71137a21e7b8fc4aceca7212145b40 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
Date: Tue, 5 Apr 2022 16:09:28 +0000
|
||||||
|
Subject: [PATCH 1/9] OvmfPkg/BaseMemEncryptLib: Detect SEV live migration
|
||||||
|
feature.
|
||||||
|
|
||||||
|
cherry-picked from https://patchew.org/EDK2/cover.1629380011.git.ashish.kalra@amd.com .
|
||||||
|
|
||||||
|
Add support to check if we are running inside KVM HVM and
|
||||||
|
KVM HVM supports SEV Live Migration feature.
|
||||||
|
|
||||||
|
Cc: Jordan Justen <jordan.l.justen@intel.com>
|
||||||
|
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
|
||||||
|
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
---
|
||||||
|
OvmfPkg/Include/Library/MemEncryptSevLib.h | 12 ++++
|
||||||
|
.../DxeMemEncryptSevLibInternal.c | 49 ++++++++++++++--
|
||||||
|
.../PeiDxeMemEncryptSevLibInternal.c | 58 +++++++++++++++++++
|
||||||
|
.../PeiDxeMemEncryptSevLibInternal.h | 31 ++++++++++
|
||||||
|
.../PeiMemEncryptSevLibInternal.c | 42 ++++++++++++++
|
||||||
|
.../SecMemEncryptSevLibInternal.c | 18 ++++++
|
||||||
|
6 files changed, 206 insertions(+), 4 deletions(-)
|
||||||
|
create mode 100644 OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibInternal.h
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/Include/Library/MemEncryptSevLib.h b/OvmfPkg/Include/Library/MemEncryptSevLib.h
|
||||||
|
index 4fa9c0d7..babec60d 100644
|
||||||
|
--- a/OvmfPkg/Include/Library/MemEncryptSevLib.h
|
||||||
|
+++ b/OvmfPkg/Include/Library/MemEncryptSevLib.h
|
||||||
|
@@ -83,6 +83,18 @@ MemEncryptSevIsEnabled (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ Returns a boolean to indicate whether SEV live migration is enabled.
|
||||||
|
+
|
||||||
|
+ @retval TRUE SEV live migration is enabled
|
||||||
|
+ @retval FALSE SEV live migration is not enabled
|
||||||
|
+**/
|
||||||
|
+BOOLEAN
|
||||||
|
+EFIAPI
|
||||||
|
+MemEncryptSevLiveMigrationIsEnabled (
|
||||||
|
+ VOID
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
This function clears memory encryption bit for the memory region specified by
|
||||||
|
BaseAddress and NumPages from the current page table context.
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c
|
||||||
|
index 4aba0075..d80ebe2f 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c
|
||||||
|
@@ -18,10 +18,14 @@
|
||||||
|
#include <Uefi/UefiBaseType.h>
|
||||||
|
#include <ConfidentialComputingGuestAttr.h>
|
||||||
|
|
||||||
|
-STATIC UINT64 mCurrentAttr = 0;
|
||||||
|
-STATIC BOOLEAN mCurrentAttrRead = FALSE;
|
||||||
|
-STATIC UINT64 mSevEncryptionMask = 0;
|
||||||
|
-STATIC BOOLEAN mSevEncryptionMaskSaved = FALSE;
|
||||||
|
+#include "PeiDxeMemEncryptSevLibInternal.h"
|
||||||
|
+
|
||||||
|
+STATIC UINT64 mCurrentAttr = 0;
|
||||||
|
+STATIC BOOLEAN mCurrentAttrRead = FALSE;
|
||||||
|
+STATIC UINT64 mSevEncryptionMask = 0;
|
||||||
|
+STATIC BOOLEAN mSevEncryptionMaskSaved = FALSE;
|
||||||
|
+STATIC BOOLEAN mSevLiveMigrationStatus = FALSE;
|
||||||
|
+STATIC BOOLEAN mSevLiveMigrationStatusChecked = FALSE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The function check if the specified Attr is set.
|
||||||
|
@@ -111,6 +115,24 @@ MemEncryptSevSnpIsEnabled (
|
||||||
|
return ConfidentialComputingGuestHas (CCAttrAmdSevSnp);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ Figures out if we are running inside KVM HVM and
|
||||||
|
+ KVM HVM supports SEV Live Migration feature.
|
||||||
|
+**/
|
||||||
|
+STATIC
|
||||||
|
+VOID
|
||||||
|
+EFIAPI
|
||||||
|
+InternalDetectSevLiveMigrationFeature (
|
||||||
|
+ VOID
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ if (KvmDetectSevLiveMigrationFeature ()) {
|
||||||
|
+ mSevLiveMigrationStatus = TRUE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mSevLiveMigrationStatusChecked = TRUE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
Returns a boolean to indicate whether SEV-ES is enabled.
|
||||||
|
|
||||||
|
@@ -141,6 +163,25 @@ MemEncryptSevIsEnabled (
|
||||||
|
return ConfidentialComputingGuestHas (CCAttrAmdSev);
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ Returns a boolean to indicate whether SEV live migration is enabled.
|
||||||
|
+
|
||||||
|
+ @retval TRUE SEV live migration is enabled
|
||||||
|
+ @retval FALSE SEV live migration is not enabled
|
||||||
|
+**/
|
||||||
|
+BOOLEAN
|
||||||
|
+EFIAPI
|
||||||
|
+MemEncryptSevLiveMigrationIsEnabled (
|
||||||
|
+ VOID
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ if (!mSevLiveMigrationStatusChecked) {
|
||||||
|
+ InternalDetectSevLiveMigrationFeature ();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return mSevLiveMigrationStatus;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
Returns the SEV encryption mask.
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibInternal.c
|
||||||
|
index 78ea16ae..868392f7 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibInternal.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibInternal.c
|
||||||
|
@@ -16,6 +16,8 @@
|
||||||
|
#include <Register/SmramSaveStateMap.h>
|
||||||
|
#include <Uefi/UefiBaseType.h>
|
||||||
|
|
||||||
|
+#include "PeiDxeMemEncryptSevLibInternal.h"
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
Locate the page range that covers the initial (pre-SMBASE-relocation) SMRAM
|
||||||
|
Save State Map.
|
||||||
|
@@ -61,3 +63,59 @@ MemEncryptSevLocateInitialSmramSaveStateMapPages (
|
||||||
|
|
||||||
|
return RETURN_SUCCESS;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ Figures out if we are running inside KVM HVM and
|
||||||
|
+ KVM HVM supports SEV Live Migration feature.
|
||||||
|
+
|
||||||
|
+ @retval TRUE SEV live migration is supported.
|
||||||
|
+ @retval FALSE SEV live migration is not supported.
|
||||||
|
+**/
|
||||||
|
+BOOLEAN
|
||||||
|
+EFIAPI
|
||||||
|
+KvmDetectSevLiveMigrationFeature (
|
||||||
|
+ VOID
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ CHAR8 Signature[13];
|
||||||
|
+ UINT32 mKvmLeaf;
|
||||||
|
+ UINT32 RegEax;
|
||||||
|
+ UINT32 RegEbx;
|
||||||
|
+ UINT32 RegEcx;
|
||||||
|
+ UINT32 RegEdx;
|
||||||
|
+
|
||||||
|
+ Signature[12] = '\0';
|
||||||
|
+ for (mKvmLeaf = 0x40000000; mKvmLeaf < 0x40010000; mKvmLeaf += 0x100) {
|
||||||
|
+ AsmCpuid (
|
||||||
|
+ mKvmLeaf,
|
||||||
|
+ NULL,
|
||||||
|
+ (UINT32 *)&Signature[0],
|
||||||
|
+ (UINT32 *)&Signature[4],
|
||||||
|
+ (UINT32 *)&Signature[8]
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
+ if (AsciiStrCmp (Signature, "KVMKVMKVM") == 0) {
|
||||||
|
+ DEBUG ((
|
||||||
|
+ DEBUG_INFO,
|
||||||
|
+ "%a: KVM Detected, signature = %a\n",
|
||||||
|
+ __FUNCTION__,
|
||||||
|
+ Signature
|
||||||
|
+ ));
|
||||||
|
+
|
||||||
|
+ RegEax = mKvmLeaf + 1;
|
||||||
|
+ RegEcx = 0;
|
||||||
|
+ AsmCpuid (mKvmLeaf + 1, &RegEax, &RegEbx, &RegEcx, &RegEdx);
|
||||||
|
+ if ((RegEax & KVM_FEATURE_MIGRATION_CONTROL) != 0) {
|
||||||
|
+ DEBUG ((
|
||||||
|
+ DEBUG_INFO,
|
||||||
|
+ "%a: SEV Live Migration feature supported\n",
|
||||||
|
+ __FUNCTION__
|
||||||
|
+ ));
|
||||||
|
+
|
||||||
|
+ return TRUE;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return FALSE;
|
||||||
|
+}
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibInternal.h b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibInternal.h
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..b0ef053c
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiDxeMemEncryptSevLibInternal.h
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+/** @file
|
||||||
|
+
|
||||||
|
+ Secure Encrypted Virtualization (SEV) library helper function
|
||||||
|
+
|
||||||
|
+ Copyright (c) 2021, AMD Incorporated. All rights reserved.<BR>
|
||||||
|
+
|
||||||
|
+ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
+
|
||||||
|
+**/
|
||||||
|
+
|
||||||
|
+#ifndef PEI_DXE_MEM_ENCRYPT_SEV_LIB_INTERNAL_H_
|
||||||
|
+#define PEI_DXE_MEM_ENCRYPT_SEV_LIB_INTERNAL_H_
|
||||||
|
+
|
||||||
|
+#include <Library/BaseLib.h>
|
||||||
|
+
|
||||||
|
+#define KVM_FEATURE_MIGRATION_CONTROL BIT17
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ Figures out if we are running inside KVM HVM and
|
||||||
|
+ KVM HVM supports SEV Live Migration feature.
|
||||||
|
+
|
||||||
|
+ @retval TRUE SEV live migration is supported.
|
||||||
|
+ @retval FALSE SEV live migration is not supported.
|
||||||
|
+**/
|
||||||
|
+BOOLEAN
|
||||||
|
+EFIAPI
|
||||||
|
+KvmDetectSevLiveMigrationFeature (
|
||||||
|
+ VOID
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
+#endif // PEI_DXE_MEM_ENCRYPT_SEV_LIB_INTERNAL_H_
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c
|
||||||
|
index 41d1246a..307087a1 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLibInternal.c
|
||||||
|
@@ -17,6 +17,11 @@
|
||||||
|
#include <Register/Cpuid.h>
|
||||||
|
#include <Uefi/UefiBaseType.h>
|
||||||
|
|
||||||
|
+#include "PeiDxeMemEncryptSevLibInternal.h"
|
||||||
|
+
|
||||||
|
+STATIC BOOLEAN mSevLiveMigrationStatus = FALSE;
|
||||||
|
+STATIC BOOLEAN mSevLiveMigrationStatusChecked = FALSE;
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
Read the workarea to determine whether SEV is enabled. If enabled,
|
||||||
|
then return the SevEsWorkArea pointer.
|
||||||
|
@@ -83,6 +88,24 @@ MemEncryptSevSnpIsEnabled (
|
||||||
|
return Msr.Bits.SevSnpBit ? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ Figures out if we are running inside KVM HVM and
|
||||||
|
+ KVM HVM supports SEV Live Migration feature.
|
||||||
|
+**/
|
||||||
|
+STATIC
|
||||||
|
+VOID
|
||||||
|
+EFIAPI
|
||||||
|
+InternalDetectSevLiveMigrationFeature (
|
||||||
|
+ VOID
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ if (KvmDetectSevLiveMigrationFeature ()) {
|
||||||
|
+ mSevLiveMigrationStatus = TRUE;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mSevLiveMigrationStatusChecked = TRUE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
Returns a boolean to indicate whether SEV-ES is enabled.
|
||||||
|
|
||||||
|
@@ -121,6 +144,25 @@ MemEncryptSevIsEnabled (
|
||||||
|
return Msr.Bits.SevBit ? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ Returns a boolean to indicate whether SEV live migration is enabled.
|
||||||
|
+
|
||||||
|
+ @retval TRUE SEV live migration is enabled
|
||||||
|
+ @retval FALSE SEV live migration is not enabled
|
||||||
|
+**/
|
||||||
|
+BOOLEAN
|
||||||
|
+EFIAPI
|
||||||
|
+MemEncryptSevLiveMigrationIsEnabled (
|
||||||
|
+ VOID
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ if (!mSevLiveMigrationStatusChecked) {
|
||||||
|
+ InternalDetectSevLiveMigrationFeature ();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return mSevLiveMigrationStatus;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
Returns the SEV encryption mask.
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c
|
||||||
|
index 27148c7e..9142ac40 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c
|
||||||
|
@@ -121,6 +121,24 @@ MemEncryptSevIsEnabled (
|
||||||
|
return Msr.Bits.SevBit ? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ Returns a boolean to indicate whether SEV live migration is enabled.
|
||||||
|
+
|
||||||
|
+ @retval TRUE SEV live migration is enabled
|
||||||
|
+ @retval FALSE SEV live migration is not enabled
|
||||||
|
+**/
|
||||||
|
+BOOLEAN
|
||||||
|
+EFIAPI
|
||||||
|
+MemEncryptSevLiveMigrationIsEnabled (
|
||||||
|
+ VOID
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ //
|
||||||
|
+ // Not used in SEC phase.
|
||||||
|
+ //
|
||||||
|
+ return FALSE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
Returns the SEV encryption mask.
|
||||||
|
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
301
0069-OvmfPkg-BaseMemEncryptLib-Hypercall-API-for-page-enc.patch
Normal file
301
0069-OvmfPkg-BaseMemEncryptLib-Hypercall-API-for-page-enc.patch
Normal file
@ -0,0 +1,301 @@
|
|||||||
|
From 2c000372cab80ab68a8672138c8d0f5cb1ae43d9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
Date: Tue, 5 Apr 2022 16:23:53 +0000
|
||||||
|
Subject: [PATCH 2/9] OvmfPkg/BaseMemEncryptLib: Hypercall API for page
|
||||||
|
encryption state change
|
||||||
|
|
||||||
|
cherry-picked from https://patchew.org/EDK2/cover.1629380011.git.ashish.kalra@amd.com .
|
||||||
|
|
||||||
|
Add API to issue hypercall on page encryption state change.
|
||||||
|
|
||||||
|
By default all the SEV guest memory regions are considered encrypted,
|
||||||
|
if a guest changes the encryption attribute of the page (e.g mark a
|
||||||
|
page as decrypted) then notify hypervisor. Hypervisor will need to
|
||||||
|
track the unencrypted pages. The information will be used during
|
||||||
|
guest live migration, guest page migration and guest debugging.
|
||||||
|
|
||||||
|
This hypercall is used to notify hypervisor when the page's
|
||||||
|
encryption state changes.
|
||||||
|
|
||||||
|
Cc: Jordan Justen <jordan.l.justen@intel.com>
|
||||||
|
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
|
||||||
|
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
|
||||||
|
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
---
|
||||||
|
OvmfPkg/Include/Library/MemEncryptSevLib.h | 52 +++++++++++++++
|
||||||
|
.../DxeMemEncryptSevLib.inf | 1 +
|
||||||
|
.../Ia32/MemEncryptSevLib.c | 27 ++++++++
|
||||||
|
.../PeiMemEncryptSevLib.inf | 1 +
|
||||||
|
.../SecMemEncryptSevLibInternal.c | 20 ++++++
|
||||||
|
.../X64/AsmHelperStub.nasm | 33 ++++++++++
|
||||||
|
.../X64/MemEncryptSevLib.c | 66 +++++++++++++++++++
|
||||||
|
7 files changed, 200 insertions(+)
|
||||||
|
create mode 100644 OvmfPkg/Library/BaseMemEncryptSevLib/X64/AsmHelperStub.nasm
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/Include/Library/MemEncryptSevLib.h b/OvmfPkg/Include/Library/MemEncryptSevLib.h
|
||||||
|
index babec60d..b60496c2 100644
|
||||||
|
--- a/OvmfPkg/Include/Library/MemEncryptSevLib.h
|
||||||
|
+++ b/OvmfPkg/Include/Library/MemEncryptSevLib.h
|
||||||
|
@@ -240,4 +240,56 @@ MemEncryptSevSnpPreValidateSystemRam (
|
||||||
|
IN UINTN NumPages
|
||||||
|
);
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ This hypercall is used to notify hypervisor when the page's encryption
|
||||||
|
+ state changes.
|
||||||
|
+
|
||||||
|
+ @param[in] PhysicalAddress The physical address that is the start address
|
||||||
|
+ of a memory region.
|
||||||
|
+ @param[in] Pages Number of pages in memory region.
|
||||||
|
+ @param[in] IsEncrypted Encrypted or Decrypted.
|
||||||
|
+
|
||||||
|
+ @retval RETURN_SUCCESS Hypercall returned success.
|
||||||
|
+ @retval RETURN_UNSUPPORTED Hypercall not supported.
|
||||||
|
+ @retval RETURN_NO_MAPPING Hypercall returned error.
|
||||||
|
+**/
|
||||||
|
+RETURN_STATUS
|
||||||
|
+EFIAPI
|
||||||
|
+SetMemoryEncDecHypercall3 (
|
||||||
|
+ IN UINTN PhysicalAddress,
|
||||||
|
+ IN UINTN Pages,
|
||||||
|
+ IN BOOLEAN IsEncrypted
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
+#define KVM_HC_MAP_GPA_RANGE 12
|
||||||
|
+#define KVM_MAP_GPA_RANGE_PAGE_SZ_4K 0
|
||||||
|
+#define KVM_MAP_GPA_RANGE_PAGE_SZ_2M BIT0
|
||||||
|
+#define KVM_MAP_GPA_RANGE_PAGE_SZ_1G BIT1
|
||||||
|
+#define KVM_MAP_GPA_RANGE_ENC_STATE(n) ((n) << 4)
|
||||||
|
+#define KVM_MAP_GPA_RANGE_ENCRYPTED KVM_MAP_GPA_RANGE_ENC_STATE(1)
|
||||||
|
+#define KVM_MAP_GPA_RANGE_DECRYPTED KVM_MAP_GPA_RANGE_ENC_STATE(0)
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ Interface exposed by the ASM implementation of the core hypercall
|
||||||
|
+
|
||||||
|
+ @param[in] HypercallNum KVM_HC_MAP_GPA_RANGE hypercall.
|
||||||
|
+ @param[in] PhysicalAddress The physical address that is the start address
|
||||||
|
+ of a memory region.
|
||||||
|
+ @param[in] Pages Number of pages in memory region.
|
||||||
|
+ @param[in] Attributes Bits 3:0 - preferred page size encoding,
|
||||||
|
+ 0 = 4kb, 1 = 2mb, 2 = 1gb, etc...
|
||||||
|
+ Bit 4 - plaintext = 0, encrypted = 1
|
||||||
|
+ Bits 63:5 - reserved (must be zero)
|
||||||
|
+
|
||||||
|
+ @retval Hypercall returned status.
|
||||||
|
+**/
|
||||||
|
+UINTN
|
||||||
|
+EFIAPI
|
||||||
|
+SetMemoryEncDecHypercall3AsmStub (
|
||||||
|
+ IN UINTN HypercallNum,
|
||||||
|
+ IN UINTN PhysicalAddress,
|
||||||
|
+ IN UINTN Pages,
|
||||||
|
+ IN UINTN Attributes
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
#endif // _MEM_ENCRYPT_SEV_LIB_H_
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf
|
||||||
|
index 3a1d3089..4d32fae6 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf
|
||||||
|
@@ -40,6 +40,7 @@
|
||||||
|
X64/SnpPageStateChangeInternal.c
|
||||||
|
X64/VirtualMemory.c
|
||||||
|
X64/VirtualMemory.h
|
||||||
|
+ X64/AsmHelperStub.nasm
|
||||||
|
|
||||||
|
[Sources.IA32]
|
||||||
|
Ia32/MemEncryptSevLib.c
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c b/OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c
|
||||||
|
index f92299fc..c1c10a61 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/Ia32/MemEncryptSevLib.c
|
||||||
|
@@ -153,3 +153,30 @@ MemEncryptSevSnpPreValidateSystemRam (
|
||||||
|
{
|
||||||
|
ASSERT (FALSE);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ This hyercall is used to notify hypervisor when the page's encryption
|
||||||
|
+ state changes.
|
||||||
|
+
|
||||||
|
+ @param[in] PhysicalAddress The physical address that is the start address
|
||||||
|
+ of a memory region.
|
||||||
|
+ @param[in] Pages Number of Pages in the memory region.
|
||||||
|
+ @param[in] IsEncrypted Encrypted or Decrypted.
|
||||||
|
+
|
||||||
|
+ @retval RETURN_SUCCESS Hypercall returned success.
|
||||||
|
+ @retval RETURN_UNSUPPORTED Hypercall not supported.
|
||||||
|
+ @retval RETURN_NO_MAPPING Hypercall returned error.
|
||||||
|
+**/
|
||||||
|
+RETURN_STATUS
|
||||||
|
+EFIAPI
|
||||||
|
+SetMemoryEncDecHypercall3 (
|
||||||
|
+ IN UINTN PhysicalAddress,
|
||||||
|
+ IN UINTN Pages,
|
||||||
|
+ IN BOOLEAN IsEncrypted
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ //
|
||||||
|
+ // Memory encryption bit is not accessible in 32-bit mode
|
||||||
|
+ //
|
||||||
|
+ return RETURN_UNSUPPORTED;
|
||||||
|
+}
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf
|
||||||
|
index 8f56783d..3f11f06a 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf
|
||||||
|
@@ -40,6 +40,7 @@
|
||||||
|
X64/SnpPageStateChangeInternal.c
|
||||||
|
X64/VirtualMemory.c
|
||||||
|
X64/VirtualMemory.h
|
||||||
|
+ X64/AsmHelperStub.nasm
|
||||||
|
|
||||||
|
[Sources.IA32]
|
||||||
|
Ia32/MemEncryptSevLib.c
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c
|
||||||
|
index 9142ac40..ffb22a08 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/SecMemEncryptSevLibInternal.c
|
||||||
|
@@ -139,6 +139,26 @@ MemEncryptSevLiveMigrationIsEnabled (
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ Interface exposed by the ASM implementation of the core hypercall
|
||||||
|
+
|
||||||
|
+ @retval Hypercall returned status.
|
||||||
|
+**/
|
||||||
|
+UINTN
|
||||||
|
+EFIAPI
|
||||||
|
+SetMemoryEncDecHypercall3AsmStub (
|
||||||
|
+ IN UINTN HypercallNum,
|
||||||
|
+ IN UINTN PhysicalAddress,
|
||||||
|
+ IN UINTN Pages,
|
||||||
|
+ IN UINTN Attributes
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ //
|
||||||
|
+ // Not used in SEC phase.
|
||||||
|
+ //
|
||||||
|
+ return RETURN_UNSUPPORTED;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
Returns the SEV encryption mask.
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/AsmHelperStub.nasm b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/AsmHelperStub.nasm
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..0ec35dd9
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/AsmHelperStub.nasm
|
||||||
|
@@ -0,0 +1,33 @@
|
||||||
|
+/** @file
|
||||||
|
+
|
||||||
|
+ ASM helper stub to invoke hypercall
|
||||||
|
+
|
||||||
|
+ Copyright (c) 2021, AMD Incorporated. All rights reserved.<BR>
|
||||||
|
+
|
||||||
|
+ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
+
|
||||||
|
+**/
|
||||||
|
+
|
||||||
|
+DEFAULT REL
|
||||||
|
+SECTION .text
|
||||||
|
+
|
||||||
|
+; UINTN
|
||||||
|
+; EFIAPI
|
||||||
|
+; SetMemoryEncDecHypercall3AsmStub (
|
||||||
|
+; IN UINTN HypercallNum,
|
||||||
|
+; IN UINTN Arg1,
|
||||||
|
+; IN UINTN Arg2,
|
||||||
|
+; IN UINTN Arg3
|
||||||
|
+; );
|
||||||
|
+global ASM_PFX(SetMemoryEncDecHypercall3AsmStub)
|
||||||
|
+ASM_PFX(SetMemoryEncDecHypercall3AsmStub):
|
||||||
|
+ ; UEFI calling conventions require RBX to
|
||||||
|
+ ; be nonvolatile/callee-saved.
|
||||||
|
+ push rbx
|
||||||
|
+ mov rax, rcx ; Copy HypercallNumber to rax
|
||||||
|
+ mov rbx, rdx ; Copy Arg1 to the register expected by KVM
|
||||||
|
+ mov rcx, r8 ; Copy Arg2 to register expected by KVM
|
||||||
|
+ mov rdx, r9 ; Copy Arg3 to register expected by KVM
|
||||||
|
+ vmmcall ; Call VMMCALL
|
||||||
|
+ pop rbx
|
||||||
|
+ ret
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c
|
||||||
|
index e7c703bb..a64ff2a5 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c
|
||||||
|
@@ -142,3 +142,69 @@ MemEncryptSevClearMmioPageEncMask (
|
||||||
|
EFI_PAGES_TO_SIZE (NumPages)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ This hyercall is used to notify hypervisor when the page's encryption
|
||||||
|
+ state changes.
|
||||||
|
+
|
||||||
|
+ @param[in] PhysicalAddress The physical address that is the start address
|
||||||
|
+ of a memory region.
|
||||||
|
+ @param[in] Pages Number of Pages in the memory region.
|
||||||
|
+ @param[in] IsEncrypted Encrypted or Decrypted.
|
||||||
|
+
|
||||||
|
+ @retval RETURN_SUCCESS Hypercall returned success.
|
||||||
|
+ @retval RETURN_UNSUPPORTED Hypercall not supported.
|
||||||
|
+ @retval RETURN_NO_MAPPING Hypercall returned error.
|
||||||
|
+**/
|
||||||
|
+RETURN_STATUS
|
||||||
|
+EFIAPI
|
||||||
|
+SetMemoryEncDecHypercall3 (
|
||||||
|
+ IN UINTN PhysicalAddress,
|
||||||
|
+ IN UINTN Pages,
|
||||||
|
+ IN BOOLEAN IsEncrypted
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ RETURN_STATUS Ret;
|
||||||
|
+ UINTN Error;
|
||||||
|
+ UINTN EncryptState;
|
||||||
|
+
|
||||||
|
+ Ret = RETURN_UNSUPPORTED;
|
||||||
|
+
|
||||||
|
+ if (MemEncryptSevLiveMigrationIsEnabled ()) {
|
||||||
|
+ Ret = RETURN_SUCCESS;
|
||||||
|
+ //
|
||||||
|
+ // The encryption bit is set/clear on the smallest page size, hence
|
||||||
|
+ // use the 4k page size in MAP_GPA_RANGE hypercall below.
|
||||||
|
+ //
|
||||||
|
+ // Also, when the GCD map is being walked and the c-bit being cleared
|
||||||
|
+ // from MMIO and NonExistent memory spaces, the physical address
|
||||||
|
+ // range being passed may not be page-aligned and adding an assert
|
||||||
|
+ // here prevents booting. Hence, rounding it down when calling
|
||||||
|
+ // SetMemoryEncDecHypercall3AsmStub below.
|
||||||
|
+ //
|
||||||
|
+
|
||||||
|
+ EncryptState = IsEncrypted ? KVM_MAP_GPA_RANGE_ENCRYPTED :
|
||||||
|
+ KVM_MAP_GPA_RANGE_DECRYPTED;
|
||||||
|
+
|
||||||
|
+ Error = SetMemoryEncDecHypercall3AsmStub (
|
||||||
|
+ KVM_HC_MAP_GPA_RANGE,
|
||||||
|
+ PhysicalAddress & ~EFI_PAGE_MASK,
|
||||||
|
+ Pages,
|
||||||
|
+ KVM_MAP_GPA_RANGE_PAGE_SZ_4K | EncryptState
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
+ if (Error != 0) {
|
||||||
|
+ DEBUG ((
|
||||||
|
+ DEBUG_ERROR,
|
||||||
|
+ "SetMemoryEncDecHypercall3 failed, Phys = %x, Pages = %d, Err = %Ld\n",
|
||||||
|
+ PhysicalAddress,
|
||||||
|
+ Pages,
|
||||||
|
+ (INT64)Error
|
||||||
|
+ ));
|
||||||
|
+
|
||||||
|
+ Ret = RETURN_NO_MAPPING;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return Ret;
|
||||||
|
+}
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
@ -0,0 +1,84 @@
|
|||||||
|
From 481f0a191fc03e79bbb52b08c1d4890b6331e68d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
Date: Tue, 5 Apr 2022 16:26:02 +0000
|
||||||
|
Subject: [PATCH 3/9] OvmfPkg/BaseMemEncryptLib: Invoke page encryption state
|
||||||
|
change hypercall
|
||||||
|
|
||||||
|
cherry-picked from https://patchew.org/EDK2/cover.1629380011.git.ashish.kalra@amd.com .
|
||||||
|
|
||||||
|
Invoke the hypercall API to notify hypervisor when the page's
|
||||||
|
encryption state changes.
|
||||||
|
|
||||||
|
Cc: Jordan Justen <jordan.l.justen@intel.com>
|
||||||
|
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
|
||||||
|
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
|
||||||
|
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
---
|
||||||
|
.../X64/PeiDxeVirtualMemory.c | 16 ++++++++++++++++
|
||||||
|
1 file changed, 16 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c
|
||||||
|
index a49cf125..42e3b03f 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c
|
||||||
|
@@ -727,6 +727,7 @@ SetMemoryEncDec (
|
||||||
|
UINT64 PgTableMask;
|
||||||
|
UINT64 AddressEncMask;
|
||||||
|
BOOLEAN IsWpEnabled;
|
||||||
|
+ BOOLEAN CBitChanged;
|
||||||
|
UINTN OrigLength;
|
||||||
|
RETURN_STATUS Status;
|
||||||
|
PHYSICAL_ADDRESS PageAddress;
|
||||||
|
@@ -800,6 +801,7 @@ SetMemoryEncDec (
|
||||||
|
// Save the specified length and physical address (we need it later).
|
||||||
|
//
|
||||||
|
OrigLength = Length;
|
||||||
|
+ CBitChanged = FALSE;
|
||||||
|
OrigPhysicalAddress = PhysicalAddress;
|
||||||
|
|
||||||
|
while (Length != 0) {
|
||||||
|
@@ -860,6 +862,7 @@ SetMemoryEncDec (
|
||||||
|
));
|
||||||
|
PhysicalAddress += BIT30;
|
||||||
|
Length -= BIT30;
|
||||||
|
+ CBitChanged = TRUE;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// We must split the page
|
||||||
|
@@ -915,6 +918,7 @@ SetMemoryEncDec (
|
||||||
|
SetOrClearCBit (&PageDirectory2MEntry->Uint64, Mode);
|
||||||
|
PhysicalAddress += BIT21;
|
||||||
|
Length -= BIT21;
|
||||||
|
+ CBitChanged = TRUE;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// We must split up this page into 4K pages
|
||||||
|
@@ -958,6 +962,7 @@ SetMemoryEncDec (
|
||||||
|
SetOrClearCBit (&PageTableEntry->Uint64, Mode);
|
||||||
|
PhysicalAddress += EFI_PAGE_SIZE;
|
||||||
|
Length -= EFI_PAGE_SIZE;
|
||||||
|
+ CBitChanged = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -990,6 +995,17 @@ SetMemoryEncDec (
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ //
|
||||||
|
+ // Notify Hypervisor on C-bit status
|
||||||
|
+ //
|
||||||
|
+ if (CBitChanged) {
|
||||||
|
+ Status = SetMemoryEncDecHypercall3 (
|
||||||
|
+ OrigPhysicalAddress,
|
||||||
|
+ EFI_SIZE_TO_PAGES (OrigLength),
|
||||||
|
+ (Mode == SetCBit) ? TRUE : FALSE
|
||||||
|
+ );
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
Done:
|
||||||
|
//
|
||||||
|
// Restore page table write protection, if any.
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
From 1058be0934a043804f2ae0b8ea1aa42454dc0eb8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
Date: Tue, 5 Apr 2022 16:27:26 +0000
|
||||||
|
Subject: [PATCH 4/9] OvmfPkg/VmgExitLib: Encryption state change hypercall
|
||||||
|
support in VC handler
|
||||||
|
|
||||||
|
cherry-picked from https://patchew.org/EDK2/cover.1629380011.git.ashish.kalra@amd.com .
|
||||||
|
|
||||||
|
Make the #VC handler aware of the page encryption state
|
||||||
|
change hypercall by adding support to check KVM_HC_MAP_GPA_RANGE
|
||||||
|
hypercall and add the additional register values used by
|
||||||
|
hypercall in the GHCB.
|
||||||
|
|
||||||
|
Cc: Jordan Justen <jordan.l.justen@intel.com>
|
||||||
|
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
|
||||||
|
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
---
|
||||||
|
OvmfPkg/Library/CcExitLib/CcExitVcHandler.c | 13 +++++++++++++
|
||||||
|
1 file changed, 13 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/Library/CcExitLib/CcExitVcHandler.c b/OvmfPkg/Library/CcExitLib/CcExitVcHandler.c
|
||||||
|
index 0fc30f7b..5c9a9085 100644
|
||||||
|
--- a/OvmfPkg/Library/CcExitLib/CcExitVcHandler.c
|
||||||
|
+++ b/OvmfPkg/Library/CcExitLib/CcExitVcHandler.c
|
||||||
|
@@ -677,6 +677,19 @@ VmmCallExit (
|
||||||
|
Ghcb->SaveArea.Cpl = (UINT8)(Regs->Cs & 0x3);
|
||||||
|
CcExitVmgSetOffsetValid (Ghcb, GhcbCpl);
|
||||||
|
|
||||||
|
+ if (Regs->Rax == KVM_HC_MAP_GPA_RANGE) {
|
||||||
|
+ //
|
||||||
|
+ // KVM_HC_MAP_GPA_RANGE hypercall requires these
|
||||||
|
+ // extra registers.
|
||||||
|
+ //
|
||||||
|
+ Ghcb->SaveArea.Rbx = Regs->Rbx;
|
||||||
|
+ CcExitVmgSetOffsetValid (Ghcb, GhcbRbx);
|
||||||
|
+ Ghcb->SaveArea.Rcx = Regs->Rcx;
|
||||||
|
+ CcExitVmgSetOffsetValid (Ghcb, GhcbRcx);
|
||||||
|
+ Ghcb->SaveArea.Rdx = Regs->Rdx;
|
||||||
|
+ CcExitVmgSetOffsetValid (Ghcb, GhcbRdx);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
Status = CcExitVmgExit (Ghcb, SVM_EXIT_VMMCALL, 0, 0);
|
||||||
|
if (Status != 0) {
|
||||||
|
return Status;
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
From 16e7adce62f7c28cc1823229b40a27493737cae6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
Date: Tue, 5 Apr 2022 16:30:54 +0000
|
||||||
|
Subject: [PATCH 5/9] OvmfPkg/PlatformPei: Mark SEC GHCB page as unencrypted
|
||||||
|
via hypercall
|
||||||
|
|
||||||
|
cherry-picked from https://patchew.org/EDK2/cover.1629380011.git.ashish.kalra@amd.com .
|
||||||
|
|
||||||
|
Mark the SEC GHCB page (that is mapped as unencrypted in
|
||||||
|
ResetVector code) in the hypervisor's guest page encryption
|
||||||
|
state tracking.
|
||||||
|
|
||||||
|
Cc: Jordan Justen <jordan.l.justen@intel.com>
|
||||||
|
Cc: Ard Biesheuvel <ard.biesheuvel@arm.com>
|
||||||
|
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
---
|
||||||
|
OvmfPkg/PlatformPei/AmdSev.c | 11 +++++++++++
|
||||||
|
1 file changed, 11 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/PlatformPei/AmdSev.c b/OvmfPkg/PlatformPei/AmdSev.c
|
||||||
|
index e6b602d7..553e841e 100644
|
||||||
|
--- a/OvmfPkg/PlatformPei/AmdSev.c
|
||||||
|
+++ b/OvmfPkg/PlatformPei/AmdSev.c
|
||||||
|
@@ -229,6 +229,17 @@ AmdSevEsInitialize (
|
||||||
|
Status = PcdSetBoolS (PcdSevEsIsEnabled, TRUE);
|
||||||
|
ASSERT_RETURN_ERROR (Status);
|
||||||
|
|
||||||
|
+ //
|
||||||
|
+ // The SEC Ghcb setup during reset-vector needs to be marked as
|
||||||
|
+ // decrypted in the hypervisor's guest page encryption state
|
||||||
|
+ // tracking.
|
||||||
|
+ //
|
||||||
|
+ SetMemoryEncDecHypercall3 (
|
||||||
|
+ FixedPcdGet32 (PcdOvmfSecGhcbBase),
|
||||||
|
+ EFI_SIZE_TO_PAGES (FixedPcdGet32 (PcdOvmfSecGhcbSize)),
|
||||||
|
+ FALSE
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
//
|
||||||
|
// Allocate GHCB and per-CPU variable pages.
|
||||||
|
// Since the pages must survive across the UEFI to OS transition
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
196
0073-OvmfPkg-AmdSevDxe-Add-support-for-SEV-live-migration.patch
Normal file
196
0073-OvmfPkg-AmdSevDxe-Add-support-for-SEV-live-migration.patch
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
From 8d82fca148d9564b666b5f4185a0e78e1f77e230 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
Date: Tue, 5 Apr 2022 16:40:03 +0000
|
||||||
|
Subject: [PATCH 6/9] OvmfPkg/AmdSevDxe: Add support for SEV live migration.
|
||||||
|
|
||||||
|
cherry-picked from https://patchew.org/EDK2/cover.1629380011.git.ashish.kalra@amd.com .
|
||||||
|
|
||||||
|
Check for SEV live migration feature support, if detected
|
||||||
|
setup a new UEFI enviroment variable to indicate OVMF
|
||||||
|
support for SEV live migration.
|
||||||
|
|
||||||
|
This environment variable is created by UEFI but consumed
|
||||||
|
by the (guest) linux kernel. This is actually part of a
|
||||||
|
3-way negotiation of the live migration feature between
|
||||||
|
hypervisor, guest OVMF and guest kernel. Host indicates
|
||||||
|
support for live migration, which is detected by OVMF
|
||||||
|
and correspondingly OVMF sets this SetLiveMigrationEnabled
|
||||||
|
UEFI variable, which is read by the guest kernel and it
|
||||||
|
indicates to the guest kernel that both host and OVMF
|
||||||
|
support and have enabled the live migration feature.
|
||||||
|
|
||||||
|
The new runtime UEFI environment variable is set via the
|
||||||
|
notification function registered for the
|
||||||
|
EFI_END_OF_DXE_EVENT_GROUP_GUID event in AmdSevDxe driver.
|
||||||
|
|
||||||
|
AmdSevDxe module is an apriori driver so it gets loaded between PEI
|
||||||
|
and DXE phases and the SetVariable call will fail at the driver's
|
||||||
|
entry point as the Variable DXE module is still not loaded yet.
|
||||||
|
So we need to wait for an event notification which is signaled
|
||||||
|
after the Variable DXE module is loaded, hence, using the
|
||||||
|
EndOfDxe event notification to make this call.
|
||||||
|
|
||||||
|
Signed-off-by: Ashish Kalra <ashish.kalra@amd.com>
|
||||||
|
---
|
||||||
|
OvmfPkg/AmdSevDxe/AmdSevDxe.c | 67 ++++++++++++++++++++++
|
||||||
|
OvmfPkg/AmdSevDxe/AmdSevDxe.inf | 4 ++
|
||||||
|
OvmfPkg/Include/Guid/AmdSevMemEncryptLib.h | 20 +++++++
|
||||||
|
OvmfPkg/OvmfPkg.dec | 1 +
|
||||||
|
4 files changed, 92 insertions(+)
|
||||||
|
create mode 100644 OvmfPkg/Include/Guid/AmdSevMemEncryptLib.h
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/AmdSevDxe/AmdSevDxe.c b/OvmfPkg/AmdSevDxe/AmdSevDxe.c
|
||||||
|
index db3675ae..e3a8049d 100644
|
||||||
|
--- a/OvmfPkg/AmdSevDxe/AmdSevDxe.c
|
||||||
|
+++ b/OvmfPkg/AmdSevDxe/AmdSevDxe.c
|
||||||
|
@@ -15,10 +15,13 @@
|
||||||
|
#include <Library/BaseMemoryLib.h>
|
||||||
|
#include <Library/DebugLib.h>
|
||||||
|
#include <Library/DxeServicesTableLib.h>
|
||||||
|
+#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
|
#include <Library/MemEncryptSevLib.h>
|
||||||
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Guid/ConfidentialComputingSevSnpBlob.h>
|
||||||
|
+#include <Guid/AmdSevMemEncryptLib.h>
|
||||||
|
+#include <Guid/EventGroup.h>
|
||||||
|
#include <Library/PcdLib.h>
|
||||||
|
#include <Pi/PrePiDxeCis.h>
|
||||||
|
#include <Protocol/SevMemoryAcceptance.h>
|
||||||
|
@@ -191,6 +194,39 @@ STATIC EDKII_MEMORY_ACCEPT_PROTOCOL mMemoryAcceptProtocol = {
|
||||||
|
AmdSevMemoryAccept
|
||||||
|
};
|
||||||
|
|
||||||
|
+STATIC
|
||||||
|
+VOID
|
||||||
|
+EFIAPI
|
||||||
|
+AmdSevDxeOnEndOfDxe (
|
||||||
|
+ IN EFI_EVENT Event,
|
||||||
|
+ IN VOID *EventToSignal
|
||||||
|
+ )
|
||||||
|
+{
|
||||||
|
+ EFI_STATUS Status;
|
||||||
|
+ BOOLEAN SevLiveMigrationEnabled;
|
||||||
|
+
|
||||||
|
+ SevLiveMigrationEnabled = MemEncryptSevLiveMigrationIsEnabled ();
|
||||||
|
+
|
||||||
|
+ if (SevLiveMigrationEnabled) {
|
||||||
|
+ Status = gRT->SetVariable (
|
||||||
|
+ L"SevLiveMigrationEnabled",
|
||||||
|
+ &gAmdSevMemEncryptGuid,
|
||||||
|
+ EFI_VARIABLE_NON_VOLATILE |
|
||||||
|
+ EFI_VARIABLE_BOOTSERVICE_ACCESS |
|
||||||
|
+ EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
|
+ sizeof SevLiveMigrationEnabled,
|
||||||
|
+ &SevLiveMigrationEnabled
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
+ DEBUG ((
|
||||||
|
+ DEBUG_INFO,
|
||||||
|
+ "%a: Setting SevLiveMigrationEnabled variable, status = %lx\n",
|
||||||
|
+ __FUNCTION__,
|
||||||
|
+ Status
|
||||||
|
+ ));
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
EFI_STATUS
|
||||||
|
EFIAPI
|
||||||
|
AmdSevDxeEntryPoint (
|
||||||
|
@@ -203,6 +239,7 @@ AmdSevDxeEntryPoint (
|
||||||
|
UINTN NumEntries;
|
||||||
|
UINTN Index;
|
||||||
|
CONFIDENTIAL_COMPUTING_SNP_BLOB_LOCATION *SnpBootDxeTable;
|
||||||
|
+ EFI_EVENT Event;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Do nothing when SEV is not enabled
|
||||||
|
@@ -361,5 +398,35 @@ AmdSevDxeEntryPoint (
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ //
|
||||||
|
+ // AmdSevDxe module is an apriori driver so it gets loaded between PEI
|
||||||
|
+ // and DXE phases and the SetVariable call will fail at the driver's
|
||||||
|
+ // entry point as the Variable DXE module is still not loaded yet.
|
||||||
|
+ // So we need to wait for an event notification which is signaled
|
||||||
|
+ // after the Variable DXE module is loaded, hence, using the
|
||||||
|
+ // EndOfDxe event notification to make this call.
|
||||||
|
+ //
|
||||||
|
+ // Register EFI_END_OF_DXE_EVENT_GROUP_GUID event.
|
||||||
|
+ // The notification function sets the runtime variable indicating OVMF
|
||||||
|
+ // support for SEV live migration.
|
||||||
|
+ //
|
||||||
|
+ Status = gBS->CreateEventEx (
|
||||||
|
+ EVT_NOTIFY_SIGNAL,
|
||||||
|
+ TPL_CALLBACK,
|
||||||
|
+ AmdSevDxeOnEndOfDxe,
|
||||||
|
+ NULL,
|
||||||
|
+ &gEfiEndOfDxeEventGroupGuid,
|
||||||
|
+ &Event
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
+ if (EFI_ERROR (Status)) {
|
||||||
|
+ DEBUG ((
|
||||||
|
+ DEBUG_ERROR,
|
||||||
|
+ "%a: CreateEventEx(): %r\n",
|
||||||
|
+ __FUNCTION__,
|
||||||
|
+ Status
|
||||||
|
+ ));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
diff --git a/OvmfPkg/AmdSevDxe/AmdSevDxe.inf b/OvmfPkg/AmdSevDxe/AmdSevDxe.inf
|
||||||
|
index e7c7d526..dd1da527 100644
|
||||||
|
--- a/OvmfPkg/AmdSevDxe/AmdSevDxe.inf
|
||||||
|
+++ b/OvmfPkg/AmdSevDxe/AmdSevDxe.inf
|
||||||
|
@@ -57,3 +57,7 @@
|
||||||
|
|
||||||
|
[Pcd]
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
|
||||||
|
+
|
||||||
|
+[Guids]
|
||||||
|
+ gAmdSevMemEncryptGuid
|
||||||
|
+ gEfiEndOfDxeEventGroupGuid ## CONSUMES ## Event
|
||||||
|
diff --git a/OvmfPkg/Include/Guid/AmdSevMemEncryptLib.h b/OvmfPkg/Include/Guid/AmdSevMemEncryptLib.h
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..62d22e79
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/OvmfPkg/Include/Guid/AmdSevMemEncryptLib.h
|
||||||
|
@@ -0,0 +1,20 @@
|
||||||
|
+/** @file
|
||||||
|
+
|
||||||
|
+ AMD Memory Encryption GUID, define a new GUID for defining
|
||||||
|
+ new UEFI environment variables assocaiated with SEV Memory Encryption.
|
||||||
|
+
|
||||||
|
+ Copyright (c) 2021, AMD Inc. All rights reserved.<BR>
|
||||||
|
+
|
||||||
|
+ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
+
|
||||||
|
+**/
|
||||||
|
+
|
||||||
|
+#ifndef __AMD_SEV_MEMENCRYPT_LIB_H__
|
||||||
|
+#define __AMD_SEV_MEMENCRYPT_LIB_H__
|
||||||
|
+
|
||||||
|
+#define AMD_SEV_MEMENCRYPT_GUID \
|
||||||
|
+{0x0cf29b71, 0x9e51, 0x433a, {0xa3, 0xb7, 0x81, 0xf3, 0xab, 0x16, 0xb8, 0x75}}
|
||||||
|
+
|
||||||
|
+extern EFI_GUID gAmdSevMemEncryptGuid;
|
||||||
|
+
|
||||||
|
+#endif
|
||||||
|
diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
|
||||||
|
index 34bca309..d50b1ae3 100644
|
||||||
|
--- a/OvmfPkg/OvmfPkg.dec
|
||||||
|
+++ b/OvmfPkg/OvmfPkg.dec
|
||||||
|
@@ -170,6 +170,7 @@
|
||||||
|
gUefiOvmfPkgTdxAcpiHobGuid = {0x6a0c5870, 0xd4ed, 0x44f4, {0xa1, 0x35, 0xdd, 0x23, 0x8b, 0x6f, 0x0c, 0x8d}}
|
||||||
|
gEfiNonCcFvGuid = {0xae047c6d, 0xbce9, 0x426c, {0xae, 0x03, 0xa6, 0x8e, 0x3b, 0x8a, 0x04, 0x88}}
|
||||||
|
gOvmfVariableGuid = {0x50bea1e5, 0xa2c5, 0x46e9, {0x9b, 0x3a, 0x59, 0x59, 0x65, 0x16, 0xb0, 0x0a}}
|
||||||
|
+ gAmdSevMemEncryptGuid = {0x0cf29b71, 0x9e51, 0x433a, {0xa3, 0xb7, 0x81, 0xf3, 0xab, 0x16, 0xb8, 0x75}}
|
||||||
|
|
||||||
|
[Ppis]
|
||||||
|
# PPI whose presence in the PPI database signals that the TPM base address
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
From fbdd6e4664e41eb299a797f1ab615d81b1bd958b Mon Sep 17 00:00:00 2001
|
||||||
|
From: hanliyang <hanliyang@hygon.cn>
|
||||||
|
Date: Mon, 17 Jan 2022 01:19:21 -0500
|
||||||
|
Subject: [PATCH 7/9] OvmfPkg/BaseMemcryptSevLib: Correct the calculation of
|
||||||
|
page range that notified to hypervisor
|
||||||
|
|
||||||
|
Correct the calculation of page range that notified to hypervisor.
|
||||||
|
|
||||||
|
Signed-off-by: hanliyang <hanliyang@hygon.cn>
|
||||||
|
---
|
||||||
|
.../Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c | 6 +++++-
|
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c
|
||||||
|
index 42e3b03f..69ada871 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c
|
||||||
|
@@ -999,9 +999,13 @@ SetMemoryEncDec (
|
||||||
|
// Notify Hypervisor on C-bit status
|
||||||
|
//
|
||||||
|
if (CBitChanged) {
|
||||||
|
+ UINTN StartPfn = OrigPhysicalAddress >> EFI_PAGE_SHIFT;
|
||||||
|
+ UINTN EndPfn = (OrigPhysicalAddress + OrigLength +
|
||||||
|
+ ((1 << EFI_PAGE_SHIFT) - 1)) >> EFI_PAGE_SHIFT;
|
||||||
|
+
|
||||||
|
Status = SetMemoryEncDecHypercall3 (
|
||||||
|
OrigPhysicalAddress,
|
||||||
|
- EFI_SIZE_TO_PAGES (OrigLength),
|
||||||
|
+ (EndPfn - StartPfn),
|
||||||
|
(Mode == SetCBit) ? TRUE : FALSE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
From 6b7bb04614be39e9903c602dd65ba18426f6a6f2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: hanliyang <hanliyang@hygon.cn>
|
||||||
|
Date: Sun, 19 Jun 2022 18:12:35 +0800
|
||||||
|
Subject: [PATCH 8/9] OvmfPkg/BaseMemEncryptLib: Return SUCCESS if not support
|
||||||
|
SEV live migration
|
||||||
|
|
||||||
|
Add this change to avoid trigger 'ASSERT_EFI_ERROR (Status = Unsupported)'
|
||||||
|
when QEMU doesn't support SEV live migration.
|
||||||
|
|
||||||
|
Signed-off-by: hanliyang <hanliyang@hygon.cn>
|
||||||
|
---
|
||||||
|
OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c | 6 ++++--
|
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c
|
||||||
|
index a64ff2a5..7b29582d 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/MemEncryptSevLib.c
|
||||||
|
@@ -168,10 +168,12 @@ SetMemoryEncDecHypercall3 (
|
||||||
|
UINTN Error;
|
||||||
|
UINTN EncryptState;
|
||||||
|
|
||||||
|
- Ret = RETURN_UNSUPPORTED;
|
||||||
|
+ //
|
||||||
|
+ // Return success if not support migration.
|
||||||
|
+ //
|
||||||
|
+ Ret = RETURN_SUCCESS;
|
||||||
|
|
||||||
|
if (MemEncryptSevLiveMigrationIsEnabled ()) {
|
||||||
|
- Ret = RETURN_SUCCESS;
|
||||||
|
//
|
||||||
|
// The encryption bit is set/clear on the smallest page size, hence
|
||||||
|
// use the 4k page size in MAP_GPA_RANGE hypercall below.
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
159
0076-OvmfPkg-BaseMemEncryptLib-Save-memory-encrypt-status.patch
Normal file
159
0076-OvmfPkg-BaseMemEncryptLib-Save-memory-encrypt-status.patch
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
From d9edefe3936aecbb9640a390cd990f1771e0dac2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xin Jiang <jiangxin@hygon.cn>
|
||||||
|
Date: Wed, 10 Jan 2024 17:34:57 +0800
|
||||||
|
Subject: [PATCH 9/9] OvmfPkg/BaseMemEncryptLib: Save memory encrypt status in
|
||||||
|
reserved memory
|
||||||
|
|
||||||
|
The MMIO routine of VC handler will get memory encrypt status to
|
||||||
|
validate MMIO address. MemEncryptSevGetEncryptionMask() will enable
|
||||||
|
interrupt while interrupt must be disabled during VC.
|
||||||
|
|
||||||
|
During DXE stage, VC routine as below:
|
||||||
|
CcExitHandleVc->MemEncryptSevGetAddressRangeState->
|
||||||
|
MemEncryptSevGetEncryptionMask->PcdGet64(PcdPteMemoryEncryptionAddressOrMask)
|
||||||
|
|
||||||
|
Unfortunately, PcdGet64() will enable interrupt in VC context.
|
||||||
|
|
||||||
|
Signed-off-by: Xin Jiang <jiangxin@hygon.cn>
|
||||||
|
---
|
||||||
|
OvmfPkg/AmdSev/AmdSevX64.fdf | 5 ++++-
|
||||||
|
.../Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf | 4 ++++
|
||||||
|
.../BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c | 9 ++-------
|
||||||
|
OvmfPkg/OvmfPkg.dec | 4 ++++
|
||||||
|
OvmfPkg/OvmfPkgX64.fdf | 5 ++++-
|
||||||
|
OvmfPkg/PlatformPei/AmdSev.c | 2 ++
|
||||||
|
OvmfPkg/PlatformPei/Csv.c | 6 ++++++
|
||||||
|
OvmfPkg/PlatformPei/PlatformPei.inf | 2 ++
|
||||||
|
8 files changed, 28 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/OvmfPkg/AmdSev/AmdSevX64.fdf b/OvmfPkg/AmdSev/AmdSevX64.fdf
|
||||||
|
index 714ab004..b0d9033f 100644
|
||||||
|
--- a/OvmfPkg/AmdSev/AmdSevX64.fdf
|
||||||
|
+++ b/OvmfPkg/AmdSev/AmdSevX64.fdf
|
||||||
|
@@ -80,7 +80,10 @@ gUefiOvmfPkgTokenSpaceGuid.PcdCsvDefaultSecureCallBase|gUefiOvmfPkgTokenSpaceGui
|
||||||
|
0x012000|0x001000
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCsvCpuidBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCsvCpuidSize
|
||||||
|
|
||||||
|
-0x013000|0x00D000
|
||||||
|
+0x013000|0x001000
|
||||||
|
+gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusBase|gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusSize
|
||||||
|
+
|
||||||
|
+0x014000|0x00C000
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
|
||||||
|
|
||||||
|
0x020000|0x0E0000
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf
|
||||||
|
index 4d32fae6..6f2f69d0 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf
|
||||||
|
@@ -61,3 +61,7 @@
|
||||||
|
[Pcd]
|
||||||
|
gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask
|
||||||
|
gEfiMdePkgTokenSpaceGuid.PcdConfidentialComputingGuestAttr
|
||||||
|
+
|
||||||
|
+[FixedPcd]
|
||||||
|
+ gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusBase
|
||||||
|
+ gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusSize
|
||||||
|
diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c
|
||||||
|
index d80ebe2f..a9d43237 100644
|
||||||
|
--- a/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c
|
||||||
|
+++ b/OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLibInternal.c
|
||||||
|
@@ -22,8 +22,6 @@
|
||||||
|
|
||||||
|
STATIC UINT64 mCurrentAttr = 0;
|
||||||
|
STATIC BOOLEAN mCurrentAttrRead = FALSE;
|
||||||
|
-STATIC UINT64 mSevEncryptionMask = 0;
|
||||||
|
-STATIC BOOLEAN mSevEncryptionMaskSaved = FALSE;
|
||||||
|
STATIC BOOLEAN mSevLiveMigrationStatus = FALSE;
|
||||||
|
STATIC BOOLEAN mSevLiveMigrationStatusChecked = FALSE;
|
||||||
|
|
||||||
|
@@ -193,10 +191,7 @@ MemEncryptSevGetEncryptionMask (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
- if (!mSevEncryptionMaskSaved) {
|
||||||
|
- mSevEncryptionMask = PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
|
||||||
|
- mSevEncryptionMaskSaved = TRUE;
|
||||||
|
- }
|
||||||
|
+ UINT64 *MemEncryptStatus = (UINT64 *)(UINT64)FixedPcdGet32 (PcdMemEncrpytStatusBase);
|
||||||
|
|
||||||
|
- return mSevEncryptionMask;
|
||||||
|
+ return *MemEncryptStatus;
|
||||||
|
}
|
||||||
|
diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
|
||||||
|
index d50b1ae3..a6016d58 100644
|
||||||
|
--- a/OvmfPkg/OvmfPkg.dec
|
||||||
|
+++ b/OvmfPkg/OvmfPkg.dec
|
||||||
|
@@ -443,6 +443,10 @@
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCsvCpuidBase|0|UINT32|0x72
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCsvCpuidSize|0|UINT32|0x73
|
||||||
|
|
||||||
|
+ ## the base address of memory encryption status.
|
||||||
|
+ gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusBase|0|UINT32|0x74
|
||||||
|
+ gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusSize|0|UINT32|0x75
|
||||||
|
+
|
||||||
|
[PcdsDynamic, PcdsDynamicEx]
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable|FALSE|BOOLEAN|0x10
|
||||||
|
diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf
|
||||||
|
index b1cf0d99..a34b9f57 100644
|
||||||
|
--- a/OvmfPkg/OvmfPkgX64.fdf
|
||||||
|
+++ b/OvmfPkg/OvmfPkgX64.fdf
|
||||||
|
@@ -100,7 +100,10 @@ gUefiOvmfPkgTokenSpaceGuid.PcdCsvDefaultSecureCallBase|gUefiOvmfPkgTokenSpaceGui
|
||||||
|
0x011000|0x001000
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCsvCpuidBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCsvCpuidSize
|
||||||
|
|
||||||
|
-0x012000|0x00E000
|
||||||
|
+0x012000|0x001000
|
||||||
|
+gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusBase|gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusSize
|
||||||
|
+
|
||||||
|
+0x013000|0x00D000
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamBase|gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPeiTempRamSize
|
||||||
|
|
||||||
|
0x020000|0x0E0000
|
||||||
|
diff --git a/OvmfPkg/PlatformPei/AmdSev.c b/OvmfPkg/PlatformPei/AmdSev.c
|
||||||
|
index 553e841e..7c4ef899 100644
|
||||||
|
--- a/OvmfPkg/PlatformPei/AmdSev.c
|
||||||
|
+++ b/OvmfPkg/PlatformPei/AmdSev.c
|
||||||
|
@@ -379,6 +379,8 @@ AmdSevInitialize (
|
||||||
|
PcdStatus = PcdSet64S (PcdPteMemoryEncryptionAddressOrMask, EncryptionMask);
|
||||||
|
ASSERT_RETURN_ERROR (PcdStatus);
|
||||||
|
|
||||||
|
+ *(UINT64 *)(UINT64)FixedPcdGet32 (PcdMemEncrpytStatusBase) = EncryptionMask;
|
||||||
|
+
|
||||||
|
DEBUG ((DEBUG_INFO, "SEV is enabled (mask 0x%lx)\n", EncryptionMask));
|
||||||
|
|
||||||
|
//
|
||||||
|
diff --git a/OvmfPkg/PlatformPei/Csv.c b/OvmfPkg/PlatformPei/Csv.c
|
||||||
|
index a52112d5..fe8c059b 100644
|
||||||
|
--- a/OvmfPkg/PlatformPei/Csv.c
|
||||||
|
+++ b/OvmfPkg/PlatformPei/Csv.c
|
||||||
|
@@ -33,6 +33,12 @@ CsvInitializeMemInfo (
|
||||||
|
UINT64 LowerMemorySize;
|
||||||
|
UINT64 UpperMemorySize;
|
||||||
|
|
||||||
|
+ BuildMemoryAllocationHob (
|
||||||
|
+ (EFI_PHYSICAL_ADDRESS)(UINTN) FixedPcdGet32 (PcdMemEncrpytStatusBase),
|
||||||
|
+ (UINT64)(UINTN) FixedPcdGet32 (PcdMemEncrpytStatusSize),
|
||||||
|
+ EfiReservedMemoryType
|
||||||
|
+ );
|
||||||
|
+
|
||||||
|
if (!CsvIsEnabled ()) {
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf b/OvmfPkg/PlatformPei/PlatformPei.inf
|
||||||
|
index 07de179f..c2d503fa 100644
|
||||||
|
--- a/OvmfPkg/PlatformPei/PlatformPei.inf
|
||||||
|
+++ b/OvmfPkg/PlatformPei/PlatformPei.inf
|
||||||
|
@@ -137,6 +137,8 @@
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdCsvDefaultSecureCallSize
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCsvCpuidBase
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCsvCpuidSize
|
||||||
|
+ gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusBase
|
||||||
|
+ gUefiOvmfPkgTokenSpaceGuid.PcdMemEncrpytStatusSize
|
||||||
|
|
||||||
|
[FeaturePcd]
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdCsmEnable
|
||||||
|
--
|
||||||
|
2.25.1
|
||||||
|
|
||||||
17
edk2.spec
17
edk2.spec
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
Name: edk2
|
Name: edk2
|
||||||
Version: %{stable_date}
|
Version: %{stable_date}
|
||||||
Release: 14
|
Release: 15
|
||||||
Summary: EFI Development Kit II
|
Summary: EFI Development Kit II
|
||||||
License: BSD-2-Clause-Patent and OpenSSL and MIT
|
License: BSD-2-Clause-Patent and OpenSSL and MIT
|
||||||
URL: https://github.com/tianocore/edk2
|
URL: https://github.com/tianocore/edk2
|
||||||
@ -110,6 +110,18 @@ patch65: 0065-OvmfPkg-Use-classic-mmio-window-for-CSV-guest.patch
|
|||||||
patch66: 0066-NetworkPkg-SECURITY-PATCH-CVE-2023-45237.patch
|
patch66: 0066-NetworkPkg-SECURITY-PATCH-CVE-2023-45237.patch
|
||||||
patch67: 0067-NetworkPkg-TcpDxe-SECURITY-PATCH-CVE-2023-45236.patch
|
patch67: 0067-NetworkPkg-TcpDxe-SECURITY-PATCH-CVE-2023-45236.patch
|
||||||
|
|
||||||
|
# Support live migrate Hygon CSV/CSV2/CSV3 guest
|
||||||
|
patch68: 0068-OvmfPkg-BaseMemEncryptLib-Detect-SEV-live-migration-.patch
|
||||||
|
patch69: 0069-OvmfPkg-BaseMemEncryptLib-Hypercall-API-for-page-enc.patch
|
||||||
|
patch70: 0070-OvmfPkg-BaseMemEncryptLib-Invoke-page-encryption-sta.patch
|
||||||
|
patch71: 0071-OvmfPkg-VmgExitLib-Encryption-state-change-hypercall.patch
|
||||||
|
patch72: 0072-OvmfPkg-PlatformPei-Mark-SEC-GHCB-page-as-unencrypte.patch
|
||||||
|
patch73: 0073-OvmfPkg-AmdSevDxe-Add-support-for-SEV-live-migration.patch
|
||||||
|
patch74: 0074-OvmfPkg-BaseMemcryptSevLib-Correct-the-calculation-o.patch
|
||||||
|
patch75: 0075-OvmfPkg-BaseMemEncryptLib-Return-SUCCESS-if-not-supp.patch
|
||||||
|
# Fix nesting #VC in mmio check
|
||||||
|
patch76: 0076-OvmfPkg-BaseMemEncryptLib-Save-memory-encrypt-status.patch
|
||||||
|
|
||||||
BuildRequires: acpica-tools gcc gcc-c++ libuuid-devel python3 bc nasm python3-unversioned-command isl
|
BuildRequires: acpica-tools gcc gcc-c++ libuuid-devel python3 bc nasm python3-unversioned-command isl
|
||||||
|
|
||||||
%description
|
%description
|
||||||
@ -379,6 +391,9 @@ chmod +x %{buildroot}%{_bindir}/Rsa2048Sha256GenerateKeys
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Oct 23 2024 hanliyang<hanliyang@hygon.cn> - 202308-15
|
||||||
|
- Add support for live migration of Hygon CSV1/2/3 guests, fix nesting #VC
|
||||||
|
|
||||||
* Mon Oct 14 2024 shenyage<shenyage1@huawei.com> - 202308-14
|
* Mon Oct 14 2024 shenyage<shenyage1@huawei.com> - 202308-14
|
||||||
- fix CVE-2023-45236、CVE-2023-45237
|
- fix CVE-2023-45236、CVE-2023-45237
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user