All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] lkdtm: Convert from jprobe to kprobe
@ 2017-10-20 13:31 Kees Cook
  2017-10-21  5:59 ` Masami Hiramatsu
  2017-10-23 12:45 ` [tip:perf/core] lkdtm, kprobes: Convert from jprobes to kprobes tip-bot for Kees Cook
  0 siblings, 2 replies; 3+ messages in thread
From: Kees Cook @ 2017-10-20 13:31 UTC (permalink / raw)
  To: Greg Kroah-Hartman; +Cc: Masami Hiramatsu, Ingo Molnar, linux-kernel

The jprobe subsystem is being removed, so convert to using kprobe instead.

Cc: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Kees Cook <keescook@chromium.org>
---
 drivers/misc/lkdtm_core.c | 154 ++++++++++++++--------------------------------
 1 file changed, 45 insertions(+), 109 deletions(-)

diff --git a/drivers/misc/lkdtm_core.c b/drivers/misc/lkdtm_core.c
index 981b3ef71e47..ed7f0c61c59a 100644
--- a/drivers/misc/lkdtm_core.c
+++ b/drivers/misc/lkdtm_core.c
@@ -56,122 +56,54 @@ static ssize_t direct_entry(struct file *f, const char __user *user_buf,
 			    size_t count, loff_t *off);
 
 #ifdef CONFIG_KPROBES
-static void lkdtm_handler(void);
+static int lkdtm_kprobe_handler(struct kprobe *kp, struct pt_regs *regs);
 static ssize_t lkdtm_debugfs_entry(struct file *f,
 				   const char __user *user_buf,
 				   size_t count, loff_t *off);
-
-
-/* jprobe entry point handlers. */
-static unsigned int jp_do_irq(unsigned int irq)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-static irqreturn_t jp_handle_irq_event(unsigned int irq,
-				       struct irqaction *action)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-static void jp_tasklet_action(struct softirq_action *a)
-{
-	lkdtm_handler();
-	jprobe_return();
-}
-
-static void jp_ll_rw_block(int rw, int nr, struct buffer_head *bhs[])
-{
-	lkdtm_handler();
-	jprobe_return();
-}
-
-struct scan_control;
-
-static unsigned long jp_shrink_inactive_list(unsigned long max_scan,
-					     struct zone *zone,
-					     struct scan_control *sc)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-static int jp_hrtimer_start(struct hrtimer *timer, ktime_t tim,
-			    const enum hrtimer_mode mode)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-static int jp_scsi_dispatch_cmd(struct scsi_cmnd *cmd)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-# ifdef CONFIG_IDE
-static int jp_generic_ide_ioctl(ide_drive_t *drive, struct file *file,
-			struct block_device *bdev, unsigned int cmd,
-			unsigned long arg)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-# endif
+# define CRASHPOINT_KPROBE(_symbol)				\
+		.kprobe = {					\
+			.symbol_name = (_symbol),		\
+			.pre_handler = lkdtm_kprobe_handler,	\
+		},
+# define CRASHPOINT_WRITE(_symbol)				\
+		(_symbol) ? lkdtm_debugfs_entry : direct_entry
+#else
+# define CRASHPOINT_KPROBE(_symbol)
+# define CRASHPOINT_WRITE(_symbol)		direct_entry
 #endif
 
 /* Crash points */
 struct crashpoint {
 	const char *name;
 	const struct file_operations fops;
-	struct jprobe jprobe;
+	struct kprobe kprobe;
 };
 
-#define CRASHPOINT(_name, _write, _symbol, _entry)		\
+#define CRASHPOINT(_name, _symbol)				\
 	{							\
 		.name = _name,					\
 		.fops = {					\
 			.read	= lkdtm_debugfs_read,		\
 			.llseek	= generic_file_llseek,		\
 			.open	= lkdtm_debugfs_open,		\
-			.write	= _write,			\
-		},						\
-		.jprobe = {					\
-			.kp.symbol_name = _symbol,		\
-			.entry = (kprobe_opcode_t *)_entry,	\
+			.write	= CRASHPOINT_WRITE(_symbol)	\
 		},						\
+		CRASHPOINT_KPROBE(_symbol)			\
 	}
 
 /* Define the possible places where we can trigger a crash point. */
-struct crashpoint crashpoints[] = {
-	CRASHPOINT("DIRECT",			direct_entry,
-		   NULL,			NULL),
+static struct crashpoint crashpoints[] = {
+	CRASHPOINT("DIRECT",		 NULL),
 #ifdef CONFIG_KPROBES
-	CRASHPOINT("INT_HARDWARE_ENTRY",	lkdtm_debugfs_entry,
-		   "do_IRQ",			jp_do_irq),
-	CRASHPOINT("INT_HW_IRQ_EN",		lkdtm_debugfs_entry,
-		   "handle_IRQ_event",		jp_handle_irq_event),
-	CRASHPOINT("INT_TASKLET_ENTRY",		lkdtm_debugfs_entry,
-		   "tasklet_action",		jp_tasklet_action),
-	CRASHPOINT("FS_DEVRW",			lkdtm_debugfs_entry,
-		   "ll_rw_block",		jp_ll_rw_block),
-	CRASHPOINT("MEM_SWAPOUT",		lkdtm_debugfs_entry,
-		   "shrink_inactive_list",	jp_shrink_inactive_list),
-	CRASHPOINT("TIMERADD",			lkdtm_debugfs_entry,
-		   "hrtimer_start",		jp_hrtimer_start),
-	CRASHPOINT("SCSI_DISPATCH_CMD",		lkdtm_debugfs_entry,
-		   "scsi_dispatch_cmd",		jp_scsi_dispatch_cmd),
+	CRASHPOINT("INT_HARDWARE_ENTRY", "do_IRQ"),
+	CRASHPOINT("INT_HW_IRQ_EN",	 "handle_IRQ_event"),
+	CRASHPOINT("INT_TASKLET_ENTRY",	 "tasklet_action"),
+	CRASHPOINT("FS_DEVRW",		 "ll_rw_block"),
+	CRASHPOINT("MEM_SWAPOUT",	 "shrink_inactive_list"),
+	CRASHPOINT("TIMERADD",		 "hrtimer_start"),
+	CRASHPOINT("SCSI_DISPATCH_CMD",	 "scsi_dispatch_cmd"),
 # ifdef CONFIG_IDE
-	CRASHPOINT("IDE_CORE_CP",		lkdtm_debugfs_entry,
-		   "generic_ide_ioctl",		jp_generic_ide_ioctl),
+	CRASHPOINT("IDE_CORE_CP",	 "generic_ide_ioctl"),
 # endif
 #endif
 };
@@ -254,8 +186,8 @@ struct crashtype crashtypes[] = {
 };
 
 
-/* Global jprobe entry and crashtype. */
-static struct jprobe *lkdtm_jprobe;
+/* Global kprobe entry and crashtype. */
+static struct kprobe *lkdtm_kprobe;
 struct crashpoint *lkdtm_crashpoint;
 struct crashtype *lkdtm_crashtype;
 
@@ -298,7 +230,8 @@ static struct crashtype *find_crashtype(const char *name)
  */
 static noinline void lkdtm_do_action(struct crashtype *crashtype)
 {
-	BUG_ON(!crashtype || !crashtype->func);
+	if (WARN_ON(!crashtype || !crashtype->func))
+		return;
 	crashtype->func();
 }
 
@@ -308,22 +241,22 @@ static int lkdtm_register_cpoint(struct crashpoint *crashpoint,
 	int ret;
 
 	/* If this doesn't have a symbol, just call immediately. */
-	if (!crashpoint->jprobe.kp.symbol_name) {
+	if (!crashpoint->kprobe.symbol_name) {
 		lkdtm_do_action(crashtype);
 		return 0;
 	}
 
-	if (lkdtm_jprobe != NULL)
-		unregister_jprobe(lkdtm_jprobe);
+	if (lkdtm_kprobe != NULL)
+		unregister_kprobe(lkdtm_kprobe);
 
 	lkdtm_crashpoint = crashpoint;
 	lkdtm_crashtype = crashtype;
-	lkdtm_jprobe = &crashpoint->jprobe;
-	ret = register_jprobe(lkdtm_jprobe);
+	lkdtm_kprobe = &crashpoint->kprobe;
+	ret = register_kprobe(lkdtm_kprobe);
 	if (ret < 0) {
-		pr_info("Couldn't register jprobe %s\n",
-			crashpoint->jprobe.kp.symbol_name);
-		lkdtm_jprobe = NULL;
+		pr_info("Couldn't register kprobe %s\n",
+			crashpoint->kprobe.symbol_name);
+		lkdtm_kprobe = NULL;
 		lkdtm_crashpoint = NULL;
 		lkdtm_crashtype = NULL;
 	}
@@ -336,13 +269,14 @@ static int lkdtm_register_cpoint(struct crashpoint *crashpoint,
 static int crash_count = DEFAULT_COUNT;
 static DEFINE_SPINLOCK(crash_count_lock);
 
-/* Called by jprobe entry points. */
-static void lkdtm_handler(void)
+/* Called by kprobe entry points. */
+static int lkdtm_kprobe_handler(struct kprobe *kp, struct pt_regs *regs)
 {
 	unsigned long flags;
 	bool do_it = false;
 
-	BUG_ON(!lkdtm_crashpoint || !lkdtm_crashtype);
+	if (WARN_ON(!lkdtm_crashpoint || !lkdtm_crashtype))
+		return 0;
 
 	spin_lock_irqsave(&crash_count_lock, flags);
 	crash_count--;
@@ -357,6 +291,8 @@ static void lkdtm_handler(void)
 
 	if (do_it)
 		lkdtm_do_action(lkdtm_crashtype);
+
+	return 0;
 }
 
 static ssize_t lkdtm_debugfs_entry(struct file *f,
@@ -556,8 +492,8 @@ static void __exit lkdtm_module_exit(void)
 	/* Handle test-specific clean-up. */
 	lkdtm_usercopy_exit();
 
-	if (lkdtm_jprobe != NULL)
-		unregister_jprobe(lkdtm_jprobe);
+	if (lkdtm_kprobe != NULL)
+		unregister_kprobe(lkdtm_kprobe);
 
 	pr_info("Crash point unregistered\n");
 }
-- 
2.7.4


-- 
Kees Cook
Pixel Security

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

* Re: [PATCH] lkdtm: Convert from jprobe to kprobe
  2017-10-20 13:31 [PATCH] lkdtm: Convert from jprobe to kprobe Kees Cook
@ 2017-10-21  5:59 ` Masami Hiramatsu
  2017-10-23 12:45 ` [tip:perf/core] lkdtm, kprobes: Convert from jprobes to kprobes tip-bot for Kees Cook
  1 sibling, 0 replies; 3+ messages in thread
From: Masami Hiramatsu @ 2017-10-21  5:59 UTC (permalink / raw)
  To: Kees Cook; +Cc: Greg Kroah-Hartman, Masami Hiramatsu, Ingo Molnar, linux-kernel

On Fri, 20 Oct 2017 06:31:27 -0700
Kees Cook <keescook@chromium.org> wrote:

> The jprobe subsystem is being removed, so convert to using kprobe instead.
> 

Looks good to me:)

Acked-by: Masami Hiramatsu <mhiramat@kernel.org>

Thanks,

> Cc: Masami Hiramatsu <mhiramat@kernel.org>
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---
>  drivers/misc/lkdtm_core.c | 154 ++++++++++++++--------------------------------
>  1 file changed, 45 insertions(+), 109 deletions(-)
> 
> diff --git a/drivers/misc/lkdtm_core.c b/drivers/misc/lkdtm_core.c
> index 981b3ef71e47..ed7f0c61c59a 100644
> --- a/drivers/misc/lkdtm_core.c
> +++ b/drivers/misc/lkdtm_core.c
> @@ -56,122 +56,54 @@ static ssize_t direct_entry(struct file *f, const char __user *user_buf,
>  			    size_t count, loff_t *off);
>  
>  #ifdef CONFIG_KPROBES
> -static void lkdtm_handler(void);
> +static int lkdtm_kprobe_handler(struct kprobe *kp, struct pt_regs *regs);
>  static ssize_t lkdtm_debugfs_entry(struct file *f,
>  				   const char __user *user_buf,
>  				   size_t count, loff_t *off);
> -
> -
> -/* jprobe entry point handlers. */
> -static unsigned int jp_do_irq(unsigned int irq)
> -{
> -	lkdtm_handler();
> -	jprobe_return();
> -	return 0;
> -}
> -
> -static irqreturn_t jp_handle_irq_event(unsigned int irq,
> -				       struct irqaction *action)
> -{
> -	lkdtm_handler();
> -	jprobe_return();
> -	return 0;
> -}
> -
> -static void jp_tasklet_action(struct softirq_action *a)
> -{
> -	lkdtm_handler();
> -	jprobe_return();
> -}
> -
> -static void jp_ll_rw_block(int rw, int nr, struct buffer_head *bhs[])
> -{
> -	lkdtm_handler();
> -	jprobe_return();
> -}
> -
> -struct scan_control;
> -
> -static unsigned long jp_shrink_inactive_list(unsigned long max_scan,
> -					     struct zone *zone,
> -					     struct scan_control *sc)
> -{
> -	lkdtm_handler();
> -	jprobe_return();
> -	return 0;
> -}
> -
> -static int jp_hrtimer_start(struct hrtimer *timer, ktime_t tim,
> -			    const enum hrtimer_mode mode)
> -{
> -	lkdtm_handler();
> -	jprobe_return();
> -	return 0;
> -}
> -
> -static int jp_scsi_dispatch_cmd(struct scsi_cmnd *cmd)
> -{
> -	lkdtm_handler();
> -	jprobe_return();
> -	return 0;
> -}
> -
> -# ifdef CONFIG_IDE
> -static int jp_generic_ide_ioctl(ide_drive_t *drive, struct file *file,
> -			struct block_device *bdev, unsigned int cmd,
> -			unsigned long arg)
> -{
> -	lkdtm_handler();
> -	jprobe_return();
> -	return 0;
> -}
> -# endif
> +# define CRASHPOINT_KPROBE(_symbol)				\
> +		.kprobe = {					\
> +			.symbol_name = (_symbol),		\
> +			.pre_handler = lkdtm_kprobe_handler,	\
> +		},
> +# define CRASHPOINT_WRITE(_symbol)				\
> +		(_symbol) ? lkdtm_debugfs_entry : direct_entry
> +#else
> +# define CRASHPOINT_KPROBE(_symbol)
> +# define CRASHPOINT_WRITE(_symbol)		direct_entry
>  #endif
>  
>  /* Crash points */
>  struct crashpoint {
>  	const char *name;
>  	const struct file_operations fops;
> -	struct jprobe jprobe;
> +	struct kprobe kprobe;
>  };
>  
> -#define CRASHPOINT(_name, _write, _symbol, _entry)		\
> +#define CRASHPOINT(_name, _symbol)				\
>  	{							\
>  		.name = _name,					\
>  		.fops = {					\
>  			.read	= lkdtm_debugfs_read,		\
>  			.llseek	= generic_file_llseek,		\
>  			.open	= lkdtm_debugfs_open,		\
> -			.write	= _write,			\
> -		},						\
> -		.jprobe = {					\
> -			.kp.symbol_name = _symbol,		\
> -			.entry = (kprobe_opcode_t *)_entry,	\
> +			.write	= CRASHPOINT_WRITE(_symbol)	\
>  		},						\
> +		CRASHPOINT_KPROBE(_symbol)			\
>  	}
>  
>  /* Define the possible places where we can trigger a crash point. */
> -struct crashpoint crashpoints[] = {
> -	CRASHPOINT("DIRECT",			direct_entry,
> -		   NULL,			NULL),
> +static struct crashpoint crashpoints[] = {
> +	CRASHPOINT("DIRECT",		 NULL),
>  #ifdef CONFIG_KPROBES
> -	CRASHPOINT("INT_HARDWARE_ENTRY",	lkdtm_debugfs_entry,
> -		   "do_IRQ",			jp_do_irq),
> -	CRASHPOINT("INT_HW_IRQ_EN",		lkdtm_debugfs_entry,
> -		   "handle_IRQ_event",		jp_handle_irq_event),
> -	CRASHPOINT("INT_TASKLET_ENTRY",		lkdtm_debugfs_entry,
> -		   "tasklet_action",		jp_tasklet_action),
> -	CRASHPOINT("FS_DEVRW",			lkdtm_debugfs_entry,
> -		   "ll_rw_block",		jp_ll_rw_block),
> -	CRASHPOINT("MEM_SWAPOUT",		lkdtm_debugfs_entry,
> -		   "shrink_inactive_list",	jp_shrink_inactive_list),
> -	CRASHPOINT("TIMERADD",			lkdtm_debugfs_entry,
> -		   "hrtimer_start",		jp_hrtimer_start),
> -	CRASHPOINT("SCSI_DISPATCH_CMD",		lkdtm_debugfs_entry,
> -		   "scsi_dispatch_cmd",		jp_scsi_dispatch_cmd),
> +	CRASHPOINT("INT_HARDWARE_ENTRY", "do_IRQ"),
> +	CRASHPOINT("INT_HW_IRQ_EN",	 "handle_IRQ_event"),
> +	CRASHPOINT("INT_TASKLET_ENTRY",	 "tasklet_action"),
> +	CRASHPOINT("FS_DEVRW",		 "ll_rw_block"),
> +	CRASHPOINT("MEM_SWAPOUT",	 "shrink_inactive_list"),
> +	CRASHPOINT("TIMERADD",		 "hrtimer_start"),
> +	CRASHPOINT("SCSI_DISPATCH_CMD",	 "scsi_dispatch_cmd"),
>  # ifdef CONFIG_IDE
> -	CRASHPOINT("IDE_CORE_CP",		lkdtm_debugfs_entry,
> -		   "generic_ide_ioctl",		jp_generic_ide_ioctl),
> +	CRASHPOINT("IDE_CORE_CP",	 "generic_ide_ioctl"),
>  # endif
>  #endif
>  };
> @@ -254,8 +186,8 @@ struct crashtype crashtypes[] = {
>  };
>  
>  
> -/* Global jprobe entry and crashtype. */
> -static struct jprobe *lkdtm_jprobe;
> +/* Global kprobe entry and crashtype. */
> +static struct kprobe *lkdtm_kprobe;
>  struct crashpoint *lkdtm_crashpoint;
>  struct crashtype *lkdtm_crashtype;
>  
> @@ -298,7 +230,8 @@ static struct crashtype *find_crashtype(const char *name)
>   */
>  static noinline void lkdtm_do_action(struct crashtype *crashtype)
>  {
> -	BUG_ON(!crashtype || !crashtype->func);
> +	if (WARN_ON(!crashtype || !crashtype->func))
> +		return;
>  	crashtype->func();
>  }
>  
> @@ -308,22 +241,22 @@ static int lkdtm_register_cpoint(struct crashpoint *crashpoint,
>  	int ret;
>  
>  	/* If this doesn't have a symbol, just call immediately. */
> -	if (!crashpoint->jprobe.kp.symbol_name) {
> +	if (!crashpoint->kprobe.symbol_name) {
>  		lkdtm_do_action(crashtype);
>  		return 0;
>  	}
>  
> -	if (lkdtm_jprobe != NULL)
> -		unregister_jprobe(lkdtm_jprobe);
> +	if (lkdtm_kprobe != NULL)
> +		unregister_kprobe(lkdtm_kprobe);
>  
>  	lkdtm_crashpoint = crashpoint;
>  	lkdtm_crashtype = crashtype;
> -	lkdtm_jprobe = &crashpoint->jprobe;
> -	ret = register_jprobe(lkdtm_jprobe);
> +	lkdtm_kprobe = &crashpoint->kprobe;
> +	ret = register_kprobe(lkdtm_kprobe);
>  	if (ret < 0) {
> -		pr_info("Couldn't register jprobe %s\n",
> -			crashpoint->jprobe.kp.symbol_name);
> -		lkdtm_jprobe = NULL;
> +		pr_info("Couldn't register kprobe %s\n",
> +			crashpoint->kprobe.symbol_name);
> +		lkdtm_kprobe = NULL;
>  		lkdtm_crashpoint = NULL;
>  		lkdtm_crashtype = NULL;
>  	}
> @@ -336,13 +269,14 @@ static int lkdtm_register_cpoint(struct crashpoint *crashpoint,
>  static int crash_count = DEFAULT_COUNT;
>  static DEFINE_SPINLOCK(crash_count_lock);
>  
> -/* Called by jprobe entry points. */
> -static void lkdtm_handler(void)
> +/* Called by kprobe entry points. */
> +static int lkdtm_kprobe_handler(struct kprobe *kp, struct pt_regs *regs)
>  {
>  	unsigned long flags;
>  	bool do_it = false;
>  
> -	BUG_ON(!lkdtm_crashpoint || !lkdtm_crashtype);
> +	if (WARN_ON(!lkdtm_crashpoint || !lkdtm_crashtype))
> +		return 0;
>  
>  	spin_lock_irqsave(&crash_count_lock, flags);
>  	crash_count--;
> @@ -357,6 +291,8 @@ static void lkdtm_handler(void)
>  
>  	if (do_it)
>  		lkdtm_do_action(lkdtm_crashtype);
> +
> +	return 0;
>  }
>  
>  static ssize_t lkdtm_debugfs_entry(struct file *f,
> @@ -556,8 +492,8 @@ static void __exit lkdtm_module_exit(void)
>  	/* Handle test-specific clean-up. */
>  	lkdtm_usercopy_exit();
>  
> -	if (lkdtm_jprobe != NULL)
> -		unregister_jprobe(lkdtm_jprobe);
> +	if (lkdtm_kprobe != NULL)
> +		unregister_kprobe(lkdtm_kprobe);
>  
>  	pr_info("Crash point unregistered\n");
>  }
> -- 
> 2.7.4
> 
> 
> -- 
> Kees Cook
> Pixel Security


-- 
Masami Hiramatsu <mhiramat@kernel.org>

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

* [tip:perf/core] lkdtm, kprobes: Convert from jprobes to kprobes
  2017-10-20 13:31 [PATCH] lkdtm: Convert from jprobe to kprobe Kees Cook
  2017-10-21  5:59 ` Masami Hiramatsu
@ 2017-10-23 12:45 ` tip-bot for Kees Cook
  1 sibling, 0 replies; 3+ messages in thread
From: tip-bot for Kees Cook @ 2017-10-23 12:45 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: mhiramat, linux-kernel, hpa, tglx, keescook, peterz, torvalds,
	mingo, gregkh

Commit-ID:  8776fe75dc0e263ed2056ea9896c2267599dc447
Gitweb:     https://git.kernel.org/tip/8776fe75dc0e263ed2056ea9896c2267599dc447
Author:     Kees Cook <keescook@chromium.org>
AuthorDate: Fri, 20 Oct 2017 06:31:27 -0700
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Mon, 23 Oct 2017 13:52:45 +0200

lkdtm, kprobes: Convert from jprobes to kprobes

The jprobes subsystem is being removed, so convert to using kprobes instead.

Signed-off-by: Kees Cook <keescook@chromium.org>
Acked-by: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
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/20171020133127.GA18360@beast
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 drivers/misc/lkdtm_core.c | 154 ++++++++++++++--------------------------------
 1 file changed, 45 insertions(+), 109 deletions(-)

diff --git a/drivers/misc/lkdtm_core.c b/drivers/misc/lkdtm_core.c
index 981b3ef..ed7f0c6 100644
--- a/drivers/misc/lkdtm_core.c
+++ b/drivers/misc/lkdtm_core.c
@@ -56,122 +56,54 @@ static ssize_t direct_entry(struct file *f, const char __user *user_buf,
 			    size_t count, loff_t *off);
 
 #ifdef CONFIG_KPROBES
-static void lkdtm_handler(void);
+static int lkdtm_kprobe_handler(struct kprobe *kp, struct pt_regs *regs);
 static ssize_t lkdtm_debugfs_entry(struct file *f,
 				   const char __user *user_buf,
 				   size_t count, loff_t *off);
-
-
-/* jprobe entry point handlers. */
-static unsigned int jp_do_irq(unsigned int irq)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-static irqreturn_t jp_handle_irq_event(unsigned int irq,
-				       struct irqaction *action)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-static void jp_tasklet_action(struct softirq_action *a)
-{
-	lkdtm_handler();
-	jprobe_return();
-}
-
-static void jp_ll_rw_block(int rw, int nr, struct buffer_head *bhs[])
-{
-	lkdtm_handler();
-	jprobe_return();
-}
-
-struct scan_control;
-
-static unsigned long jp_shrink_inactive_list(unsigned long max_scan,
-					     struct zone *zone,
-					     struct scan_control *sc)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-static int jp_hrtimer_start(struct hrtimer *timer, ktime_t tim,
-			    const enum hrtimer_mode mode)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-static int jp_scsi_dispatch_cmd(struct scsi_cmnd *cmd)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-
-# ifdef CONFIG_IDE
-static int jp_generic_ide_ioctl(ide_drive_t *drive, struct file *file,
-			struct block_device *bdev, unsigned int cmd,
-			unsigned long arg)
-{
-	lkdtm_handler();
-	jprobe_return();
-	return 0;
-}
-# endif
+# define CRASHPOINT_KPROBE(_symbol)				\
+		.kprobe = {					\
+			.symbol_name = (_symbol),		\
+			.pre_handler = lkdtm_kprobe_handler,	\
+		},
+# define CRASHPOINT_WRITE(_symbol)				\
+		(_symbol) ? lkdtm_debugfs_entry : direct_entry
+#else
+# define CRASHPOINT_KPROBE(_symbol)
+# define CRASHPOINT_WRITE(_symbol)		direct_entry
 #endif
 
 /* Crash points */
 struct crashpoint {
 	const char *name;
 	const struct file_operations fops;
-	struct jprobe jprobe;
+	struct kprobe kprobe;
 };
 
-#define CRASHPOINT(_name, _write, _symbol, _entry)		\
+#define CRASHPOINT(_name, _symbol)				\
 	{							\
 		.name = _name,					\
 		.fops = {					\
 			.read	= lkdtm_debugfs_read,		\
 			.llseek	= generic_file_llseek,		\
 			.open	= lkdtm_debugfs_open,		\
-			.write	= _write,			\
-		},						\
-		.jprobe = {					\
-			.kp.symbol_name = _symbol,		\
-			.entry = (kprobe_opcode_t *)_entry,	\
+			.write	= CRASHPOINT_WRITE(_symbol)	\
 		},						\
+		CRASHPOINT_KPROBE(_symbol)			\
 	}
 
 /* Define the possible places where we can trigger a crash point. */
-struct crashpoint crashpoints[] = {
-	CRASHPOINT("DIRECT",			direct_entry,
-		   NULL,			NULL),
+static struct crashpoint crashpoints[] = {
+	CRASHPOINT("DIRECT",		 NULL),
 #ifdef CONFIG_KPROBES
-	CRASHPOINT("INT_HARDWARE_ENTRY",	lkdtm_debugfs_entry,
-		   "do_IRQ",			jp_do_irq),
-	CRASHPOINT("INT_HW_IRQ_EN",		lkdtm_debugfs_entry,
-		   "handle_IRQ_event",		jp_handle_irq_event),
-	CRASHPOINT("INT_TASKLET_ENTRY",		lkdtm_debugfs_entry,
-		   "tasklet_action",		jp_tasklet_action),
-	CRASHPOINT("FS_DEVRW",			lkdtm_debugfs_entry,
-		   "ll_rw_block",		jp_ll_rw_block),
-	CRASHPOINT("MEM_SWAPOUT",		lkdtm_debugfs_entry,
-		   "shrink_inactive_list",	jp_shrink_inactive_list),
-	CRASHPOINT("TIMERADD",			lkdtm_debugfs_entry,
-		   "hrtimer_start",		jp_hrtimer_start),
-	CRASHPOINT("SCSI_DISPATCH_CMD",		lkdtm_debugfs_entry,
-		   "scsi_dispatch_cmd",		jp_scsi_dispatch_cmd),
+	CRASHPOINT("INT_HARDWARE_ENTRY", "do_IRQ"),
+	CRASHPOINT("INT_HW_IRQ_EN",	 "handle_IRQ_event"),
+	CRASHPOINT("INT_TASKLET_ENTRY",	 "tasklet_action"),
+	CRASHPOINT("FS_DEVRW",		 "ll_rw_block"),
+	CRASHPOINT("MEM_SWAPOUT",	 "shrink_inactive_list"),
+	CRASHPOINT("TIMERADD",		 "hrtimer_start"),
+	CRASHPOINT("SCSI_DISPATCH_CMD",	 "scsi_dispatch_cmd"),
 # ifdef CONFIG_IDE
-	CRASHPOINT("IDE_CORE_CP",		lkdtm_debugfs_entry,
-		   "generic_ide_ioctl",		jp_generic_ide_ioctl),
+	CRASHPOINT("IDE_CORE_CP",	 "generic_ide_ioctl"),
 # endif
 #endif
 };
@@ -254,8 +186,8 @@ struct crashtype crashtypes[] = {
 };
 
 
-/* Global jprobe entry and crashtype. */
-static struct jprobe *lkdtm_jprobe;
+/* Global kprobe entry and crashtype. */
+static struct kprobe *lkdtm_kprobe;
 struct crashpoint *lkdtm_crashpoint;
 struct crashtype *lkdtm_crashtype;
 
@@ -298,7 +230,8 @@ static struct crashtype *find_crashtype(const char *name)
  */
 static noinline void lkdtm_do_action(struct crashtype *crashtype)
 {
-	BUG_ON(!crashtype || !crashtype->func);
+	if (WARN_ON(!crashtype || !crashtype->func))
+		return;
 	crashtype->func();
 }
 
@@ -308,22 +241,22 @@ static int lkdtm_register_cpoint(struct crashpoint *crashpoint,
 	int ret;
 
 	/* If this doesn't have a symbol, just call immediately. */
-	if (!crashpoint->jprobe.kp.symbol_name) {
+	if (!crashpoint->kprobe.symbol_name) {
 		lkdtm_do_action(crashtype);
 		return 0;
 	}
 
-	if (lkdtm_jprobe != NULL)
-		unregister_jprobe(lkdtm_jprobe);
+	if (lkdtm_kprobe != NULL)
+		unregister_kprobe(lkdtm_kprobe);
 
 	lkdtm_crashpoint = crashpoint;
 	lkdtm_crashtype = crashtype;
-	lkdtm_jprobe = &crashpoint->jprobe;
-	ret = register_jprobe(lkdtm_jprobe);
+	lkdtm_kprobe = &crashpoint->kprobe;
+	ret = register_kprobe(lkdtm_kprobe);
 	if (ret < 0) {
-		pr_info("Couldn't register jprobe %s\n",
-			crashpoint->jprobe.kp.symbol_name);
-		lkdtm_jprobe = NULL;
+		pr_info("Couldn't register kprobe %s\n",
+			crashpoint->kprobe.symbol_name);
+		lkdtm_kprobe = NULL;
 		lkdtm_crashpoint = NULL;
 		lkdtm_crashtype = NULL;
 	}
@@ -336,13 +269,14 @@ static int lkdtm_register_cpoint(struct crashpoint *crashpoint,
 static int crash_count = DEFAULT_COUNT;
 static DEFINE_SPINLOCK(crash_count_lock);
 
-/* Called by jprobe entry points. */
-static void lkdtm_handler(void)
+/* Called by kprobe entry points. */
+static int lkdtm_kprobe_handler(struct kprobe *kp, struct pt_regs *regs)
 {
 	unsigned long flags;
 	bool do_it = false;
 
-	BUG_ON(!lkdtm_crashpoint || !lkdtm_crashtype);
+	if (WARN_ON(!lkdtm_crashpoint || !lkdtm_crashtype))
+		return 0;
 
 	spin_lock_irqsave(&crash_count_lock, flags);
 	crash_count--;
@@ -357,6 +291,8 @@ static void lkdtm_handler(void)
 
 	if (do_it)
 		lkdtm_do_action(lkdtm_crashtype);
+
+	return 0;
 }
 
 static ssize_t lkdtm_debugfs_entry(struct file *f,
@@ -556,8 +492,8 @@ static void __exit lkdtm_module_exit(void)
 	/* Handle test-specific clean-up. */
 	lkdtm_usercopy_exit();
 
-	if (lkdtm_jprobe != NULL)
-		unregister_jprobe(lkdtm_jprobe);
+	if (lkdtm_kprobe != NULL)
+		unregister_kprobe(lkdtm_kprobe);
 
 	pr_info("Crash point unregistered\n");
 }

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

end of thread, other threads:[~2017-10-23 12:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-20 13:31 [PATCH] lkdtm: Convert from jprobe to kprobe Kees Cook
2017-10-21  5:59 ` Masami Hiramatsu
2017-10-23 12:45 ` [tip:perf/core] lkdtm, kprobes: Convert from jprobes to kprobes tip-bot for Kees Cook

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.