1/* 2 * arch/x86_64/kernel/stacktrace.c 3 * 4 * Stack trace management functions 5 * 6 * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> 7 */ 8#include <linux/sched.h> 9#include <linux/stacktrace.h> 10#include <linux/module.h> 11#include <asm/stacktrace.h> 12 13static void save_stack_warning(void *data, char *msg) 14{ 15} 16 17static void 18save_stack_warning_symbol(void *data, char *msg, unsigned long symbol) 19{ 20} 21 22static int save_stack_stack(void *data, char *name) 23{ 24 return -1; 25} 26 27static void save_stack_address(void *data, unsigned long addr) 28{ 29 struct stack_trace *trace = (struct stack_trace *)data; 30 if (trace->skip > 0) { 31 trace->skip--; 32 return; 33 } 34 if (trace->nr_entries < trace->max_entries) 35 trace->entries[trace->nr_entries++] = addr; 36} 37 38static struct stacktrace_ops save_stack_ops = { 39 .warning = save_stack_warning, 40 .warning_symbol = save_stack_warning_symbol, 41 .stack = save_stack_stack, 42 .address = save_stack_address, 43}; 44 45/* 46 * Save stack-backtrace addresses into a stack_trace buffer. 47 */ 48void save_stack_trace(struct stack_trace *trace) 49{ 50 dump_trace(current, NULL, NULL, &save_stack_ops, trace); 51 if (trace->nr_entries < trace->max_entries) 52 trace->entries[trace->nr_entries++] = ULONG_MAX; 53} 54EXPORT_SYMBOL(save_stack_trace); 55