kprobe_example.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /*
  2. * NOTE: This example is works on x86 and powerpc.
  3. * Here's a sample kernel module showing the use of kprobes to dump a
  4. * stack trace and selected registers when _do_fork() is called.
  5. *
  6. * For more information on theory of operation of kprobes, see
  7. * Documentation/kprobes.txt
  8. *
  9. * You will see the trace data in /var/log/messages and on the console
  10. * whenever _do_fork() is invoked to create a new process.
  11. */
  12. #include <linux/kernel.h>
  13. #include <linux/module.h>
  14. #include <linux/kprobes.h>
  15. #define MAX_SYMBOL_LEN 64
  16. static char symbol[MAX_SYMBOL_LEN] = "_do_fork";
  17. module_param_string(symbol, symbol, sizeof(symbol), 0644);
  18. /* For each probe you need to allocate a kprobe structure */
  19. static struct kprobe kp = {
  20. .symbol_name = symbol,
  21. };
  22. /* kprobe pre_handler: called just before the probed instruction is executed */
  23. static int handler_pre(struct kprobe *p, struct pt_regs *regs)
  24. {
  25. #ifdef CONFIG_X86
  26. printk(KERN_INFO "pre_handler: p->addr = 0x%p, ip = %lx,"
  27. " flags = 0x%lx\n",
  28. p->addr, regs->ip, regs->flags);
  29. #endif
  30. #ifdef CONFIG_PPC
  31. printk(KERN_INFO "pre_handler: p->addr = 0x%p, nip = 0x%lx,"
  32. " msr = 0x%lx\n",
  33. p->addr, regs->nip, regs->msr);
  34. #endif
  35. #ifdef CONFIG_MIPS
  36. printk(KERN_INFO "pre_handler: p->addr = 0x%p, epc = 0x%lx,"
  37. " status = 0x%lx\n",
  38. p->addr, regs->cp0_epc, regs->cp0_status);
  39. #endif
  40. #ifdef CONFIG_TILEGX
  41. printk(KERN_INFO "pre_handler: p->addr = 0x%p, pc = 0x%lx,"
  42. " ex1 = 0x%lx\n",
  43. p->addr, regs->pc, regs->ex1);
  44. #endif
  45. /* A dump_stack() here will give a stack backtrace */
  46. return 0;
  47. }
  48. /* kprobe post_handler: called after the probed instruction is executed */
  49. static void handler_post(struct kprobe *p, struct pt_regs *regs,
  50. unsigned long flags)
  51. {
  52. #ifdef CONFIG_X86
  53. printk(KERN_INFO "post_handler: p->addr = 0x%p, flags = 0x%lx\n",
  54. p->addr, regs->flags);
  55. #endif
  56. #ifdef CONFIG_PPC
  57. printk(KERN_INFO "post_handler: p->addr = 0x%p, msr = 0x%lx\n",
  58. p->addr, regs->msr);
  59. #endif
  60. #ifdef CONFIG_MIPS
  61. printk(KERN_INFO "post_handler: p->addr = 0x%p, status = 0x%lx\n",
  62. p->addr, regs->cp0_status);
  63. #endif
  64. #ifdef CONFIG_TILEGX
  65. printk(KERN_INFO "post_handler: p->addr = 0x%p, ex1 = 0x%lx\n",
  66. p->addr, regs->ex1);
  67. #endif
  68. }
  69. /*
  70. * fault_handler: this is called if an exception is generated for any
  71. * instruction within the pre- or post-handler, or when Kprobes
  72. * single-steps the probed instruction.
  73. */
  74. static int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr)
  75. {
  76. printk(KERN_INFO "fault_handler: p->addr = 0x%p, trap #%dn",
  77. p->addr, trapnr);
  78. /* Return 0 because we don't handle the fault. */
  79. return 0;
  80. }
  81. static int __init kprobe_init(void)
  82. {
  83. int ret;
  84. kp.pre_handler = handler_pre;
  85. kp.post_handler = handler_post;
  86. kp.fault_handler = handler_fault;
  87. ret = register_kprobe(&kp);
  88. if (ret < 0) {
  89. printk(KERN_INFO "register_kprobe failed, returned %d\n", ret);
  90. return ret;
  91. }
  92. printk(KERN_INFO "Planted kprobe at %p\n", kp.addr);
  93. return 0;
  94. }
  95. static void __exit kprobe_exit(void)
  96. {
  97. unregister_kprobe(&kp);
  98. printk(KERN_INFO "kprobe at %p unregistered\n", kp.addr);
  99. }
  100. module_init(kprobe_init)
  101. module_exit(kprobe_exit)
  102. MODULE_LICENSE("GPL");