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);

Reply via email to