Ovmfpkg/CcExitLib: Provide SVSM discovery support

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4654

The SVSM specification documents an alternative method of discovery for
the SVSM using a reserved CPUID bit and a reserved MSR.

For the CPUID support, the #VC handler of an SEV-SNP guest should modify
the returned value in the EAX register for the 0x8000001f CPUID function
by setting bit 28 when an SVSM is present.

For the MSR support, new reserved MSR 0xc001f000 has been defined. A #VC
should be generated when accessing this MSR. The #VC handler is expected
to ignore writes to this MSR and return the physical calling area address
(CAA) on reads of this MSR.

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: Laszlo Ersek <lersek@redhat.com>
Cc: Michael Roth <michael.roth@amd.com>
Cc: Min Xu <min.m.xu@intel.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
This commit is contained in:
Tom Lendacky
2024-03-08 07:32:50 -08:00
committed by mergify[bot]
parent a010681f74
commit 47001ab989
3 changed files with 31 additions and 4 deletions

View File

@@ -1,7 +1,7 @@
## @file ## @file
# CcExitLib Library. # CcExitLib Library.
# #
# Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR> # Copyright (C) 2020 - 2024, Advanced Micro Devices, Inc. All rights reserved.<BR>
# Copyright (C) 2020 - 2022, Intel Corporation. All rights reserved.<BR> # Copyright (C) 2020 - 2022, Intel Corporation. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent # SPDX-License-Identifier: BSD-2-Clause-Patent
# #
@@ -41,6 +41,7 @@
DebugLib DebugLib
LocalApicLib LocalApicLib
MemEncryptSevLib MemEncryptSevLib
AmdSvsmLib
[Pcd] [Pcd]
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidBase

View File

@@ -1,7 +1,7 @@
/** @file /** @file
X64 #VC Exception Handler functon. X64 #VC Exception Handler functon.
Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR> Copyright (C) 2020 - 2024, Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@@ -12,6 +12,7 @@
#include <Library/LocalApicLib.h> #include <Library/LocalApicLib.h>
#include <Library/MemEncryptSevLib.h> #include <Library/MemEncryptSevLib.h>
#include <Library/CcExitLib.h> #include <Library/CcExitLib.h>
#include <Library/AmdSvsmLib.h>
#include <Register/Amd/Msr.h> #include <Register/Amd/Msr.h>
#include <Register/Intel/Cpuid.h> #include <Register/Intel/Cpuid.h>
#include <IndustryStandard/InstructionParsing.h> #include <IndustryStandard/InstructionParsing.h>
@@ -713,10 +714,29 @@ MsrExit (
IN CC_INSTRUCTION_DATA *InstructionData IN CC_INSTRUCTION_DATA *InstructionData
) )
{ {
UINT64 ExitInfo1, Status; MSR_SVSM_CAA_REGISTER Msr;
UINT64 ExitInfo1;
UINT64 Status;
ExitInfo1 = 0; ExitInfo1 = 0;
//
// The SVSM CAA MSR is a software implemented MSR and not supported
// by the hardware, handle it directly.
//
if (Regs->Rax == MSR_SVSM_CAA) {
// Writes to the SVSM CAA MSR are ignored
if (*(InstructionData->OpCodes + 1) == 0x30) {
return 0;
}
Msr.Uint64 = AmdSvsmSnpGetCaa ();
Regs->Rax = Msr.Bits.Lower32Bits;
Regs->Rdx = Msr.Bits.Upper32Bits;
return 0;
}
switch (*(InstructionData->OpCodes + 1)) { switch (*(InstructionData->OpCodes + 1)) {
case 0x30: // WRMSR case 0x30: // WRMSR
ExitInfo1 = 1; ExitInfo1 = 1;
@@ -1388,6 +1408,11 @@ GetCpuidFw (
*Ebx = (*Ebx & 0xFFFFFF00) | (Ebx2 & 0x000000FF); *Ebx = (*Ebx & 0xFFFFFF00) | (Ebx2 & 0x000000FF);
/* node ID */ /* node ID */
*Ecx = (*Ecx & 0xFFFFFF00) | (Ecx2 & 0x000000FF); *Ecx = (*Ecx & 0xFFFFFF00) | (Ecx2 & 0x000000FF);
} else if (EaxIn == 0x8000001F) {
/* Set the SVSM feature bit if running under an SVSM */
if (AmdSvsmIsSvsmPresent ()) {
*Eax |= BIT28;
}
} }
Out: Out:

View File

@@ -1,7 +1,7 @@
## @file ## @file
# VMGEXIT Support Library. # VMGEXIT Support Library.
# #
# Copyright (C) 2020, Advanced Micro Devices, Inc. All rights reserved.<BR> # Copyright (C) 2020 - 2024, Advanced Micro Devices, Inc. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent # SPDX-License-Identifier: BSD-2-Clause-Patent
# #
## ##
@@ -41,6 +41,7 @@
LocalApicLib LocalApicLib
MemEncryptSevLib MemEncryptSevLib
PcdLib PcdLib
AmdSvsmLib
[FixedPcd] [FixedPcd]
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBackupBase