1b886d83cSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 26dab2778SArjan van de Ven /* 36dab2778SArjan van de Ven * Simple stack backtrace regression test module 46dab2778SArjan van de Ven * 56dab2778SArjan van de Ven * (C) Copyright 2008 Intel Corporation 66dab2778SArjan van de Ven * Author: Arjan van de Ven <arjan@linux.intel.com> 76dab2778SArjan van de Ven */ 86dab2778SArjan van de Ven 94e6a0535SVegard Nossum #include <linux/completion.h> 10ad118c54SVegard Nossum #include <linux/delay.h> 114e6a0535SVegard Nossum #include <linux/interrupt.h> 126dab2778SArjan van de Ven #include <linux/module.h> 136dab2778SArjan van de Ven #include <linux/sched.h> 14ad118c54SVegard Nossum #include <linux/stacktrace.h> 156dab2778SArjan van de Ven backtrace_test_normal(void)164e6a0535SVegard Nossumstatic void backtrace_test_normal(void) 174e6a0535SVegard Nossum { 18462b29b8SFabian Frederick pr_info("Testing a backtrace from process context.\n"); 19462b29b8SFabian Frederick pr_info("The following trace is a kernel self test and not a bug!\n"); 206dab2778SArjan van de Ven 214e6a0535SVegard Nossum dump_stack(); 224e6a0535SVegard Nossum } 234e6a0535SVegard Nossum 244e6a0535SVegard Nossum static DECLARE_COMPLETION(backtrace_work); 254e6a0535SVegard Nossum backtrace_test_irq_callback(unsigned long data)264e6a0535SVegard Nossumstatic void backtrace_test_irq_callback(unsigned long data) 274e6a0535SVegard Nossum { 284e6a0535SVegard Nossum dump_stack(); 294e6a0535SVegard Nossum complete(&backtrace_work); 304e6a0535SVegard Nossum } 314e6a0535SVegard Nossum 32*b13fecb1SKees Cook static DECLARE_TASKLET_OLD(backtrace_tasklet, &backtrace_test_irq_callback); 334e6a0535SVegard Nossum backtrace_test_irq(void)344e6a0535SVegard Nossumstatic void backtrace_test_irq(void) 356dab2778SArjan van de Ven { 36462b29b8SFabian Frederick pr_info("Testing a backtrace from irq context.\n"); 37462b29b8SFabian Frederick pr_info("The following trace is a kernel self test and not a bug!\n"); 384e6a0535SVegard Nossum 394e6a0535SVegard Nossum init_completion(&backtrace_work); 404e6a0535SVegard Nossum tasklet_schedule(&backtrace_tasklet); 414e6a0535SVegard Nossum wait_for_completion(&backtrace_work); 426dab2778SArjan van de Ven } 43ad118c54SVegard Nossum 44ad118c54SVegard Nossum #ifdef CONFIG_STACKTRACE backtrace_test_saved(void)45ad118c54SVegard Nossumstatic void backtrace_test_saved(void) 46ad118c54SVegard Nossum { 47ad118c54SVegard Nossum unsigned long entries[8]; 481b59562dSThomas Gleixner unsigned int nr_entries; 49ad118c54SVegard Nossum 50462b29b8SFabian Frederick pr_info("Testing a saved backtrace.\n"); 51462b29b8SFabian Frederick pr_info("The following trace is a kernel self test and not a bug!\n"); 52ad118c54SVegard Nossum 531b59562dSThomas Gleixner nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 0); 541b59562dSThomas Gleixner stack_trace_print(entries, nr_entries, 0); 55ad118c54SVegard Nossum } 56ad118c54SVegard Nossum #else backtrace_test_saved(void)57ad118c54SVegard Nossumstatic void backtrace_test_saved(void) 58ad118c54SVegard Nossum { 59462b29b8SFabian Frederick pr_info("Saved backtrace test skipped.\n"); 60ad118c54SVegard Nossum } 61ad118c54SVegard Nossum #endif 62ad118c54SVegard Nossum backtrace_regression_test(void)636dab2778SArjan van de Venstatic int backtrace_regression_test(void) 646dab2778SArjan van de Ven { 65462b29b8SFabian Frederick pr_info("====[ backtrace testing ]===========\n"); 666dab2778SArjan van de Ven 674e6a0535SVegard Nossum backtrace_test_normal(); 684e6a0535SVegard Nossum backtrace_test_irq(); 69ad118c54SVegard Nossum backtrace_test_saved(); 70ad118c54SVegard Nossum 71462b29b8SFabian Frederick pr_info("====[ end of backtrace testing ]====\n"); 726dab2778SArjan van de Ven return 0; 736dab2778SArjan van de Ven } 746dab2778SArjan van de Ven exitf(void)756dab2778SArjan van de Venstatic void exitf(void) 766dab2778SArjan van de Ven { 776dab2778SArjan van de Ven } 786dab2778SArjan van de Ven 796dab2778SArjan van de Ven module_init(backtrace_regression_test); 806dab2778SArjan van de Ven module_exit(exitf); 816dab2778SArjan van de Ven MODULE_LICENSE("GPL"); 826dab2778SArjan van de Ven MODULE_AUTHOR("Arjan van de Ven <arjan@linux.intel.com>"); 83