// Uncomment the following line to enable kernel stack unwinding within gator, note it can also be defined from the Makefile // #define GATOR_KERNEL_STACK_UNWINDING static void kernel_backtrace(int cpu, struct pt_regs *const regs) { #if defined(__arm__) || defined(__aarch64__) #ifdef GATOR_KERNEL_STACK_UNWINDING int depth = gator_backtrace_depth; #else int depth = 1; #endif struct stackframe frame; if (depth == 0) depth = 1; #if defined(__arm__) frame.fp = regs->ARM_fp; frame.sp = regs->ARM_sp; frame.lr = regs->ARM_lr; frame.pc = regs->ARM_pc; #else frame.fp = regs->regs[29]; frame.sp = regs->sp; frame.pc = regs->pc; #endif walk_stackframe(&frame, report_trace, &depth); #else marshal_backtrace(PC_REG & ~1, NO_COOKIE); #endif }
static int report_trace(struct stackframe *frame, void *d) { struct module *mod; unsigned int *depth = d, addr = frame->pc, cookie = NO_COOKIE, cpu = smp_processor_id(); if (*depth) { mod = __module_address(addr); if (mod) { cookie = get_cookie(cpu, per_cpu(backtrace_buffer, cpu), current, NULL, mod, true); addr = addr - (unsigned long)mod->module_core; } marshal_backtrace(addr & ~1, cookie); (*depth)--; } return *depth == 0; }
static int report_trace(struct stackframe *frame, void *d) { unsigned int *depth = d, cookie = NO_COOKIE; unsigned long addr = frame->pc; if (*depth) { #if defined(MODULE) unsigned int cpu = get_physical_cpu(); struct module *mod = __module_address(addr); if (mod) { cookie = get_cookie(cpu, current, mod->name, false); addr = addr - (unsigned long)mod->module_core; } #endif marshal_backtrace(addr & ~1, cookie); (*depth)--; } return *depth == 0; }
// Uncomment the following line to enable kernel stack unwinding within gator, note it can also be defined from the Makefile // #define GATOR_KERNEL_STACK_UNWINDING static void kernel_backtrace(int cpu, int buftype, struct pt_regs * const regs) { #if defined(__arm__) #ifdef GATOR_KERNEL_STACK_UNWINDING int depth = gator_backtrace_depth; #else int depth = 1; #endif struct stackframe frame; if (depth == 0) depth = 1; frame.fp = regs->ARM_fp; frame.sp = regs->ARM_sp; frame.lr = regs->ARM_lr; frame.pc = regs->ARM_pc; per_cpu(backtrace_buffer, cpu) = buftype; walk_stackframe(&frame, report_trace, &depth); #else marshal_backtrace(PC_REG & ~1, NO_COOKIE); #endif }