diff options
-rw-r--r-- | sys/alpha/alpha/db_trace.c | 6 | ||||
-rw-r--r-- | sys/amd64/amd64/db_trace.c | 6 | ||||
-rw-r--r-- | sys/arm/arm/db_trace.c | 6 | ||||
-rw-r--r-- | sys/i386/i386/db_trace.c | 6 | ||||
-rw-r--r-- | sys/ia64/ia64/db_trace.c | 6 | ||||
-rw-r--r-- | sys/powerpc/powerpc/db_trace.c | 5 | ||||
-rw-r--r-- | sys/sparc64/sparc64/db_trace.c | 15 |
7 files changed, 33 insertions, 17 deletions
diff --git a/sys/alpha/alpha/db_trace.c b/sys/alpha/alpha/db_trace.c index 615bd2edff28..8671ca82586b 100644 --- a/sys/alpha/alpha/db_trace.c +++ b/sys/alpha/alpha/db_trace.c @@ -213,14 +213,16 @@ db_backtrace(struct thread *td, db_addr_t frame, db_addr_t pc, int count) db_expr_t diff; db_addr_t symval; u_long last_ipl, tfps; - int i; + int i, quit; if (count == -1) count = 1024; last_ipl = ~0L; tf = NULL; - while (count--) { + quit = 0; + db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE); + while (count-- && !quit) { sym = db_search_symbol(pc, DB_STGY_ANY, &diff); if (sym == DB_SYM_NULL) return (ENOENT); diff --git a/sys/amd64/amd64/db_trace.c b/sys/amd64/amd64/db_trace.c index 5928dbe48d68..a4d464a7277f 100644 --- a/sys/amd64/amd64/db_trace.c +++ b/sys/amd64/amd64/db_trace.c @@ -373,14 +373,16 @@ db_backtrace(struct thread *td, struct trapframe *tf, long *argp; db_expr_t offset; c_db_sym_t sym; - int narg; + int narg, quit; boolean_t first; if (count == -1) count = 1024; first = TRUE; - while (count--) { + quit = 0; + db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE); + while (count-- && !quit) { sym = db_search_symbol(pc, DB_STGY_ANY, &offset); db_symbol_values(sym, &name, NULL); diff --git a/sys/arm/arm/db_trace.c b/sys/arm/arm/db_trace.c index b05e760d448c..28ca26de5ac8 100644 --- a/sys/arm/arm/db_trace.c +++ b/sys/arm/arm/db_trace.c @@ -102,7 +102,7 @@ db_stack_trace_cmd(addr, have_addr, count, modif) db_expr_t offset; boolean_t kernel_only = TRUE; boolean_t trace_thread = FALSE; - int scp_offset; + int scp_offset, quit; if (kdb_frame == NULL && !have_addr) return; @@ -142,7 +142,9 @@ db_stack_trace_cmd(addr, have_addr, count, modif) lastframe = NULL; scp_offset = -(get_pc_str_offset() >> 2); - while (count-- && frame != NULL) { + quit = 0; + db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE); + while (count-- && frame != NULL && !quit) { db_addr_t scp; u_int32_t savecode; int r; diff --git a/sys/i386/i386/db_trace.c b/sys/i386/i386/db_trace.c index ca3435eaf348..4b6cb61e3522 100644 --- a/sys/i386/i386/db_trace.c +++ b/sys/i386/i386/db_trace.c @@ -379,14 +379,16 @@ db_backtrace(struct thread *td, struct trapframe *tf, struct i386_frame *frame, int *argp; db_expr_t offset; c_db_sym_t sym; - int narg; + int narg, quit; boolean_t first; if (count == -1) count = 1024; first = TRUE; - while (count--) { + quit = 0; + db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE); + while (count-- && !quit) { sym = db_search_symbol(pc, DB_STGY_ANY, &offset); db_symbol_values(sym, &name, NULL); diff --git a/sys/ia64/ia64/db_trace.c b/sys/ia64/ia64/db_trace.c index 7f9c53cd9614..6065eb656279 100644 --- a/sys/ia64/ia64/db_trace.c +++ b/sys/ia64/ia64/db_trace.c @@ -57,10 +57,12 @@ db_backtrace(struct thread *td, struct pcb *pcb, int count) db_expr_t offset; uint64_t bsp, cfm, ip, pfs, reg, sp; c_db_sym_t sym; - int args, error, i; + int args, error, i, quit; + quit = 0; + db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE); error = unw_create_from_pcb(&rs, pcb); - while (!error && count--) { + while (!error && count-- && !quit) { error = unw_get_cfm(&rs, &cfm); if (!error) error = unw_get_bsp(&rs, &bsp); diff --git a/sys/powerpc/powerpc/db_trace.c b/sys/powerpc/powerpc/db_trace.c index 9fe1cc38322a..23d4e50eb5c6 100644 --- a/sys/powerpc/powerpc/db_trace.c +++ b/sys/powerpc/powerpc/db_trace.c @@ -129,6 +129,7 @@ db_backtrace(struct thread *td, db_addr_t fp, int count) const char *symname; boolean_t kernel_only = TRUE; boolean_t full = FALSE; + int quit; #if 0 { @@ -148,7 +149,9 @@ db_backtrace(struct thread *td, db_addr_t fp, int count) stackframe = fp; - for (;;) { + quit = 0; + db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE); + while (!quit) { if (stackframe < PAGE_SIZE) break; diff --git a/sys/sparc64/sparc64/db_trace.c b/sys/sparc64/sparc64/db_trace.c index b5fdec9f42b0..acb4b5ad565f 100644 --- a/sys/sparc64/sparc64/db_trace.c +++ b/sys/sparc64/sparc64/db_trace.c @@ -96,7 +96,7 @@ db_frame(struct db_variable *vp, db_expr_t *valuep, int op) * User stack trace (debugging aid). */ static void -db_utrace(struct thread *td, struct trapframe *tf) +db_utrace(struct thread *td, struct trapframe *tf, int count, int *quitp) { struct pcb *pcb; db_addr_t sp, rsp, o7, pc; @@ -108,7 +108,7 @@ db_utrace(struct thread *td, struct trapframe *tf) FALSE); pc = db_get_value((db_addr_t)&tf->tf_tpc, sizeof(tf->tf_tpc), FALSE); db_printf("user trace: trap %%o7=%#lx\n", o7); - while (sp != 0) { + while (count-- && sp != 0 && !*quitp) { db_printf("pc %#lx, sp %#lx\n", pc, sp); /* First, check whether the frame is in the pcb. */ found = 0; @@ -134,7 +134,7 @@ db_utrace(struct thread *td, struct trapframe *tf) } static int -db_print_trap(struct thread *td, struct trapframe *tf) +db_print_trap(struct thread *td, struct trapframe *tf, int count, int *quitp) { struct proc *p; const char *symname; @@ -212,7 +212,7 @@ db_print_trap(struct thread *td, struct trapframe *tf) db_printf("userland() at "); db_printsym(tpc, DB_STGY_PROC); db_printf("\n"); - db_utrace(td, tf); + db_utrace(td, tf, count, quitp); } return (user); } @@ -229,6 +229,7 @@ db_backtrace(struct thread *td, struct frame *fp, int count) db_addr_t pc; int trap; int user; + int quit; if (count == -1) count = 1024; @@ -236,7 +237,9 @@ db_backtrace(struct thread *td, struct frame *fp, int count) trap = 0; user = 0; npc = 0; - while (count-- && !user) { + quit = 0; + db_setup_paging(db_simple_pager, &quit, DB_LINES_PER_PAGE); + while (count-- && !user && !quit) { pc = (db_addr_t)db_get_value((db_addr_t)&fp->fr_pc, sizeof(fp->fr_pc), FALSE); if (trap) { @@ -260,7 +263,7 @@ db_backtrace(struct thread *td, struct frame *fp, int count) tf = (struct trapframe *)(fp + 1); npc = db_get_value((db_addr_t)&tf->tf_tpc, sizeof(tf->tf_tpc), FALSE); - user = db_print_trap(td, tf); + user = db_print_trap(td, tf, count, &quit); trap = 1; } else { db_printf("%s() at ", name); |