From nobody Tue Jun 9 19:46:34 2026 X-Original-To: dev-commits-src-main@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 4gZfYW5G6Yz6gXSh for ; Tue, 09 Jun 2026 19:46:39 +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 "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gZfYW1qktz3vLp for ; Tue, 09 Jun 2026 19:46:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781034399; 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=KtGok9QQkUqsFh0Ux6h9ZEUPSi0+eA32EVbTn3M5MPI=; b=jKOsO1Oqav+HtH0SCfMk3rEjt603gOiE7R8IZipTqHo62spaBWj7obVMgPJIAQSnKuniL5 FWkCr3bCIujgXkLwde8PX0HOhXIEW1Ljar0mj4RlMCZrJWxFVORsTg6cbF71Z8PUdZ2QpP r+Osos5Xx1m4nFLlUbVG7VYv2yA6YIPZzmD17txN8q2sSEcwMu0kUiGL91iEE47Qfuh48j h4Dq3vP552u64zqjo15AYUyh0BNm2KbnmV1iHJbCeFUwmFwcy74BwkBOi1fri8bjW81S2c 4VMxZI9WG+Lx7B8tBdHOLCLdqh6oUKwxssbKKrVypsVvGYo0lFOOI31/oFIhdQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1781034399; a=rsa-sha256; cv=none; b=pBJzRdMslThqtlkod3+nEVOBXIx4qHTuCT5W8L2QA7JQk0J+YU1JMbTINhNz5JjvP56bR+ zYO6qS0q/QjGekiMROmOV5zKlkns4/4ObKL2bhO00wdnis7igSRP8zSBThhXVLCEoKgSqH bsOMZA1pFShS3CnVAj/hAXveScil1vSUWLpfd3nqZaq+DZ5XmeJ0SK4AZrSm3HW2DLwklT GpMKfVHk3+UZdtcVw7ZbYXfOFc0tWKRRfEtLoa4TwwfL9oqu4chmI1DmnCv7iUey6QMGMw Rr0SeSTqqmSaT6yypeCIXzmaOf/jfrOoK6PJodPlEnEFZj2QnB/1PE/dOEzrug== 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=1781034399; 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=KtGok9QQkUqsFh0Ux6h9ZEUPSi0+eA32EVbTn3M5MPI=; b=U8D9/tT1UtqzVrxCK42FGPPsdPY0stKoWkSmGNvNcXtGzqunQjhE82qsmNaYEwFcMKWDwd KCL1EvvilpC04Vy4m93JHGAkMimD+bCk9x/aoP6yCsJxynyRlx8YvpWETEmAfP2QpKMBqf mx4WoPT85eM4esTSyf2O3NJLgGawGAzCG5skjyEDt35sBQpYvu8FRtqdq5viQrAo+NeolR 7ufF92I3+/DWi+pR7HeX1XKNXuEvOMY+zi5PrXNMuV0FM9Oj87ehn1wct6VpSg0cs5tkT1 BevolkPFzyzYer4H7Wrb0eDWdxkPAwxv5rXMSmJ0YBVD4QUKMXskhMEUpE3OFA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gZfYW1Jrnzpfd for ; Tue, 09 Jun 2026 19:46:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1978c by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 09 Jun 2026 19:46:34 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Ali Mashtizadeh From: Mitchell Horne Subject: git: dded0ab415cc - main - hwpmc: Disable AMD PMCs if in an unsupported VM List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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: mhorne X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: dded0ab415cc09eed506968366e383d406834823 Auto-Submitted: auto-generated Date: Tue, 09 Jun 2026 19:46:34 +0000 Message-Id: <6a286d9a.1978c.49e1669d@gitrepo.freebsd.org> The branch main has been updated by mhorne: URL: https://cgit.FreeBSD.org/src/commit/?id=dded0ab415cc09eed506968366e383d406834823 commit dded0ab415cc09eed506968366e383d406834823 Author: Ali Mashtizadeh AuthorDate: 2026-06-05 23:48:53 +0000 Commit: Mitchell Horne CommitDate: 2026-06-09 19:46:31 +0000 hwpmc: Disable AMD PMCs if in an unsupported VM AMD does not have a CPUID bit to indicate the lack of K8 PMCs. If all other PMC features are not present we should test an event selector to see if it stores and returns a value. If the VM is implemented correctly, this should result in a #GP on the initial wrmsr_safe. Bhyve and a few other VMs ignore writes, so I got one step further and test that it retains the OS and USR bits. Tested on Zen 5 native and a Zen 5 Bhyve virtual machine. This code should not run on any recent hardware, except in a VM, as it checks that the core counter extension is missing. PR: 268943 Reported by: Sandipan Das, John F. Carr Reviewed by: mhorne, imp Sponsored by: Netflix MFC after: 1 week Pull Request: https://github.com/freebsd/freebsd-src/pull/2272/changes --- sys/dev/hwpmc/hwpmc_amd.c | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/sys/dev/hwpmc/hwpmc_amd.c b/sys/dev/hwpmc/hwpmc_amd.c index 299021494716..e76bdef118d5 100644 --- a/sys/dev/hwpmc/hwpmc_amd.c +++ b/sys/dev/hwpmc/hwpmc_amd.c @@ -869,12 +869,14 @@ amd_pcpu_fini(struct pmc_mdep *md, int cpu) struct pmc_mdep * pmc_amd_initialize(void) { + struct amd_descr *d; struct pmc_classdep *pcd; struct pmc_mdep *pmc_mdep; + uint64_t reg; enum pmc_cputype cputype; - int error, i, ncpus, nclasses; + int ncpus, nclasses, i; int family, model, stepping; - struct amd_descr *d; + int error; /* * The presence of hardware performance counters on the AMD @@ -905,6 +907,37 @@ pmc_amd_initialize(void) return (NULL); } + /* + * Unforunately, there is no way to communicate that the original four + * core counters are disabled through CPUIDs alone. We attempt to + * write and read back the MSR to validate that it is working. + * + * Referenced the BIOS and Kernel Developer Guide for AMD Athlon 64 and + * AMD Opteron Processors 26094 Rev. 3.24 January, 2005 to ensure these + * fields are valid. + */ + if ((amd_feature2 & AMDID2_PCXC) == 0) { + error = wrmsr_safe(AMD_PMC_EVSEL_0, AMD_PMC_OS | AMD_PMC_USR); + if (error != 0) { + printf("hwpmc: AMD evsel 0 wrmsr failed!\n"); + return (NULL); + } + + error = rdmsr_safe(AMD_PMC_EVSEL_0, ®); + if (error != 0) { + printf("hwpmc: AMD evsel 0 rdmsr failed!\n"); + return (NULL); + } + + if (reg == 0) { + printf("hwpmc: AMD evsel returned invalid value! " + "You may be in a VM without PMC support.\n"); + return (NULL); + } + + wrmsr(AMD_PMC_EVSEL_0, 0); + } + /* * From PPR for AMD Family 1Ah, a new cpuid leaf specifies the maximum * number of PMCs of each type. If we do not have that leaf, we use