Module Name: src Committed By: skrll Date: Sat Jan 24 15:44:32 UTC 2015
Modified Files: src/sys/arch/arm/arm: db_trace.c Log Message: Fix crash(8) backtrace support. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/sys/arch/arm/arm/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/arm/arm/db_trace.c diff -u src/sys/arch/arm/arm/db_trace.c:1.30 src/sys/arch/arm/arm/db_trace.c:1.31 --- src/sys/arch/arm/arm/db_trace.c:1.30 Sat Mar 29 15:48:01 2014 +++ src/sys/arch/arm/arm/db_trace.c Sat Jan 24 15:44:32 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: db_trace.c,v 1.30 2014/03/29 15:48:01 skrll Exp $ */ +/* $NetBSD: db_trace.c,v 1.31 2015/01/24 15:44:32 skrll Exp $ */ /* * Copyright (c) 2000, 2001 Ben Harris @@ -31,7 +31,7 @@ #include <sys/param.h> -__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.30 2014/03/29 15:48:01 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: db_trace.c,v 1.31 2015/01/24 15:44:32 skrll Exp $"); #include <sys/proc.h> #include <arm/armreg.h> @@ -155,9 +155,19 @@ db_stack_trace_print(db_expr_t addr, boo } else frame = (uint32_t *)(addr); } - lastframe = NULL; scp_offset = -(get_pc_str_offset() >> 2); + if (frame == NULL) + return; + + lastframe = frame; +#ifndef _KERNEL + uint32_t frameb[4]; + db_read_bytes((db_addr_t)(frame - 3), sizeof(frameb), + (char *)frameb); + frame = frameb + 3; +#endif + /* * In theory, the SCP isn't guaranteed to be in the function * that generated the stack frame. We hope for the best. @@ -169,7 +179,7 @@ db_stack_trace_print(db_expr_t addr, boo #endif pc = scp; - while (count-- && frame != NULL) { + while (count--) { uint32_t savecode; int r; uint32_t *rp; @@ -180,14 +190,8 @@ db_stack_trace_print(db_expr_t addr, boo #else scp = frame[FR_SCP]; #endif - lastframe = frame; - (*pr)("%p: ", frame); -#ifndef _KERNEL - uint32_t frameb[4]; - db_read_bytes((db_addr_t)(frame - 3), sizeof(frameb), - (char *)frameb); - frame = frameb + 3; -#endif + (*pr)("%p: ", lastframe); + db_printsym(pc, DB_STGY_PROC, pr); if (trace_full) { (*pr)("\n\t"); @@ -244,6 +248,9 @@ db_stack_trace_print(db_expr_t addr, boo frame = (uint32_t *)(frame[FR_RFP]); + if (frame == NULL) + break; + if (INKERNEL((int)frame)) { /* staying in kernel */ if (frame <= lastframe) { @@ -262,5 +269,11 @@ db_stack_trace_print(db_expr_t addr, boo break; } } + lastframe = frame; +#ifndef _KERNEL + db_read_bytes((db_addr_t)(frame - 3), sizeof(frameb), + (char *)frameb); + frame = frameb + 3; +#endif } }