aboutsummaryrefslogtreecommitdiffstats
path: root/samples/hw_breakpoint/data_breakpoint.c
diff options
context:
space:
mode:
Diffstat (limited to 'samples/hw_breakpoint/data_breakpoint.c')
-rw-r--r--samples/hw_breakpoint/data_breakpoint.c43
1 files changed, 24 insertions, 19 deletions
diff --git a/samples/hw_breakpoint/data_breakpoint.c b/samples/hw_breakpoint/data_breakpoint.c
index 9cbdbb871b7a..5bc9819a819e 100644
--- a/samples/hw_breakpoint/data_breakpoint.c
+++ b/samples/hw_breakpoint/data_breakpoint.c
@@ -27,18 +27,19 @@
27#include <linux/module.h> /* Needed by all modules */ 27#include <linux/module.h> /* Needed by all modules */
28#include <linux/kernel.h> /* Needed for KERN_INFO */ 28#include <linux/kernel.h> /* Needed for KERN_INFO */
29#include <linux/init.h> /* Needed for the macros */ 29#include <linux/init.h> /* Needed for the macros */
30#include <linux/kallsyms.h>
30 31
31#include <asm/hw_breakpoint.h> 32#include <linux/perf_event.h>
33#include <linux/hw_breakpoint.h>
32 34
33struct hw_breakpoint sample_hbp; 35struct perf_event **sample_hbp;
34 36
35static char ksym_name[KSYM_NAME_LEN] = "pid_max"; 37static char ksym_name[KSYM_NAME_LEN] = "pid_max";
36module_param_string(ksym, ksym_name, KSYM_NAME_LEN, S_IRUGO); 38module_param_string(ksym, ksym_name, KSYM_NAME_LEN, S_IRUGO);
37MODULE_PARM_DESC(ksym, "Kernel symbol to monitor; this module will report any" 39MODULE_PARM_DESC(ksym, "Kernel symbol to monitor; this module will report any"
38 " write operations on the kernel symbol"); 40 " write operations on the kernel symbol");
39 41
40void sample_hbp_handler(struct hw_breakpoint *temp, struct pt_regs 42static void sample_hbp_handler(struct perf_event *temp, void *data)
41 *temp_regs)
42{ 43{
43 printk(KERN_INFO "%s value is changed\n", ksym_name); 44 printk(KERN_INFO "%s value is changed\n", ksym_name);
44 dump_stack(); 45 dump_stack();
@@ -48,30 +49,34 @@ void sample_hbp_handler(struct hw_breakpoint *temp, struct pt_regs
48static int __init hw_break_module_init(void) 49static int __init hw_break_module_init(void)
49{ 50{
50 int ret; 51 int ret;
52 unsigned long addr;
51 53
52#ifdef CONFIG_X86 54 addr = kallsyms_lookup_name(ksym_name);
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 55
58 sample_hbp.triggered = (void *)sample_hbp_handler; 56 sample_hbp = register_wide_hw_breakpoint(addr, HW_BREAKPOINT_LEN_4,
57 HW_BREAKPOINT_W | HW_BREAKPOINT_R,
58 sample_hbp_handler, true);
59 if (IS_ERR(sample_hbp)) {
60 ret = PTR_ERR(sample_hbp);
61 goto fail;
62 } else if (!sample_hbp) {
63 ret = -EINVAL;
64 goto fail;
65 }
59 66
60 ret = register_kernel_hw_breakpoint(&sample_hbp); 67 printk(KERN_INFO "HW Breakpoint for %s write installed\n", ksym_name);
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 68
69 return 0; 69 return 0;
70
71fail:
72 printk(KERN_INFO "Breakpoint registration failed\n");
73
74 return ret;
70} 75}
71 76
72static void __exit hw_break_module_exit(void) 77static void __exit hw_break_module_exit(void)
73{ 78{
74 unregister_kernel_hw_breakpoint(&sample_hbp); 79 unregister_wide_hw_breakpoint(sample_hbp);
75 printk(KERN_INFO "HW Breakpoint for %s write uninstalled\n", ksym_name); 80 printk(KERN_INFO "HW Breakpoint for %s write uninstalled\n", ksym_name);
76} 81}
77 82