OvmfPkg: Add AMD SEV-ES DebugVirtualization feature support

The SEV-ES DebugVirtualization feature enables type B swapping of
debug registers on #VMEXIT and makes #DB and DR7 intercepts
unnecessary and unwanted.

When DebugVirtualization is enabled, this stops booting if
interaction from the HV.

Add new API to PEI, SEC, DXE.

This does not change the existing behaviour yet.

Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Michael Roth <michael.roth@amd.com>
Cc: Min Xu <min.m.xu@intel.com>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Alexey Kardashevskiy <aik@amd.com>
---
Changes:
v5:
* "rb" from Tom

v4:
* s/DebugSwap/DebugVirtualization/
This commit is contained in:
Alexey Kardashevskiy 2022-11-30 19:41:12 +11:00 committed by mergify[bot]
parent 3f28aa2fb0
commit 9f06feb5d2
5 changed files with 74 additions and 3 deletions

View File

@ -166,6 +166,18 @@ MemEncryptSevGetEncryptionMask (
VOID
);
/**
Returns a boolean to indicate whether DebugVirtualization is enabled.
@retval TRUE DebugVirtualization is enabled
@retval FALSE DebugVirtualization is not enabled
**/
BOOLEAN
EFIAPI
MemEncryptSevEsDebugVirtualizationIsEnabled (
VOID
);
/**
Returns the encryption state of the specified virtual address range.

View File

@ -40,19 +40,25 @@ AmdMemEncryptionAttrCheck (
IN CONFIDENTIAL_COMPUTING_GUEST_ATTR Attr
)
{
UINT64 CurrentLevel;
CurrentLevel = CurrentAttr & CCAttrTypeMask;
switch (Attr) {
case CCAttrAmdSev:
//
// SEV is automatically enabled if SEV-ES or SEV-SNP is active.
//
return CurrentAttr >= CCAttrAmdSev;
return CurrentLevel >= CCAttrAmdSev;
case CCAttrAmdSevEs:
//
// SEV-ES is automatically enabled if SEV-SNP is active.
//
return CurrentAttr >= CCAttrAmdSevEs;
return CurrentLevel >= CCAttrAmdSevEs;
case CCAttrAmdSevSnp:
return CurrentAttr == CCAttrAmdSevSnp;
return CurrentLevel == CCAttrAmdSevSnp;
case CCAttrFeatureAmdSevEsDebugVirtualization:
return !!(CurrentAttr & CCAttrFeatureAmdSevEsDebugVirtualization);
default:
return FALSE;
}
@ -159,3 +165,18 @@ MemEncryptSevGetEncryptionMask (
return mSevEncryptionMask;
}
/**
Returns a boolean to indicate whether DebugVirtualization is enabled.
@retval TRUE DebugVirtualization is enabled
@retval FALSE DebugVirtualization is not enabled
**/
BOOLEAN
EFIAPI
MemEncryptSevEsDebugVirtualizationIsEnabled (
VOID
)
{
return ConfidentialComputingGuestHas (CCAttrFeatureAmdSevEsDebugVirtualization);
}

View File

@ -141,3 +141,18 @@ MemEncryptSevGetEncryptionMask (
return SevEsWorkArea->EncryptionMask;
}
/**
Returns a boolean to indicate whether DebugVirtualization is enabled.
@retval TRUE DebugVirtualization is enabled
@retval FALSE DebugVirtualization is not enabled
**/
BOOLEAN
EFIAPI
MemEncryptSevEsDebugVirtualizationIsEnabled (
VOID
)
{
return FALSE;
}

View File

@ -142,6 +142,21 @@ MemEncryptSevGetEncryptionMask (
return SevEsWorkArea->EncryptionMask;
}
/**
Returns a boolean to indicate whether DebugVirtualization is enabled.
@retval TRUE DebugVirtualization is enabled
@retval FALSE DebugVirtualization is not enabled
**/
BOOLEAN
EFIAPI
MemEncryptSevEsDebugVirtualizationIsEnabled (
VOID
)
{
return FALSE;
}
/**
Locate the page range that covers the initial (pre-SMBASE-relocation) SMRAM
Save State Map.

View File

@ -1609,6 +1609,10 @@ Dr7WriteExit (
UINT64 *Register;
UINT64 Status;
if (MemEncryptSevEsDebugVirtualizationIsEnabled ()) {
return UnsupportedExit (Ghcb, Regs, InstructionData);
}
Ext = &InstructionData->Ext;
SevEsData = (SEV_ES_PER_CPU_DATA *)(Ghcb + 1);
@ -1659,6 +1663,10 @@ Dr7ReadExit (
SEV_ES_PER_CPU_DATA *SevEsData;
UINT64 *Register;
if (MemEncryptSevEsDebugVirtualizationIsEnabled ()) {
return UnsupportedExit (Ghcb, Regs, InstructionData);
}
Ext = &InstructionData->Ext;
SevEsData = (SEV_ES_PER_CPU_DATA *)(Ghcb + 1);