[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v9 14/55] i386/tdx: Set APIC bus rate to match with what TDX modu
From: |
Xiaoyao Li |
Subject: |
[PATCH v9 14/55] i386/tdx: Set APIC bus rate to match with what TDX module enforces |
Date: |
Thu, 8 May 2025 10:59:20 -0400 |
TDX advertises core crystal clock with cpuid[0x15] as 25MHz for TD
guests and it's unchangeable from VMM. As a result, TDX guest reads
the APIC timer at the same frequency, 25MHz.
While KVM's default emulated frequency for APIC bus is 1GHz, set the
APIC bus rate to match with TDX explicitly to ensure KVM provide correct
emulated APIC timer for TD guest.
Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
---
Changes in v6:
- new patch;
---
target/i386/kvm/tdx.c | 13 +++++++++++++
target/i386/kvm/tdx.h | 3 +++
2 files changed, 16 insertions(+)
diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c
index 39fd964c6b27..c96e8eb7b8c2 100644
--- a/target/i386/kvm/tdx.c
+++ b/target/i386/kvm/tdx.c
@@ -254,6 +254,19 @@ int tdx_pre_create_vcpu(CPUState *cpu, Error **errp)
init_vm = g_malloc0(sizeof(struct kvm_tdx_init_vm) +
sizeof(struct kvm_cpuid_entry2) *
KVM_MAX_CPUID_ENTRIES);
+ if (!kvm_check_extension(kvm_state, KVM_CAP_X86_APIC_BUS_CYCLES_NS)) {
+ error_setg(errp, "KVM doesn't support KVM_CAP_X86_APIC_BUS_CYCLES_NS");
+ return -EOPNOTSUPP;
+ }
+
+ r = kvm_vm_enable_cap(kvm_state, KVM_CAP_X86_APIC_BUS_CYCLES_NS,
+ 0, TDX_APIC_BUS_CYCLES_NS);
+ if (r < 0) {
+ error_setg_errno(errp, -r,
+ "Unable to set core crystal clock frequency to
25MHz");
+ return r;
+ }
+
if (tdx_guest->mrconfigid) {
g_autofree uint8_t *data = qbase64_decode(tdx_guest->mrconfigid,
strlen(tdx_guest->mrconfigid), &data_len, errp);
diff --git a/target/i386/kvm/tdx.h b/target/i386/kvm/tdx.h
index e472b11fb0dd..d39e733d9fcc 100644
--- a/target/i386/kvm/tdx.h
+++ b/target/i386/kvm/tdx.h
@@ -16,6 +16,9 @@ typedef struct TdxGuestClass {
X86ConfidentialGuestClass parent_class;
} TdxGuestClass;
+/* TDX requires bus frequency 25MHz */
+#define TDX_APIC_BUS_CYCLES_NS 40
+
typedef struct TdxGuest {
X86ConfidentialGuest parent_obj;
--
2.43.0
- [PATCH v9 06/55] i386/tdx: Introduce is_tdx_vm() helper and cache tdx_guest object, (continued)
- [PATCH v9 06/55] i386/tdx: Introduce is_tdx_vm() helper and cache tdx_guest object, Xiaoyao Li, 2025/05/08
- [PATCH v9 08/55] i386/tdx: Initialize TDX before creating TD vcpus, Xiaoyao Li, 2025/05/08
- [PATCH v9 09/55] i386/tdx: Add property sept-ve-disable for tdx-guest object, Xiaoyao Li, 2025/05/08
- [PATCH v9 10/55] i386/tdx: Make sept_ve_disable set by default, Xiaoyao Li, 2025/05/08
- [PATCH v9 11/55] i386/tdx: Wire CPU features up with attributes of TD guest, Xiaoyao Li, 2025/05/08
- [PATCH v9 12/55] i386/tdx: Validate TD attributes, Xiaoyao Li, 2025/05/08
- [PATCH v9 13/55] i386/tdx: Support user configurable mrconfigid/mrowner/mrownerconfig, Xiaoyao Li, 2025/05/08
- [PATCH v9 14/55] i386/tdx: Set APIC bus rate to match with what TDX module enforces,
Xiaoyao Li <=
- [PATCH v9 15/55] i386/tdx: Implement user specified tsc frequency, Xiaoyao Li, 2025/05/08
- [PATCH v9 16/55] i386/tdx: load TDVF for TD guest, Xiaoyao Li, 2025/05/08
- [PATCH v9 17/55] i386/tdvf: Introduce function to parse TDVF metadata, Xiaoyao Li, 2025/05/08
- [PATCH v9 18/55] i386/tdx: Parse TDVF metadata for TDX VM, Xiaoyao Li, 2025/05/08
- [PATCH v9 19/55] i386/tdx: Don't initialize pc.rom for TDX VMs, Xiaoyao Li, 2025/05/08
- [PATCH v9 20/55] i386/tdx: Track mem_ptr for each firmware entry of TDVF, Xiaoyao Li, 2025/05/08
- [PATCH v9 21/55] i386/tdx: Track RAM entries for TDX VM, Xiaoyao Li, 2025/05/08
- [PATCH v9 22/55] headers: Add definitions from UEFI spec for volumes, resources, etc..., Xiaoyao Li, 2025/05/08
- [PATCH v9 25/55] i386/tdx: Call KVM_TDX_INIT_VCPU to initialize TDX vcpu, Xiaoyao Li, 2025/05/08
- [PATCH v9 26/55] i386/tdx: Finalize TDX VM, Xiaoyao Li, 2025/05/08