[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 21/47] x86/xen: Obtain TSC frequency from CPUID if present
- To: Paolo Bonzini <pbonzini@xxxxxxxxxx>, Thomas Gleixner <tglx@xxxxxxxxxx>, Ingo Molnar <mingo@xxxxxxxxxx>, Borislav Petkov <bp@xxxxxxxxx>, Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>, x86@xxxxxxxxxx, Kiryl Shutsemau <kas@xxxxxxxxxx>, Sean Christopherson <seanjc@xxxxxxxxxx>, "K. Y. Srinivasan" <kys@xxxxxxxxxxxxx>, Haiyang Zhang <haiyangz@xxxxxxxxxxxxx>, Wei Liu <wei.liu@xxxxxxxxxx>, Dexuan Cui <decui@xxxxxxxxxxxxx>, Long Li <longli@xxxxxxxxxxxxx>, Ajay Kaher <ajay.kaher@xxxxxxxxxxxx>, Alexey Makhalov <alexey.makhalov@xxxxxxxxxxxx>, Jan Kiszka <jan.kiszka@xxxxxxxxxxx>, Andy Lutomirski <luto@xxxxxxxxxx>, Peter Zijlstra <peterz@xxxxxxxxxxxxx>, Juergen Gross <jgross@xxxxxxxx>, Daniel Lezcano <daniel.lezcano@xxxxxxxxxx>, John Stultz <jstultz@xxxxxxxxxx>
- From: Sean Christopherson <seanjc@xxxxxxxxxx>
- Date: Fri, 29 May 2026 07:44:08 -0700
- Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=20251104 header.d=google.com header.i="@google.com" header.h="Cc:To:From:Subject:Message-ID:References:Mime-Version:In-Reply-To:Date:Reply-To"
- Cc: "H. Peter Anvin" <hpa@xxxxxxxxx>, Rick Edgecombe <rick.p.edgecombe@xxxxxxxxx>, Vitaly Kuznetsov <vkuznets@xxxxxxxxxx>, Broadcom internal kernel review list <bcm-kernel-feedback-list@xxxxxxxxxxxx>, Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>, Stephen Boyd <sboyd@xxxxxxxxxx>, kvm@xxxxxxxxxxxxxxx, linux-kernel@xxxxxxxxxxxxxxx, linux-coco@xxxxxxxxxxxxxxx, linux-hyperv@xxxxxxxxxxxxxxx, virtualization@xxxxxxxxxxxxxxx, xen-devel@xxxxxxxxxxxxxxxxxxxx, David Woodhouse <dwmw@xxxxxxxxxxxx>, Tom Lendacky <thomas.lendacky@xxxxxxx>, Nikunj A Dadhania <nikunj@xxxxxxx>, David Woodhouse <dwmw2@xxxxxxxxxxxxx>, Michael Kelley <mhklinux@xxxxxxxxxxx>, Thomas Gleixner <tglx@xxxxxxxxxxxxx>
- Delivery-date: Fri, 29 May 2026 14:45:27 +0000
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
From: David Woodhouse <dwmw@xxxxxxxxxxxx>
The Xen CPUID leaf 3, sub-leaf 0, ECX provides the guest TSC frequency
in kHz directly. Use it when available instead of reverse-calculating
the frequency from the pvclock tsc_to_system_mul and tsc_shift values,
which loses precision.
This mirrors the equivalent change for KVM guests using the generic
0x40000010 timing leaf.
Signed-off-by: David Woodhouse <dwmw@xxxxxxxxxxxx>
[sean: drop non-Xen changes]
Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx>
---
arch/x86/xen/time.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
index 487ad838c441..36d66abf5379 100644
--- a/arch/x86/xen/time.c
+++ b/arch/x86/xen/time.c
@@ -42,6 +42,17 @@ static unsigned int __init xen_tsc_khz(void)
{
struct pvclock_vcpu_time_info *info =
&HYPERVISOR_shared_info->vcpu_info[0].time;
+ u32 base = xen_cpuid_base();
+ u32 eax, ebx, ecx, edx;
+
+ /*
+ * If Xen provides the guest TSC frequency directly in CPUID
+ * (leaf 3, sub-leaf 0, ECX), use that instead of reverse-
+ * calculating from the pvclock mul/shift.
+ */
+ cpuid_count(base + 3, 0, &eax, &ebx, &ecx, &edx);
+ if (ecx)
+ return ecx;
return pvclock_tsc_khz(info);
}
--
2.54.0.823.g6e5bcc1fc9-goog
|