static __inline__ int next_frame(ia64_backtrace_t *bt) { /* */ if (in_ivt_code(bt->frame.ip)) return 0; /* */ if (bt->prev_pfs_loc && bt->regs && bt->frame.pfs_loc == bt->prev_pfs_loc) bt->frame.pfs_loc = &bt->regs->ar_pfs; bt->prev_pfs_loc = NULL; return unw_unwind(&bt->frame) == 0; }
static __inline__ int next_frame(ia64_backtrace_t *bt) { /* * Avoid unsightly console message from unw_unwind() when attempting * to unwind through the Interrupt Vector Table which has no unwind * information. */ if (in_ivt_code(bt->frame.ip)) return 0; /* * WAR for spinlock contention from leaf functions. ia64_spinlock_contention_pre3_4 * has ar.pfs == r0. Leaf functions do not modify ar.pfs so ar.pfs remains * as 0, stopping the backtrace. Record the previous ar.pfs when the current * IP is in ia64_spinlock_contention_pre3_4 then unwind, if pfs_loc has not changed * after unwind then use pt_regs.ar_pfs which is where the real ar.pfs is for * leaf functions. */ if (bt->prev_pfs_loc && bt->regs && bt->frame.pfs_loc == bt->prev_pfs_loc) bt->frame.pfs_loc = &bt->regs->ar_pfs; bt->prev_pfs_loc = NULL; return unw_unwind(&bt->frame) == 0; }