Skip to content

Commit

Permalink
Fix detection of TDX confidential VM on Azure platform
Browse files Browse the repository at this point in the history
The original CVM detection logic for TDX assumes that the guest can see
the standard TDX CPUID leaf. This was true in Azure when this code was
originally written, however, current Azure now blocks that leaf in the
paravisor. Instead it is required to use the same Azure specific CPUID
leaf that is used for SEV-SNP detection, which reports the VM isolation
type.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
(cherry picked from commit 9d7be044cad1ae54e344daf8f2ec37da46faf0fd)

Related: RHEL-50651
  • Loading branch information
berrange authored and github-actions[bot] committed Aug 22, 2024
1 parent 23d5887 commit adb6c21
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 6 deletions.
11 changes: 8 additions & 3 deletions src/basic/confidential-virt.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ static uint64_t msr(uint64_t index) {
return ret;
}

static bool detect_hyperv_sev(void) {
static bool detect_hyperv_cvm(uint32_t isoltype) {
uint32_t eax, ebx, ecx, edx, feat;
char sig[13] = {};

Expand All @@ -101,7 +101,7 @@ static bool detect_hyperv_sev(void) {
ebx = ecx = edx = 0;
cpuid(&eax, &ebx, &ecx, &edx);

if ((ebx & CPUID_HYPERV_ISOLATION_TYPE_MASK) == CPUID_HYPERV_ISOLATION_TYPE_SNP)
if ((ebx & CPUID_HYPERV_ISOLATION_TYPE_MASK) == isoltype)
return true;
}

Expand Down Expand Up @@ -134,7 +134,7 @@ static ConfidentialVirtualization detect_sev(void) {
if (!(eax & EAX_SEV)) {
log_debug("No sev in CPUID, trying hyperv CPUID");

if (detect_hyperv_sev())
if (detect_hyperv_cvm(CPUID_HYPERV_ISOLATION_TYPE_SNP))
return CONFIDENTIAL_VIRTUALIZATION_SEV_SNP;

log_debug("No hyperv CPUID");
Expand Down Expand Up @@ -172,6 +172,11 @@ static ConfidentialVirtualization detect_tdx(void) {
if (memcmp(sig, CPUID_SIG_INTEL_TDX, sizeof(sig)) == 0)
return CONFIDENTIAL_VIRTUALIZATION_TDX;

log_debug("No tdx in CPUID, trying hyperv CPUID");

if (detect_hyperv_cvm(CPUID_HYPERV_ISOLATION_TYPE_TDX))
return CONFIDENTIAL_VIRTUALIZATION_TDX;

return CONFIDENTIAL_VIRTUALIZATION_NONE;
}

Expand Down
9 changes: 6 additions & 3 deletions src/boot/efi/vmm.c
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ static uint64_t msr(uint32_t index) {
return val;
}

static bool detect_hyperv_sev(void) {
static bool detect_hyperv_cvm(uint32_t isoltype) {
uint32_t eax, ebx, ecx, edx, feat;
char sig[13] = {};

Expand All @@ -370,7 +370,7 @@ static bool detect_hyperv_sev(void) {
if (ebx & CPUID_HYPERV_ISOLATION && !(ebx & CPUID_HYPERV_CPU_MANAGEMENT)) {
__cpuid(CPUID_HYPERV_ISOLATION_CONFIG, eax, ebx, ecx, edx);

if ((ebx & CPUID_HYPERV_ISOLATION_TYPE_MASK) == CPUID_HYPERV_ISOLATION_TYPE_SNP)
if ((ebx & CPUID_HYPERV_ISOLATION_TYPE_MASK) == isoltype)
return true;
}

Expand All @@ -395,7 +395,7 @@ static bool detect_sev(void) {
* specific CPUID checks.
*/
if (!(eax & EAX_SEV))
return detect_hyperv_sev();
return detect_hyperv_cvm(CPUID_HYPERV_ISOLATION_TYPE_SNP);

msrval = msr(MSR_AMD64_SEV);

Expand All @@ -419,6 +419,9 @@ static bool detect_tdx(void) {
if (memcmp(sig, CPUID_SIG_INTEL_TDX, sizeof(sig)) == 0)
return true;

if (detect_hyperv_cvm(CPUID_HYPERV_ISOLATION_TYPE_TDX))
return true;

return false;
}
#endif /* ! __i386__ && ! __x86_64__ */
Expand Down
1 change: 1 addition & 0 deletions src/fundamental/confidential-virt-fundamental.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@

#define CPUID_HYPERV_ISOLATION_TYPE_MASK UINT32_C(0xf)
#define CPUID_HYPERV_ISOLATION_TYPE_SNP 2
#define CPUID_HYPERV_ISOLATION_TYPE_TDX 3

#define EAX_SEV (UINT32_C(1) << 1)
#define MSR_SEV (UINT64_C(1) << 0)
Expand Down

0 comments on commit adb6c21

Please sign in to comment.