From nobody Mon Oct 12 03:59:53 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 4j33dP3B4Hz6vNQM for ; Mon, 12 Oct 2026 03:59: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 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 4j33dP1b6Sz4g6w for ; Mon, 12 Oct 2026 03:59:53 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791777593; 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=3Muf2W2UvIImT1gqnlJf8hjNiZlCalCnY1laKdnMF7I=; b=sJsgNq+HD4cBwPhu/KSPH4KhpxoC1S/011akxsJeZ2MY32iOd7FMVyOEBx9O3TcA8bFcc9 c7LwWvFCh9wGY6OFzbweFtBehtlKGBgXtGDOrfMWZaPEg4iawfikHUK6mN05+ar4qeKyDn AWDdJtetatbXD0CAh5zBgr1bjtVJQZCqI5Q+1RZS25+G9MIKBfPHJUTYirFWR88X90bGJs HAL39s3lU2A/aGkpTPS8XKPSn4u7Nxv1YBQByG1cPi2KlFC8iWrL+Pd33zqv+RLYG21fEI OFqcrFD5rt6N7ZpNsCqL5t6eKrZWLBKVubyNcSrmnINBA2jAD4hPbv/FYrnKQg== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1791777593; b=FwfBhwSnm7ChTmbvv70QNriU0+59LEhTSTAJUV28tKQ00tK0bF65tghR7MjfgoJPDQdubJ 5uvLbsJ/kSKxxKhf3h+G0Z2VkaRUL3Gu8bkYpUXoeaGgwpfCv6pSNKa/+YVFD+9VyDDv9N gBxBHpbT2B4FMh0Hh/xZqf6+dPgLgZIFVsz4BoNS5BD5oKmVs68uT/S47GEKR6HvyAfk9e SRXlWHs4nzb0fCvtJ5+Oa3aJu/Ff6gffJvyWVgnAcE0cYuzNpY4jWQjjZ4F7LJfhcJW8pX SZ84mWLA/J2qSRq+l7qEN3UMC8rjxxvORSMyr+9Lfz0Ai3edwWG7zvEPpXPZCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1791777593; 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=3Muf2W2UvIImT1gqnlJf8hjNiZlCalCnY1laKdnMF7I=; b=Xt2LIOYxD9YnqtDv2Xx5/h+D+rO2NnVMk7hej+mR94kyOmf6qxkV0FKMsGAB/b8kuh16AD Db6HgddsOka21kpwGPW4Om53a5hvrm4D6v5IIbhGqLiMVNkja4jsnYEXIcfNIZ8lV3YNhc NXXJX17YA9UPdNCBm0kSEqVWi5hg0rG4qvLQ7471hJ4TOID1BXKm6MTotsx7aFjGB63t8P IIOuji5Wo+0hFHHocO9wfFtuNjsigPCCFUgfoMJLkRsEQWpgvS6I6J2WsEXIUM2+jvs59k gaAIBj0WV1wOUyHmTm3IuBVNd7ahwYY6ezA9eFvrqZBCMn1hnko2hBrEL2N5Ww== 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 4j33dP0fvBz1B47 for ; Mon, 12 Oct 2026 03:59:53 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 18d71 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 12 Oct 2026 03:59:53 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Minsoo Choo Subject: git: f02a5391295e - stable/15 - powerpc/radix: include page tables in minidumps List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: Commit messages for all branches 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: mchoo X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: f02a5391295e37474d66d92b6a76433a2f4ac643 Auto-Submitted: auto-generated Date: Mon, 12 Oct 2026 03:59:53 +0000 Message-Id: <6acc5b39.18d71.a9548b@gitrepo.freebsd.org> The branch stable/15 has been updated by mchoo: URL: https://cgit.FreeBSD.org/src/commit/?id=f02a5391295e37474d66d92b6a76433a2f4ac643 commit f02a5391295e37474d66d92b6a76433a2f4ac643 Author: Minsoo Choo AuthorDate: 2026-09-16 04:12:30 +0000 Commit: Minsoo Choo CommitDate: 2026-10-12 03:59:13 +0000 powerpc/radix: include page tables in minidumps The radix pmap did not implement the minidump pmap callbacks, so radix minidumps were emitted with an empty pmap section. Such dumps do not contain enough information for libkvm to translate kernel virtual addresses. Snapshot the 64KB radix root table in the pmap section, add lower-level page-table pages to the sparse dump, and include pages backing non-DMAP kernel mappings. Keep the bulk direct map out of the dump while retaining the relocated kernel image. PR: 298532 Reviewed by: jhb Approved by: jhb (mentor) MFC after: 2 weeks Sponsored by: FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D59743 (cherry picked from commit a38a698704b0289db3260617116a455fecdd54f6) --- sys/powerpc/aim/mmu_radix.c | 157 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/sys/powerpc/aim/mmu_radix.c b/sys/powerpc/aim/mmu_radix.c index 4e877f3ecd55..754522e85591 100644 --- a/sys/powerpc/aim/mmu_radix.c +++ b/sys/powerpc/aim/mmu_radix.c @@ -121,6 +121,8 @@ static void pmap_pte_walk(pml1_entry_t *l1, vm_offset_t va); extern int nkpt; extern caddr_t crashdumpmap; +extern unsigned char _etext[]; +extern unsigned char _end[]; #define RIC_FLUSH_TLB 0 #define RIC_FLUSH_PWC 1 @@ -493,6 +495,9 @@ static void mmu_radix_kenter_attr(vm_offset_t, vm_paddr_t, vm_memattr_t ma); static int mmu_radix_dev_direct_mapped(vm_paddr_t, vm_size_t); static void mmu_radix_dumpsys_map(vm_paddr_t pa, size_t sz, void **va); static void mmu_radix_scan_init(void); +static size_t mmu_radix_scan_pmap(struct bitset *dump_bitset); +static void *mmu_radix_dump_pmap_init(unsigned blkpgs); +static void *mmu_radix_dump_pmap(void *ctx, void *buf, u_long *nbytes); static void mmu_radix_cpu_bootstrap(int ap); static void mmu_radix_tlbie_all(void); @@ -515,6 +520,9 @@ static struct pmap_funcs mmu_radix_methods = { .dev_direct_mapped = mmu_radix_dev_direct_mapped, .dumpsys_pa_init = mmu_radix_scan_init, .dumpsys_map_chunk = mmu_radix_dumpsys_map, + .dumpsys_scan_pmap = mmu_radix_scan_pmap, + .dumpsys_dump_pmap_init = mmu_radix_dump_pmap_init, + .dumpsys_dump_pmap = mmu_radix_dump_pmap, .page_is_mapped = mmu_radix_page_is_mapped, .ps_enabled = mmu_radix_ps_enabled, .align_superpage = mmu_radix_align_superpage, @@ -6176,6 +6184,155 @@ mmu_radix_dev_direct_mapped(vm_paddr_t pa, vm_size_t size) return (mem_valid(pa, size)); } +static void +mmu_radix_dump_add_range(struct bitset *dump_bitset, vm_paddr_t pa, + vm_size_t size) +{ + vm_paddr_t end; + + end = pa + size; + for (; pa < end; pa += PAGE_SIZE) { + if (vm_phys_is_dumpable(pa)) + vm_page_dump_add(dump_bitset, pa); + } +} + +static void +mmu_radix_dump_add_leaf(struct bitset *dump_bitset, vm_offset_t va, + vm_paddr_t pa, vm_size_t size, vm_offset_t kstart, vm_offset_t kend) +{ + vm_offset_t end, start; + + /* + * Most DMAP mappings only provide aliases for memory already selected + * by the minidump bitmap. The relocated kernel image is the exception: + * its pages were allocated before regular minidump page tracking began. + */ + if (va < VM_MIN_KERNEL_ADDRESS) { + end = va + size; + if (end <= kstart || va >= kend) + return; + start = MAX(va, kstart); + end = MIN(end, kend); + pa += start - va; + size = end - start; + } + mmu_radix_dump_add_range(dump_bitset, pa, size); +} + +static size_t +mmu_radix_scan_pmap(struct bitset *dump_bitset) +{ + pt_entry_t *l1, *l2, *l3, *pt; + pt_entry_t l1e, l2e, l3e, pte; + vm_offset_t kstart, kend, va1, va2, va3, va; + vm_paddr_t pa; + u_int i, j, k, l; + + kstart = trunc_page((vm_offset_t)_etext); + kend = round_page((vm_offset_t)_end); + l1 = kernel_pmap->pm_pml1; + + PMAP_LOCK(kernel_pmap); + for (i = 0; i < RADIX_PGD_SIZE / sizeof(*l1); i++) { + l1e = be64toh(l1[i]); + if ((l1e & RPTE_VALID) == 0) + continue; + va1 = DMAP_BASE_ADDRESS | ((vm_offset_t)i << + L1_PAGE_SIZE_SHIFT); + if ((l1e & RPTE_LEAF) != 0) { + mmu_radix_dump_add_leaf(dump_bitset, va1, + l1e & RPTE_RPN_MASK, L1_PAGE_SIZE, kstart, kend); + continue; + } + + pa = l1e & RPDE_NLB_MASK; + mmu_radix_dump_add_range(dump_bitset, pa, PAGE_SIZE); + l2 = PHYS_TO_DMAP(pa); + for (j = 0; j < NL2EPG; j++) { + l2e = be64toh(l2[j]); + if ((l2e & RPTE_VALID) == 0) + continue; + va2 = va1 | ((vm_offset_t)j << L2_PAGE_SIZE_SHIFT); + if ((l2e & RPTE_LEAF) != 0) { + mmu_radix_dump_add_leaf(dump_bitset, va2, + l2e & RPTE_RPN_MASK, L2_PAGE_SIZE, kstart, + kend); + continue; + } + + pa = l2e & RPDE_NLB_MASK; + mmu_radix_dump_add_range(dump_bitset, pa, PAGE_SIZE); + l3 = PHYS_TO_DMAP(pa); + for (k = 0; k < NL3EPG; k++) { + l3e = be64toh(l3[k]); + if ((l3e & RPTE_VALID) == 0) + continue; + va3 = va2 | ((vm_offset_t)k << + L3_PAGE_SIZE_SHIFT); + if ((l3e & RPTE_LEAF) != 0) { + mmu_radix_dump_add_leaf(dump_bitset, va3, + l3e & RPTE_RPN_MASK, L3_PAGE_SIZE, + kstart, kend); + continue; + } + + pa = l3e & RPDE_NLB_MASK; + mmu_radix_dump_add_range(dump_bitset, pa, + PAGE_SIZE); + pt = PHYS_TO_DMAP(pa); + for (l = 0; l < RPTE_ENTRIES; l++) { + pte = be64toh(pt[l]); + if ((pte & (RPTE_VALID | RPTE_LEAF)) != + (RPTE_VALID | RPTE_LEAF)) + continue; + va = va3 | ((vm_offset_t)l << PAGE_SHIFT); + mmu_radix_dump_add_leaf(dump_bitset, va, + pte & RPTE_RPN_MASK, PAGE_SIZE, + kstart, kend); + } + } + } + } + PMAP_UNLOCK(kernel_pmap); + + return (RADIX_PGD_SIZE); +} + +struct radix_dump_context { + size_t off; + size_t blksz; +}; + +static struct radix_dump_context radix_dump_ctx; + +static void * +mmu_radix_dump_pmap_init(unsigned blkpgs) +{ + + radix_dump_ctx.off = 0; + radix_dump_ctx.blksz = blkpgs * PAGE_SIZE; + return (&radix_dump_ctx); +} + +static void * +mmu_radix_dump_pmap(void *ctx, void *buf __unused, u_long *nbytes) +{ + struct radix_dump_context *dctx; + void *p; + + dctx = ctx; + if (dctx->off == RADIX_PGD_SIZE) { + *nbytes = 0; + return (NULL); + } + + *nbytes = MIN(dctx->blksz, RADIX_PGD_SIZE - dctx->off); + p = (char *)kernel_pmap->pm_pml1 + dctx->off; + dctx->off += *nbytes; + return (p); +} + static void mmu_radix_scan_init(void) {