Module Name: src Committed By: martin Date: Fri Sep 20 09:30:52 UTC 2024
Modified Files: src/sys/arch/sparc64/sparc64 [netbsd-10]: db_trace.c Log Message: Pull up following revision(s) (requested by rin in ticket #883): sys/arch/sparc64/sparc64/db_trace.c: revision 1.56 sys/arch/sparc64/sparc64/db_trace.c: revision 1.57 sparc64/db_trace.c: Nix trailing whitespace. No functional change intended. sparc64/db_trace.c: Don't dereference; use db_read_bytes. Makes crash(8) and ddb match, and avoids crashing in ddb when you feed in a bad lwp pointer! To generate a diff of this commit: cvs rdiff -u -r1.55 -r1.55.20.1 src/sys/arch/sparc64/sparc64/db_trace.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/sparc64/sparc64/db_trace.c diff -u src/sys/arch/sparc64/sparc64/db_trace.c:1.55 src/sys/arch/sparc64/sparc64/db_trace.c:1.55.20.1 --- src/sys/arch/sparc64/sparc64/db_trace.c:1.55 Sun May 31 11:28:52 2020 +++ src/sys/arch/sparc64/sparc64/db_trace.c Fri Sep 20 09:30:52 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: db_trace.c,v 1.55 2020/05/31 11:28:52 martin Exp $ */ +/* $NetBSD: db_trace.c,v 1.55.20.1 2024/09/20 09:30:52 martin Exp $ */ /* * Copyright (c) 1996-2002 Eduardo Horvath. All rights reserved. @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.55 2020/05/31 11:28:52 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.55.20.1 2024/09/20 09:30:52 martin Exp $"); #include <sys/param.h> #include <sys/proc.h> @@ -57,7 +57,7 @@ void db_print_window(uint64_t); #endif #ifdef _KERNEL -#define KLOAD(x) probeget((paddr_t)(u_long)&(x), ASI_PRIMARY, sizeof(x)) +#define KLOAD(x) probeget((paddr_t)(u_long)&(x), ASI_PRIMARY, sizeof(x)) #else static long kload(db_addr_t addr) @@ -127,12 +127,8 @@ db_stack_trace_print(db_expr_t addr, boo } (*pr)("lid %d ", l.l_lid); pcb = lwp_getpcb(&l); -#ifndef _KERNEL db_read_bytes((db_addr_t)&pcb->pcb_sp, sizeof(frame), (char *)&frame); -#else - frame = (vaddr_t)pcb->pcb_sp; -#endif (*pr)("at %p\n", frame); } else { frame = (vaddr_t)addr; @@ -153,12 +149,12 @@ db_stack_trace_print(db_expr_t addr, boo if (frame & 1) { f64 = (struct frame64 *)(frame + BIAS); pc = (db_addr_t)KLOAD(f64->fr_pc); - + frame = KLOAD(f64->fr_fp); } else { f32 = (struct frame32 *)(frame); pc = (db_addr_t)KLOAD(f32->fr_pc); - + frame = (long)KLOAD(f32->fr_fp); } @@ -175,13 +171,13 @@ db_stack_trace_print(db_expr_t addr, boo if (!INKERNEL(frame)) break; #endif - + db_find_sym_and_offset(pc, &name, &offset); if (name == NULL) name = "?"; - + (*pr)("%s(", name); - + /* * Print %i0..%i5; hope these still reflect the * actual arguments somewhat... @@ -216,7 +212,7 @@ db_dump_window(db_expr_t addr, bool have /* Traverse window stack */ for (i=0; i<addr && frame; i++) { - if (frame & 1) + if (frame & 1) frame = (uint64_t)((struct frame64 *)(u_long)(frame + BIAS))->fr_fp; else frame = (uint64_t)((struct frame32 *)(u_long)frame)->fr_fp; } @@ -226,13 +222,13 @@ db_dump_window(db_expr_t addr, bool have } #endif -void +void db_print_window(uint64_t frame) { if (frame & 1) { struct frame64* f = (struct frame64*)(u_long)(frame + BIAS); - db_printf("frame64 %p locals, ins:\n", f); + db_printf("frame64 %p locals, ins:\n", f); if (INKERNEL(f)) { db_printf("%llx %llx %llx %llx ", (unsigned long long)f->fr_local[0], @@ -245,12 +241,12 @@ db_print_window(uint64_t frame) (unsigned long long)f->fr_local[6], (unsigned long long)f->fr_local[7]); db_printf("%llx %llx %llx %llx ", - (unsigned long long)f->fr_arg[0], + (unsigned long long)f->fr_arg[0], (unsigned long long)f->fr_arg[1], (unsigned long long)f->fr_arg[2], (unsigned long long)f->fr_arg[3]); db_printf("%llx %llx %llx=sp %llx=pc:", - (unsigned long long)f->fr_arg[4], + (unsigned long long)f->fr_arg[4], (unsigned long long)f->fr_arg[5], (unsigned long long)f->fr_fp, (unsigned long long)f->fr_pc); @@ -276,7 +272,7 @@ db_print_window(uint64_t frame) (unsigned long long)f->fr_arg[5], (unsigned long long)f->fr_fp, (unsigned long long)f->fr_pc); - db_printf("\n"); + db_printf("\n"); } } else { struct frame32* f = (struct frame32*)(u_long)frame; @@ -297,14 +293,14 @@ db_print_window(uint64_t frame) if (copyin(f, &fr, sizeof(fr))) return; f = &fr; db_printf("%8x %8x %8x %8x %8x %8x %8x %8x\n", - f->fr_local[0], f->fr_local[1], + f->fr_local[0], f->fr_local[1], f->fr_local[2], f->fr_local[3], - f->fr_local[4], f->fr_local[5], + f->fr_local[4], f->fr_local[5], f->fr_local[6], f->fr_local[7]); db_printf("%8x %8x %8x %8x %8x %8x %8x=sp %8x=pc\n", - f->fr_arg[0], f->fr_arg[1], + f->fr_arg[0], f->fr_arg[1], f->fr_arg[2], f->fr_arg[3], - f->fr_arg[4], f->fr_arg[5], + f->fr_arg[4], f->fr_arg[5], f->fr_fp, f->fr_pc); } } @@ -391,7 +387,7 @@ db_dump_trap(db_expr_t addr, bool have_a tf, (unsigned long long)tf->tf_tstate, (unsigned long long)tf->tf_pc, (unsigned long long)tf->tf_npc); - db_printf("y: %x\tpil: %d\toldpil: %d\tfault: %llx\ttt: %x\tGlobals:\n", + db_printf("y: %x\tpil: %d\toldpil: %d\tfault: %llx\ttt: %x\tGlobals:\n", (int)tf->tf_y, (int)tf->tf_pil, (int)tf->tf_oldpil, (unsigned long long)tf->tf_fault, (int)tf->tf_tt); db_printf("%016llx %016llx %016llx %016llx\n",