1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Simple stack backtrace regression test module 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * (C) Copyright 2008 Intel Corporation 6*4882a593Smuzhiyun * Author: Arjan van de Ven <arjan@linux.intel.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/completion.h> 10*4882a593Smuzhiyun #include <linux/delay.h> 11*4882a593Smuzhiyun #include <linux/interrupt.h> 12*4882a593Smuzhiyun #include <linux/module.h> 13*4882a593Smuzhiyun #include <linux/sched.h> 14*4882a593Smuzhiyun #include <linux/stacktrace.h> 15*4882a593Smuzhiyun backtrace_test_normal(void)16*4882a593Smuzhiyunstatic void backtrace_test_normal(void) 17*4882a593Smuzhiyun { 18*4882a593Smuzhiyun pr_info("Testing a backtrace from process context.\n"); 19*4882a593Smuzhiyun pr_info("The following trace is a kernel self test and not a bug!\n"); 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun dump_stack(); 22*4882a593Smuzhiyun } 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun static DECLARE_COMPLETION(backtrace_work); 25*4882a593Smuzhiyun backtrace_test_irq_callback(unsigned long data)26*4882a593Smuzhiyunstatic void backtrace_test_irq_callback(unsigned long data) 27*4882a593Smuzhiyun { 28*4882a593Smuzhiyun dump_stack(); 29*4882a593Smuzhiyun complete(&backtrace_work); 30*4882a593Smuzhiyun } 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun static DECLARE_TASKLET_OLD(backtrace_tasklet, &backtrace_test_irq_callback); 33*4882a593Smuzhiyun backtrace_test_irq(void)34*4882a593Smuzhiyunstatic void backtrace_test_irq(void) 35*4882a593Smuzhiyun { 36*4882a593Smuzhiyun pr_info("Testing a backtrace from irq context.\n"); 37*4882a593Smuzhiyun pr_info("The following trace is a kernel self test and not a bug!\n"); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun init_completion(&backtrace_work); 40*4882a593Smuzhiyun tasklet_schedule(&backtrace_tasklet); 41*4882a593Smuzhiyun wait_for_completion(&backtrace_work); 42*4882a593Smuzhiyun } 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #ifdef CONFIG_STACKTRACE backtrace_test_saved(void)45*4882a593Smuzhiyunstatic void backtrace_test_saved(void) 46*4882a593Smuzhiyun { 47*4882a593Smuzhiyun unsigned long entries[8]; 48*4882a593Smuzhiyun unsigned int nr_entries; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun pr_info("Testing a saved backtrace.\n"); 51*4882a593Smuzhiyun pr_info("The following trace is a kernel self test and not a bug!\n"); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 0); 54*4882a593Smuzhiyun stack_trace_print(entries, nr_entries, 0); 55*4882a593Smuzhiyun } 56*4882a593Smuzhiyun #else backtrace_test_saved(void)57*4882a593Smuzhiyunstatic void backtrace_test_saved(void) 58*4882a593Smuzhiyun { 59*4882a593Smuzhiyun pr_info("Saved backtrace test skipped.\n"); 60*4882a593Smuzhiyun } 61*4882a593Smuzhiyun #endif 62*4882a593Smuzhiyun backtrace_regression_test(void)63*4882a593Smuzhiyunstatic int backtrace_regression_test(void) 64*4882a593Smuzhiyun { 65*4882a593Smuzhiyun pr_info("====[ backtrace testing ]===========\n"); 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun backtrace_test_normal(); 68*4882a593Smuzhiyun backtrace_test_irq(); 69*4882a593Smuzhiyun backtrace_test_saved(); 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun pr_info("====[ end of backtrace testing ]====\n"); 72*4882a593Smuzhiyun return 0; 73*4882a593Smuzhiyun } 74*4882a593Smuzhiyun exitf(void)75*4882a593Smuzhiyunstatic void exitf(void) 76*4882a593Smuzhiyun { 77*4882a593Smuzhiyun } 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun module_init(backtrace_regression_test); 80*4882a593Smuzhiyun module_exit(exitf); 81*4882a593Smuzhiyun MODULE_LICENSE("GPL"); 82*4882a593Smuzhiyun MODULE_AUTHOR("Arjan van de Ven <arjan@linux.intel.com>"); 83