From nobody Wed Oct 07 14:24:14 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 4j0Fk62hMtz6w0J3 for ; Wed, 07 Oct 2026 14:24:14 +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 "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4j0Fk61HRtz4CSV for ; Wed, 07 Oct 2026 14:24:14 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791383054; 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=oFZjHXPtU692lExuAsyz1a6sFQa7nMIT2l6LlI9UR+c=; b=NxAr+DmbGADdY0mErSqJvBNFT3JAxO7ATDEL/giOOpBdrPaxhqvSsMsg9NDRI4BHLRdTz5 wp8CMzTLfvYD92Bd+2pYBk5JnNtwDt5FarrEZ7QZEp+pXAjbsEm5bncv0VN2yREm2bacus haCZglibOYtpbr8600JG32CFTDh+QOs8yZJ1Dc9vq+WF1jAKx42lFPuHAmlPAkVvZiSuN/ oPL8IeKXFHdO1zWKj20GWrJhbfSqAvbqtVc+LaaWWv2J7JlYFKAW7m3zPlJM3JEUW/di8M 3tCIrWSGHeGL2PRjFcxjPP6ICaGty7fmJ08JrXnH2sJDBSvn5B1Qb3/KibIq5A== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791383054; b=AVqJg3fRvfZAvAtVbj0kslBkfGeyh1SFyCSaICxU9xzXj95gLDNd4DR6OR7Z3nixRqoktT UhrQwmrLusCqFb7CdNTXttrPXcSkmV8stD33j+3WNfqOLDfQAFmRTKvSIS1/Xz18gm95nP 7WazVccOj6g+m9fgLhjlYhCpPG3GoYCJgom2L4sg7rltyN9UdkikdizqpURBAWo26VXxwZ siTqiX6Q9z7fTpE/yXcAVVggQAvhvO9G8aMIgJtRC1kHwbZg/gZdm+gVdYdWNF92RGEHQV 8dNmIQ3SZqq9vyf7vZ8Dcnmy4pG8Y6X8WYXGmLDfTHKWPYjLQh5xwd+tLYKOkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791383054; 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=oFZjHXPtU692lExuAsyz1a6sFQa7nMIT2l6LlI9UR+c=; b=jIGOX85pTBi3jOGTHMfIhQpBM077Lhs3/P4HN9kUvy8/lXyiu3iklxXMf0KLk/5pWIqrn3 J4OZ/AsCBhKNPgr77fqFxlA5b4aLmszf//ew6a8ixMf+lncKJIPM8rSxIO/b+Lwl42mLx6 LjFmWiIEZtkyGpTXQ0O2DZ2Yg2TvPmb8hdDA3XDBm59u5R4gfrwwJGpIGlv9g3iKDhQDfm d7oYVtb17PMTwYwpn7QLHfAA1ZWJbe2fvGmoDz3UfD10ri81iyIcnEPSRcCPQ06nHTaauc NHSpmjmb64OVzyzGVmmJPD1RHY9vDVE2+xtYEhw1MSE1PUmnrIyVfH4B7x0W2Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4j0Fk60MRCzxb2 for ; Wed, 07 Oct 2026 14:24:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1e0fe by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 07 Oct 2026 14:24:14 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Alan Cox Subject: git: 7dd9a8125f70 - main - arm64: a local TLB invalidation suffices when enabling write access 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: alc X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 7dd9a8125f70f1fc40fd9907bdaae0d23c8586c9 Auto-Submitted: auto-generated Date: Wed, 07 Oct 2026 14:24:14 +0000 Message-Id: <6ac6560e.1e0fe.7f5295ca@gitrepo.freebsd.org> The branch main has been updated by alc: URL: https://cgit.FreeBSD.org/src/commit/?id=7dd9a8125f70f1fc40fd9907bdaae0d23c8586c9 commit 7dd9a8125f70f1fc40fd9907bdaae0d23c8586c9 Author: Alan Cox AuthorDate: 2026-10-06 04:53:00 +0000 Commit: Alan Cox CommitDate: 2026-10-07 14:22:57 +0000 arm64: a local TLB invalidation suffices when enabling write access When a PTE logically supports write access, as indicated by its DBM field, but write access is nonetheless blocked by the PTE's protection field, pmap_fault() can enable write access with only a local TLB invalidation. Reviewed by: andrew, kib, markj MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D60417 --- sys/arm64/arm64/pmap.c | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index acdcfe7fea8c..97cbb92d6d43 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -2152,6 +2152,31 @@ pmap_s1_invalidate_page(pmap_t pmap, vm_offset_t va, bool final_only) isb(); } +/* + * Invalidates any cached final-level TLB entry for the specified virtual + * address in the given virtual address space, but only on the current + * processor. + * + * The pmap_multiple_tlbi errata only affect broadcast invalidations. + */ +static __inline void +pmap_s1_invalidate_page_local(pmap_t pmap, vm_offset_t va) +{ + uint64_t r; + + PMAP_ASSERT_STAGE1(pmap); + dsb(nshst); + r = TLBI_VA(va); + if (pmap == kernel_pmap) { + __asm __volatile("tlbi vaale1, %0" : : "r" (r)); + } else { + r |= ASID_TO_OPERAND(COOKIE_TO_ASID(pmap->pm_cookie)); + __asm __volatile("tlbi vale1, %0" : : "r" (r)); + } + dsb(nsh); + isb(); +} + static __inline void pmap_s2_invalidate_page(pmap_t pmap, vm_offset_t va, bool final_only) { @@ -9965,11 +9990,16 @@ pmap_fault(pmap_t pmap, uint64_t esr, uint64_t far) ptep = pmap_pte(pmap, far, &lvl); if (ptep != NULL && ((pte = pmap_load(ptep)) & ATTR_SW_DBM) != 0) { + /* + * A local invalidation suffices when enabling write + * access. At worst, a write using a stale read-only + * TLB entry on another processor triggers a fault, + * requiring its own local invalidation below. + */ if ((pte & ATTR_S1_AP_RW_BIT) == - ATTR_S1_AP(ATTR_S1_AP_RO)) { + ATTR_S1_AP(ATTR_S1_AP_RO)) pmap_clear_bits(ptep, ATTR_S1_AP_RW_BIT); - pmap_s1_invalidate_page(pmap, far, true); - } + pmap_s1_invalidate_page_local(pmap, far); rv = KERN_SUCCESS; } PMAP_UNLOCK(pmap);