OvmfPkg: Don't make APIC MMIO accesses with encryption bit set

For the most part, OVMF will clear the encryption bit for MMIO regions,
but there is currently one known exception during SEC when the APIC
base address is accessed via MMIO with the encryption bit set for
SEV-ES/SEV-SNP guests. In the case of SEV-SNP, this requires special
handling on the hypervisor side which may not be available in the
future[1], so make the necessary changes in the SEC-configured page
table to clear the encryption bit for 4K region containing the APIC
base address.

[1] https://lore.kernel.org/lkml/20240208002420.34mvemnzrwwsaesw@amd.com/#t

Suggested-by: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Min Xu <min.m.xu@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Jianyong Wu <jianyong.wu@arm.com>
Cc: Anatol Belski <anbelski@linux.microsoft.com>
Signed-off-by: Michael Roth <michael.roth@amd.com>
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Michael Roth
2024-05-02 13:49:26 +02:00
committed by mergify[bot]
parent fd290ab862
commit f0ed194236
10 changed files with 97 additions and 3 deletions

View File

@@ -91,4 +91,18 @@ SevSnpIsEnabled (
VOID
);
/**
Map MMIO regions unencrypted if SEV-ES is active.
During early booting, page table entries default to having the encryption bit
set for SEV-ES/SEV-SNP guests. In cases where there is MMIO to an address, the
encryption bit should be cleared. Clear it here for any known MMIO accesses
during SEC, which is currently just the APIC base address.
**/
VOID
SecMapApicBaseUnencrypted (
VOID
);
#endif