2008-01-30 15:33:08 +03:00
/*
* Simple stack backtrace regression test module
*
* ( C ) Copyright 2008 Intel Corporation
* Author : Arjan van de Ven < arjan @ linux . intel . com >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; version 2
* of the License .
*/
2008-06-27 20:06:54 +04:00
# include <linux/completion.h>
2008-06-27 20:04:48 +04:00
# include <linux/delay.h>
2008-06-27 20:06:54 +04:00
# include <linux/interrupt.h>
2008-01-30 15:33:08 +03:00
# include <linux/module.h>
# include <linux/sched.h>
2008-06-27 20:04:48 +04:00
# include <linux/stacktrace.h>
2008-01-30 15:33:08 +03:00
2008-06-27 20:06:54 +04:00
static void backtrace_test_normal ( void )
{
2014-06-05 03:11:18 +04:00
pr_info ( " Testing a backtrace from process context. \n " ) ;
pr_info ( " The following trace is a kernel self test and not a bug! \n " ) ;
2008-06-27 20:06:54 +04:00
dump_stack ( ) ;
}
static DECLARE_COMPLETION ( backtrace_work ) ;
static void backtrace_test_irq_callback ( unsigned long data )
{
dump_stack ( ) ;
complete ( & backtrace_work ) ;
}
static DECLARE_TASKLET ( backtrace_tasklet , & backtrace_test_irq_callback , 0 ) ;
2008-01-30 15:33:08 +03:00
2008-06-27 20:06:54 +04:00
static void backtrace_test_irq ( void )
2008-01-30 15:33:08 +03:00
{
2014-06-05 03:11:18 +04:00
pr_info ( " Testing a backtrace from irq context. \n " ) ;
pr_info ( " The following trace is a kernel self test and not a bug! \n " ) ;
2008-06-27 20:06:54 +04:00
init_completion ( & backtrace_work ) ;
tasklet_schedule ( & backtrace_tasklet ) ;
wait_for_completion ( & backtrace_work ) ;
2008-01-30 15:33:08 +03:00
}
2008-06-27 20:04:48 +04:00
# ifdef CONFIG_STACKTRACE
static void backtrace_test_saved ( void )
{
struct stack_trace trace ;
unsigned long entries [ 8 ] ;
2014-06-05 03:11:18 +04:00
pr_info ( " Testing a saved backtrace. \n " ) ;
pr_info ( " The following trace is a kernel self test and not a bug! \n " ) ;
2008-06-27 20:04:48 +04:00
trace . nr_entries = 0 ;
trace . max_entries = ARRAY_SIZE ( entries ) ;
trace . entries = entries ;
trace . skip = 0 ;
save_stack_trace ( & trace ) ;
print_stack_trace ( & trace , 0 ) ;
}
# else
static void backtrace_test_saved ( void )
{
2014-06-05 03:11:18 +04:00
pr_info ( " Saved backtrace test skipped. \n " ) ;
2008-06-27 20:04:48 +04:00
}
# endif
2008-01-30 15:33:08 +03:00
static int backtrace_regression_test ( void )
{
2014-06-05 03:11:18 +04:00
pr_info ( " ====[ backtrace testing ]=========== \n " ) ;
2008-01-30 15:33:08 +03:00
2008-06-27 20:06:54 +04:00
backtrace_test_normal ( ) ;
backtrace_test_irq ( ) ;
2008-06-27 20:04:48 +04:00
backtrace_test_saved ( ) ;
2014-06-05 03:11:18 +04:00
pr_info ( " ====[ end of backtrace testing ]==== \n " ) ;
2008-01-30 15:33:08 +03:00
return 0 ;
}
static void exitf ( void )
{
}
module_init ( backtrace_regression_test ) ;
module_exit ( exitf ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_AUTHOR ( " Arjan van de Ven <arjan@linux.intel.com> " ) ;