From nobody Thu Aug 6 22:31:47 2026 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4hGMTJ5rWWz6nLCX for ; Thu, 06 Aug 2026 22:31:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4hGMTJ0mf1z4PPj for ; Thu, 06 Aug 2026 22:31:48 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786055508; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=EcMzF5oUCuNAxekMncPJ+S1k9ixvzqBGxtyECkcNR1c=; b=xxf8o1FNt/EeG+0Xx8sqxVItDcrlfgZD2lVrjCfr8pXRJvBnpGV5FX1IFu9z1QQpEsdjqh kv1CKtSry472zfdz3aHovNSdCg45s7tQtReJwUe3CljuTJRTgdObDaBD/Wa5ohK7dlBa9E 7zZhKuw0VJPTP5zjaKpRZ+GZK7o3DumEWGTcOY2kW2n1i90FVI+wev9EvipcGSBPMr3eLo qRGNcsL45oPXFuvbTaNlaPIo293T3vaSJbiJWqJiFIBbhCk0GPCNx1SARAfq0rj2Cra9Fg zFSzSouVgaO0xrZGelqweCY9SnGRSYkavCZKkxgmD8FMCIKVIwKGOuUfeTC6pw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1786055508; a=rsa-sha256; cv=none; b=XZBJunbcdyWPPF6HHnnqq1ry9oTO7BNdOYOyWPyADA2PaoCHfpB/lt2qlr2MFqdexjM12o u7ZueuWB8lRMkmMMIal+D05S12BL98kgHKQj+LU8BtJ47zUceN002S5WLNQoB3+dOmVKIx Fw3br3+6NebQz36S56CGz8tpM5vss6bIGgwbIoqFFcmwNNjHstajUGyBJDrfRqFeCz2zWv EgPOR/0LCfXEVxWYDng+JTbh3s5dltCDXk05H8koBLVJRqKpwTHwgiU7mo8nPAyEA5uanF CsjuoYVb79tccpaw9fpJiEtq2dhMobUT9PTyCgvu9AYuLv+eM82iEHeYhT9q7Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1786055508; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=EcMzF5oUCuNAxekMncPJ+S1k9ixvzqBGxtyECkcNR1c=; b=cFM2Hmu0c9fjuU3n5fYP5H5ZxiNSRxeDjZY9g/EoRdikRCDykrSr9WYXlfWwb3UPogNVGl tlz34uCNNd8PYWYtsprCsV267qU2jCajRlFpTk0FwWXEwcUQ0IoyCJBY6LdPNp0Hb/qXRD Y44tStHIX0vhzHefc5SF1R/v/9ZPgSz0Si8BziITukr0AjGsYFq9Y3AYCSf7yjo2Tyfm/c cLJtfkEfOyspjQ9po3j6AF31KNnTz3WVk/iyVn3h8Zk4ml7pszlzRw3diL57Aw+KL+ZBx7 dVcItquuyif4WIDb26guFJNNzeaKumYagiqIJwhbLQ7DImhytc8QIC1xnoDajA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hGMTH6pGYzgQx for ; Thu, 06 Aug 2026 22:31:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1fe20 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 06 Aug 2026 22:31:47 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Matt Delco From: Alexander Ziaee Subject: git: 3c0afd5bea93 - stable/14 - x86: Handle when MPERF/APERF MSRs aren't writable List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: ziaee X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 3c0afd5bea93a77a63632d3858896160932e7013 Auto-Submitted: auto-generated Date: Thu, 06 Aug 2026 22:31:47 +0000 Message-Id: <6a750b53.1fe20.b463d94@gitrepo.freebsd.org> The branch stable/14 has been updated by ziaee: URL: https://cgit.FreeBSD.org/src/commit/?id=3c0afd5bea93a77a63632d3858896160932e7013 commit 3c0afd5bea93a77a63632d3858896160932e7013 Author: Matt Delco AuthorDate: 2026-03-26 17:30:31 +0000 Commit: Alexander Ziaee CommitDate: 2026-08-06 22:25:08 +0000 x86: Handle when MPERF/APERF MSRs aren't writable For performance and/or correct reasons some hypervisors allow MPERF/APERF MSRs to be read but not written to. This change modifies the handling of these MSRs to not rely on writes. This patch is part of Google Cloud Engine (GCE) C4-LSSD turnup. Sponsored by: Google Tested by: NetApp (previous) PR: 292808 MFC after: 3 days Co-authored-by: Jim Mattson Reviewed by: jrtc27, imp, kib, markj, olce, obiwac Differential Revision: https://reviews.freebsd.org/D55996 (cherry picked from commit 7e7d4e711ff94d114c93fd522d4125aa9bd9f5cd) --- sys/x86/x86/cpu_machdep.c | 14 +++++++------- sys/x86/x86/tsc.c | 9 ++++++--- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/sys/x86/x86/cpu_machdep.c b/sys/x86/x86/cpu_machdep.c index dd19c2a46dbb..d082f19e3d36 100644 --- a/sys/x86/x86/cpu_machdep.c +++ b/sys/x86/x86/cpu_machdep.c @@ -424,7 +424,7 @@ int cpu_est_clockrate(int cpu_id, uint64_t *rate) { uint64_t tsc1, tsc2; - uint64_t acnt, mcnt, perf; + uint64_t acnt_start, acnt_end, mcnt_start, mcnt_end, perf; register_t reg; int error = 0; @@ -454,20 +454,20 @@ cpu_est_clockrate(int cpu_id, uint64_t *rate) /* Calibrate by measuring a short delay. */ reg = intr_disable(); if (tsc_is_invariant) { - wrmsr(MSR_MPERF, 0); - wrmsr(MSR_APERF, 0); + mcnt_start = rdmsr(MSR_MPERF); + acnt_start = rdmsr(MSR_APERF); tsc1 = rdtsc(); DELAY(1000); - mcnt = rdmsr(MSR_MPERF); - acnt = rdmsr(MSR_APERF); + mcnt_end = rdmsr(MSR_MPERF); + acnt_end = rdmsr(MSR_APERF); tsc2 = rdtsc(); intr_restore(reg); - if (mcnt == 0) { + if (mcnt_end == mcnt_start) { tsc_perf_stat = 0; error = EOPNOTSUPP; goto err; } - perf = 1000 * acnt / mcnt; + perf = 1000 * (acnt_end - acnt_start) / (mcnt_end - mcnt_start); *rate = (tsc2 - tsc1) * perf; } else { tsc1 = rdtsc(); diff --git a/sys/x86/x86/tsc.c b/sys/x86/x86/tsc.c index 5874b2195dea..36de8036289b 100644 --- a/sys/x86/x86/tsc.c +++ b/sys/x86/x86/tsc.c @@ -433,6 +433,8 @@ probe_tsc_freq_late(void) void start_TSC(void) { + uint64_t mperf, aperf; + if ((cpu_feature & CPUID_TSC) == 0 || tsc_disabled) return; @@ -442,11 +444,12 @@ start_TSC(void) /* * XXX Some emulators expose host CPUID without actual support * for these MSRs. We must test whether they really work. + * They may also be read-only, so test for increment. */ - wrmsr(MSR_MPERF, 0); - wrmsr(MSR_APERF, 0); + mperf = rdmsr(MSR_MPERF); + aperf = rdmsr(MSR_APERF); DELAY(10); - if (rdmsr(MSR_MPERF) > 0 && rdmsr(MSR_APERF) > 0) + if (rdmsr(MSR_MPERF) != mperf && rdmsr(MSR_APERF) != aperf) tsc_perf_stat = 1; }