From nobody Mon Feb 9 23:39:34 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=reject dis=none) header.from=google.com ARC-Seal: i=1; a=rsa-sha256; t=1738376299; cv=none; d=zohomail.com; s=zohoarc; b=SDGAEGOExHw3m6mrUsaaUVzvj9QYS5H3IgSq7XWUSZ/T0IUgsyxyCHMk13hTwY3SKHKXK3lo8UE8vo5Aqzfd2pqLwOfSJDSCZwzCj6NVvT9LB8xQUYOAdvXqAArChbAWNAe5Ur4r9M5DHyCNN9t5CxPvMkxqA+mu8DubZF+tF6I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1738376299; h=Content-Type:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Sender:Subject:Subject:To:To:Message-Id; bh=jT3QYFJ8LBBvWgIRRoR6lTexg7BmHolHr3L1o5rQg1s=; b=nKphWTVxqRhfYl2xHKF3esuIe7+dkrv9jop6Zc+OmQcfwhCU49xXxLnar1w3yddsY4xgFOangVZh6UiL8WwfMsMNQSzo2+O5Kv9zGl1HjSqvqKdJ9pOTcnPObs0qSlHwKRnzZVTvAAol4E0nppyjoeWE73m3AutIhlB44/M47VQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1738376299937804.9577733768216; Fri, 31 Jan 2025 18:18:19 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.880053.1290236 (Exim 4.92) (envelope-from ) id 1te34i-0003Pn-EI; Sat, 01 Feb 2025 02:17:36 +0000 Received: by outflank-mailman (output) from mailman id 880053.1290236; Sat, 01 Feb 2025 02:17:36 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1te34i-0003Pc-94; Sat, 01 Feb 2025 02:17:36 +0000 Received: by outflank-mailman (input) for mailman id 880053; Sat, 01 Feb 2025 02:17:34 +0000 Received: from se1-gles-sth1-in.inumbo.com ([159.253.27.254] helo=se1-gles-sth1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1te34g-0002sH-M0 for xen-devel@lists.xenproject.org; Sat, 01 Feb 2025 02:17:34 +0000 Received: from mail-pj1-x104a.google.com (mail-pj1-x104a.google.com [2607:f8b0:4864:20::104a]) by se1-gles-sth1.inumbo.com (Halon) with ESMTPS id b200b74d-e042-11ef-a0e6-8be0dac302b0; Sat, 01 Feb 2025 03:17:34 +0100 (CET) Received: by mail-pj1-x104a.google.com with SMTP id 98e67ed59e1d1-2f83e54432dso7100254a91.2 for ; Fri, 31 Jan 2025 18:17:33 -0800 (PST) X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: b200b74d-e042-11ef-a0e6-8be0dac302b0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1738376252; x=1738981052; darn=lists.xenproject.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:from:to:cc:subject:date:message-id:reply-to; bh=jT3QYFJ8LBBvWgIRRoR6lTexg7BmHolHr3L1o5rQg1s=; b=oHtEnZlRs3Us4Ysu0VZNwBG4benWVKrzDWzbxfnBjOJ/GAr3qPXibzYNm/vrVOl+V1 4cQPdxUo8E9ErX5oZdUAvU2Ev4FK/Hu/UjmABKz1dZwxnjJsD4AYRJSjR0Alnd9zX1/G BWKLjBXaLeu3HjgSujOFG10J7CYH1wrcGec6edMtz4r3nLG4vqX9c2JgxrP5xsSjw+Ws v79KN69Mi/bTJSU2sF7IFj0HuQBMoiJg2vxB6HsZaDCR5pRfgcd1tXNPnvWneNCfD+Bk 69bUS7oH4QFOglzHhkTYTWXIs0pVCpNaXqInwRQWfldOfExJQicyR2EU3jJLwE/A74nu JUlQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738376252; x=1738981052; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:reply-to:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=jT3QYFJ8LBBvWgIRRoR6lTexg7BmHolHr3L1o5rQg1s=; b=GYW/3uzzL5W7T34QInx6kYUx+pASf7sPFhsRKedJ0ngojBoP4WOHmnO6zsqZsxWa4Y 0gzzJ5zpk/OJQZY0q3mNX+57fvEv/Y5OkbzoVntQrJt+dIWIRNKFLv1ZylzsuV5tjLX2 lx5nIgJDQ/OulVFfeUv1fJF+GmHZ1sIFMFVERhDB5nKcSS9NvVu5KMASFyP2GYm/nJUP c7hXUuygjq+tSLhWIQ794H21DHAKhPK+b3Jx9TZzotUCRckPIDThefZv4++RN+f2Pkl3 JQWXJnmldBDsG4TWoItH4mxsrHP2KzwfBiVm5gQCFDbFbDOmm4+cqsZlhsjIUai87rPh q/WQ== X-Forwarded-Encrypted: i=1; AJvYcCX0YwXo+7Qk9UjampzheYqlKyZKcS8a388VwRoe0G/dWp9WA/Llt8zGcraO4UNLdq+i7oG8Mw9w2Jk=@lists.xenproject.org X-Gm-Message-State: AOJu0YyUHm4yq7vgqhEX3OJOGSMo1vvKeqQoNyTFxRA4R6tCv2nuz2sH K08Wauj5ijH+J3Ar3ucDMox2fiC6V/lG1oVuzDkRRYqW5xyAJe3I0Gg6FCOo9p/hqASbj3qR1vw WRA== X-Google-Smtp-Source: AGHT+IENOAlD/a9C1yscB8pt52goTvVVex1rnSy0sEVpxDmpsSGOR0udgFhGxI9toBaldalY7yVRQJOWBrI= X-Received: from pjbqj6.prod.google.com ([2002:a17:90b:28c6:b0:2ef:6fb0:55fb]) (user=seanjc job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90a:c887:b0:2ee:a744:a4fe with SMTP id 98e67ed59e1d1-2f83ac5cbf4mr18887576a91.25.1738376252521; Fri, 31 Jan 2025 18:17:32 -0800 (PST) Reply-To: Sean Christopherson Date: Fri, 31 Jan 2025 18:17:05 -0800 In-Reply-To: <20250201021718.699411-1-seanjc@google.com> Mime-Version: 1.0 References: <20250201021718.699411-1-seanjc@google.com> X-Mailer: git-send-email 2.48.1.362.g079036d154-goog Message-ID: <20250201021718.699411-4-seanjc@google.com> Subject: [PATCH 03/16] x86/tsc: Add helper to register CPU and TSC freq calibration routines From: Sean Christopherson To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "Kirill A. Shutemov" , Juergen Gross , "K. Y. Srinivasan" , Haiyang Zhang , Wei Liu , Dexuan Cui , Ajay Kaher , Alexey Makhalov , Jan Kiszka , Paolo Bonzini , Andy Lutomirski , Peter Zijlstra Cc: linux-kernel@vger.kernel.org, linux-coco@lists.linux.dev, virtualization@lists.linux.dev, linux-hyperv@vger.kernel.org, jailhouse-dev@googlegroups.com, kvm@vger.kernel.org, xen-devel@lists.xenproject.org, Sean Christopherson , Nikunj A Dadhania , Tom Lendacky X-ZohoMail-DKIM: pass (identity @google.com) X-ZM-MESSAGEID: 1738376302177019000 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a helper to register non-native, i.e. PV and CoCo, CPU and TSC frequency calibration routines. This will allow consolidating handling of common TSC properties that are forced by hypervisor (PV routines), and will also allow adding sanity checks to guard against overriding a TSC calibration routine with a routine that is less robust/trusted. Make the CPU calibration routine optional, as Xen (very sanely) doesn't assume the CPU runs as the same frequency as the TSC. Wrap the helper in an #ifdef to document that the kernel overrides the native routines when running as a VM, and to guard against unwanted usage. Add a TODO to call out that AMD_MEM_ENCRYPT is a mess and doesn't depend on HYPERVISOR_GUEST because it gates both guest and host code. No functional change intended. Signed-off-by: Sean Christopherson --- arch/x86/coco/sev/core.c | 4 ++-- arch/x86/include/asm/tsc.h | 4 ++++ arch/x86/kernel/cpu/acrn.c | 4 ++-- arch/x86/kernel/cpu/mshyperv.c | 3 +-- arch/x86/kernel/cpu/vmware.c | 4 ++-- arch/x86/kernel/jailhouse.c | 4 ++-- arch/x86/kernel/kvmclock.c | 4 ++-- arch/x86/kernel/tsc.c | 17 +++++++++++++++++ arch/x86/xen/time.c | 2 +- 9 files changed, 33 insertions(+), 13 deletions(-) diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c index 82492efc5d94..684cef70edc1 100644 --- a/arch/x86/coco/sev/core.c +++ b/arch/x86/coco/sev/core.c @@ -3291,6 +3291,6 @@ void __init snp_secure_tsc_init(void) rdmsrl(MSR_AMD64_GUEST_TSC_FREQ, tsc_freq_mhz); snp_tsc_freq_khz =3D (unsigned long)(tsc_freq_mhz * 1000); =20 - x86_platform.calibrate_cpu =3D securetsc_get_tsc_khz; - x86_platform.calibrate_tsc =3D securetsc_get_tsc_khz; + tsc_register_calibration_routines(securetsc_get_tsc_khz, + securetsc_get_tsc_khz); } diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index 540e2a31c87d..82a6cc27cafb 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h @@ -87,6 +87,10 @@ static inline int cpuid_get_cpu_freq(unsigned int *cpu_k= hz) =20 extern void tsc_early_init(void); extern void tsc_init(void); +#if defined(CONFIG_HYPERVISOR_GUEST) || defined(CONFIG_AMD_MEM_ENCRYPT) +extern void tsc_register_calibration_routines(unsigned long (*calibrate_ts= c)(void), + unsigned long (*calibrate_cpu)(void)); +#endif extern void mark_tsc_unstable(char *reason); extern int unsynchronized_tsc(void); extern int check_tsc_unstable(void); diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c index 2c5b51aad91a..c1506cb87d8c 100644 --- a/arch/x86/kernel/cpu/acrn.c +++ b/arch/x86/kernel/cpu/acrn.c @@ -29,8 +29,8 @@ static void __init acrn_init_platform(void) /* Install system interrupt handler for ACRN hypervisor callback */ sysvec_install(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback); =20 - x86_platform.calibrate_tsc =3D acrn_get_tsc_khz; - x86_platform.calibrate_cpu =3D acrn_get_tsc_khz; + tsc_register_calibration_routines(acrn_get_tsc_khz, + acrn_get_tsc_khz); } =20 static bool acrn_x2apic_available(void) diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index f285757618fc..aa60491bf738 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -478,8 +478,7 @@ static void __init ms_hyperv_init_platform(void) =20 if (ms_hyperv.features & HV_ACCESS_FREQUENCY_MSRS && ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) { - x86_platform.calibrate_tsc =3D hv_get_tsc_khz; - x86_platform.calibrate_cpu =3D hv_get_tsc_khz; + tsc_register_calibration_routines(hv_get_tsc_khz, hv_get_tsc_khz); setup_force_cpu_cap(X86_FEATURE_TSC_KNOWN_FREQ); } =20 diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c index 00189cdeb775..d6f079a75f05 100644 --- a/arch/x86/kernel/cpu/vmware.c +++ b/arch/x86/kernel/cpu/vmware.c @@ -416,8 +416,8 @@ static void __init vmware_platform_setup(void) } =20 vmware_tsc_khz =3D tsc_khz; - x86_platform.calibrate_tsc =3D vmware_get_tsc_khz; - x86_platform.calibrate_cpu =3D vmware_get_tsc_khz; + tsc_register_calibration_routines(vmware_get_tsc_khz, + vmware_get_tsc_khz); =20 #ifdef CONFIG_X86_LOCAL_APIC /* Skip lapic calibration since we know the bus frequency. */ diff --git a/arch/x86/kernel/jailhouse.c b/arch/x86/kernel/jailhouse.c index cd8ed1edbf9e..b0a053692161 100644 --- a/arch/x86/kernel/jailhouse.c +++ b/arch/x86/kernel/jailhouse.c @@ -209,8 +209,6 @@ static void __init jailhouse_init_platform(void) x86_init.mpparse.parse_smp_cfg =3D jailhouse_parse_smp_config; x86_init.pci.arch_init =3D jailhouse_pci_arch_init; =20 - x86_platform.calibrate_cpu =3D jailhouse_get_tsc; - x86_platform.calibrate_tsc =3D jailhouse_get_tsc; x86_platform.get_wallclock =3D jailhouse_get_wallclock; x86_platform.legacy.rtc =3D 0; x86_platform.legacy.warm_reset =3D 0; @@ -220,6 +218,8 @@ static void __init jailhouse_init_platform(void) =20 machine_ops.emergency_restart =3D jailhouse_no_restart; =20 + tsc_register_calibration_routines(jailhouse_get_tsc, jailhouse_get_tsc); + while (pa_data) { mapping =3D early_memremap(pa_data, sizeof(header)); memcpy(&header, mapping, sizeof(header)); diff --git a/arch/x86/kernel/kvmclock.c b/arch/x86/kernel/kvmclock.c index 5b2c15214a6b..b898b95a7d50 100644 --- a/arch/x86/kernel/kvmclock.c +++ b/arch/x86/kernel/kvmclock.c @@ -320,8 +320,8 @@ void __init kvmclock_init(void) flags =3D pvclock_read_flags(&hv_clock_boot[0].pvti); kvm_sched_clock_init(flags & PVCLOCK_TSC_STABLE_BIT); =20 - x86_platform.calibrate_tsc =3D kvm_get_tsc_khz; - x86_platform.calibrate_cpu =3D kvm_get_tsc_khz; + tsc_register_calibration_routines(kvm_get_tsc_khz, kvm_get_tsc_khz); + x86_platform.get_wallclock =3D kvm_get_wallclock; x86_platform.set_wallclock =3D kvm_set_wallclock; #ifdef CONFIG_X86_LOCAL_APIC diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 4fc633ac5873..5a16271b7a5c 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -1245,6 +1245,23 @@ static void __init check_system_tsc_reliable(void) tsc_disable_clocksource_watchdog(); } =20 +/* + * TODO: Disentangle AMD_MEM_ENCRYPT and make SEV guest support depend on + * HYPERVISOR_GUEST. + */ +#if defined(CONFIG_HYPERVISOR_GUEST) || defined(CONFIG_AMD_MEM_ENCRYPT) +void tsc_register_calibration_routines(unsigned long (*calibrate_tsc)(void= ), + unsigned long (*calibrate_cpu)(void)) +{ + if (WARN_ON_ONCE(!calibrate_tsc)) + return; + + x86_platform.calibrate_tsc =3D calibrate_tsc; + if (calibrate_cpu) + x86_platform.calibrate_cpu =3D calibrate_cpu; +} +#endif + /* * Make an educated guess if the TSC is trustworthy and synchronized * over all CPUs. diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c index 96521b1874ac..9e2e900dc0c7 100644 --- a/arch/x86/xen/time.c +++ b/arch/x86/xen/time.c @@ -566,7 +566,7 @@ static void __init xen_init_time_common(void) static_call_update(pv_steal_clock, xen_steal_clock); paravirt_set_sched_clock(xen_sched_clock); =20 - x86_platform.calibrate_tsc =3D xen_tsc_khz; + tsc_register_calibration_routines(xen_tsc_khz, NULL); x86_platform.get_wallclock =3D xen_get_wallclock; } =20 --=20 2.48.1.362.g079036d154-goog