2006-07-03 00:24:40 -07:00
/*
* arch / x86_64 / kernel / stacktrace . c
*
* Stack trace management functions
*
* Copyright ( C ) 2006 Red Hat , Inc . , Ingo Molnar < mingo @ redhat . com >
*/
# include <linux/sched.h>
# include <linux/stacktrace.h>
2006-09-26 10:52:34 +02:00
# include <linux/module.h>
# include <asm/stacktrace.h>
2006-07-03 00:24:40 -07:00
2006-09-26 10:52:34 +02:00
static void save_stack_warning ( void * data , char * msg )
2006-07-03 00:24:40 -07:00
{
}
2006-09-26 10:52:34 +02:00
static void
save_stack_warning_symbol ( void * data , char * msg , unsigned long symbol )
2006-07-03 00:24:40 -07:00
{
}
2006-09-26 10:52:34 +02:00
static int save_stack_stack ( void * data , char * name )
2006-07-03 00:24:40 -07:00
{
2007-05-08 00:23:29 -07:00
return - 1 ;
2006-09-26 10:52:34 +02:00
}
2006-07-03 00:24:40 -07:00
2006-09-26 10:52:34 +02:00
static void save_stack_address ( void * data , unsigned long addr )
{
struct stack_trace * trace = ( struct stack_trace * ) data ;
if ( trace - > skip > 0 ) {
trace - > skip - - ;
return ;
2006-07-03 00:24:40 -07:00
}
2007-02-13 13:26:21 +01:00
if ( trace - > nr_entries < trace - > max_entries )
2006-09-26 10:52:34 +02:00
trace - > entries [ trace - > nr_entries + + ] = addr ;
2006-07-03 00:24:40 -07:00
}
2006-09-26 10:52:34 +02:00
static struct stacktrace_ops save_stack_ops = {
. warning = save_stack_warning ,
. warning_symbol = save_stack_warning_symbol ,
. stack = save_stack_stack ,
. address = save_stack_address ,
} ;
2006-07-03 00:24:40 -07:00
/*
* Save stack - backtrace addresses into a stack_trace buffer .
*/
2007-05-08 00:23:29 -07:00
void save_stack_trace ( struct stack_trace * trace )
2006-07-03 00:24:40 -07:00
{
2007-05-08 00:23:29 -07:00
dump_trace ( current , NULL , NULL , & save_stack_ops , trace ) ;
2007-02-13 13:26:21 +01:00
if ( trace - > nr_entries < trace - > max_entries )
trace - > entries [ trace - > nr_entries + + ] = ULONG_MAX ;
2006-07-03 00:24:40 -07:00
}
2006-09-26 10:52:34 +02:00
EXPORT_SYMBOL ( save_stack_trace ) ;