2019-06-01 11:08:55 +03:00
// SPDX-License-Identifier: GPL-2.0-only
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 >
*/
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 ) ;
}
2020-07-14 01:01:26 +03:00
static DECLARE_TASKLET_OLD ( backtrace_tasklet , & backtrace_test_irq_callback ) ;
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 )
{
unsigned long entries [ 8 ] ;
2019-04-25 12:44:57 +03:00
unsigned int nr_entries ;
2008-06-27 20:04:48 +04:00
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
2019-04-25 12:44:57 +03:00
nr_entries = stack_trace_save ( entries , ARRAY_SIZE ( entries ) , 0 ) ;
stack_trace_print ( entries , nr_entries , 0 ) ;
2008-06-27 20:04:48 +04:00
}
# 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> " ) ;