Commit f60d24d2 authored by Frederic Weisbecker's avatar Frederic Weisbecker

hw-breakpoints: Fix broken hw-breakpoint sample module

The hw-breakpoint sample module has been broken during the
hw-breakpoint internals refactoring. Propagate the changes
to it.
Reported-by: default avatar"K. Prasad" <prasad@linux.vnet.ibm.com>
Signed-off-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
parent 9f6b3c2c
...@@ -454,6 +454,7 @@ register_wide_hw_breakpoint(unsigned long addr, ...@@ -454,6 +454,7 @@ register_wide_hw_breakpoint(unsigned long addr,
/* return the error if any */ /* return the error if any */
return ERR_PTR(err); return ERR_PTR(err);
} }
EXPORT_SYMBOL_GPL(register_wide_hw_breakpoint);
/** /**
* unregister_wide_hw_breakpoint - unregister a wide breakpoint in the kernel * unregister_wide_hw_breakpoint - unregister a wide breakpoint in the kernel
...@@ -470,7 +471,7 @@ void unregister_wide_hw_breakpoint(struct perf_event **cpu_events) ...@@ -470,7 +471,7 @@ void unregister_wide_hw_breakpoint(struct perf_event **cpu_events)
} }
free_percpu(cpu_events); free_percpu(cpu_events);
} }
EXPORT_SYMBOL_GPL(unregister_wide_hw_breakpoint);
static struct notifier_block hw_breakpoint_exceptions_nb = { static struct notifier_block hw_breakpoint_exceptions_nb = {
.notifier_call = hw_breakpoint_exceptions_notify, .notifier_call = hw_breakpoint_exceptions_notify,
......
...@@ -181,6 +181,7 @@ unsigned long kallsyms_lookup_name(const char *name) ...@@ -181,6 +181,7 @@ unsigned long kallsyms_lookup_name(const char *name)
} }
return module_kallsyms_lookup_name(name); return module_kallsyms_lookup_name(name);
} }
EXPORT_SYMBOL_GPL(kallsyms_lookup_name);
int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
unsigned long), unsigned long),
......
...@@ -27,18 +27,19 @@ ...@@ -27,18 +27,19 @@
#include <linux/module.h> /* Needed by all modules */ #include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */ #include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */ #include <linux/init.h> /* Needed for the macros */
#include <linux/kallsyms.h>
#include <asm/hw_breakpoint.h> #include <linux/perf_event.h>
#include <linux/hw_breakpoint.h>
struct hw_breakpoint sample_hbp; struct perf_event **sample_hbp;
static char ksym_name[KSYM_NAME_LEN] = "pid_max"; static char ksym_name[KSYM_NAME_LEN] = "pid_max";
module_param_string(ksym, ksym_name, KSYM_NAME_LEN, S_IRUGO); module_param_string(ksym, ksym_name, KSYM_NAME_LEN, S_IRUGO);
MODULE_PARM_DESC(ksym, "Kernel symbol to monitor; this module will report any" MODULE_PARM_DESC(ksym, "Kernel symbol to monitor; this module will report any"
" write operations on the kernel symbol"); " write operations on the kernel symbol");
void sample_hbp_handler(struct hw_breakpoint *temp, struct pt_regs static void sample_hbp_handler(struct perf_event *temp, void *data)
*temp_regs)
{ {
printk(KERN_INFO "%s value is changed\n", ksym_name); printk(KERN_INFO "%s value is changed\n", ksym_name);
dump_stack(); dump_stack();
...@@ -48,30 +49,34 @@ void sample_hbp_handler(struct hw_breakpoint *temp, struct pt_regs ...@@ -48,30 +49,34 @@ void sample_hbp_handler(struct hw_breakpoint *temp, struct pt_regs
static int __init hw_break_module_init(void) static int __init hw_break_module_init(void)
{ {
int ret; int ret;
unsigned long addr;
#ifdef CONFIG_X86 addr = kallsyms_lookup_name(ksym_name);
sample_hbp.info.name = ksym_name;
sample_hbp.info.type = HW_BREAKPOINT_WRITE;
sample_hbp.info.len = HW_BREAKPOINT_LEN_4;
#endif /* CONFIG_X86 */
sample_hbp.triggered = (void *)sample_hbp_handler; sample_hbp = register_wide_hw_breakpoint(addr, HW_BREAKPOINT_LEN_4,
HW_BREAKPOINT_W | HW_BREAKPOINT_R,
sample_hbp_handler, true);
if (IS_ERR(sample_hbp)) {
ret = PTR_ERR(sample_hbp);
goto fail;
} else if (!sample_hbp) {
ret = -EINVAL;
goto fail;
}
ret = register_kernel_hw_breakpoint(&sample_hbp); printk(KERN_INFO "HW Breakpoint for %s write installed\n", ksym_name);
if (ret < 0) { return 0;
fail:
printk(KERN_INFO "Breakpoint registration failed\n"); printk(KERN_INFO "Breakpoint registration failed\n");
return ret;
} else
printk(KERN_INFO "HW Breakpoint for %s write installed\n",
ksym_name);
return 0; return ret;
} }
static void __exit hw_break_module_exit(void) static void __exit hw_break_module_exit(void)
{ {
unregister_kernel_hw_breakpoint(&sample_hbp); unregister_wide_hw_breakpoint(sample_hbp);
printk(KERN_INFO "HW Breakpoint for %s write uninstalled\n", ksym_name); printk(KERN_INFO "HW Breakpoint for %s write uninstalled\n", ksym_name);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment