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