aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/kprobes.c
diff options
context:
space:
mode:
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>2017-07-07 13:07:25 -0400
committerIngo Molnar <mingo@kernel.org>2017-07-08 05:05:34 -0400
commit0f73ff80b751b39ff539a550e65c5bd131ff0316 (patch)
tree0497a4f43c3c6eb3d51afa4026524eb1b73db946 /kernel/kprobes.c
parent659b957f20c78fd470083c80af5e79eedfb39e5b (diff)
kprobes: Simplify register_jprobes()
Re-factor jprobe registration functions as the current version is getting too unwieldy. Move the actual jprobe registration to register_jprobe() and re-organize code accordingly. Suggested-by: Ingo Molnar <mingo@kernel.org> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/089cae4bfe73767f765291ee0e6fb0c3d240e5f1.1499443367.git.naveen.n.rao@linux.vnet.ibm.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/kprobes.c')
-rw-r--r--kernel/kprobes.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/kernel/kprobes.c b/kernel/kprobes.c
index a519219169fd..db3cd3e60bdd 100644
--- a/kernel/kprobes.c
+++ b/kernel/kprobes.c
@@ -1771,24 +1771,13 @@ unsigned long __weak arch_deref_entry_point(void *entry)
1771 1771
1772int register_jprobes(struct jprobe **jps, int num) 1772int register_jprobes(struct jprobe **jps, int num)
1773{ 1773{
1774 struct jprobe *jp;
1775 int ret = 0, i; 1774 int ret = 0, i;
1776 1775
1777 if (num <= 0) 1776 if (num <= 0)
1778 return -EINVAL; 1777 return -EINVAL;
1778
1779 for (i = 0; i < num; i++) { 1779 for (i = 0; i < num; i++) {
1780 unsigned long addr, offset; 1780 ret = register_jprobe(jps[i]);
1781 jp = jps[i];
1782 addr = arch_deref_entry_point(jp->entry);
1783
1784 /* Verify probepoint is a function entry point */
1785 if (kallsyms_lookup_size_offset(addr, NULL, &offset) &&
1786 offset == 0) {
1787 jp->kp.pre_handler = setjmp_pre_handler;
1788 jp->kp.break_handler = longjmp_break_handler;
1789 ret = register_kprobe(&jp->kp);
1790 } else
1791 ret = -EINVAL;
1792 1781
1793 if (ret < 0) { 1782 if (ret < 0) {
1794 if (i > 0) 1783 if (i > 0)
@@ -1796,13 +1785,26 @@ int register_jprobes(struct jprobe **jps, int num)
1796 break; 1785 break;
1797 } 1786 }
1798 } 1787 }
1788
1799 return ret; 1789 return ret;
1800} 1790}
1801EXPORT_SYMBOL_GPL(register_jprobes); 1791EXPORT_SYMBOL_GPL(register_jprobes);
1802 1792
1803int register_jprobe(struct jprobe *jp) 1793int register_jprobe(struct jprobe *jp)
1804{ 1794{
1805 return register_jprobes(&jp, 1); 1795 unsigned long addr, offset;
1796 struct kprobe *kp = &jp->kp;
1797
1798 /* Verify probepoint is a function entry point */
1799 addr = arch_deref_entry_point(jp->entry);
1800
1801 if (kallsyms_lookup_size_offset(addr, NULL, &offset) && offset == 0) {
1802 kp->pre_handler = setjmp_pre_handler;
1803 kp->break_handler = longjmp_break_handler;
1804 return register_kprobe(kp);
1805 }
1806
1807 return -EINVAL;
1806} 1808}
1807EXPORT_SYMBOL_GPL(register_jprobe); 1809EXPORT_SYMBOL_GPL(register_jprobe);
1808 1810