LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH] Move kprobes examples to samples/ (resend)
@ 2007-10-21 12:39 Ananth N Mavinakayanahalli
  2007-11-13 12:00 ` Andrew Morton
  0 siblings, 1 reply; 10+ messages in thread
From: Ananth N Mavinakayanahalli @ 2007-10-21 12:39 UTC (permalink / raw)
  To: lkml
  Cc: hch, akpm, randy.dunlap, Anil S Keshavamurthy, mathieu.desnoyers,
	davem, Prasanna S Panchamukhi

Andrew,

This patch moves the kprobe examples currently in
Documentation/krprobes.txt to under samples/. Patch originally by Randy
Dunlap. I have modified the examples slightly per Christoph's
suggestions.

Ananth

---
Move kprobes examples from Documentation/kprobes.txt to under samples/.
Patch originally by Randy Dunlap.

In addition, I have

o Updated the patch to apply on 2.6.23-mm1
o Modified examples code to build on multiple architectures. Currently,
  the examples code works for x86_64, x86_32 and powerpc
o Cleaned up unneeded #includes


Signed-off-by: Randy Dunlap <randy.dunlap@oracle.com>
Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
---
 Documentation/kprobes.txt           |  206 ------------------------------------
 samples/Kconfig                     |    6 +
 samples/Makefile                    |    2 
 samples/kprobes/Makefile            |    5 
 samples/kprobes/jprobe_example.c    |   64 +++++++++++
 samples/kprobes/kprobe_example.c    |   89 +++++++++++++++
 samples/kprobes/kretprobe_example.c |   59 ++++++++++
 7 files changed, 229 insertions(+), 202 deletions(-)

Index: linux-2.6.23/Documentation/kprobes.txt
===================================================================
--- linux-2.6.23.orig/Documentation/kprobes.txt
+++ linux-2.6.23/Documentation/kprobes.txt
@@ -166,7 +166,8 @@ code mapping.
 The Kprobes API includes a "register" function and an "unregister"
 function for each type of probe.  Here are terse, mini-man-page
 specifications for these functions and the associated probe handlers
-that you'll write.  See the latter half of this document for examples.
+that you'll write.  See the files in the samples/kprobes/ sub-directory
+for examples.
 
 4.1 register_kprobe
 
@@ -392,220 +393,15 @@ e. Watchpoint probes (which fire on data
 
 8. Kprobes Example
 
-Here's a sample kernel module showing the use of kprobes to dump a
-stack trace and selected i386 registers when do_fork() is called.
------ cut here -----
-/*kprobe_example.c*/
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/kprobes.h>
-#include <linux/sched.h>
-
-/*For each probe you need to allocate a kprobe structure*/
-static struct kprobe kp;
-
-/*kprobe pre_handler: called just before the probed instruction is executed*/
-int handler_pre(struct kprobe *p, struct pt_regs *regs)
-{
-	printk("pre_handler: p->addr=0x%p, eip=%lx, eflags=0x%lx\n",
-		p->addr, regs->eip, regs->eflags);
-	dump_stack();
-	return 0;
-}
-
-/*kprobe post_handler: called after the probed instruction is executed*/
-void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags)
-{
-	printk("post_handler: p->addr=0x%p, eflags=0x%lx\n",
-		p->addr, regs->eflags);
-}
-
-/* fault_handler: this is called if an exception is generated for any
- * instruction within the pre- or post-handler, or when Kprobes
- * single-steps the probed instruction.
- */
-int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr)
-{
-	printk("fault_handler: p->addr=0x%p, trap #%dn",
-		p->addr, trapnr);
-	/* Return 0 because we don't handle the fault. */
-	return 0;
-}
-
-static int __init kprobe_init(void)
-{
-	int ret;
-	kp.pre_handler = handler_pre;
-	kp.post_handler = handler_post;
-	kp.fault_handler = handler_fault;
-	kp.symbol_name = "do_fork";
-
-	ret = register_kprobe(&kp);
-	if (ret < 0) {
-		printk("register_kprobe failed, returned %d\n", ret);
-		return ret;
-	}
-	printk("kprobe registered\n");
-	return 0;
-}
-
-static void __exit kprobe_exit(void)
-{
-	unregister_kprobe(&kp);
-	printk("kprobe unregistered\n");
-}
-
-module_init(kprobe_init)
-module_exit(kprobe_exit)
-MODULE_LICENSE("GPL");
------ cut here -----
-
-You can build the kernel module, kprobe-example.ko, using the following
-Makefile:
------ cut here -----
-obj-m := kprobe-example.o
-KDIR := /lib/modules/$(shell uname -r)/build
-PWD := $(shell pwd)
-default:
-	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
-clean:
-	rm -f *.mod.c *.ko *.o
------ cut here -----
-
-$ make
-$ su -
-...
-# insmod kprobe-example.ko
-
-You will see the trace data in /var/log/messages and on the console
-whenever do_fork() is invoked to create a new process.
+See samples/kprobes/kprobe_example.c.
 
 9. Jprobes Example
 
-Here's a sample kernel module showing the use of jprobes to dump
-the arguments of do_fork().
------ cut here -----
-/*jprobe-example.c */
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/fs.h>
-#include <linux/uio.h>
-#include <linux/kprobes.h>
-
-/*
- * Jumper probe for do_fork.
- * Mirror principle enables access to arguments of the probed routine
- * from the probe handler.
- */
-
-/* Proxy routine having the same arguments as actual do_fork() routine */
-long jdo_fork(unsigned long clone_flags, unsigned long stack_start,
-	      struct pt_regs *regs, unsigned long stack_size,
-	      int __user * parent_tidptr, int __user * child_tidptr)
-{
-	printk("jprobe: clone_flags=0x%lx, stack_size=0x%lx, regs=0x%p\n",
-	       clone_flags, stack_size, regs);
-	/* Always end with a call to jprobe_return(). */
-	jprobe_return();
-	/*NOTREACHED*/
-	return 0;
-}
-
-static struct jprobe my_jprobe = {
-	.entry = jdo_fork
-};
-
-static int __init jprobe_init(void)
-{
-	int ret;
-	my_jprobe.kp.symbol_name = "do_fork";
-
-	if ((ret = register_jprobe(&my_jprobe)) <0) {
-		printk("register_jprobe failed, returned %d\n", ret);
-		return -1;
-	}
-	printk("Planted jprobe at %p, handler addr %p\n",
-	       my_jprobe.kp.addr, my_jprobe.entry);
-	return 0;
-}
-
-static void __exit jprobe_exit(void)
-{
-	unregister_jprobe(&my_jprobe);
-	printk("jprobe unregistered\n");
-}
-
-module_init(jprobe_init)
-module_exit(jprobe_exit)
-MODULE_LICENSE("GPL");
------ cut here -----
-
-Build and insert the kernel module as shown in the above kprobe
-example.  You will see the trace data in /var/log/messages and on
-the console whenever do_fork() is invoked to create a new process.
-(Some messages may be suppressed if syslogd is configured to
-eliminate duplicate messages.)
+See samples/kprobes/jprobe_example.c.
 
 10. Kretprobes Example
 
-Here's a sample kernel module showing the use of return probes to
-report failed calls to sys_open().
------ cut here -----
-/*kretprobe-example.c*/
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/kprobes.h>
-
-static const char *probed_func = "sys_open";
-
-/* Return-probe handler: If the probed function fails, log the return value. */
-static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
-{
-	int retval = regs_return_value(regs);
-	if (retval < 0) {
-		printk("%s returns %d\n", probed_func, retval);
-	}
-	return 0;
-}
-
-static struct kretprobe my_kretprobe = {
-	.handler = ret_handler,
-	/* Probe up to 20 instances concurrently. */
-	.maxactive = 20
-};
-
-static int __init kretprobe_init(void)
-{
-	int ret;
-	my_kretprobe.kp.symbol_name = (char *)probed_func;
-
-	if ((ret = register_kretprobe(&my_kretprobe)) < 0) {
-		printk("register_kretprobe failed, returned %d\n", ret);
-		return -1;
-	}
-	printk("Planted return probe at %p\n", my_kretprobe.kp.addr);
-	return 0;
-}
-
-static void __exit kretprobe_exit(void)
-{
-	unregister_kretprobe(&my_kretprobe);
-	printk("kretprobe unregistered\n");
-	/* nmissed > 0 suggests that maxactive was set too low. */
-	printk("Missed probing %d instances of %s\n",
-		my_kretprobe.nmissed, probed_func);
-}
-
-module_init(kretprobe_init)
-module_exit(kretprobe_exit)
-MODULE_LICENSE("GPL");
------ cut here -----
-
-Build and insert the kernel module as shown in the above kprobe
-example.  You will see the trace data in /var/log/messages and on the
-console whenever sys_open() returns a negative value.  (Some messages
-may be suppressed if syslogd is configured to eliminate duplicate
-messages.)
+See samples/kprobes/kretprobe_example.c.
 
 For additional information on Kprobes, refer to the following URLs:
 http://www-106.ibm.com/developerworks/library/l-kprobes.html?ca=dgr-lnxw42Kprobe
Index: linux-2.6.23/samples/kprobes/jprobe_example.c
===================================================================
--- /dev/null
+++ linux-2.6.23/samples/kprobes/jprobe_example.c
@@ -0,0 +1,64 @@
+/*
+ * Here's a sample kernel module showing the use of jprobes to dump
+ * the arguments of do_fork().
+ *
+ * Build and insert the kernel module as done in the kprobe example.
+ * You will see the trace data in /var/log/messages and on the
+ * console whenever do_fork() is invoked to create a new process.
+ * (Some messages may be suppressed if syslogd is configured to
+ * eliminate duplicate messages.)
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/kprobes.h>
+
+/*
+ * Jumper probe for do_fork.
+ * Mirror principle enables access to arguments of the probed routine
+ * from the probe handler.
+ */
+
+/* Proxy routine having the same arguments as actual do_fork() routine */
+static long jdo_fork(unsigned long clone_flags, unsigned long stack_start,
+	      struct pt_regs *regs, unsigned long stack_size,
+	      int __user * parent_tidptr, int __user * child_tidptr)
+{
+	printk("jprobe: clone_flags = 0x%lx, stack_size = 0x%lx, regs = 0x%p\n",
+	       clone_flags, stack_size, regs);
+
+	/* Always end with a call to jprobe_return(). */
+	jprobe_return();
+	return 0;
+}
+
+static struct jprobe my_jprobe = {
+	.entry			= jdo_fork,
+	.kp = {
+		.symbol_name	= "do_fork",
+	},
+};
+
+static int __init jprobe_init(void)
+{
+	int ret;
+
+	ret = register_jprobe(&my_jprobe);
+	if (ret < 0) {
+		printk("register_jprobe failed, returned %d\n", ret);
+		return -1;
+	}
+	printk("Planted jprobe at %p, handler addr %p\n",
+	       my_jprobe.kp.addr, my_jprobe.entry);
+	return 0;
+}
+
+static void __exit jprobe_exit(void)
+{
+	unregister_jprobe(&my_jprobe);
+	printk("jprobe at %p unregistered\n", my_jprobe.kp.addr);
+}
+
+module_init(jprobe_init)
+module_exit(jprobe_exit)
+MODULE_LICENSE("GPL");
Index: linux-2.6.23/samples/kprobes/kprobe_example.c
===================================================================
--- /dev/null
+++ linux-2.6.23/samples/kprobes/kprobe_example.c
@@ -0,0 +1,89 @@
+/*
+ * NOTE: This example is works on x86 and powerpc.
+ * Here's a sample kernel module showing the use of kprobes to dump a
+ * stack trace and selected registers when do_fork() is called.
+ *
+ * You will see the trace data in /var/log/messages and on the console
+ * whenever do_fork() is invoked to create a new process.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/kprobes.h>
+
+/* For each probe you need to allocate a kprobe structure */
+static struct kprobe kp = {
+	.symbol_name	= "do_fork",
+};
+
+/* kprobe pre_handler: called just before the probed instruction is executed */
+static int handler_pre(struct kprobe *p, struct pt_regs *regs)
+{
+#ifdef CONFIG_X86_32
+	printk("pre_handler: p->addr = 0x%p, eip = %lx, eflags = 0x%lx\n",
+		p->addr, regs->eip, regs->eflags);
+#endif
+#ifdef CONFIG_X86_64
+	printk("pre_handler: p->addr = 0x%p, rip = %lx, eflags = 0x%lx\n",
+		p->addr, regs->rip, regs->eflags);
+#endif
+#ifdef CONFIG_PPC
+	printk("pre_handler: p->addr = 0x%p, nip = 0x%lx, msr = 0x%lx\n",
+		p->addr, regs->nip, regs->msr);
+#endif
+
+	/* A dump_stack() here will give a stack backtrace */
+	return 0;
+}
+
+/* kprobe post_handler: called after the probed instruction is executed */
+static void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags)
+{
+#if defined(CONFIG_X86_32) || defined(CONFIG_X86_64)
+	printk("post_handler: p->addr = 0x%p, eflags = 0x%lx\n",
+		p->addr, regs->eflags);
+#endif
+#ifdef CONFIG_PPC
+	printk("post_handler: p->addr = 0x%p, msr = 0x%lx\n",
+		p->addr, regs->msr);
+#endif
+}
+
+/*
+ * fault_handler: this is called if an exception is generated for any
+ * instruction within the pre- or post-handler, or when Kprobes
+ * single-steps the probed instruction.
+ */
+static int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr)
+{
+	printk("fault_handler: p->addr = 0x%p, trap #%dn",
+		p->addr, trapnr);
+	/* Return 0 because we don't handle the fault. */
+	return 0;
+}
+
+static int __init kprobe_init(void)
+{
+	int ret;
+	kp.pre_handler = handler_pre;
+	kp.post_handler = handler_post;
+	kp.fault_handler = handler_fault;
+
+	ret = register_kprobe(&kp);
+	if (ret < 0) {
+		printk("register_kprobe failed, returned %d\n", ret);
+		return ret;
+	}
+	printk("Planted kprobe at %p\n", kp.addr);
+	return 0;
+}
+
+static void __exit kprobe_exit(void)
+{
+	unregister_kprobe(&kp);
+	printk("kprobe at %p unregistered\n", kp.addr);
+}
+
+module_init(kprobe_init)
+module_exit(kprobe_exit)
+MODULE_LICENSE("GPL");
Index: linux-2.6.23/samples/kprobes/kretprobe_example.c
===================================================================
--- /dev/null
+++ linux-2.6.23/samples/kprobes/kretprobe_example.c
@@ -0,0 +1,59 @@
+/*
+ * Here's a sample kernel module showing the use of return probes to
+ * report the return value from do_fork().
+ *
+ * Build and insert the kernel module as done in the kprobe example.
+ * You will see the trace data in /var/log/messages and on the console
+ * whenever sys_open() returns a negative value.  (Some messages
+ * may be suppressed if syslogd is configured to eliminate duplicate
+ * messages.)
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/kprobes.h>
+
+/* Return-probe handler: If the probed function fails, log the return value. */
+static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
+{
+	int retval = regs_return_value(regs);
+
+	printk("do_fork returns %d\n", retval);
+	return 0;
+}
+
+static struct kretprobe my_kretprobe = {
+	.handler		= ret_handler,
+	.kp = {
+		.symbol_name	= "do_fork",
+	},
+	/* Probe up to 20 instances concurrently. */
+	.maxactive		= 20,
+};
+
+static int __init kretprobe_init(void)
+{
+	int ret;
+
+	ret = register_kretprobe(&my_kretprobe);
+	if (ret < 0) {
+		printk("register_kretprobe failed, returned %d\n", ret);
+		return -1;
+	}
+	printk("Planted return probe at %p\n", my_kretprobe.kp.addr);
+	return 0;
+}
+
+static void __exit kretprobe_exit(void)
+{
+	unregister_kretprobe(&my_kretprobe);
+	printk("kretprobe at %p unregistered\n", my_kretprobe.kp.addr);
+
+	/* nmissed > 0 suggests that maxactive was set too low. */
+	printk("Missed probing %d instances of do_fork()\n",
+		my_kretprobe.nmissed);
+}
+
+module_init(kretprobe_init)
+module_exit(kretprobe_exit)
+MODULE_LICENSE("GPL");
Index: linux-2.6.23/samples/Kconfig
===================================================================
--- linux-2.6.23.orig/samples/Kconfig
+++ linux-2.6.23/samples/Kconfig
@@ -13,4 +13,10 @@ config SAMPLE_MARKERS
 	help
 	  This build markers example modules.
 
+config SAMPLE_KPROBES
+	tristate "Build kprobes examples -- loadable modules only"
+	depends on KPROBES && m
+	help
+	  This build several kprobes example modules.
+
 endif # SAMPLES
Index: linux-2.6.23/samples/Makefile
===================================================================
--- linux-2.6.23.orig/samples/Makefile
+++ linux-2.6.23/samples/Makefile
@@ -1,3 +1,3 @@
 # Makefile for Linux samples code
 
-obj-$(CONFIG_SAMPLES)	+= markers/
+obj-$(CONFIG_SAMPLES)	+= markers/ kprobes/
Index: linux-2.6.23/samples/kprobes/Makefile
===================================================================
--- /dev/null
+++ linux-2.6.23/samples/kprobes/Makefile
@@ -0,0 +1,5 @@
+# builds the kprobes example kernel modules;
+# then to use one (as root):  insmod <module_name.ko>
+
+obj-$(CONFIG_SAMPLE_KPROBES) += kprobe_example.o jprobe_example.o \
+		kretprobe_example.o

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] Move kprobes examples to samples/ (resend)
  2007-10-21 12:39 [PATCH] Move kprobes examples to samples/ (resend) Ananth N Mavinakayanahalli
@ 2007-11-13 12:00 ` Andrew Morton
  2007-11-13 12:03   ` David Miller
  2007-11-13 15:39   ` Ananth N Mavinakayanahalli
  0 siblings, 2 replies; 10+ messages in thread
From: Andrew Morton @ 2007-11-13 12:00 UTC (permalink / raw)
  To: ananth
  Cc: lkml, hch, randy.dunlap, Anil S Keshavamurthy, mathieu.desnoyers,
	davem, Prasanna S Panchamukhi

On Sun, 21 Oct 2007 18:09:19 +0530 Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote:

> Move kprobes examples from Documentation/kprobes.txt to under samples/.
> Patch originally by Randy Dunlap.
> 
> In addition, I have
> 
> o Updated the patch to apply on 2.6.23-mm1
> o Modified examples code to build on multiple architectures. Currently,
>   the examples code works for x86_64, x86_32 and powerpc
> o Cleaned up unneeded #includes

Could you please take a look at what's needed to get this working on sparc64?

samples/kprobes/kretprobe_example.c: In function `ret_handler':
samples/kprobes/kretprobe_example.c:19: error: implicit declaration of function `regs_return_value'

Thanks.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] Move kprobes examples to samples/ (resend)
  2007-11-13 12:00 ` Andrew Morton
@ 2007-11-13 12:03   ` David Miller
  2007-11-13 12:53     ` Mathieu Desnoyers
  2007-11-13 15:39   ` Ananth N Mavinakayanahalli
  1 sibling, 1 reply; 10+ messages in thread
From: David Miller @ 2007-11-13 12:03 UTC (permalink / raw)
  To: akpm
  Cc: ananth, linux-kernel, hch, randy.dunlap, anil.s.keshavamurthy,
	mathieu.desnoyers, prasanna

From: Andrew Morton <akpm@linux-foundation.org>
Date: Tue, 13 Nov 2007 04:00:45 -0800

> On Sun, 21 Oct 2007 18:09:19 +0530 Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote:
> 
> > Move kprobes examples from Documentation/kprobes.txt to under samples/.
> > Patch originally by Randy Dunlap.
> > 
> > In addition, I have
> > 
> > o Updated the patch to apply on 2.6.23-mm1
> > o Modified examples code to build on multiple architectures. Currently,
> >   the examples code works for x86_64, x86_32 and powerpc
> > o Cleaned up unneeded #includes
> 
> Could you please take a look at what's needed to get this working on sparc64?
> 
> samples/kprobes/kretprobe_example.c: In function `ret_handler':
> samples/kprobes/kretprobe_example.c:19: error: implicit declaration of function `regs_return_value'

kretprobes support most likely, it's on my todo list to implement
but it will take a while since I'm busy fixing networking bugs
but I can stop doing that if you like.

:-)

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] Move kprobes examples to samples/ (resend)
  2007-11-13 12:03   ` David Miller
@ 2007-11-13 12:53     ` Mathieu Desnoyers
  0 siblings, 0 replies; 10+ messages in thread
From: Mathieu Desnoyers @ 2007-11-13 12:53 UTC (permalink / raw)
  To: David Miller
  Cc: akpm, ananth, linux-kernel, hch, randy.dunlap,
	anil.s.keshavamurthy, prasanna

* David Miller (davem@davemloft.net) wrote:
> From: Andrew Morton <akpm@linux-foundation.org>
> Date: Tue, 13 Nov 2007 04:00:45 -0800
> 
> > On Sun, 21 Oct 2007 18:09:19 +0530 Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote:
> > 
> > > Move kprobes examples from Documentation/kprobes.txt to under samples/.
> > > Patch originally by Randy Dunlap.
> > > 
> > > In addition, I have
> > > 
> > > o Updated the patch to apply on 2.6.23-mm1
> > > o Modified examples code to build on multiple architectures. Currently,
> > >   the examples code works for x86_64, x86_32 and powerpc
> > > o Cleaned up unneeded #includes
> > 
> > Could you please take a look at what's needed to get this working on sparc64?
> > 
> > samples/kprobes/kretprobe_example.c: In function `ret_handler':
> > samples/kprobes/kretprobe_example.c:19: error: implicit declaration of function `regs_return_value'
> 
> kretprobes support most likely, it's on my todo list to implement
> but it will take a while since I'm busy fixing networking bugs
> but I can stop doing that if you like.
> 
> :-)

I wonder if compiling this example makes sense when
ARCH_SUPPORTS_KRETPROBES is not defined ? We could just use a
obj-$ARCH_SUPPORTS_KRETPROBES to compile the example conditionally.

Mathieu


-- 
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] Move kprobes examples to samples/ (resend)
  2007-11-13 12:00 ` Andrew Morton
  2007-11-13 12:03   ` David Miller
@ 2007-11-13 15:39   ` Ananth N Mavinakayanahalli
  2007-11-13 15:47     ` [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig Ananth N Mavinakayanahalli
  2007-11-13 20:15     ` [PATCH] Move kprobes examples to samples/ (resend) Andrew Morton
  1 sibling, 2 replies; 10+ messages in thread
From: Ananth N Mavinakayanahalli @ 2007-11-13 15:39 UTC (permalink / raw)
  To: Andrew Morton
  Cc: lkml, hch, randy.dunlap, Anil S Keshavamurthy, mathieu.desnoyers,
	davem, Prasanna S Panchamukhi

On Tue, Nov 13, 2007 at 04:00:45AM -0800, Andrew Morton wrote:
> On Sun, 21 Oct 2007 18:09:19 +0530 Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote:
> 
> > Move kprobes examples from Documentation/kprobes.txt to under samples/.
> > Patch originally by Randy Dunlap.
> > 
> > In addition, I have
> > 
> > o Updated the patch to apply on 2.6.23-mm1
> > o Modified examples code to build on multiple architectures. Currently,
> >   the examples code works for x86_64, x86_32 and powerpc
> > o Cleaned up unneeded #includes
> 
> Could you please take a look at what's needed to get this working on sparc64?
> 
> samples/kprobes/kretprobe_example.c: In function `ret_handler':
> samples/kprobes/kretprobe_example.c:19: error: implicit declaration of function `regs_return_value'
> 
> Thanks.

As Davem mentions, these are a fallout of sparc64 not having kretprobe
support. As a followup to this mail, I am sending a couple of patches
that should fix the issue (sparc64 cross compile works fine with the
patches).

Ananth

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig
  2007-11-13 15:39   ` Ananth N Mavinakayanahalli
@ 2007-11-13 15:47     ` Ananth N Mavinakayanahalli
  2007-11-13 15:50       ` [patch 2/2] Kprobes: Build kretprobe samples only if arch supports kretprobes Ananth N Mavinakayanahalli
  2007-12-08  0:35       ` [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig Andrew Morton
  2007-11-13 20:15     ` [PATCH] Move kprobes examples to samples/ (resend) Andrew Morton
  1 sibling, 2 replies; 10+ messages in thread
From: Ananth N Mavinakayanahalli @ 2007-11-13 15:47 UTC (permalink / raw)
  To: Andrew Morton
  Cc: lkml, hch, randy.dunlap, Anil S Keshavamurthy, mathieu.desnoyers,
	davem, Prasanna S Panchamukhi

From: Ananth N Mavinakayanahalli <ananth@in.ibm.com>

This patch adds CONFIG_ARCH_SUPPORTS_KRETPROBES to the
arch/<arch>/Kconfig file for relevant architectures with kprobes
support. This facilitates easy handling of in-kernel modules (like
samples/kprobes/kretprobe_example.c) that depend on kretprobes being
present in the kernel.

This patch depends on Mathieu Desnoyers' "Instrumentation menu removal"
patchset (http://marc.info/?l=linux-kernel&m=119496432229633&w=2)


Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
---
 arch/avr32/Kconfig            |    5 +++++
 arch/ia64/Kconfig             |    5 +++++
 arch/powerpc/Kconfig          |    5 +++++
 arch/s390/Kconfig             |    5 +++++
 arch/sparc64/Kconfig          |    5 +++++
 arch/x86/Kconfig.i386         |    5 +++++
 arch/x86/Kconfig.x86_64       |    5 +++++
 include/asm-ia64/kprobes.h    |    1 -
 include/asm-powerpc/kprobes.h |    1 -
 include/asm-s390/kprobes.h    |    1 -
 include/asm-x86/kprobes_32.h  |    1 -
 include/asm-x86/kprobes_64.h  |    1 -
 include/linux/kprobes.h       |    6 +++---
 kernel/kprobes.c              |    6 +++---
 14 files changed, 41 insertions(+), 11 deletions(-)

Index: kernel-13nov/arch/avr32/Kconfig
===================================================================
--- kernel-13nov.orig/arch/avr32/Kconfig
+++ kernel-13nov/arch/avr32/Kconfig
@@ -73,6 +73,11 @@ config GENERIC_BUG
 config ARCH_SUPPORTS_KPROBES
 	def_bool y
 
+config ARCH_SUPPORTS_KRETPROBES
+	bool
+	depends on ARCH_SUPPORTS_KPROBES
+	default n
+
 source "init/Kconfig"
 
 menu "System Type and features"
Index: kernel-13nov/arch/ia64/Kconfig
===================================================================
--- kernel-13nov.orig/arch/ia64/Kconfig
+++ kernel-13nov/arch/ia64/Kconfig
@@ -105,6 +105,11 @@ config ARCH_SUPPORTS_OPROFILE
 config ARCH_SUPPORTS_KPROBES
 	def_bool y
 
+config ARCH_SUPPORTS_KRETPROBES
+	bool
+	depends on ARCH_SUPPORTS_KPROBES
+	default y
+
 choice
 	prompt "System type"
 	default IA64_GENERIC
Index: kernel-13nov/arch/powerpc/Kconfig
===================================================================
--- kernel-13nov.orig/arch/powerpc/Kconfig
+++ kernel-13nov/arch/powerpc/Kconfig
@@ -169,6 +169,11 @@ config ARCH_SUPPORTS_OPROFILE
 config ARCH_SUPPORTS_KPROBES
 	def_bool y
 
+config ARCH_SUPPORTS_KRETPROBES
+	bool
+	depends on ARCH_SUPPORTS_KPROBES
+	default y
+
 source "init/Kconfig"
 
 source "arch/powerpc/platforms/Kconfig"
Index: kernel-13nov/arch/s390/Kconfig
===================================================================
--- kernel-13nov.orig/arch/s390/Kconfig
+++ kernel-13nov/arch/s390/Kconfig
@@ -58,6 +58,11 @@ config ARCH_SUPPORTS_OPROFILE
 config ARCH_SUPPORTS_KPROBES
 	def_bool y
 
+config ARCH_SUPPORTS_KRETPROBES
+	bool
+	depends on ARCH_SUPPORTS_KPROBES
+	default y
+
 source "init/Kconfig"
 
 menu "Base setup"
Index: kernel-13nov/arch/sparc64/Kconfig
===================================================================
--- kernel-13nov.orig/arch/sparc64/Kconfig
+++ kernel-13nov/arch/sparc64/Kconfig
@@ -82,6 +82,11 @@ config ARCH_SUPPORTS_OPROFILE
 config ARCH_SUPPORTS_KPROBES
 	def_bool y
 
+config ARCH_SUPPORTS_KRETPROBES
+	bool
+	depends on ARCH_SUPPORTS_KPROBES
+	default n
+
 choice
 	prompt "Kernel page size"
 	default SPARC64_PAGE_SIZE_8KB
Index: kernel-13nov/arch/x86/Kconfig.i386
===================================================================
--- kernel-13nov.orig/arch/x86/Kconfig.i386
+++ kernel-13nov/arch/x86/Kconfig.i386
@@ -97,6 +97,11 @@ config ARCH_SUPPORTS_OPROFILE
 config ARCH_SUPPORTS_KPROBES
 	def_bool y
 
+config ARCH_SUPPORTS_KRETPROBES
+	bool
+	depends on ARCH_SUPPORTS_KPROBES
+	default y
+
 source "init/Kconfig"
 
 menu "Processor type and features"
Index: kernel-13nov/arch/x86/Kconfig.x86_64
===================================================================
--- kernel-13nov.orig/arch/x86/Kconfig.x86_64
+++ kernel-13nov/arch/x86/Kconfig.x86_64
@@ -139,6 +139,11 @@ config ARCH_SUPPORTS_OPROFILE
 config ARCH_SUPPORTS_KPROBES
 	def_bool y
 
+config ARCH_SUPPORTS_KRETPROBES
+	bool
+	depends on ARCH_SUPPORTS_KPROBES
+	default y
+
 source "init/Kconfig"
 
 
Index: kernel-13nov/include/asm-ia64/kprobes.h
===================================================================
--- kernel-13nov.orig/include/asm-ia64/kprobes.h
+++ kernel-13nov/include/asm-ia64/kprobes.h
@@ -82,7 +82,6 @@ struct kprobe_ctlblk {
 	struct prev_kprobe prev_kprobe[ARCH_PREV_KPROBE_SZ];
 };
 
-#define ARCH_SUPPORTS_KRETPROBES
 #define kretprobe_blacklist_size 0
 
 #define SLOT0_OPCODE_SHIFT	(37)
Index: kernel-13nov/include/asm-powerpc/kprobes.h
===================================================================
--- kernel-13nov.orig/include/asm-powerpc/kprobes.h
+++ kernel-13nov/include/asm-powerpc/kprobes.h
@@ -80,7 +80,6 @@ typedef unsigned int kprobe_opcode_t;
 #define is_trap(instr)	(IS_TW(instr) || IS_TWI(instr))
 #endif
 
-#define ARCH_SUPPORTS_KRETPROBES
 #define flush_insn_slot(p)	do { } while (0)
 #define kretprobe_blacklist_size 0
 
Index: kernel-13nov/include/asm-s390/kprobes.h
===================================================================
--- kernel-13nov.orig/include/asm-s390/kprobes.h
+++ kernel-13nov/include/asm-s390/kprobes.h
@@ -46,7 +46,6 @@ typedef u16 kprobe_opcode_t;
 	? (MAX_STACK_SIZE) \
 	: (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR)))
 
-#define ARCH_SUPPORTS_KRETPROBES
 #define kretprobe_blacklist_size 0
 
 #define KPROBE_SWAP_INST	0x10
Index: kernel-13nov/include/asm-x86/kprobes_32.h
===================================================================
--- kernel-13nov.orig/include/asm-x86/kprobes_32.h
+++ kernel-13nov/include/asm-x86/kprobes_32.h
@@ -42,7 +42,6 @@ typedef u8 kprobe_opcode_t;
 	? (MAX_STACK_SIZE) \
 	: (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR)))
 
-#define ARCH_SUPPORTS_KRETPROBES
 #define flush_insn_slot(p)	do { } while (0)
 
 extern const int kretprobe_blacklist_size;
Index: kernel-13nov/include/asm-x86/kprobes_64.h
===================================================================
--- kernel-13nov.orig/include/asm-x86/kprobes_64.h
+++ kernel-13nov/include/asm-x86/kprobes_64.h
@@ -41,7 +41,6 @@ typedef u8 kprobe_opcode_t;
 	? (MAX_STACK_SIZE) \
 	: (((unsigned long)current_thread_info()) + THREAD_SIZE - (ADDR)))
 
-#define ARCH_SUPPORTS_KRETPROBES
 extern const int kretprobe_blacklist_size;
 
 void kretprobe_trampoline(void);
Index: kernel-13nov/include/linux/kprobes.h
===================================================================
--- kernel-13nov.orig/include/linux/kprobes.h
+++ kernel-13nov/include/linux/kprobes.h
@@ -125,11 +125,11 @@ struct jprobe {
 DECLARE_PER_CPU(struct kprobe *, current_kprobe);
 DECLARE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
 
-#ifdef ARCH_SUPPORTS_KRETPROBES
+#ifdef CONFIG_ARCH_SUPPORTS_KRETPROBES
 extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
 				   struct pt_regs *regs);
 extern int arch_trampoline_kprobe(struct kprobe *p);
-#else /* ARCH_SUPPORTS_KRETPROBES */
+#else /* CONFIG_ARCH_SUPPORTS_KRETPROBES */
 static inline void arch_prepare_kretprobe(struct kretprobe *rp,
 					struct pt_regs *regs)
 {
@@ -138,7 +138,7 @@ static inline int arch_trampoline_kprobe
 {
 	return 0;
 }
-#endif /* ARCH_SUPPORTS_KRETPROBES */
+#endif /* CONFIG_ARCH_SUPPORTS_KRETPROBES */
 /*
  * Function-return probe -
  * Note:
Index: kernel-13nov/kernel/kprobes.c
===================================================================
--- kernel-13nov.orig/kernel/kprobes.c
+++ kernel-13nov/kernel/kprobes.c
@@ -678,7 +678,7 @@ void __kprobes unregister_jprobe(struct 
 	unregister_kprobe(&jp->kp);
 }
 
-#ifdef ARCH_SUPPORTS_KRETPROBES
+#ifdef CONFIG_ARCH_SUPPORTS_KRETPROBES
 
 /*
  * This kprobe pre_handler is registered with every kretprobe. When probe
@@ -762,7 +762,7 @@ int __kprobes register_kretprobe(struct 
 	return ret;
 }
 
-#else /* ARCH_SUPPORTS_KRETPROBES */
+#else /* CONFIG_ARCH_SUPPORTS_KRETPROBES */
 
 int __kprobes register_kretprobe(struct kretprobe *rp)
 {
@@ -775,7 +775,7 @@ static int __kprobes pre_handler_kretpro
 	return 0;
 }
 
-#endif /* ARCH_SUPPORTS_KRETPROBES */
+#endif /* CONFIG_ARCH_SUPPORTS_KRETPROBES */
 
 void __kprobes unregister_kretprobe(struct kretprobe *rp)
 {

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [patch 2/2] Kprobes: Build kretprobe samples only if arch supports kretprobes
  2007-11-13 15:47     ` [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig Ananth N Mavinakayanahalli
@ 2007-11-13 15:50       ` Ananth N Mavinakayanahalli
  2007-12-08  0:35       ` [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig Andrew Morton
  1 sibling, 0 replies; 10+ messages in thread
From: Ananth N Mavinakayanahalli @ 2007-11-13 15:50 UTC (permalink / raw)
  To: Andrew Morton
  Cc: lkml, hch, randy.dunlap, Anil S Keshavamurthy, mathieu.desnoyers,
	davem, Prasanna S Panchamukhi

From: Ananth N Mavinakayanahalli <ananth@in.ibm.com>

This patch builds samples/kprobes/kretprobe_example.c only on archs that
support kretprobes.


Signed-off-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
---
 samples/kprobes/Makefile |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

Index: kernel-13nov/samples/kprobes/Makefile
===================================================================
--- kernel-13nov.orig/samples/kprobes/Makefile
+++ kernel-13nov/samples/kprobes/Makefile
@@ -1,5 +1,8 @@
 # builds the kprobes example kernel modules;
 # then to use one (as root):  insmod <module_name.ko>
 
-obj-$(CONFIG_SAMPLE_KPROBES) += kprobe_example.o jprobe_example.o \
-		kretprobe_example.o
+obj-$(CONFIG_SAMPLE_KPROBES) += kprobe_example.o jprobe_example.o
+
+ifeq ($(CONFIG_ARCH_SUPPORTS_KRETPROBES),y)
+obj-$(CONFIG_SAMPLE_KPROBES) += kretprobe_example.o
+endif

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] Move kprobes examples to samples/ (resend)
  2007-11-13 15:39   ` Ananth N Mavinakayanahalli
  2007-11-13 15:47     ` [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig Ananth N Mavinakayanahalli
@ 2007-11-13 20:15     ` Andrew Morton
  1 sibling, 0 replies; 10+ messages in thread
From: Andrew Morton @ 2007-11-13 20:15 UTC (permalink / raw)
  To: ananth
  Cc: lkml, hch, randy.dunlap, Anil S Keshavamurthy, mathieu.desnoyers,
	davem, Prasanna S Panchamukhi

On Tue, 13 Nov 2007 21:09:25 +0530 Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote:

> On Tue, Nov 13, 2007 at 04:00:45AM -0800, Andrew Morton wrote:
> > On Sun, 21 Oct 2007 18:09:19 +0530 Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote:
> > 
> > > Move kprobes examples from Documentation/kprobes.txt to under samples/.
> > > Patch originally by Randy Dunlap.
> > > 
> > > In addition, I have
> > > 
> > > o Updated the patch to apply on 2.6.23-mm1
> > > o Modified examples code to build on multiple architectures. Currently,
> > >   the examples code works for x86_64, x86_32 and powerpc
> > > o Cleaned up unneeded #includes
> > 
> > Could you please take a look at what's needed to get this working on sparc64?
> > 
> > samples/kprobes/kretprobe_example.c: In function `ret_handler':
> > samples/kprobes/kretprobe_example.c:19: error: implicit declaration of function `regs_return_value'
> > 
> > Thanks.
> 
> As Davem mentions, these are a fallout of sparc64 not having kretprobe
> support. As a followup to this mail, I am sending a couple of patches
> that should fix the issue (sparc64 cross compile works fine with the
> patches).
> 

Thanks.

> This patch depends on Mathieu Desnoyers' "Instrumentation menu removal"
> patchset (http://marc.info/?l=linux-kernel&m=119496432229633&w=2)

argh.  OK, I'll look at this later in the week.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig
  2007-11-13 15:47     ` [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig Ananth N Mavinakayanahalli
  2007-11-13 15:50       ` [patch 2/2] Kprobes: Build kretprobe samples only if arch supports kretprobes Ananth N Mavinakayanahalli
@ 2007-12-08  0:35       ` Andrew Morton
  2007-12-08 15:16         ` Mathieu Desnoyers
  1 sibling, 1 reply; 10+ messages in thread
From: Andrew Morton @ 2007-12-08  0:35 UTC (permalink / raw)
  To: ananth
  Cc: linux-kernel, hch, randy.dunlap, anil.s.keshavamurthy,
	mathieu.desnoyers, davem, prasanna

On Tue, 13 Nov 2007 21:17:10 +0530
Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote:

> From: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
> 
> This patch adds CONFIG_ARCH_SUPPORTS_KRETPROBES to the
> arch/<arch>/Kconfig file for relevant architectures with kprobes
> support. This facilitates easy handling of in-kernel modules (like
> samples/kprobes/kretprobe_example.c) that depend on kretprobes being
> present in the kernel.
> 
> This patch depends on Mathieu Desnoyers' "Instrumentation menu removal"
> patchset (http://marc.info/?l=linux-kernel&m=119496432229633&w=2)

I didn't merge this because I didn't merge Mathieu's patches because my brain
is not large enough to keep up with Mathieu's patches so sparc64 is still
busted.

Please send fixes against 2.6.24-rc4-mm1?

Thanks.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig
  2007-12-08  0:35       ` [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig Andrew Morton
@ 2007-12-08 15:16         ` Mathieu Desnoyers
  0 siblings, 0 replies; 10+ messages in thread
From: Mathieu Desnoyers @ 2007-12-08 15:16 UTC (permalink / raw)
  To: Andrew Morton
  Cc: ananth, linux-kernel, hch, randy.dunlap, anil.s.keshavamurthy,
	davem, prasanna

* Andrew Morton (akpm@linux-foundation.org) wrote:
> On Tue, 13 Nov 2007 21:17:10 +0530
> Ananth N Mavinakayanahalli <ananth@in.ibm.com> wrote:
> 
> > From: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
> > 
> > This patch adds CONFIG_ARCH_SUPPORTS_KRETPROBES to the
> > arch/<arch>/Kconfig file for relevant architectures with kprobes
> > support. This facilitates easy handling of in-kernel modules (like
> > samples/kprobes/kretprobe_example.c) that depend on kretprobes being
> > present in the kernel.
> > 
> > This patch depends on Mathieu Desnoyers' "Instrumentation menu removal"
> > patchset (http://marc.info/?l=linux-kernel&m=119496432229633&w=2)
> 
> I didn't merge this because I didn't merge Mathieu's patches because my brain
> is not large enough to keep up with Mathieu's patches so sparc64 is still
> busted.
> 
> Please send fixes against 2.6.24-rc4-mm1?
> 
> Thanks.

I'll resend the instrumentation menu removal patchset against
2.6.24-rc4-mm1 immediately.

Mathieu

-- 
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2007-12-08 15:16 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-10-21 12:39 [PATCH] Move kprobes examples to samples/ (resend) Ananth N Mavinakayanahalli
2007-11-13 12:00 ` Andrew Morton
2007-11-13 12:03   ` David Miller
2007-11-13 12:53     ` Mathieu Desnoyers
2007-11-13 15:39   ` Ananth N Mavinakayanahalli
2007-11-13 15:47     ` [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig Ananth N Mavinakayanahalli
2007-11-13 15:50       ` [patch 2/2] Kprobes: Build kretprobe samples only if arch supports kretprobes Ananth N Mavinakayanahalli
2007-12-08  0:35       ` [patch 1/2] Kprobes: Indicate kretprobe support in arch/<arch>/Kconfig Andrew Morton
2007-12-08 15:16         ` Mathieu Desnoyers
2007-11-13 20:15     ` [PATCH] Move kprobes examples to samples/ (resend) Andrew Morton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).