From nobody Wed Oct 07 14:24:14 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 4j0FkC31pGz6vysM for ; Wed, 07 Oct 2026 14:24:19 +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 4j0FkC2T9hz4CrY for ; Wed, 07 Oct 2026 14:24:19 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791383059; 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=BrRub/4riO5EL+6+tzoMeXpB6jhupxO8Kt8ymJc3EY7TZPlB20SXbF0BTnVcf38rMQKXbU D0tu+oFAawyB8fUp8NroQ5dd0w7e++iF/TVtgOcnSwukjYF6GYz9WGLhu+/lPQTlurFJZf R7ZzKAIEHaeEJGDRETv625DbDkL4fcbpK0QpJHhdD1FbGsgxvNcMGGJhn/E1WvLP81yxE9 bZgM55HZKcG5Q5KvHMRZ23oW0F46LOWmui/tsSB9Hg3uYe/fpWdVBpZHlVj9MZyzFDG48v fWgaU7Rk43zXM19OoF8FRhb++ZYzpXELMxv15qLg5/2qP39fviYZDlu/F1+MPA== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791383059; b=QtS9pJ1NGH/RgyKxxXgWX7MHyNU6Zw4ypLkC+Bar1pSfoCytb5SOxjZlmDVidDZK3DC9ro 9xVVg5gErzpwdNy4CdkI/RTBpoQU6CcLPL9Fz/RTACG8oVCQo7D12t6prDadUiOUMnBMcH N16qxB9UbTBttc4lNyjF9SDAoaZZOtHJWycAb0G1CLaRAHU5tbG+wBlA+B39dpL4cM2n9r YpYylPQVt4BbBV9359SSD/pMwnOE7+UV9h6wSAGz+VnmjM0MpzeR19ecFaNXwR9K4TBD8g nnpa1+pYeM5MOqYsR05Ntb9gwbXwINZnDBfmtr9q3K5LM9MgGqO4Li2wsqEv+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791383059; 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=Tte6sXBQrKPJhKEbHdMnotatw165ZbwhuKsXIGIskbhA8/d3yrJuvsp0nhz2Hwww12Gt0l 3gF0ENNKXND4dO1pjGe71Egni5M+MOQ/SiNGRrqV9rC4d20bWifaIYFjgcAO7OLNquOB9x khwWc8M6Vv1mFcbfreqJr+S/SIk1R0CdPxE86ehd7016/vRoStJYAKXCy92t8pDQtj9zUA 8Fr/EwID1kmWaC7q6oJN7RMLub/KMHvLzfRv7vjh3D9BZzQpknHDv0Bg2c4O7kFa+JMgPl bXshkwuJ7L/zMmmcxAH3ES8o5d6oLwLtl1GTTszrJ+4Fafnga4FJMxwmCHfxfg== 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 4j0FkC1XSgzxb3 for ; Wed, 07 Oct 2026 14:24:19 +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 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 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);