From nobody Tue Oct 20 18:55:53 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 4j8M7Y4WNWz6vxwV for ; Tue, 20 Oct 2026 18:55:53 +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) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4j8M7Y3wFcz4vZ8 for ; Tue, 20 Oct 2026 18:55:53 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792522553; 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=QbMHUvrJvbZ/MxxIudeAhuy0pvVbNfkN/pYxGPJOD78=; b=PzA7+RUURY8UleWJULKpucCSYavJ8nRaCzIlKA3cCMa2vz+LIaUeGiV0PBB56qwzcFZHeN /mU/6L1LRObD7/DMjDiRf+bEAucDdUPe+tG+o7PIZ++1DrF9jwTEd9v5Eissbo0RryQtPO rXcx/YqWNCvbqkUGiWsd0QYsszuOBgUrLS8PUR7ZCPA38qzvtg/fgDpEsPqjE18g6TUogI gFFkDaXo40CDleTyPddPgFUghBiUVSLI+5Kc4dzIQkHmo/zhRiwH6Bs6u6H0OUPslujHOu 90M7DhdnAx3meMJvpZ6N+KRHAOTcE/ROiW1MZWJEWx6pIzRuNPpgi52uzqE7mA== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792522553; b=eHA3j3s0K7Exf4CcmIoBvJ1NF0SD9hf7PKhEE9h5xYTcxQvlDNAr0C0VC4pj2FuFVRupkm o5kEwONijMV7ZJKAlRWJ/EnuMreoqlH/nWsLDZXKzin1/ASMRg5L9rIOWo+Xm9Yk9eb8pO Qet4TbEG2mhOShvrwmfARXt3zjirrhFfa84SP+QnWJKWAhaU69RBxgrybQfBJZSVuMajmi Px7YZIZ1mYUEZyP4h2qVw7MTZhGxllcLi1guhqi6OB5BP9MzzuFJv7Morg/AdR1/H1TknS DcX760n8KdVMabcQVgbqeWovxVTPcvosnj0erinDpz3rO00QjwrONFrdqp2XBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792522553; 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=QbMHUvrJvbZ/MxxIudeAhuy0pvVbNfkN/pYxGPJOD78=; b=YiRp1M3UnUQSIpGV6iffTysde4aa/Tx6lNJRn37x37Tly1uAhPW7GB3TA7bCnnOsRTOquX ABZdfne59Z2d3G2TTnGHCnSaxdP0jdhMCaEWyI71ztj2jCfadu3cUSaZUFnQg5bJLPSStM UXq7vn9LpVIMpZn65iNSHGNSYUTo/imYcbOged9xR3LOZDa5xWc3vKOD+4S30lr8YPWZ9g o3L9nXmMg5Ggv0vlCuZ7NeAtZNhH/YcEw5CLCqhWjz8a2UK21Tq0yAtBxRu6150BtwpkmS V4xy7S4SRejh6HGMfjge2ExJ8RBbb7MBWOmjhnQwZg02P3a7naRJE6K8OQm1OQ== 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 4j8M7Y3JpRzJKC for ; Tue, 20 Oct 2026 18:55:53 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 38190 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 20 Oct 2026 18:55:53 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Andrew Gallatin Subject: git: ef7d7011ce2f - main - arm64: Fix EFI runtime mappings with 16K pages List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: Commit messages for the main branch of the src repository 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: gallatin X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ef7d7011ce2fa48ab072c5e802ac00ccb25c4c48 Auto-Submitted: auto-generated Date: Tue, 20 Oct 2026 18:55:53 +0000 Message-Id: <6ad7b939.38190.813ba59@gitrepo.freebsd.org> The branch main has been updated by gallatin: URL: https://cgit.FreeBSD.org/src/commit/?id=ef7d7011ce2fa48ab072c5e802ac00ccb25c4c48 commit ef7d7011ce2fa48ab072c5e802ac00ccb25c4c48 Author: Andrew Gallatin AuthorDate: 2026-10-20 18:54:01 +0000 Commit: Andrew Gallatin CommitDate: 2026-10-20 18:54:01 +0000 arm64: Fix EFI runtime mappings with 16K pages Map complete EFI descriptor ranges at the kernel page granularity and merge compatible entries when 4K EFI regions share a kernel page. Preserve execution when any sharing region requires it and reject conflicting mapping attributes without panicing. This gets my small N1 booting with 16K pages. Reviewed by: chs, imp Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D60749 --- sys/arm64/arm64/efirt_machdep.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/sys/arm64/arm64/efirt_machdep.c b/sys/arm64/arm64/efirt_machdep.c index 07946a2bdb82..5e6a58295e36 100644 --- a/sys/arm64/arm64/efirt_machdep.c +++ b/sys/arm64/arm64/efirt_machdep.c @@ -139,8 +139,6 @@ efi_1t1_l3(vm_offset_t va) l3 = PHYS_TO_DMAP(mphys); l3 += pmap_l3_index(va); - KASSERT(*l3 == 0, ("%s: Already mapped: va %#jx *pt %#jx", __func__, - va, *l3)); return (l3); } @@ -167,10 +165,9 @@ bool efi_create_1t1_map(struct efi_md *map, int ndesc, int descsz) { struct efi_md *p; - pt_entry_t *l3, l3_attr; - vm_offset_t va; + pt_entry_t *l3, l3_attr, l3_entry; + vm_offset_t va, end; vm_page_t efi_l0_page; - uint64_t idx; int i, mode; uint64_t pa; @@ -230,8 +227,9 @@ efi_create_1t1_map(struct efi_md *map, int ndesc, int descsz) l3_attr |= ATTR_S1_XN; VM_OBJECT_WLOCK(obj_1t1_pt); - for (va = p->md_phys, idx = 0; idx < p->md_pages; - idx += (PAGE_SIZE / EFI_PAGE_SIZE), va += PAGE_SIZE) { + /* EFI regions can start and end within a kernel page. */ + end = p->md_phys + p->md_pages * EFI_PAGE_SIZE; + for (va = trunc_page(p->md_phys); va < end; va += PAGE_SIZE) { l3 = efi_1t1_l3(va); if (mode == VM_MEMATTR_DEVICE && in_realm()) @@ -239,7 +237,24 @@ efi_create_1t1_map(struct efi_md *map, int ndesc, int descsz) else pa = va; - *l3 = PHYS_TO_PTE(pa) | l3_attr; + l3_entry = PHYS_TO_PTE(pa) | l3_attr; + if (*l3 != 0) { + /* + * Multiple EFI regions can share a kernel page. + * Their memory attributes must agree, but the + * page must be executable if any region needs it. + */ + if (((*l3 ^ l3_entry) & ~ATTR_S1_PXN) != 0) { + VM_OBJECT_WUNLOCK(obj_1t1_pt); + printf("EFI Runtime entry %d has conflicting " + "mapping at %#jx: %#jx != %#jx\n", i, + (uintmax_t)va, (uintmax_t)*l3, + (uintmax_t)l3_entry); + goto fail; + } + l3_entry &= *l3 | ~ATTR_S1_PXN; + } + *l3 = l3_entry; } VM_OBJECT_WUNLOCK(obj_1t1_pt); }