static int kgdb_get_blocked_state(struct vcpu *p, struct cpu_user_regs *regs, struct unw_frame_info *unw) #endif { unsigned long ip; int count = 0; #ifndef XEN unw_init_from_blocked_task(unw, p); #endif ip = 0UL; do { if (unw_unwind(unw) < 0) return -1; unw_get_ip(unw, &ip); #ifndef XEN if (!in_sched_functions(ip)) break; #else dbg_printk("ip 0x%lx cr_iip 0x%lx\n", ip, regs->cr_iip); if (ip == regs->cr_iip) break; #endif } while (count++ < 16); if (!ip) return -1; else return 0; }
static void ia64_do_save_stack(struct unw_frame_info *info, void *arg) { struct stack_trace *trace = arg; unsigned long ip; int skip = trace->skip; trace->nr_entries = 0; do { unw_get_ip(info, &ip); if (ip == 0) break; if (skip == 0) { trace->entries[trace->nr_entries++] = ip; if (trace->nr_entries == trace->max_entries) break; } else skip--; } while (unw_unwind(info) >= 0); }
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; }