/*===========================================================================* * stacktrace * *===========================================================================*/ PUBLIC void proc_stacktrace(struct proc *whichproc) { reg_t v_bp, v_pc, v_hbp; int iskernel; v_bp = whichproc->p_reg.fp; iskernel = iskernelp(whichproc); printf("%-8.8s %6d 0x%lx ", whichproc->p_name, whichproc->p_endpoint, whichproc->p_reg.pc); while(v_bp) { #define PRCOPY(pr, pv, v, n) \ (iskernel ? (memcpy((char *) v, (char *) pv, n), OK) : \ data_copy(pr->p_endpoint, pv, KERNEL, (vir_bytes) (v), n)) if(PRCOPY(whichproc, v_bp, &v_hbp, sizeof(v_hbp)) != OK) { printf("(v_bp 0x%lx ?)", v_bp); break; } if(PRCOPY(whichproc, v_bp + sizeof(v_pc), &v_pc, sizeof(v_pc)) != OK) { printf("(v_pc 0x%lx ?)", v_bp + sizeof(v_pc)); break; } printf("0x%lx ", (unsigned long) v_pc); if(v_hbp != 0 && v_hbp <= v_bp) { printf("(hbp %lx ?)", v_hbp); break; } v_bp = v_hbp; } printf("\n"); }
/*===========================================================================* * proc_stacktrace_execute * *===========================================================================*/ PRIVATE void proc_stacktrace_execute(struct proc *whichproc, reg_t v_bp, reg_t pc) { reg_t v_hbp; int iskernel; int n = 0; iskernel = iskernelp(whichproc); printf("%-8.8s %6d 0x%lx ", whichproc->p_name, whichproc->p_endpoint, pc); while(v_bp) { reg_t v_pc; #define PRCOPY(pr, pv, v, n) \ (iskernel ? (memcpy((char *) v, (char *) pv, n), OK) : \ data_copy(pr->p_endpoint, pv, KERNEL, (vir_bytes) (v), n)) if(PRCOPY(whichproc, v_bp, &v_hbp, sizeof(v_hbp)) != OK) { printf("(v_bp 0x%lx ?)", v_bp); break; } if(PRCOPY(whichproc, v_bp + sizeof(v_pc), &v_pc, sizeof(v_pc)) != OK) { printf("(v_pc 0x%lx ?)", v_bp + sizeof(v_pc)); break; } printf("0x%lx ", (unsigned long) v_pc); if(v_hbp != 0 && v_hbp <= v_bp) { printf("(hbp %lx ?)", v_hbp); break; } v_bp = v_hbp; if(n++ > 50) { printf("(truncated after %d steps) ", n); break; } } printf("\n"); }