From nobody Sat Sep 05 04:15:19 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 4hcKkK0g38z6qs2K for ; Sat, 05 Sep 2026 04:15:20 +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 4hcKkJ0ygRz3bSZ for ; Sat, 05 Sep 2026 04:15:20 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1788581720; 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=ka/PNkYYj1tlibO9JnQb5RYuNKwqi7wFSNRuSHm29A8=; b=Nv8d606pTLXR2lkaooP4OKY2F6wQllXcqWjlXDNWNKFIYKwmodTdstPIbQ7JORh2PixVt/ qO7ZE/YcfUQzrMe6C9FJVZXYvTS3ycuDAugyu8oD285HRbrbwEXJqz1crOvncd+GX631tK SuF47z7MA2/sYdHIYZglbO7EE+JIPRQXSIZ6eLXwc7EvXGokKQYGQiuptCXJVsky6hO4no a8bifTX3SG7frrhFnDWR7ArwsAEMPQ0eGgrDQbV2KSdLtZ1PM46Tdb/WM6AhqPA2rCojKE sjdMWldHlJjIKK15EW9VSWgEUbhGHGlhpjcTb/uPqhUjc6VQG6Jv/zf4D77Y+g== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1788581720; a=rsa-sha256; cv=none; b=ZlpKr5MHrufWe/rqL/WRQPuJxW1/p6n9oY8CosDBx8IM4YCOoRKNzdSZ7USGg/8240qqaY Q8NYy0L02MXGyeJau5l9qrjocVj3JguxcHIppQWfEXHLPpSdqWeMDzFG5lOzuoAhFHVV9v RgVN92taImoP7xa6HzHZsvl/D3CB+qRpb9OGfwfJWktOtqal6LXdfg+V2EwQOudql3N1IP VKy3BA1bj3W1BwyqQZRlKJENgYGIDJj5xYhgt/H5EKj3sg42F0Xf9GiR60XkCIcjbFCY7V mO+GYfEsI4CxGeDUcjBqeAJqQQJPnSF1oeqIZP4Hi6J+xe0M7kMyK7wLw9knSA== 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=1788581720; 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=ka/PNkYYj1tlibO9JnQb5RYuNKwqi7wFSNRuSHm29A8=; b=mfZcwdo/kbPmnBNIKB2KUy2HWk2Y1r6EMRKsNywQ6bzfWANAy83RzFK2HYRPyqo0hWMQy0 Kpw9D+vlAEWPsd2khN+N9oqcv771OOh6/q6eFojfwATE7EXLvH6HnHLz8gzqO+QfXVXDI3 4xwAgwyGvMlnsTsPZ6bz93rX44eMh1kalYgqzTo0yWJmLCiiOnuGBanBSNC78BuFXBRZnM QVcC6SZV0Kdd6EoLhzEsspWKizYTkIVCfAA1lBgwXCuZzBTfu7ddXPuylG228Mx0HfLbNn VCfJqr9x0EyZFqsE//UduuhJevdd9Q2et0H0Np089AixoYNug/MBMGBYgqeTkw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4hcKkH62SmzVc9 for ; Sat, 05 Sep 2026 04:15:19 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3e98b by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sat, 05 Sep 2026 04:15:19 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Justin Hibbits Subject: git: 5aeedaf7204a - main - powerpc/ddb: Dump more state in `show pcpu` 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: jhibbits X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5aeedaf7204a97b88f04d6a1890dfd1ff02d6101 Auto-Submitted: auto-generated Date: Sat, 05 Sep 2026 04:15:19 +0000 Message-Id: <6a9b9757.3e98b.19ba6e72@gitrepo.freebsd.org> The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=5aeedaf7204a97b88f04d6a1890dfd1ff02d6101 commit 5aeedaf7204a97b88f04d6a1890dfd1ff02d6101 Author: Justin Hibbits AuthorDate: 2026-09-05 04:03:11 +0000 Commit: Justin Hibbits CommitDate: 2026-09-05 04:11:57 +0000 powerpc/ddb: Dump more state in `show pcpu` Add a new CPU-family `show pcpu` handler, cpu_db_show_mdpcpu() to dump CPU-specific PCPU data. Only Book-E is populated for now, but AIM may be populated later. These new field prints: save areas, TLB miss nesting, the new critical stack pointer. All of them have been very useful for debugging very esoteric bugs, so make them easier to see from DDB, instead of having to rummage through hex dumps. --- sys/powerpc/aim/aim_machdep.c | 7 ++++++ sys/powerpc/booke/booke_machdep.c | 48 ++++++++++++++++++++++++++++++++++++++ sys/powerpc/include/md_var.h | 5 ++++ sys/powerpc/powerpc/db_interface.c | 7 ++++++ 4 files changed, 67 insertions(+) diff --git a/sys/powerpc/aim/aim_machdep.c b/sys/powerpc/aim/aim_machdep.c index 814c679ff47e..2dbd087c8f4e 100644 --- a/sys/powerpc/aim/aim_machdep.c +++ b/sys/powerpc/aim/aim_machdep.c @@ -541,6 +541,13 @@ memcpy(pcpu->pc_aim.slb, PCPU_GET(aim.slb), sizeof(pcpu->pc_aim.slb)); #endif } +#ifdef DDB +void +cpu_db_show_mdpcpu(struct pcpu *pc) +{ +} +#endif + /* Return 0 on handled success, otherwise signal number. */ int cpu_machine_check(struct thread *td, struct trapframe *frame, int *ucode) diff --git a/sys/powerpc/booke/booke_machdep.c b/sys/powerpc/booke/booke_machdep.c index 99b14bc9e974..58b847766d46 100644 --- a/sys/powerpc/booke/booke_machdep.c +++ b/sys/powerpc/booke/booke_machdep.c @@ -426,6 +426,54 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t sz) #endif } +#ifdef DDB +/* + * Dump an exception save area. In a nested save, R31 holds the DEAR of the + * outer exception. + */ +static void +db_show_booke_save(const char *name, register_t *sv) +{ + + db_printf("%s r30 %#jx r31 %#jx dear %#jx esr %#jx\n", name, + (uintmax_t)sv[CPUSAVE_R30], (uintmax_t)sv[CPUSAVE_R31], + (uintmax_t)sv[CPUSAVE_BOOKE_DEAR], + (uintmax_t)sv[CPUSAVE_BOOKE_ESR]); + db_printf("%s srr0 %#jx srr1 %#jx\n", name, + (uintmax_t)sv[CPUSAVE_SRR0], (uintmax_t)sv[CPUSAVE_SRR1]); +} + +void +cpu_db_show_mdpcpu(struct pcpu *pc) +{ + register_t *tlbsave; + int i; + + db_printf("tid_next = %d tlb_level = %#jx critstack = %p\n", + pc->pc_booke.tid_next, (uintmax_t)pc->pc_booke.tlb_level, + pc->pc_booke.critstack); + db_show_booke_save("tempsave", pc->pc_tempsave); + db_show_booke_save("disisave", pc->pc_disisave); + db_show_booke_save("critsave", pc->pc_booke.critsave); + /* + * In critsave, CPUSAVE_SRR0-1 hold the interrupt's own CSRR0-1 (DSRR0-1 + * for the enhanced-debug vector); the non-critical SRR0-1 that were + * live at the time are kept separately. + */ + db_printf("critsave held srr0 %#jx srr1 %#jx\n", + (uintmax_t)pc->pc_booke.critsave[BOOKE_CRITSAVE_SRR0], + (uintmax_t)pc->pc_booke.critsave[BOOKE_CRITSAVE_SRR1]); + db_show_booke_save("mchksave", pc->pc_booke.mchksave); + for (i = 0; i < BOOKE_TLB_MAXNEST && + i < (int)pc->pc_booke.tlb_level; i++) { + tlbsave = &pc->pc_booke.tlbsave[i * BOOKE_TLB_SAVELEN]; + db_printf("tlbsave%d srr0 %#jx srr1 %#jx\n", i, + (uintmax_t)tlbsave[TLBSAVE_BOOKE_SRR0], + (uintmax_t)tlbsave[TLBSAVE_BOOKE_SRR1]); + } +} +#endif /* DDB */ + /* Shutdown the CPU as much as possible. */ void cpu_halt(void) diff --git a/sys/powerpc/include/md_var.h b/sys/powerpc/include/md_var.h index e995f0a91b63..b51d779fbd0f 100644 --- a/sys/powerpc/include/md_var.h +++ b/sys/powerpc/include/md_var.h @@ -68,4 +68,9 @@ void cpu_setup(u_int); struct trapframe; void powerpc_interrupt(struct trapframe *); +/* Platform half of DDB 'show pcpu' (db_show_mdpcpu) */ +struct pcpu; +void cpu_db_show_mdpcpu(struct pcpu *); + + #endif /* !_MACHINE_MD_VAR_H_ */ diff --git a/sys/powerpc/powerpc/db_interface.c b/sys/powerpc/powerpc/db_interface.c index 158578d7a27d..f0da39ba93ec 100644 --- a/sys/powerpc/powerpc/db_interface.c +++ b/sys/powerpc/powerpc/db_interface.c @@ -86,8 +86,15 @@ db_write_bytes(vm_offset_t addr, size_t size, char *data) void db_show_mdpcpu(struct pcpu *pc) { + struct thread *td; db_printf("PPC: hwref = %#zx\n", pc->pc_hwref); db_printf("PPC: ipimask = %#x\n", pc->pc_ipimask); db_printf("PPC: flags = %#x\n", pc->pc_flags); + td = pc->pc_curthread; + if (td != NULL) + db_printf("PPC: spinlocks = %d saved_msr = %#jx\n", + td->td_md.md_spinlock_count, + (uintmax_t)td->td_md.md_saved_msr); + cpu_db_show_mdpcpu(pc); }