From nobody Thu Apr 30 17:43:07 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 4g61jR7108z6bvnF for ; Thu, 30 Apr 2026 17:43:07 +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 4g61jR609Zz3l9j for ; Thu, 30 Apr 2026 17:43:07 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777570987; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=X1MxuXbpSEfh8TXgJoi17zk4TfTfeT4lUEy0NlKEqeo=; b=CDvmi/nW4+Du+SFFCDIBWP44efbjIdt2eQRVeLsIc7m/vJPlI5xJq3L2KdGtAfLT9S5URj mtKXIFvjYIt5n+8FjK+bMtJdqEPTmDD1tGMBV6dJBWgo1Pwr3jOCQfoHqIDmW7nymMWhBn Z8lduIWkKKXBPB+icYdUDmWc1k1p2pWsSmJcFWuW3yulCGzbAeBQEKaRN5wjXY4ZrRRsZ1 OPNBLPIFy00ikcaIyLmETQnd3q3i1tDwrTaL0sjzqE9HFqgcYVEfHhtaoj7Wyy/+eGFavg VW+hLD+a6MC3rGdlo1FeZQqOQr4IbY26NpE4zDnDwrv6eLTHz1vHkqRIZHaNPQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777570987; a=rsa-sha256; cv=none; b=hIC7bfAic8OhFMtKQEUM0oPVZWPpLS5DSKdo5o1KzZKQfShaCwZIM8BujxPakRHPu/kTOj kywX24nBboz8ORb3VN6wzn6Og4yUMKZH5v8Kz6UHeM7srz9yAa9kiWICdcV/tSsga3b52F hwMuLmu5WCMg/JxDbVd+5jxRTn5bMUTyocDvgzE4bnHL66uoBpvYqdpdOBDdKfhx1LdiHG itawdveoXtVVf24S5VaXy6lEoBA9eKx4reyi3SsGWKjAvKyTQDaiKf8HnI5fqubW0Ah3FA dRPPMk97SybDdWgaWzygjEDNyEwNpx/QTXl9jBSPDVgb9aVHFcs4oSxzVASagA== 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=1777570987; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=X1MxuXbpSEfh8TXgJoi17zk4TfTfeT4lUEy0NlKEqeo=; b=XGj0V6PhsupKzFjiZFULd27TaC+eeDLcxV8prpDp2Jt1hzFAWJJ6MGPUZOdJJEfErwmCN0 +lkDeKqlYFzfBmKvTo+bxelTkbVCKJEx3cvpBI3MYYMGapFl9BMMO6ppcl8qX0rMGMfFsA EDuIqWFYGsKyIhALYznW+FUj8e12ZxyhmtmcSKndAzFLm05K/3+FWmmHS2Hg7e6MYmUyPU iG00VHqqT8vPDmennXbZtFF1AEaYvJJ8s8pe8cW0p0rmN3WsiT5Z+gxnIlb06AVpF+amH2 KC5BUsLLoso8PbdS4bHqBcJJOyz/W8mld3Dwucj9oa9d59ijqmkCrumdyRqxWg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g61jR4Mmdz69F for ; Thu, 30 Apr 2026 17:43:07 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 31318 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Thu, 30 Apr 2026 17:43:07 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Jessica Clarke Subject: git: 04f744ce91ef - stable/15 - arm64/vmm: Enable 16-bit VMIDs when in use by pmap 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 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jrtc27 X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: 04f744ce91efbb37f89b8e6d04f24af111e8bd8f Auto-Submitted: auto-generated Date: Thu, 30 Apr 2026 17:43:07 +0000 Message-Id: <69f394ab.31318.667bd2ec@gitrepo.freebsd.org> The branch stable/15 has been updated by jrtc27: URL: https://cgit.FreeBSD.org/src/commit/?id=04f744ce91efbb37f89b8e6d04f24af111e8bd8f commit 04f744ce91efbb37f89b8e6d04f24af111e8bd8f Author: Jessica Clarke AuthorDate: 2026-04-23 15:40:33 +0000 Commit: Jessica Clarke CommitDate: 2026-04-30 17:42:29 +0000 arm64/vmm: Enable 16-bit VMIDs when in use by pmap pmap_init always uses 16-bit VMIDs when supported, but we never enable them in VTCR_EL2 (for ASIDs, locore enables them in TCR_EL1 and pmap_init keys off whether they've been enabled, but the order in which pmap_init and vmmops_modinit run is reversed). As a result, although the full 16-bit value can be stored to VTTBR_EL2 and read back, the upper 8 bits are treated as 0, and so VMIDs that our VMID allocation believes are distinct end up aliasing. In future this interface may change such that vmm decides on the VMID width and tells the pmap to use that, with appropriate support for unloading and reloading vmm, but that can come as a follow-up change, as this is a more minimal bug fix. Reviewed by: markj Obtained from: CheriBSD Fixes: 47e073941f4e ("Import the kernel parts of bhyve/arm64") MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D55860 (cherry picked from commit 44e4f45aec4469440af434098e61bd13982bbbc0) --- sys/arm64/arm64/pmap.c | 11 +++++++++++ sys/arm64/include/hypervisor.h | 2 ++ sys/arm64/include/pmap.h | 1 + sys/arm64/vmm/vmm_arm64.c | 2 ++ 4 files changed, 16 insertions(+) diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index 678030f827dd..aa0b0e829f7a 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -797,6 +797,17 @@ pmap_ps_enabled(pmap_t pmap) return (superpages_enabled != 0); } +bool +pmap_vs_enabled(void) +{ + /* + * 8 and 16 are the only values hardware can support, but allow for the + * possibility of artificially restricting the bits, e.g. for testing. + */ + KASSERT(vmids.asid_bits <= 16, ("VMID bits %d > 16", vmids.asid_bits)); + return (vmids.asid_bits > 8); +} + bool pmap_get_tables(pmap_t pmap, vm_offset_t va, pd_entry_t **l0, pd_entry_t **l1, pd_entry_t **l2, pt_entry_t **l3) diff --git a/sys/arm64/include/hypervisor.h b/sys/arm64/include/hypervisor.h index 3ee5c12f2265..879cd229a2bd 100644 --- a/sys/arm64/include/hypervisor.h +++ b/sys/arm64/include/hypervisor.h @@ -2142,6 +2142,8 @@ #define VTCR_EL2_PS_44BIT (0x4UL << VTCR_EL2_PS_SHIFT) #define VTCR_EL2_PS_48BIT (0x5UL << VTCR_EL2_PS_SHIFT) #define VTCR_EL2_PS_52BIT (0x6UL << VTCR_EL2_PS_SHIFT) +#define VTCR_EL2_VS_SHIFT 19 +#define VTCR_EL2_VS (1UL << VTCR_EL2_VS_SHIFT) #define VTCR_EL2_DS_SHIFT 32 #define VTCR_EL2_DS (0x1UL << VTCR_EL2_DS_SHIFT) diff --git a/sys/arm64/include/pmap.h b/sys/arm64/include/pmap.h index 406b6e2c5e0a..f5812893fcfa 100644 --- a/sys/arm64/include/pmap.h +++ b/sys/arm64/include/pmap.h @@ -156,6 +156,7 @@ void *pmap_mapdev_attr(vm_paddr_t pa, vm_size_t size, vm_memattr_t ma); bool pmap_page_is_mapped(vm_page_t m); int pmap_pinit_stage(pmap_t, enum pmap_stage, int); bool pmap_ps_enabled(pmap_t pmap); +bool pmap_vs_enabled(void); uint64_t pmap_to_ttbr0(pmap_t pmap); void pmap_disable_promotion(vm_offset_t sva, vm_size_t size); void pmap_map_delete(pmap_t, vm_offset_t, vm_offset_t); diff --git a/sys/arm64/vmm/vmm_arm64.c b/sys/arm64/vmm/vmm_arm64.c index 712783338214..8fe0bf62bf8b 100644 --- a/sys/arm64/vmm/vmm_arm64.c +++ b/sys/arm64/vmm/vmm_arm64.c @@ -391,6 +391,8 @@ vmmops_modinit(int ipinum) #ifdef SMP el2_regs.vtcr_el2 |= VTCR_EL2_SH0_IS; #endif + if (pmap_vs_enabled()) + el2_regs.vtcr_el2 |= VTCR_EL2_VS; /* * If FEAT_LPA2 is enabled in the host then we need to enable it here * so the page tables created by pmap.c are correct. The meaning of