Noticed while looking at Jasper's diff. - convert declarations from k&r to standard C - delete support for 32bit frame backtracing. I doubt this code has ever been executed on OpenBSD. If a 32bit frame is encountered ((sp&1)==0) then print a warning and stop processing the frames - delete a pile of casts that are unnecessary - minor whitespace tweaks
build tested ok? Philip Index: db_trace.c =================================================================== RCS file: /data/src/openbsd/src/sys/arch/sparc64/sparc64/db_trace.c,v retrieving revision 1.10 diff -u -p -r1.10 db_trace.c --- db_trace.c 9 Feb 2015 09:21:30 -0000 1.10 +++ db_trace.c 10 Sep 2016 03:07:37 -0000 @@ -56,12 +56,8 @@ void db_print_window(u_int64_t); #define ULOAD(x) probeget((paddr_t)(u_long)&(x), ASI_AIUS, sizeof(x)) void -db_stack_trace_print(addr, have_addr, count, modif, pr) - db_expr_t addr; - int have_addr; - db_expr_t count; - char *modif; - int (*pr)(const char *, ...); +db_stack_trace_print(db_expr_t addr, int have_addr, db_expr_t count, + char *modif, int (*pr)(const char *, ...)) { vaddr_t frame; boolean_t kernel_only = TRUE; @@ -95,28 +91,26 @@ db_stack_trace_print(addr, have_addr, co } } + if ((frame & 1) == 0) { + db_printf("WARNING: corrupt frame at %lx\n", frame); + return; + } + while (count--) { int i; db_expr_t offset; char *name; db_addr_t pc; struct frame64 *f64; - struct frame32 *f32; /* * Switch to frame that contains arguments */ - 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); - } + + f64 = (struct frame64 *)(frame + BIAS); + pc = (db_addr_t)KLOAD(f64->fr_pc); + + frame = KLOAD(f64->fr_fp); if (kernel_only) { if (pc < KERNBASE || pc >= KERNEND) @@ -137,22 +131,20 @@ db_stack_trace_print(addr, have_addr, co name = "?"; (*pr)("%s(", name); + + if ((frame & 1) == 0) { + db_printf(")\nWARNING: corrupt frame at %lx\n", frame); + break; + } /* * Print %i0..%i5; hope these still reflect the * actual arguments somewhat... */ - if (frame & 1) { - f64 = (struct frame64 *)(frame + BIAS); - for (i = 0; i < 5; i++) - (*pr)("%lx, ", (long)KLOAD(f64->fr_arg[i])); - (*pr)("%lx) at ", (long)KLOAD(f64->fr_arg[i])); - } else { - f32 = (struct frame32 *)(frame); - for (i = 0; i < 5; i++) - (*pr)("%x, ", (u_int)KLOAD(f32->fr_arg[i])); - (*pr)("%x) at ", (u_int)KLOAD(f32->fr_arg[i])); - } + f64 = (struct frame64 *)(frame + BIAS); + for (i = 0; i < 5; i++) + (*pr)("%lx, ", (long)KLOAD(f64->fr_arg[i])); + (*pr)("%lx) at ", (long)KLOAD(f64->fr_arg[i])); db_printsym(pc, DB_STGY_PROC, pr); (*pr)("\n"); } @@ -160,11 +152,7 @@ db_stack_trace_print(addr, have_addr, co void -db_dump_window(addr, have_addr, count, modif) - db_expr_t addr; - int have_addr; - db_expr_t count; - char *modif; +db_dump_window(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { int i; u_int64_t frame = DDB_TF->tf_out[6]; @@ -174,10 +162,15 @@ db_dump_window(addr, have_addr, count, m addr = 0; /* Traverse window stack */ - for (i=0; i<addr && frame; i++) { - if (frame & 1) - frame = (u_int64_t)((struct frame64 *)(u_long)(frame + BIAS))->fr_fp; - else frame = (u_int64_t)((struct frame32 *)(u_long)frame)->fr_fp; + for (i = 0; i < addr && frame; i++) { + if ((frame & 1) == 0) + break; + frame = ((struct frame64 *)(frame + BIAS))->fr_fp; + } + + if (frame & 1) { + db_printf("WARNING: corrupt frame at %llx\n", frame); + return; } db_printf("Window %lx ", addr); @@ -185,96 +178,67 @@ db_dump_window(addr, have_addr, count, m } void -db_print_window(frame) -u_int64_t frame; +db_print_window(u_int64_t frame) { - if (frame & 1) { - struct frame64* f = (struct frame64*)(u_long)(frame + BIAS); + struct frame64 *f = (struct frame64 *)(frame + BIAS); - db_printf("frame64 %p locals, ins:\n", f); - if (INKERNEL(f)) { - db_printf("%llx %llx %llx %llx ", - (unsigned long long)f->fr_local[0], - (unsigned long long)f->fr_local[1], - (unsigned long long)f->fr_local[2], - (unsigned long long)f->fr_local[3]); - db_printf("%llx %llx %llx %llx\n", - (unsigned long long)f->fr_local[4], - (unsigned long long)f->fr_local[5], - (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[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[5], - (unsigned long long)f->fr_fp, - (unsigned long long)f->fr_pc); - /* Sometimes this don't work. Dunno why. */ - db_printsym(f->fr_pc, DB_STGY_PROC, db_printf); - db_printf("\n"); - } else { - struct frame64 fr; - - if (copyin(f, &fr, sizeof(fr))) return; - f = &fr; - db_printf("%llx %llx %llx %llx ", - (unsigned long long)f->fr_local[0], (unsigned long long)f->fr_local[1], (unsigned long long)f->fr_local[2], (unsigned long long)f->fr_local[3]); - db_printf("%llx %llx %llx %llx\n", - (unsigned long long)f->fr_local[4], (unsigned long long)f->fr_local[5], (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[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[5], - (unsigned long long)f->fr_fp, - (unsigned long long)f->fr_pc); - db_printf("\n"); - } + db_printf("frame64 %p locals, ins:\n", f); + if (INKERNEL(f)) { + db_printf("%llx %llx %llx %llx ", + (unsigned long long)f->fr_local[0], + (unsigned long long)f->fr_local[1], + (unsigned long long)f->fr_local[2], + (unsigned long long)f->fr_local[3]); + db_printf("%llx %llx %llx %llx\n", + (unsigned long long)f->fr_local[4], + (unsigned long long)f->fr_local[5], + (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[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[5], + (unsigned long long)f->fr_fp, + (unsigned long long)f->fr_pc); + /* Sometimes this don't work. Dunno why. */ + db_printsym(f->fr_pc, DB_STGY_PROC, db_printf); + db_printf("\n"); } else { - struct frame32* f = (struct frame32*)(u_long)frame; + struct frame64 fr; - db_printf("frame %p locals, ins:\n", f); - if (INKERNEL(f)) { - db_printf("%8x %8x %8x %8x %8x %8x %8x %8x\n", - 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[6], f->fr_local[7]); - db_printf("%8x %8x %8x %8x %8x %8x %8x=sp %8x=pc:", - 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_fp, f->fr_pc); - db_printsym(f->fr_pc, DB_STGY_PROC, db_printf); - db_printf("\n"); - } else { - struct frame32 fr; - - 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[2], f->fr_local[3], - 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[2], f->fr_arg[3], - f->fr_arg[4], f->fr_arg[5], - f->fr_fp, f->fr_pc); - } + if (copyin(f, &fr, sizeof(fr))) + return; + f = &fr; + db_printf("%llx %llx %llx %llx ", + (unsigned long long)f->fr_local[0], + (unsigned long long)f->fr_local[1], + (unsigned long long)f->fr_local[2], + (unsigned long long)f->fr_local[3]); + db_printf("%llx %llx %llx %llx\n", + (unsigned long long)f->fr_local[4], + (unsigned long long)f->fr_local[5], + (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[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[5], + (unsigned long long)f->fr_fp, + (unsigned long long)f->fr_pc); + db_printf("\n"); } } void -db_dump_stack(addr, have_addr, count, modif) - db_expr_t addr; - int have_addr; - db_expr_t count; - char *modif; +db_dump_stack(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { int i; u_int64_t frame, oldframe; @@ -295,46 +259,35 @@ db_dump_stack(addr, have_addr, count, mo /* Traverse window stack */ oldframe = 0; - for (i=0; i<count && frame; i++) { + for (i = 0; i < count && frame; i++) { if (oldframe == frame) { - db_printf("WARNING: stack loop at %llx\n", - (unsigned long long) frame); + db_printf("WARNING: stack loop at %llx\n", frame); break; } oldframe = frame; - if (frame & 1) { - frame += BIAS; - if (!INKERNEL(((struct frame64 *)(u_long)(frame))) - && kernel_only) break; - db_printf("Window %x ", i); - db_print_window(frame - BIAS); - if (!INKERNEL(((struct frame64 *)(u_long)(frame)))) - copyin(((caddr_t)&((struct frame64 *)(u_long)frame)->fr_fp), &frame, sizeof(frame)); - else - frame = ((struct frame64 *)(u_long)frame)->fr_fp; - } else { - u_int32_t tmp; - if (!INKERNEL(((struct frame32 *)(u_long)frame)) - && kernel_only) break; - db_printf("Window %x ", i); - db_print_window(frame); - if (!INKERNEL(((struct frame32 *)(u_long)frame))) { - copyin(&((struct frame32 *)(u_long)frame)->fr_fp, &tmp, sizeof(tmp)); - frame = (u_int64_t)tmp; - } else - frame = (u_int64_t)((struct frame32 *)(u_long)frame)->fr_fp; + + if ((frame & 1) == 0) { + db_printf("WARNING: corrupt stack at %llx\n", frame); + break; } + + frame += BIAS; + if (!INKERNEL(((struct frame64 *)frame)) + && kernel_only) break; + db_printf("Window %x ", i); + db_print_window(frame - BIAS); + if (!INKERNEL(((struct frame64 *)frame))) { + copyin(&((struct frame64 *)frame)->fr_fp, &frame, + sizeof(frame)); + } else + frame = ((struct frame64 *)frame)->fr_fp; } } void -db_dump_trap(addr, have_addr, count, modif) - db_expr_t addr; - int have_addr; - db_expr_t count; - char *modif; +db_dump_trap(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { struct trapframe64 *tf; @@ -403,21 +356,21 @@ db_dump_trap(addr, have_addr, count, mod if (tf == curproc->p_md.md_tf) { struct rwindow32 *kstack = (struct rwindow32 *)(((caddr_t)tf)+CCFSZ); db_printf("ins (from stack):\n%016llx %016llx %016llx %016llx\n", - (int64_t)kstack->rw_local[0], (int64_t)kstack->rw_local[1], - (int64_t)kstack->rw_local[2], (int64_t)kstack->rw_local[3]); + (int64_t)kstack->rw_local[0], + (int64_t)kstack->rw_local[1], + (int64_t)kstack->rw_local[2], + (int64_t)kstack->rw_local[3]); db_printf("%016llx %016llx %016llx %016llx\n", - (int64_t)kstack->rw_local[4], (int64_t)kstack->rw_local[5], - (int64_t)kstack->rw_local[6], (int64_t)kstack->rw_local[7]); + (int64_t)kstack->rw_local[4], + (int64_t)kstack->rw_local[5], + (int64_t)kstack->rw_local[6], + (int64_t)kstack->rw_local[7]); } #endif } void -db_dump_fpstate(addr, have_addr, count, modif) - db_expr_t addr; - int have_addr; - db_expr_t count; - char *modif; +db_dump_fpstate(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { struct fpstate64 *fpstate; @@ -505,11 +458,7 @@ db_dump_fpstate(addr, have_addr, count, } void -db_dump_ts(addr, have_addr, count, modif) - db_expr_t addr; - int have_addr; - db_expr_t count; - char *modif; +db_dump_ts(db_expr_t addr, int have_addr, db_expr_t count, char *modif) { struct trapstate *ts; int i, tl; @@ -517,7 +466,7 @@ db_dump_ts(addr, have_addr, count, modif /* Use our last trapframe? */ ts = &ddb_regs.ddb_ts[0]; tl = ddb_regs.ddb_tl; - for (i=0; i<tl; i++) { + for (i = 0; i < tl; i++) { printf("%d tt=%lx tstate=%lx tpc=%p tnpc=%p\n", i+1, (long)ts[i].tt, (u_long)ts[i].tstate, (void *)(u_long)ts[i].tpc, (void *)(u_long)ts[i].tnpc);