Commit 432039933a16b8227b7b267f46ac1c1b9b3adf14

Authored by K.Prasad
Committed by Frederic Weisbecker
1 parent 17f557e5b5

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

... ... @@ -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
1 1 # Makefile for Linux samples code
2 2  
3   -obj-$(CONFIG_SAMPLES) += markers/ kobject/ kprobes/ tracepoints/ trace_events/
  3 +obj-$(CONFIG_SAMPLES) += markers/ kobject/ kprobes/ tracepoints/ \
  4 + trace_events/ hw_breakpoint/
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");