From nobody Mon Apr 13 19:54:53 2026 X-Original-To: dev-commits-src-all@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 4fvdRL26bzz6ZdB6 for ; Mon, 13 Apr 2026 19:54:54 +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 "R12" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4fvdRK6vKqz3n6m for ; Mon, 13 Apr 2026 19:54:53 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776110094; 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=EvqRckNRudgZaSNf8G+URjcW2nDQL4qutndL0AjvBpQ=; b=LuHZvvQpTTIrbRMQufmuIH3zQq35NkdmzdY0O2k3XhL6ivbYHhq/bfG+iEASWS2WW8Hhne 4V62zBNwqmM1zRm2AVQbmvZyz1ngWUIhj4/EyK0UjZh4I09nMrwK4nZCWw9O+NZWujS/0s bA/cVRbTd6R1z4/5Cw5JvJ5V/K9Stuu15ayzpMPxszasfzF1iIBsHq26BRlJNyLJSw2TTG YVF5f90G1V1FHw6majbbzLJMM+0hNomLReC28twDE2Uw+bmNUe6zbOEgm4RuJ/Tn5bJtTt uvO+F8P2a5B0n3H/j77Log+2wRraIn9gbS9n0r6nMT2lzEYBr0bePqO09O3P7g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776110094; a=rsa-sha256; cv=none; b=W0tC8QDtDneUZFDTZpMU3DuIuZjX1FL5Fkpuagy1Ltx5+dL8/jhvWBSvvNGDyE8v1k2WjH lCvJvGKNZ59WhVLSezW/nTxKcJ/q4xHD6vqOotQUFRNtSnEoGSR89ww+o4ZNgfrIjsgAVy FqHiIY+7IUc+afJamhfNGjPA6NaxpnCZ9RGWHXfwsrAnCP7N/jx1lLuIMtJzHahifFNKBW AKT7Zm7NWr4PG4iI5FxuBWRZNBdhAUxLKgca8Jm+0qG++PD/hcX3MmKN+dyCKBo/2cxER8 efqWrXHSCijsrs/0GxDq7Z8nDzCc3nbldLRWxbNUxafGJ+lmE7U5ki+OTif7Ew== 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=1776110094; 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=EvqRckNRudgZaSNf8G+URjcW2nDQL4qutndL0AjvBpQ=; b=ob1eBWzuqauIKbhuBvcVvu8aAbXGhpX/hxV8B0emObR435Cfy/J5mcQ3Ol34/2v6FkgVB6 MuJko4lx0kd/JS0KGVTXBRiGfvq0CaoUEVrD5heegB3hXRdvuON0wtcPIt5BRz+qlrMOWD EgTJA8djsYCv4qN4gTldGpNHJXgh3Gx8ZHF4KKeSSb5zbFRArIpDwCNeQoinPQLKFeJ3k6 Dutm3F3+Okh4u8CJWqBxfaYN4m3nOgH2NnYhHoQcI3cf/y0e0ypt9i0ACDixkzvEY21ico jeHy4wwsWHQ3c+nGR9Nc9/tf5bvg0cP+siyFZhb0z4pwLpu/VAm4fJCxR9ovYQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fvdRK6GTsz3Zl for ; Mon, 13 Apr 2026 19:54:53 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 42527 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 13 Apr 2026 19:54:53 +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: 1b8723defccc - stable/15 - x86: Handle when MPERF/APERF MSRs aren't writable List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org 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/15 X-Git-Reftype: branch X-Git-Commit: 1b8723defcccade771864aad4cbc0eaa372366ed Auto-Submitted: auto-generated Date: Mon, 13 Apr 2026 19:54:53 +0000 Message-Id: <69dd4a0d.42527.4a2b2f17@gitrepo.freebsd.org> The branch stable/15 has been updated by ziaee: URL: https://cgit.FreeBSD.org/src/commit/?id=1b8723defcccade771864aad4cbc0eaa372366ed commit 1b8723defcccade771864aad4cbc0eaa372366ed Author: Matt Delco AuthorDate: 2026-03-26 17:30:31 +0000 Commit: Alexander Ziaee CommitDate: 2026-04-13 19:54:16 +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 775fee97d3cd..422bdf9cfb0d 100644 --- a/sys/x86/x86/cpu_machdep.c +++ b/sys/x86/x86/cpu_machdep.c @@ -423,7 +423,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; @@ -453,20 +453,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 3b873d9dae73..f88ce60c6319 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; }