From nobody Mon Apr 13 14:24:05 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 4fvV5f2tgNz6ZFFv for ; Mon, 13 Apr 2026 14:24:06 +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 4fvV5d75hzz3qyd for ; Mon, 13 Apr 2026 14:24:05 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776090246; 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=dj939GV4e2wF3lll7PVMrZNqi9H0DzxMiu9r3JhNzOk=; b=Sbe0C4YaO+Z3NxuEr82lAhElPZyrS5S1FaiHC/ZpD3O1QtnRsvuDVVStu/RKfWxMkq4qZ+ lysvZfFXnybOpMGXkP6u1tuuKxMfCg1o8fUj+XJBS3kbt9jkAvq1wDw1wpjxb1ABPWPDAN y5e31aSEdJoKUrhvw5GMpaVsH6CHEBIVev+wDI6Cya/EH/jkLThQ+62WrD+EMFzipAK8Zj u2P//wwpEhTZg1hZXsIHIP5T44mgLkz1n0F60ykX3/cOvkkSC0g+iMYeKzcq3Ye1TG/MVI FWoUeqF80n89YDdt31jmiaENDfFQl1zJtrMMU6UprIVUnUE3IV0wAk375YDUpg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776090246; a=rsa-sha256; cv=none; b=c/+0ipvMNkpkrvvVH7byEGM6fuAL+T5/DnmOhs73VivDq2u67D1DXWBwFU8vbSFvBy33dV DlolXWbac4GRkyF8wDSxjYK4/ywAklV/erC5deeBOlH3dba+miQd+En7Yhdp1Uog/Y75xB SNojntTG/LABVdoIDOd5QtZiTEGvU5/g2oAGokCpwifhhl5lbv7bICkwOvNfxFlVzYOyzE GCsqyz8ynSZaFfv4mUSTLW/f1iIjmpBS0Q5Xy8jg5COGm3O29g6tS8rR5f7TrQQF/xiFsw 1I7QLCJlfC5/CwjFN+puM3RR1tREoOrzqW72U75CfY08hNJ/Eb0t6ejSmp7pUA== 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=1776090246; 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=dj939GV4e2wF3lll7PVMrZNqi9H0DzxMiu9r3JhNzOk=; b=gZPCArJUJs/7B5chYvfuHCGpKezsIvOLJBEDdE4NTqxdk70MavoZ3+gwkgf3Ad9WCq56aa svMrSmSIbFaNqX7+OMQCpwMOYZXIIdv5qo5Mx2moS7pziEdA5q2kGIHGBrPRn7k/3HQirT RT42IzwnyTwsHpogXXi5e82eMV/gWN0qlhWfc8oCKt8iOWWmBxzCH+fj2kZ8AEoO1u2L4q 3L7YAh4xOyPyLeT8jzAeNVuwx0X7f2JDl4rGU7i1uVd0G4CwRwSqrtjly2Mt+3H51d2jX/ s2ncfANJz4JQdtRFc0NcHBATM3TrU8jmbv4PJpRR+q/WtorEKjB92Bs9hulNBA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fvV5d6VBcz16s1 for ; Mon, 13 Apr 2026 14:24:05 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 4722b by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 13 Apr 2026 14:24:05 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Turner Subject: git: 580958427536 - main - arm64: Handle changing self-referential DMAP pages 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 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: andrew X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5809584275363d6b2f44981d8561a126a1344360 Auto-Submitted: auto-generated Date: Mon, 13 Apr 2026 14:24:05 +0000 Message-Id: <69dcfc85.4722b.421b2c62@gitrepo.freebsd.org> The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=5809584275363d6b2f44981d8561a126a1344360 commit 5809584275363d6b2f44981d8561a126a1344360 Author: Andrew Turner AuthorDate: 2026-04-13 11:50:47 +0000 Commit: Andrew Turner CommitDate: 2026-04-13 14:23:05 +0000 arm64: Handle changing self-referential DMAP pages Support changing the property of a DMAP page that holds it's own page table entry. Because we need to perform a break-before-make sequence to change the properties of pages a page that also holds it's own page table entry will fault in the make part of the sequence. Handle this by mapping the page with a temporary mapping as we already do when demoting a superpage. Reviewed by: kib Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D55943 --- sys/arm64/arm64/pmap.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c index 7d19c927d369..a23905994846 100644 --- a/sys/arm64/arm64/pmap.c +++ b/sys/arm64/arm64/pmap.c @@ -8248,6 +8248,7 @@ pmap_change_props_locked(vm_offset_t va, vm_size_t size, vm_prot_t prot, vm_paddr_t pa; pt_entry_t pte, *ptep, *newpte; pt_entry_t bits, mask; + char *tmpptep; int lvl, rv; PMAP_LOCK_ASSERT(kernel_pmap, MA_OWNED); @@ -8377,6 +8378,24 @@ pmap_change_props_locked(vm_offset_t va, vm_size_t size, vm_prot_t prot, break; } + tmpptep = 0; + if (tmpva <= (vm_offset_t)ptep && + tmpva + pte_size > (vm_offset_t)ptep) { + vm_paddr_t pte_pa; + + mtx_lock(&cmap_lock); + tmpptep = cmap1_addr; + pte_pa = DMAP_TO_PHYS((vm_offset_t)ptep); + pmap_store(cmap1_pte, ATTR_AF | + pmap_sh_attr | ATTR_S1_AP(ATTR_S1_AP_RW) | + ATTR_S1_XN | ATTR_KERN_GP | + ATTR_S1_IDX(VM_MEMATTR_WRITE_BACK) | + PHYS_TO_PTE(pte_pa &~L3_OFFSET) | L3_PAGE); + dsb(ishst); + ptep = (pt_entry_t *)(tmpptep + + ((vm_offset_t)ptep & PAGE_MASK)); + } + /* Update the entry */ pte = pmap_load(ptep); pte &= ~mask; @@ -8403,6 +8422,13 @@ pmap_change_props_locked(vm_offset_t va, vm_size_t size, vm_prot_t prot, break; } + if (tmpptep != 0) { + pmap_clear(cmap1_pte); + pmap_s1_invalidate_page(kernel_pmap, + (vm_offset_t)tmpptep, true); + mtx_unlock(&cmap_lock); + } + pa = PTE_TO_PHYS(pte); if (!VIRT_IN_DMAP(tmpva) && PHYS_IN_DMAP(pa)) { /*