81 lines
2.8 KiB
Diff
81 lines
2.8 KiB
Diff
From 0d8993cabc26807ef973630f38ec2b09557497fe Mon Sep 17 00:00:00 2001
|
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
Date: Fri, 18 Jul 2025 18:03:48 +0200
|
|
Subject: [PATCH 079/115] i386/cgs: Introduce
|
|
x86_confidential_guest_check_features()
|
|
|
|
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
|
|
RH-MergeRequest: 391: TDX support, including attestation and device assignment
|
|
RH-Jira: RHEL-15710 RHEL-20798 RHEL-49728
|
|
RH-Acked-by: Yash Mankad <None>
|
|
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
|
RH-Acked-by: David Hildenbrand <david@redhat.com>
|
|
RH-Commit: [79/115] 1fce5742b7746e6ba589c486fb1a6aec8ab8391a (bonzini/rhel-qemu-kvm)
|
|
|
|
To do cgs specific feature checking. Note the feature checking in
|
|
x86_cpu_filter_features() is valid for non-cgs VMs. For cgs VMs like
|
|
TDX, what features can be supported has more restrictions.
|
|
|
|
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
|
|
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
|
|
Link: https://lore.kernel.org/r/20250508150002.689633-51-xiaoyao.li@intel.com
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
(cherry picked from commit dc0b08b303ad34983b43936a4c978672e0f9a9d8)
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
---
|
|
target/i386/confidential-guest.h | 13 +++++++++++++
|
|
target/i386/kvm/kvm.c | 8 ++++++++
|
|
2 files changed, 21 insertions(+)
|
|
|
|
diff --git a/target/i386/confidential-guest.h b/target/i386/confidential-guest.h
|
|
index 8a5cc7ecff..4e7eb43416 100644
|
|
--- a/target/i386/confidential-guest.h
|
|
+++ b/target/i386/confidential-guest.h
|
|
@@ -42,6 +42,7 @@ struct X86ConfidentialGuestClass {
|
|
void (*cpu_instance_init)(X86ConfidentialGuest *cg, CPUState *cpu);
|
|
uint32_t (*adjust_cpuid_features)(X86ConfidentialGuest *cg, uint32_t feature,
|
|
uint32_t index, int reg, uint32_t value);
|
|
+ int (*check_features)(X86ConfidentialGuest *cg, CPUState *cs);
|
|
};
|
|
|
|
/**
|
|
@@ -91,4 +92,16 @@ static inline int x86_confidential_guest_adjust_cpuid_features(X86ConfidentialGu
|
|
}
|
|
}
|
|
|
|
+static inline int x86_confidential_guest_check_features(X86ConfidentialGuest *cg,
|
|
+ CPUState *cs)
|
|
+{
|
|
+ X86ConfidentialGuestClass *klass = X86_CONFIDENTIAL_GUEST_GET_CLASS(cg);
|
|
+
|
|
+ if (klass->check_features) {
|
|
+ return klass->check_features(cg, cs);
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
#endif
|
|
diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c
|
|
index 76352323e4..b6fddcd543 100644
|
|
--- a/target/i386/kvm/kvm.c
|
|
+++ b/target/i386/kvm/kvm.c
|
|
@@ -2081,6 +2081,14 @@ int kvm_arch_init_vcpu(CPUState *cs)
|
|
int r;
|
|
Error *local_err = NULL;
|
|
|
|
+ if (current_machine->cgs) {
|
|
+ r = x86_confidential_guest_check_features(
|
|
+ X86_CONFIDENTIAL_GUEST(current_machine->cgs), cs);
|
|
+ if (r < 0) {
|
|
+ return r;
|
|
+ }
|
|
+ }
|
|
+
|
|
memset(&cpuid_data, 0, sizeof(cpuid_data));
|
|
|
|
cpuid_i = 0;
|
|
--
|
|
2.50.1
|
|
|