mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Frederic Weisbecker <fweisbec@gmail.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: LKML <linux-kernel@vger.kernel.org>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Thomas Gleixner <tglx@linuxtronix.de>,
	Mike Galbraith <efault@gmx.de>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Paul Mackerras <paulus@samba.org>,
	Arnaldo Carvalho de Melo <acme@redhat.com>,
	Lai Jiangshan <laijs@cn.fujitsu.com>,
	Anton Blanchard <anton@samba.org>, Li Zefan <lizf@cn.fujitsu.com>,
	Zhaolei <zhaolei@cn.fujitsu.com>,
	KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
	Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>,
	"K . Prasad" <prasad@linux.vnet.ibm.com>,
	Alan Stern <stern@rowland.harvard.edu>
Subject: [RFC][PATCH 3/5] hw-breakpoints: Make user breakpoints API truly generic
Date: Mon, 20 Jul 2009 13:08:05 -0400	[thread overview]
Message-ID: <1248109687-7808-4-git-send-email-fweisbec@gmail.com> (raw)
In-Reply-To: <1248109687-7808-1-git-send-email-fweisbec@gmail.com>

Following the API changes on the kernel breakpoints API,
the user breakpoints registration now follows the same pattern.

The target, access length and type and now given as parameters
in the registration helpers to avoid per arch code in generic code.

However, to keep registering or modifying easily a user breakpoint
from arch code with a prefilled arch breakpoint structure, we provide
two new helpers:

- register_user_hw_breakpoint_filled(tsk, bp)
- modify_user_hw_breakpoint_filled(tsk, bp)

Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: K.Prasad <prasad@linux.vnet.ibm.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
---
 arch/x86/kernel/ptrace.c            |   21 ++++++-----
 include/asm-generic/hw_breakpoint.h |   12 +++++-
 kernel/hw_breakpoint.c              |   65 +++++++++++++++++++++++++++++-----
 3 files changed, 76 insertions(+), 22 deletions(-)

diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index cabdabc..ef0eb10 100644
--- a/arch/x86/kernel/ptrace.c
+++ b/arch/x86/kernel/ptrace.c
@@ -525,17 +525,18 @@ restore:
 		if (!bp) {
 			rc = -ENOMEM;
 			bp = kzalloc(sizeof(struct hw_breakpoint), GFP_KERNEL);
-			if (bp) {
-				bp->info.address = thread->debugreg[i];
-				bp->triggered = ptrace_triggered;
-				bp->info.len = len;
-				bp->info.type = type;
-				rc = register_user_hw_breakpoint(tsk, bp);
-				if (rc)
-					kfree(bp);
-			}
+			if (!bp)
+				break;
+
+			bp->info.address = thread->debugreg[i];
+			bp->triggered = ptrace_triggered;
+			bp->info.len = len;
+			bp->info.type = type;
+			rc = register_user_hw_breakpoint_filled(tsk, bp);
+			if (rc)
+				kfree(bp);
 		} else
-			rc = modify_user_hw_breakpoint(tsk, bp);
+			rc = modify_user_hw_breakpoint_filled(tsk, bp);
 		if (rc)
 			break;
 	}
diff --git a/include/asm-generic/hw_breakpoint.h b/include/asm-generic/hw_breakpoint.h
index 300fe4c..598e3c4 100644
--- a/include/asm-generic/hw_breakpoint.h
+++ b/include/asm-generic/hw_breakpoint.h
@@ -83,10 +83,18 @@ struct hw_breakpoint {
  * 1-, 2-, and 4-byte lengths may be unavailable.
  */
 
+extern int register_user_hw_breakpoint_filled(struct task_struct *tsk,
+					      struct hw_breakpoint *bp);
 extern int register_user_hw_breakpoint(struct task_struct *tsk,
-					struct hw_breakpoint *bp);
+				       struct hw_breakpoint *bp,
+				       unsigned long addr, int len,
+				       enum breakpoint_type type);
+extern int modify_user_hw_breakpoint_filled(struct task_struct *tsk,
+					    struct hw_breakpoint *bp);
 extern int modify_user_hw_breakpoint(struct task_struct *tsk,
-					struct hw_breakpoint *bp);
+				     struct hw_breakpoint *bp,
+				     unsigned long addr,
+				     int len, enum breakpoint_type type);
 extern void unregister_user_hw_breakpoint(struct task_struct *tsk,
 						struct hw_breakpoint *bp);
 /*
diff --git a/kernel/hw_breakpoint.c b/kernel/hw_breakpoint.c
index 0301245..f9e62e7 100644
--- a/kernel/hw_breakpoint.c
+++ b/kernel/hw_breakpoint.c
@@ -211,16 +211,14 @@ static void __unregister_user_hw_breakpoint(int pos, struct task_struct *tsk)
 }
 
 /**
- * register_user_hw_breakpoint - register a hardware breakpoint for user space
+ * register_user_hw_breakpoint_filled - register a filled hardware breakpoint
+ * for user space.
  * @tsk: pointer to 'task_struct' of the process to which the address belongs
  * @bp: the breakpoint structure to register
- *
- * @bp.info->name or @bp.info->address, @bp.info->len, @bp.info->type and
  * @bp->triggered must be set properly before invocation
- *
  */
-int register_user_hw_breakpoint(struct task_struct *tsk,
-					struct hw_breakpoint *bp)
+int register_user_hw_breakpoint_filled(struct task_struct *tsk,
+				       struct hw_breakpoint *bp)
 {
 	struct thread_struct *thread = &(tsk->thread);
 	int i, rc = -ENOSPC;
@@ -246,15 +244,40 @@ int register_user_hw_breakpoint(struct task_struct *tsk,
 	spin_unlock_bh(&hw_breakpoint_lock);
 	return rc;
 }
+EXPORT_SYMBOL_GPL(register_user_hw_breakpoint_filled);
+
+/**
+ * register_user_hw_breakpoint - register a filled hardware breakpoint
+ * for user space.
+ * @tsk: pointer to 'task_struct' of the process to which the address belongs
+ * @bp: the breakpoint structure to register
+ * @addr: target of the breakpoint
+ * @len: length of the memory target access
+ * @type: type of the breakpoint (read-write/read/write/execute)
+ * @bp->triggered must be set properly before invocation
+ */
+int register_user_hw_breakpoint(struct task_struct *tsk,
+				struct hw_breakpoint *bp,
+				unsigned long addr,
+				int len, enum breakpoint_type type)
+{
+	int ret;
+
+	ret = arch_fill_hw_breakpoint(bp, addr, len, type);
+	if (ret)
+		return ret;
+
+	return register_user_hw_breakpoint_filled(tsk, bp);
+}
 EXPORT_SYMBOL_GPL(register_user_hw_breakpoint);
 
 /**
- * modify_user_hw_breakpoint - modify a user-space hardware breakpoint
+ * modify_user_hw_breakpoint_filled - modify a filled user-space hardware breakpoint
  * @tsk: pointer to 'task_struct' of the process to which the address belongs
- * @bp: the breakpoint structure to unregister
- *
+ * @bp: the breakpoint structure to update
  */
-int modify_user_hw_breakpoint(struct task_struct *tsk, struct hw_breakpoint *bp)
+int modify_user_hw_breakpoint_filled(struct task_struct *tsk,
+				     struct hw_breakpoint *bp)
 {
 	struct thread_struct *thread = &(tsk->thread);
 	int i, ret = -ENOENT;
@@ -269,6 +292,28 @@ int modify_user_hw_breakpoint(struct task_struct *tsk, struct hw_breakpoint *bp)
 	spin_unlock_bh(&hw_breakpoint_lock);
 	return ret;
 }
+EXPORT_SYMBOL_GPL(modify_user_hw_breakpoint_filled);
+
+/**
+ * modify_user_hw_breakpoint - modify a user-space hardware breakpoint
+ * @tsk: pointer to 'task_struct' of the process to which the address belongs
+ * @bp: the breakpoint structure to update
+ * @addr: target of the breakpoint
+ * @len: length of the memory target access
+ * @type: type of the breakpoint (read-write/read/write/execute)
+ */
+int modify_user_hw_breakpoint(struct task_struct *tsk, struct hw_breakpoint *bp,
+			      unsigned long addr, int len,
+			      enum breakpoint_type type)
+{
+	int ret;
+
+	ret = arch_fill_hw_breakpoint(bp, addr, len, type);
+	if (ret)
+		return ret;
+
+	return register_user_hw_breakpoint_filled(tsk, bp);
+}
 EXPORT_SYMBOL_GPL(modify_user_hw_breakpoint);
 
 /**
-- 
1.6.2.3


  parent reply	other threads:[~2009-07-20 17:08 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-20 17:08 [RFC][PATCH 0/5] hw-breakpoints: Make the API generic + support for perfcounters Frederic Weisbecker
2009-07-20 17:08 ` [RFC][PATCH 1/5] hw-breakpoints: Make kernel breakpoints API truly generic Frederic Weisbecker
2009-07-20 17:27   ` Mathieu Desnoyers
2009-07-25  2:37     ` Frederic Weisbecker
2009-07-25 15:38       ` Mathieu Desnoyers
2009-07-28  1:35         ` Frederic Weisbecker
2009-07-21 11:15   ` K.Prasad
2009-07-25  2:56     ` Frederic Weisbecker
2009-07-20 17:08 ` [RFC][PATCH 2/5] hw-breakpoints: Pull up the target symbol in a generic field Frederic Weisbecker
2009-07-20 17:08 ` Frederic Weisbecker [this message]
2009-07-20 17:08 ` [RFC][PATCH 4/5] perfcounter: Grow the event number to 64 bits Frederic Weisbecker
2009-07-20 17:08 ` [RFC][PATCH 5/5] perfcounter: Add support for kernel hardware breakpoints Frederic Weisbecker
2009-07-20 17:38   ` Peter Zijlstra
2009-07-21  7:11     ` Frédéric Weisbecker
2009-07-20 17:38   ` Peter Zijlstra
2009-07-21  7:19     ` Frédéric Weisbecker
2009-07-20 17:38   ` Peter Zijlstra
2009-07-20 21:22     ` Frédéric Weisbecker
2009-07-24 20:20       ` Masami Hiramatsu
2009-07-23 13:08   ` Peter Zijlstra
2009-07-23 17:45     ` Peter Zijlstra
2009-07-23 19:56       ` Alan Stern
2009-07-24 14:02     ` Frédéric Weisbecker
2009-07-24 14:26       ` Peter Zijlstra
2009-07-24 17:47         ` Frederic Weisbecker
2009-07-25 10:56           ` Peter Zijlstra
2009-07-25 14:19             ` Frederic Weisbecker
2009-07-25 15:51               ` Mathieu Desnoyers
2009-07-25 16:27                 ` Peter Zijlstra
2009-07-25 16:22               ` Peter Zijlstra
2009-07-25 23:57                 ` K.Prasad
2009-07-27  8:53                   ` Peter Zijlstra
2009-07-28  1:03                     ` Frederic Weisbecker
2009-07-28  7:24                       ` Peter Zijlstra
2009-07-28 14:04                         ` Mathieu Desnoyers
2009-07-28 14:42                           ` Peter Zijlstra
2009-07-29  0:36                         ` Frederic Weisbecker
2009-07-29  8:28                           ` Peter Zijlstra
2009-07-29 14:03                             ` Frederic Weisbecker
2009-07-28 16:12                     ` K.Prasad
2009-07-28 16:41                       ` Peter Zijlstra
2009-07-29  6:37                         ` K.Prasad
2009-07-29  9:22                           ` Peter Zijlstra
2009-07-29 14:57                             ` Arnaldo Carvalho de Melo
2009-07-28  0:18                 ` Frederic Weisbecker
2009-07-28  7:26                   ` Peter Zijlstra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1248109687-7808-4-git-send-email-fweisbec@gmail.com \
    --to=fweisbec@gmail.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@redhat.com \
    --cc=anton@samba.org \
    --cc=efault@gmx.de \
    --cc=kosaki.motohiro@jp.fujitsu.com \
    --cc=laijs@cn.fujitsu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lizf@cn.fujitsu.com \
    --cc=mathieu.desnoyers@polymtl.ca \
    --cc=mingo@elte.hu \
    --cc=paulus@samba.org \
    --cc=prasad@linux.vnet.ibm.com \
    --cc=rostedt@goodmis.org \
    --cc=stern@rowland.harvard.edu \
    --cc=tglx@linuxtronix.de \
    --cc=zhaolei@cn.fujitsu.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®