diff options
-rw-r--r-- | sys/ia64/ia64/db_trace.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/sys/ia64/ia64/db_trace.c b/sys/ia64/ia64/db_trace.c index 289446a..e30e340 100644 --- a/sys/ia64/ia64/db_trace.c +++ b/sys/ia64/ia64/db_trace.c @@ -63,23 +63,38 @@ db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count, char *m db_expr_t offset; c_db_sym_t sym; u_int64_t ar_pfs; + u_int64_t newpc; + int newsof, newsol, i; + + /* + * XXX this assumes the simplistic stack frames used + * by the old toolchain. + */ + ar_pfs = *db_rse_register_address(bsp, 32 + sol - 1); + newpc = *db_rse_register_address(bsp, 32 + sol - 2); + newsof = ar_pfs & 0x7f; + newsol = (ar_pfs >> 7) & 0x7f; sym = db_search_symbol(callpc, DB_STGY_ANY, &offset); db_symbol_values(sym, &name, NULL); - db_printf("%s() at ", name); + db_printf("%s(", name); + + for (i = 0; i < newsof - newsol; i++) { + if (i > 0) + db_printf(", "); + db_printf("0x%lx", + *db_rse_register_address(bsp, 32 + i)); + } + db_printf(") at "); + db_printsym(callpc, DB_STGY_PROC); db_printf("\n"); - /* - * XXX this assumes the simplistic stack frames used - * by the old toolchain. - */ - ar_pfs = *db_rse_register_address(bsp, 32 + sol - 1); - callpc = *db_rse_register_address(bsp, 32 + sol - 2); - sof = ar_pfs & 0x7f; - sol = (ar_pfs >> 7) & 0x7f; - bsp = db_rse_previous_frame(bsp, sol); + bsp = db_rse_previous_frame(bsp, newsol); + callpc = newpc; + sol = newsol; + sof = newsof; if (!callpc) break; } |