The live migration of Hygon CSV1/2/3 guest depends on the KVM
hypercall KVM_HC_MAP_GPA_RANGE, add code to sync page enc/dec
status to KVM.
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)
Signed-off-by: hanliyang <hanliyang@hygon.cn>
85 lines
2.8 KiB
Diff
85 lines
2.8 KiB
Diff
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
|
|
|