From nobody Mon Apr 13 14:24:05 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 4fvV5l33kZz6ZFPH for ; Mon, 13 Apr 2026 14:24:11 +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 4fvV5l01Qtz3qmY for ; Mon, 13 Apr 2026 14:24:11 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1776090251; 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=Cv9lR8PAgEv0a6WGtf20/k6XzhisJ1eJKuuzj7q6iTHnUyvKovbtT4W9W97sSspZ3u4374 QNIoqmJgXjJDJaZBRGslNHdoS5uX0tVHUMW0gQtd+Srg8459egwS5sEzCxk+9CS5JA85/+ dd03DrJTylGhVihNmWmmx4x3WutsWNsoN0PuA5GIM412G4sDqbPudmexNLRutiThU/l9cA 0X2DtOwS1gujYhiazcY/PovwGW9GtWnJZdIcb9/QBTcRXAUbtIgTYagEajGAf8YQYr7vrd IhTo57yGybxSi1lN3MLRFpM7EGsIeswVfoZWjixpRnQuOeP1iXMdlp47WhNTig== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1776090251; a=rsa-sha256; cv=none; b=nz/7WmzLWKjc2no7fIBc7kPEz8hUYJjRpc11dt+UzI4mOGnvxrH/psZG84Xlul878kM3BS mcQpLh8vze5+6RmM2vtaum1GBclwqJGFjeQX1ySIOW8Dn9//GAWRlNujKTEB1N/BfyUDiF Gr0kUpaOfIo1hPyk3xrOvbKU2fNt73vn0d0Qt1jM5O4B5J+R6bJgks+XKme7bufJHcxCQk Fv8vyNFiDfPhsTHA/26tQHsDloCSw/9FQ4R7+ZmkjqAJlugvVkY2fJ9lS4k9w+DPJuVkBz gzRPM6j/bZiFg2XqCBhwWoMEOwcQrvgSy1m64QEUFG3ffSbnzkKQ2mRJY8DgqQ== 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=1776090251; 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=ZNW5xPWFm/fUBqjZyBolNnRMj65XGNYIEgRTmXBTCvl7cXKV8qi8T22WtMwjd7jYdigJKh 0oZFfiTtgBhdm6PKoHudjc+1yRhcKgJB/slKBoIle/H0O1ZwUWWDLWq0CZqcsNDlYesjSQ 8IRLCTO3xZqE42BBkWsUsHakQJBtkHr/IMgrxhY2P+q6+jAQGGI1ugUtqVYI9ihXSklA9M BWBGq9aUgb84PuAy0k3FlJ1CPLP05Kcdt/vwyodk5sAKasdJdXO4sYQnskgv94AL4j9++I yhLzA8Rrxht4Pyx/diDqAw0yL7dEn24RQ3weuNMQASEVonPUMHzUXS9hNG2d4g== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4fvV5k6kjcz172J for ; Mon, 13 Apr 2026 14:24:10 +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 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 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)) { /*