> Date: Fri, 9 Sep 2016 20:44:00 -0700
> From: Philip Guenther <[email protected]>
>
> On Fri, 9 Sep 2016, Philip Guenther wrote:
> > 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
>
> Testing "tr", "mach stack", "mach window", and "mach tf" showed one
> reversed test. Updated diff below.
>
> ok?
ok kettenis@
> 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:36:20 -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) == 0) {
> + 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);
> -
> - 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;
> + struct frame64 *f = (struct frame64 *)(frame + BIAS);
>
> - 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;
> -
> - 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;
> + struct frame64 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);
>
>