From 481f0a191fc03e79bbb52b08c1d4890b6331e68d Mon Sep 17 00:00:00 2001 From: Ashish Kalra 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 Cc: Ard Biesheuvel Signed-off-by: Brijesh Singh Signed-off-by: Ashish Kalra --- .../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