]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commit
perf/x86: Add perf text poke events for kprobes
authorAdrian Hunter <adrian.hunter@intel.com>
Tue, 12 May 2020 12:19:12 +0000 (15:19 +0300)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 15 Jun 2020 12:09:49 +0000 (14:09 +0200)
commit3e46bb40af8c12947c093efb8af56e0e921cd39b
tree368afd1f003f6f75ab49c2d1c21146304205eb6f
parent69e49088692899d25dedfa22f00dfb9761e86ed7
perf/x86: Add perf text poke events for kprobes

Add perf text poke events for kprobes. That includes:

 - the replaced instruction(s) which are executed out-of-line
   i.e. arch_copy_kprobe() and arch_remove_kprobe()

 - the INT3 that activates the kprobe
   i.e. arch_arm_kprobe() and arch_disarm_kprobe()

 - optimised kprobe function
   i.e. arch_prepare_optimized_kprobe() and
      __arch_remove_optimized_kprobe()

 - optimised kprobe
   i.e. arch_optimize_kprobes() and arch_unoptimize_kprobe()

Resulting in 8 possible text_poke events:

 0:  NULL -> probe.ainsn.insn (if ainsn.boostable && !kp.post_handler)
arch_copy_kprobe()

 1:  old0 -> INT3 arch_arm_kprobe()

 // boosted kprobe active

 2:  NULL -> optprobe_trampoline arch_prepare_optimized_kprobe()

 3:  INT3,old1,old2,old3,old4 -> JMP32 arch_optimize_kprobes()

 // optprobe active

 4:  JMP32 -> INT3,old1,old2,old3,old4

 // optprobe disabled and kprobe active (this sometimes goes back to 3)
arch_unoptimize_kprobe()

 5:  optprobe_trampoline -> NULL arch_remove_optimized_kprobe()

 // boosted kprobe active

 6:  INT3 -> old0 arch_disarm_kprobe()

 7:  probe.ainsn.insn -> NULL (if ainsn.boostable && !kp.post_handler)
arch_remove_kprobe()

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Link: https://lkml.kernel.org/r/20200512121922.8997-6-adrian.hunter@intel.com
arch/x86/include/asm/kprobes.h
arch/x86/kernel/kprobes/core.c
arch/x86/kernel/kprobes/opt.c