xref: /openbmc/linux/kernel/backtracetest.c (revision b13fecb1)
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 Nossum static 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 Nossum static void backtrace_test_irq_callback(unsigned long data)
274e6a0535SVegard Nossum {
284e6a0535SVegard Nossum 	dump_stack();
294e6a0535SVegard Nossum 	complete(&backtrace_work);
304e6a0535SVegard Nossum }
314e6a0535SVegard Nossum 
32b13fecb1SKees Cook static DECLARE_TASKLET_OLD(backtrace_tasklet, &backtrace_test_irq_callback);
334e6a0535SVegard Nossum 
backtrace_test_irq(void)344e6a0535SVegard Nossum static 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 Nossum static 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 Nossum static 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 Ven static 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 Ven static 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