Commit 432039933a16b8227b7b267f46ac1c1b9b3adf14
Committed by
Frederic Weisbecker
1 parent
17f557e5b5
Exists in
master
and in
4 other branches
hw-breakpoints: sample HW breakpoint over kernel data address
This patch introduces a sample kernel module to demonstrate the use of Hardware Breakpoint feature. It places a breakpoint over the kernel variable 'pid_max' to monitor all write operations and emits a function-backtrace when done. Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Showing 4 changed files with 92 additions and 1 deletions Side-by-side Diff
samples/Kconfig
... | ... | @@ -45,5 +45,11 @@ |
45 | 45 | default m |
46 | 46 | depends on SAMPLE_KPROBES && KRETPROBES |
47 | 47 | |
48 | +config SAMPLE_HW_BREAKPOINT | |
49 | + tristate "Build kernel hardware breakpoint examples -- loadable module only" | |
50 | + depends on HAVE_HW_BREAKPOINT && m | |
51 | + help | |
52 | + This builds kernel hardware breakpoint example modules. | |
53 | + | |
48 | 54 | endif # SAMPLES |
samples/Makefile
samples/hw_breakpoint/Makefile
1 | +obj-$(CONFIG_SAMPLE_HW_BREAKPOINT) += data_breakpoint.o |
samples/hw_breakpoint/data_breakpoint.c
1 | +/* | |
2 | + * data_breakpoint.c - Sample HW Breakpoint file to watch kernel data address | |
3 | + * | |
4 | + * This program is free software; you can redistribute it and/or modify | |
5 | + * it under the terms of the GNU General Public License as published by | |
6 | + * the Free Software Foundation; either version 2 of the License, or | |
7 | + * (at your option) any later version. | |
8 | + * | |
9 | + * This program is distributed in the hope that it will be useful, | |
10 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | + * GNU General Public License for more details. | |
13 | + * | |
14 | + * You should have received a copy of the GNU General Public License | |
15 | + * along with this program; if not, write to the Free Software | |
16 | + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
17 | + * | |
18 | + * usage: insmod data_breakpoint.ko ksym=<ksym_name> | |
19 | + * | |
20 | + * This file is a kernel module that places a breakpoint over ksym_name kernel | |
21 | + * variable using Hardware Breakpoint register. The corresponding handler which | |
22 | + * prints a backtrace is invoked everytime a write operation is performed on | |
23 | + * that variable. | |
24 | + * | |
25 | + * Copyright (C) IBM Corporation, 2009 | |
26 | + */ | |
27 | +#include <linux/module.h> /* Needed by all modules */ | |
28 | +#include <linux/kernel.h> /* Needed for KERN_INFO */ | |
29 | +#include <linux/init.h> /* Needed for the macros */ | |
30 | + | |
31 | +#include <asm/hw_breakpoint.h> | |
32 | + | |
33 | +struct hw_breakpoint sample_hbp; | |
34 | + | |
35 | +static char ksym_name[KSYM_NAME_LEN] = "pid_max"; | |
36 | +module_param_string(ksym, ksym_name, KSYM_NAME_LEN, S_IRUGO); | |
37 | +MODULE_PARM_DESC(ksym, "Kernel symbol to monitor; this module will report any" | |
38 | + " write operations on the kernel symbol"); | |
39 | + | |
40 | +void sample_hbp_handler(struct hw_breakpoint *temp, struct pt_regs | |
41 | + *temp_regs) | |
42 | +{ | |
43 | + printk(KERN_INFO "%s value is changed\n", ksym_name); | |
44 | + dump_stack(); | |
45 | + printk(KERN_INFO "Dump stack from sample_hbp_handler\n"); | |
46 | +} | |
47 | + | |
48 | +static int __init hw_break_module_init(void) | |
49 | +{ | |
50 | + int ret; | |
51 | + | |
52 | +#ifdef CONFIG_X86 | |
53 | + sample_hbp.info.name = ksym_name; | |
54 | + sample_hbp.info.type = HW_BREAKPOINT_WRITE; | |
55 | + sample_hbp.info.len = HW_BREAKPOINT_LEN_4; | |
56 | +#endif /* CONFIG_X86 */ | |
57 | + | |
58 | + sample_hbp.triggered = (void *)sample_hbp_handler; | |
59 | + | |
60 | + ret = register_kernel_hw_breakpoint(&sample_hbp); | |
61 | + | |
62 | + if (ret < 0) { | |
63 | + printk(KERN_INFO "Breakpoint registration failed\n"); | |
64 | + return ret; | |
65 | + } else | |
66 | + printk(KERN_INFO "HW Breakpoint for %s write installed\n", | |
67 | + ksym_name); | |
68 | + | |
69 | + return 0; | |
70 | +} | |
71 | + | |
72 | +static void __exit hw_break_module_exit(void) | |
73 | +{ | |
74 | + unregister_kernel_hw_breakpoint(&sample_hbp); | |
75 | + printk(KERN_INFO "HW Breakpoint for %s write uninstalled\n", ksym_name); | |
76 | +} | |
77 | + | |
78 | +module_init(hw_break_module_init); | |
79 | +module_exit(hw_break_module_exit); | |
80 | + | |
81 | +MODULE_LICENSE("GPL"); | |
82 | +MODULE_AUTHOR("K.Prasad"); | |
83 | +MODULE_DESCRIPTION("ksym breakpoint"); |